=================================================================== RCS file: /home/cvs/OpenXM/src/util/ox_pathfinder.c,v retrieving revision 1.5 retrieving revision 1.10 diff -u -p -r1.5 -r1.10 --- OpenXM/src/util/ox_pathfinder.c 2003/07/22 03:25:56 1.5 +++ OpenXM/src/util/ox_pathfinder.c 2003/12/01 03:15:37 1.10 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/util/ox_pathfinder.c,v 1.4 2003/07/21 13:36:43 takayama Exp $ */ +/* $OpenXM: OpenXM/src/util/ox_pathfinder.c,v 1.9 2003/11/24 11:47:35 takayama Exp $ */ /* Moved from misc-2003/07/cygwin/test.c */ #include @@ -26,9 +26,10 @@ static char *get_ox_path(); static char *get_oxc_path(); static char *get_oxlog_path(); static int getFileSize(char *fn); +static void errorPathFinder(char *s); +static void msgPathFinder(char *s); - static int Verbose_get_home = 0; static int NoX = 0; @@ -36,6 +37,17 @@ static int NoX = 0; #define nomemory(a) {fprintf(stderr,"(%d) no more memory.\n",a);exit(10);} #define mymalloc(a) sGC_malloc(a) +static void errorPathFinder(char *s) { + /* Todo; we need to return the error message to the client if it is used + in ox_shell */ + fprintf(stderr,"Error: %s",s); +} +static void msgPathFinder(char *s) { + /* Todo; we need to return the error message to the client if it is used + in ox_shell */ + fprintf(stderr,"Log(ox_pathfinder): %s",s); +} + int ox_pathfinderNoX(int f) { if (f < 0) return NoX; NoX = f; @@ -791,6 +803,12 @@ char *generateTMPfileName(char *seed) { char *fname; char *tt; int num; + static int prevnum=0; + /* Bugs for k0. + (1) unlink does not work so, load["t.k"];; load["t.k"];; fails (only cygwin. + (2) In case of error, TMP file is not removed. cf KCerror(). + In case of cygwin, we can only load 90 times. + */ int i; int clean = 0; tmp = getenv("TMP"); @@ -808,14 +826,16 @@ char *generateTMPfileName(char *seed) { fname = (char *)mymalloc(strlen(seed)+40); if (fname == NULL) nomemory(fname); } - for (num=0; num <100; num++) { + for (num=prevnum+1; num <100; num++) { if (tmp != NULL) { sprintf(fname,"%s/%s-tmp-%d.txt",tmp,seed,num); }else{ sprintf(fname,"%s-tmp-%d.txt",seed,num); } - if (getFileSize(fname) < 0) return fname; - else { + if (getFileSize(fname) < 0) { + prevnum = num; + return fname; + } else { if ((num > 90) && (!clean)) { /* Clean the old garbages. */ for (i=0; i<100; i++) { @@ -828,21 +848,12 @@ char *generateTMPfileName(char *seed) { struct stat buf; int m; m = stat(fname,&buf); -#if defined(__CYGWIN__) -#define _POSIX_SOURCE -#endif -#ifndef _POSIX_SOURCE - if ((m >= 0) && (buf.st_mtimespec.tv_sec+120 < time(NULL))) { - unlink(fname); - } -#else if ((m >= 0) && (buf.st_mtime+120 < time(NULL))) { unlink(fname); } -#endif } } - num = 0; clean=1; + num = 0; clean=1; prevnum=0; } } } @@ -878,3 +889,115 @@ char *getCppPath(void) { else return NULL; } } + +char *getCommandPath(char *cmdname) +{ + char *path; + char *msg; + char *path2; + char *ss; + int i,j; + /* Use /cygdrive format always. */ + if (cmdname == NULL) return NULL; + if (strlen(cmdname) < 1) { + errorPathFinder("getCommandPath: cmdname is an empty string.\n"); + return NULL; + } + if (cmdname[0] == '/') { + if (getFileSize(cmdname) >= 0) { /* Todo: isExecutableFile() */ + }else{ + msg = (char *)mymalloc(strlen(cmdname)+30); + sprintf(msg,"getCommandPath: %s is not found."); + errorPathFinder(msg); + return NULL; + } + return cmdname; + } + + path = getOpenXM_HOME(); /* It will return /cygdrive for windows. */ + if (path != NULL) { + path2 = (char *)mymalloc(strlen(path)+5); + strcpy(path2,path); + strcat(path2,"bin"); + ss = oxWhich(cmdname,path2); + if (ss != NULL) return ss; + } + + path = (char *)getenv("PATH"); /* Todo: it will not give /cygdrive format*/ + ss = oxWhich(cmdname,path); + if (ss == NULL) { + errorPathFinder("oxWhich_unix: could not find it in the path string.\n"); + } + return ss; +} + +char *oxWhich(char *cmdname,char *path) { + return(oxWhich_unix(cmdname,path)); +} + +char *oxWhich_unix(char *cmdname,char *path) { + char *path2; + int i,j; + if (path == NULL) { + return NULL; + } + + path2 = (char *)mymalloc(strlen(path)+strlen(cmdname)+2); + for (i=0, j=0; i <= strlen(path); i++) { + path2[j] = 0; + if ((path[i] == ':') || (path[i] == 0)) { + strcat(path2,"/"); strcat(path2,cmdname); + if (getFileSize(path2) >= 0) { /* Todo: isExecutableFile() */ + return path2; + } + j = 0; path2[j] = 0; + }else{ + path2[j] = path[i]; j++; path2[j] = 0; + } + } + return NULL; +} + +char *oxEvalEnvVar(char *s) { + int n, i,j; + char *es; + char *news; + int flag,flag2; + flag=-1; + n = strlen(s); + es = (char *)mymalloc(n+1); es[0] = 0; + if (es == NULL) nomemory(1); + for (i=0; i= 0) { + es = (char *)getenv(es); + if (es == NULL) es=""; + news = (char *) mymalloc(n+5+strlen(es)); + if (news == NULL) nomemory(1); + j = 0; + for (i=0; i