| /**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 <assert.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <fcntl.h> |
| #include <sys/stat.h> |
| |
| #if defined(_MSC_VER) || defined(__MINGW32__) |
| #include <windows.h> |
| #include <process.h> |
| #include <io.h> |
| #else |
| #include <unistd.h> |
| #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 |
| |