/**CFile**************************************************************** FileName [utilFile.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Temporary file utilities.] Synopsis [Temporary file utilities.] Author [Niklas Een] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - September 29, 2010.] Revision [$Id: utilFile.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include #include #include #include #include #include #if defined(_MSC_VER) || defined(__MINGW32__) #include #include #include #else #include #endif #include "abc_global.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static ABC_UINT64_T realTimeAbs() // -- absolute time in nano-seconds { #if defined(_MSC_VER) LARGE_INTEGER f, t; double realTime_freq; int ok; ok = QueryPerformanceFrequency(&f); assert(ok); realTime_freq = 1.0 / (__int64)(((ABC_UINT64_T)f.LowPart) | ((ABC_UINT64_T)f.HighPart << 32)); ok = QueryPerformanceCounter(&t); assert(ok); return (ABC_UINT64_T)(__int64)(((__int64)(((ABC_UINT64_T)t.LowPart | ((ABC_UINT64_T)t.HighPart << 32))) * realTime_freq * 1000000000)); #else return 0; #endif } /**Function************************************************************* Synopsis [Opens a temporary file.] Description [Opens a temporary file with given prefix and returns file descriptor (-1 on failure) and a string containing the name of the file (to be freed by caller).] SideEffects [] SeeAlso [] ***********************************************************************/ int tmpFile(const char* prefix, const char* suffix, char** out_name) { #if defined(_MSC_VER) || defined(__MINGW32__) int i, fd; *out_name = (char*)malloc(strlen(prefix) + strlen(suffix) + 27); for (i = 0; i < 10; i++){ sprintf(*out_name, "%s%I64X%d%s", prefix, realTimeAbs(), _getpid(), suffix); fd = _open(*out_name, O_CREAT | O_EXCL | O_BINARY | O_RDWR, _S_IREAD | _S_IWRITE); if (fd == -1){ free(*out_name); *out_name = NULL; } return fd; } assert(0); // -- could not open temporary file return 0; #else int fd; *out_name = (char*)malloc(strlen(prefix) + strlen(suffix) + 7); assert(*out_name != NULL); sprintf(*out_name, "%sXXXXXX", prefix); fd = mkstemp(*out_name); if (fd == -1){ free(*out_name); *out_name = NULL; }else{ // Kludge: close(fd); unlink(*out_name); strcat(*out_name, suffix); fd = open(*out_name, O_CREAT | O_EXCL | O_RDWR, S_IREAD | S_IWRITE); if (fd == -1){ free(*out_name); *out_name = NULL; } } return fd; #endif } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ /* int main(int argc, char** argv) { char* tmp_filename; int fd = tmpFile("__abctmp_", &tmp_filename); FILE* out = fdopen(fd, "wb"); fprintf(out, "This file contains important information.\n"); fclose(out); printf("Created: %s\n", tmp_filename); free(tmp_filename); return 0; } */ /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ char* vnsprintf(const char* format, va_list args) { unsigned n; char* ret; va_list args_copy; static FILE* dummy_file = NULL; if (!dummy_file) { #if !defined(_MSC_VER) && !defined(__MINGW32) dummy_file = fopen("/dev/null", "wb"); #else dummy_file = fopen("NUL", "wb"); #endif } #if defined(__va_copy) __va_copy(args_copy, args); #else #if defined(va_copy) va_copy(args_copy, args); #else args_copy = args; #endif #endif n = vfprintf(dummy_file, format, args); ret = ABC_ALLOC( char, n + 1 ); ret[n] = (char)255; args = args_copy; vsprintf(ret, format, args); #if !defined(__va_copy) && defined(va_copy) va_end(args_copy); #endif assert(ret[n] == 0); return ret; } char* nsprintf(const char* format, ...) { char* ret; va_list args; va_start(args, format); ret = vnsprintf(format, args); va_end(args); return ret; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END