/**CFile**************************************************************** FileName [extraUtilUtil.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [extra] Synopsis [Old SIS utilities.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: extraUtilUtil.c,v 1.0 2003/02/01 00:00:00 alanmi Exp $] ***********************************************************************/ #include #include #include "extra.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// #define EXTRA_RLIMIT_DATA_DEFAULT 67108864 // assume 64MB by default /* File : getopt.c * Author : Henry Spencer, University of Toronto * Updated: 28 April 1984 * * Changes: (R Rudell) * changed index() to strchr(); * added getopt_reset() to reset the getopt argument parsing * * Purpose: get option letter from argv. */ const char * globalUtilOptarg; // Global argument pointer (util_optarg) int globalUtilOptind = 0; // Global argv index (util_optind) static const char *pScanStr; //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [getSoftDataLimit()] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Extra_GetSoftDataLimit() { return EXTRA_RLIMIT_DATA_DEFAULT; } /**Function************************************************************* Synopsis [util_getopt_reset()] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Extra_UtilGetoptReset() { globalUtilOptarg = 0; globalUtilOptind = 0; pScanStr = 0; } /**Function************************************************************* Synopsis [util_getopt()] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Extra_UtilGetopt( int argc, char *argv[], const char *optstring ) { register int c; register const char *place; globalUtilOptarg = NULL; if (pScanStr == NULL || *pScanStr == '\0') { if (globalUtilOptind == 0) globalUtilOptind++; if (globalUtilOptind >= argc) return EOF; place = argv[globalUtilOptind]; if (place[0] != '-' || place[1] == '\0') return EOF; globalUtilOptind++; if (place[1] == '-' && place[2] == '\0') return EOF; pScanStr = place+1; } c = *pScanStr++; place = strchr(optstring, c); if (place == NULL || c == ':') { (void) fprintf(stderr, "%s: unknown option %c\n", argv[0], c); return '?'; } if (*++place == ':') { if (*pScanStr != '\0') { globalUtilOptarg = pScanStr; pScanStr = NULL; } else { if (globalUtilOptind >= argc) { (void) fprintf(stderr, "%s: %c requires an argument\n", argv[0], c); return '?'; } globalUtilOptarg = argv[globalUtilOptind]; globalUtilOptind++; } } return c; } /**Function************************************************************* Synopsis [util_print_time()] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ char * Extra_UtilPrintTime( long t ) { static char s[40]; (void) sprintf(s, "%ld.%02ld sec", t/1000, (t%1000)/10); return s; } /**Function************************************************************* Synopsis [Extra_UtilStrsav()] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ char * Extra_UtilStrsav( const char *s ) { if(s == NULL) { /* added 7/95, for robustness */ return NULL; } else { return strcpy(ABC_ALLOC(char, strlen(s)+1), s); } } /**Function************************************************************* Synopsis [util_tilde_expand()] Description [The code contributed by Niklas Sorensson.] SideEffects [] SeeAlso [] ***********************************************************************/ char * Extra_UtilTildeExpand( char *fname ) { return Extra_UtilStrsav( fname ); /* int n_tildes = 0; const char* home; char* expanded; int length; int i, j, k; for (i = 0; i < (int)strlen(fname); i++) if (fname[i] == '~') n_tildes++; home = getenv("HOME"); length = n_tildes * strlen(home) + strlen(fname); expanded = ABC_ALLOC(char, length + 1); j = 0; for (i = 0; i < (int)strlen(fname); i++){ if (fname[i] == '~'){ for (k = 0; k < (int)strlen(home); k++) expanded[j++] = home[k]; }else expanded[j++] = fname[i]; } expanded[j] = '\0'; return expanded; */ } /**Function************************************************************* Synopsis [check_file()] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Extra_UtilCheckFile(char *filename, const char *mode) { FILE *fp; int got_file; if (strcmp(mode, "x") == 0) { mode = "r"; } fp = fopen(filename, mode); got_file = (fp != 0); if (fp != 0) { (void) fclose(fp); } return got_file; } /**Function************************************************************* Synopsis [util_file_search()] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ char * Extra_UtilFileSearch(char *file, char *path, char *mode) //char *file; // file we're looking for //char *path; // search path, colon separated //char *mode; // "r", "w", or "x" { int quit; char *buffer, *filename, *save_path, *cp; if (path == 0 || strcmp(path, "") == 0) { path = "."; /* just look in the current directory */ } save_path = path = Extra_UtilStrsav(path); quit = 0; do { cp = strchr(path, ':'); if (cp != 0) { *cp = '\0'; } else { quit = 1; } /* cons up the filename out of the path and file name */ if (strcmp(path, ".") == 0) { buffer = Extra_UtilStrsav(file); } else { buffer = ABC_ALLOC(char, strlen(path) + strlen(file) + 4); (void) sprintf(buffer, "%s/%s", path, file); } filename = Extra_UtilTildeExpand(buffer); ABC_FREE(buffer); /* see if we can access it */ if (Extra_UtilCheckFile(filename, mode)) { ABC_FREE(save_path); return filename; } ABC_FREE(filename); path = ++cp; } while (! quit); ABC_FREE(save_path); return 0; } /**Function************************************************************* Synopsis [MMout_of_memory()] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ /* MMout_of_memory -- out of memory for lazy people, flush and exit */ void Extra_UtilMMout_Of_Memory( long size ) { (void) fflush(stdout); (void) fprintf(stderr, "\nout of memory allocating %u bytes\n", (unsigned) size); assert( 0 ); exit(1); } /**Function************************************************************* Synopsis [MMoutOfMemory()] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void (*Extra_UtilMMoutOfMemory)( long size ) = (void (*)( long size ))Extra_UtilMMout_Of_Memory; /**Function************************************************************* Synopsis [util_cpu_time()] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ abctime Extra_CpuTime() { return Abc_Clock(); } /**Function************************************************************* Synopsis [util_cpu_time()] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ #if defined(NT) || defined(NT64) || defined(WIN32) double Extra_CpuTimeDouble() { return 1.0*Abc_Clock()/CLOCKS_PER_SEC; } #else ABC_NAMESPACE_IMPL_END #include #include #include ABC_NAMESPACE_IMPL_START double Extra_CpuTimeDouble() { struct rusage ru; getrusage(RUSAGE_SELF, &ru); return (double)ru.ru_utime.tv_sec + (double)ru.ru_utime.tv_usec / 1000000; } #endif /**Function************************************************************* Synopsis [Testing memory leaks.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Extra_MemTest() { // ABC_ALLOC( char, 1002 ); } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END