version 1.4.58b
[polyglot.git] / util.c
diff --git a/util.c b/util.c
index 873ed2f..c2dec6b 100644 (file)
--- a/util.c
+++ b/util.c
 \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
@@ -146,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
@@ -189,16 +198,19 @@ void my_fatal(const char format[], ...) {
 \r
     CONSTRUCT_ARG_STRING(format,string);\r
     \r
-    fprintf(stderr,"%s",string);\r
-    if (LogFile != NULL) fprintf(LogFile,"%s",string);\r
+    my_log("POLYGLOT %s",string);\r
+    // This should be gui_send but this does not work.\r
+    // Why?\r
+\r
+    printf("tellusererror POLYGLOT: %s",string);\r
 \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
+      Error = TRUE;\r
+      quit();\r
     }\r
 }\r
 \r
@@ -235,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
@@ -286,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
@@ -325,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
@@ -339,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
@@ -397,4 +478,49 @@ double my_timer_elapsed_real(const my_timer_t * timer) {
 }\r
 \r
 \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
+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
+  Sleep(msec);\r
+#endif\r
+}\r