version 1.4.58b
[polyglot.git] / util.c
diff --git a/util.c b/util.c
index 8551aca..c2dec6b 100644 (file)
--- a/util.c
+++ b/util.c
 #include <stdlib.h>\r
 #include <string.h>\r
 #include <time.h>\r
+#ifndef _MSC_VER\r
 #include <sys/time.h>\r
+#endif\r
 \r
 #include "main.h"\r
 #include "util.h"\r
+#include "gui.h"\r
+\r
+// macros\r
+\r
+#define StringSize 4096\r
 \r
 // variables\r
 \r
@@ -29,7 +36,6 @@ static bool Error;
 \r
 FILE * LogFile=NULL;\r
 \r
-\r
 // functions\r
 \r
 // util_init()\r
@@ -145,6 +151,10 @@ void my_log_open(const char file_name[]) {
 //line buffering doesn't work too well in MSVC and/or windows \r
    if (LogFile != NULL) setvbuf(LogFile,NULL,_IOLBF,0); // line buffering\r
 #endif\r
+   if(LogFile!=NULL){\r
+       my_log("POLYGLOT *** LOGFILE OPENED ***\n");\r
+   }\r
+\r
 }\r
 \r
 // my_log_close()\r
@@ -158,45 +168,50 @@ void my_log_close() {
 // my_log()\r
 \r
 void my_log(const char format[], ...) {\r
+    \r
+    char string[FormatBufferSize];\r
+    \r
+    ASSERT(format!=NULL);\r
 \r
-   va_list ap;\r
-\r
-   ASSERT(format!=NULL);\r
+//  format\r
 \r
-   if (LogFile != NULL) {\r
-      fprintf(LogFile,"%.3f ",now_real());\r
-      va_start(ap,format);\r
+    CONSTRUCT_ARG_STRING(format,string);\r
+    \r
 \r
-      vfprintf(LogFile,format,ap);\r
-      va_end(ap);\r
+    if (LogFile != NULL) {\r
+        fprintf(LogFile,"%.3f %s",now_real(),string);\r
 #ifdef _WIN32\r
-      fflush(LogFile);\r
+        fflush(LogFile);\r
 #endif\r
-   }\r
+    }\r
 }\r
 \r
 // my_fatal()\r
 \r
 void my_fatal(const char format[], ...) {\r
 \r
-   va_list ap;\r
+    char string[FormatBufferSize];\r
+\r
+    ASSERT(format!=NULL);\r
 \r
-   ASSERT(format!=NULL);\r
+// format\r
 \r
-   va_start(ap,format);\r
+    CONSTRUCT_ARG_STRING(format,string);\r
+    \r
+    my_log("POLYGLOT %s",string);\r
+    // This should be gui_send but this does not work.\r
+    // Why?\r
 \r
-   vfprintf(stderr,format,ap);\r
-   if (LogFile != NULL) vfprintf(LogFile,format,ap);\r
+    printf("tellusererror POLYGLOT: %s",string);\r
 \r
-   va_end(ap);\r
-   if (Error) { // recursive error\r
-      my_log("POLYGLOT *** RECURSIVE ERROR ***\n");\r
-      exit(EXIT_FAILURE);\r
-      // abort();\r
-   } else {\r
+    if (Error) { // recursive error\r
+        my_log("POLYGLOT *** RECURSIVE ERROR ***\n");\r
+        exit(EXIT_FAILURE);\r
+            // abort();\r
+    } else {\r
       Error = TRUE;\r
       quit();\r
-   }\r
+    }\r
 }\r
 \r
 // my_file_read_line()\r
@@ -232,6 +247,32 @@ bool my_file_read_line(FILE * file, char string[], int size) {
    return TRUE;\r
 }\r
 \r
+// my_file_join()\r
+\r
+void my_path_join(char *join_path, const char *path, const char *file){\r
+    char separator;\r
+#ifdef _WIN32\r
+    separator='\\';\r
+#else\r
+    separator='/';\r
+#endif\r
+    snprintf(join_path,StringSize,"%s%c%s",path,separator,file);\r
+    join_path[StringSize-1]='\0';\r
+}\r
+\r
+// my_mkdir()\r
+\r
+int my_mkdir(const char *path){\r
+    int ret;\r
+#ifdef _WIN32\r
+    ret=_mkdir(path);\r
+#else\r
+    ret=mkdir(path,S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);\r
+#endif\r
+    return ret;\r
+}\r
+\r
+\r
 // my_string_empty()\r
 \r
 bool my_string_empty(const char string[]) {\r
@@ -283,6 +324,44 @@ bool my_string_case_equal(const char string_1[], const char string_2[]) {
    return FALSE;\r
 }\r
 \r
+// my_strtolower()\r
+\r
+void my_string_tolower(char *dst, const char *src){\r
+  int c;\r
+  ASSERT(src!=NULL);\r
+  ASSERT(dst!=NULL);\r
+  while((c=*(src++))){\r
+    *dst=tolower(c);\r
+    dst++;\r
+  }\r
+  *(dst++)='\0';\r
+}\r
+\r
+// my_string_case_contains()\r
+\r
+const char* my_string_case_contains(const char string_1[], const char string_2[]){\r
+   \r
+   char tmp1[StringSize];\r
+   char tmp2[StringSize];\r
+   char *where;\r
+\r
+\r
+   ASSERT(string_1!=NULL);\r
+   ASSERT(string_2!=NULL);\r
+\r
+   my_string_tolower(tmp1,string_1);\r
+   my_string_tolower(tmp2,string_2);\r
+\r
+   where=strstr(tmp1,tmp2);\r
+   if(where){\r
+      return string_1+(where-tmp1);\r
+   }\r
+   return NULL;\r
+\r
+  \r
+}\r
+\r
+\r
 // my_strdup()\r
 \r
 char * my_strdup(const char string[]) {\r
@@ -322,6 +401,8 @@ void my_string_set(const char * * variable, const char string[]) {
    *variable = my_strdup(string);\r
 }\r
 \r
+// now_real()\r
+\r
 double now_real() {\r
 #ifndef _WIN32\r
    struct timeval tv[1];\r
@@ -336,7 +417,10 @@ double now_real() {
 \r
    return tv->tv_sec + tv->tv_usec * 1E-6;\r
 #else\r
-   return (double) GetTickCount() / 1000.0;  // we can do better here:-)\r
+   struct _timeb timeptr;\r
+   _ftime(&timeptr);\r
+   return(timeptr.time+((double)timeptr.millitm)/1000.0);\r
+//   return (double) GetTickCount() / 1000.0;  // we can do better here:-)\r
 #endif\r
 }\r
 \r
@@ -394,19 +478,49 @@ double my_timer_elapsed_real(const my_timer_t * timer) {
 }\r
 \r
 \r
-char * my_getcwd(char *buf, size_t size){\r
-#ifdef _WIN32\r
-    return _getcwd(buf,size);\r
-#else\r
-    return getcwd(buf,size);\r
-#endif\r
+void my_dequote(char *out, const char *in, const char *special){\r
+  const char *p; \r
+  char *q;\r
+  char c;\r
+  p=in;\r
+  q=out;\r
+  while((c=*(p++))){\r
+    if(c=='\\' && strchr(special,*p)){\r
+      *(q++)=*(p++);\r
+    }else{\r
+      *(q++)=c;\r
+    }\r
+  }\r
+  *q='\0';\r
 }\r
 \r
-int my_chdir (const char *path){\r
-    ASSERT(path!=NULL);\r
-#ifdef _WIN32\r
-    return _chdir(path);\r
+void my_quote(char *out, const char *in, const char *special){\r
+  const char *p;\r
+  char *q;\r
+  char c;\r
+  p=in;\r
+  q=out;\r
+  while(q-out< StringSize-2 && (c=*(p++))){\r
+    if(c=='\\'){\r
+      if(*p!=0 && strchr(special,*p)){\r
+       *(q++)='\\';\r
+      }\r
+    }else if(strchr(special,c)){\r
+      *(q++)='\\';\r
+    }\r
+    *(q++)=c;\r
+  }\r
+  *q='\0';\r
+}\r
+\r
+\r
+void my_sleep(int msec){\r
+#ifndef _WIN32\r
+  struct timespec tm;\r
+  tm.tv_sec=msec/1000;\r
+  tm.tv_nsec=1000000*(msec%1000);\r
+  nanosleep(&tm,NULL);\r
 #else\r
-    return chdir(path);\r
+  Sleep(msec);\r
 #endif\r
 }\r