Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Define correctly variables for windows.
[simgrid.git] / tools / tesh2 / src / getpath.c
index a46c4fe..4f768d7 100644 (file)
@@ -1,5 +1,7 @@
 #include <com.h>\r
 \r
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(tesh);\r
+\r
 /*#include <stdlib.h>\r
 #include <string.h>\r
 \r
@@ -8,7 +10,7 @@
 #include <sys/types.h>\r
 #include <sys/stat.h>\r
 \r
-#ifndef WIN32\r
+#ifndef _XBT_WIN32\r
 #include <pwd.h>\r
 #else\r
 #endif\r
@@ -20,7 +22,7 @@
 #define PATH_MAX 255\r
 #endif\r
 \r
-#ifndef WIN32\r
+#ifndef _XBT_WIN32\r
 int\r
 getpath(const char* file, char** path)\r
 {\r
@@ -300,13 +302,14 @@ translatepath(const char* totranslate, char** translated)
        return len;\r
 }\r
 #else\r
-int\r
+/*int\r
 getpath(const char* file, char** path)\r
 {\r
        DWORD len;\r
        char* part = NULL;\r
        char buffer[PATH_MAX + 1] = {0}; \r
        struct stat info = {0};\r
+\r
        \r
        len = GetFullPathName(file, PATH_MAX, buffer, &part );\r
        \r
@@ -315,7 +318,6 @@ getpath(const char* file, char** path)
                *path = NULL;\r
                return -1;\r
        }\r
-\r
        \r
        if(stat(buffer, &info) || !S_ISREG(info.st_mode))\r
        {\r
@@ -330,17 +332,82 @@ getpath(const char* file, char** path)
        *path = strncpy(*path, buffer, strlen(buffer) - strlen(part) - 1);\r
 \r
        return (int)(strlen(buffer) - strlen(part) -1);\r
+}*/\r
+\r
+int\r
+getpath(const char* file, char** path)\r
+{\r
+       char buf1[PATH_MAX + 1] = {0};\r
+       char buf2[PATH_MAX + 1] = {0};\r
+       struct stat info = {0};\r
+\r
+       char* delimiter;\r
+       \r
+       if(!file)\r
+       {\r
+               *path = NULL;\r
+               return -1;\r
+       }\r
+\r
+       delimiter = strrchr(file,'/');\r
+\r
+       if(!delimiter)\r
+               delimiter = strrchr(file,'\\');\r
+\r
+       if(!delimiter)\r
+       {\r
+               *path = getcwd(NULL,0);\r
+       }\r
+       else\r
+       {\r
+               strncpy(buf2, file, (delimiter - file));\r
+\r
+               if(translatepath(buf2, path) < 0)\r
+               {\r
+                       if(errno == ENOTDIR)\r
+                               errno = ENOENT;\r
+\r
+                       return -1;\r
+               }\r
+       }\r
+\r
+       sprintf(buf1,"%s\\%s", *path, delimiter ? delimiter + 1 : file);\r
+\r
+       \r
+       if(stat(buf1, &info) || !S_ISREG(info.st_mode))\r
+       {\r
+               free(*path);\r
+               *path = NULL;\r
+               errno = ENOENT;\r
+               return -1;\r
+       }               \r
+       \r
+       return (int) strlen(*path);\r
 }\r
 \r
+\r
 int\r
 translatepath(const char* totranslate, char** translated)\r
 {\r
        char buffer1[PATH_MAX + 1] = {0};               \r
        char buffer2[PATH_MAX + 1] = {0};\r
        char *p1;\r
-       int i, j, len;\r
+       int i, len;\r
        \r
        struct stat stat_buf = {0};\r
+\r
+       len = (int)strlen(totranslate);                                         \r
+       \r
+       strncpy(buffer1, totranslate, len);\r
+\r
+       while((p1 = strstr(buffer1, "//"))) \r
+               if(p1[2]) \r
+                       strcpy(p1, p1 + 1); \r
+               else \r
+                       p1[1] = '\0';\r
+\r
+       if(buffer1[strlen(buffer1) - 1] == '/' || buffer1[strlen(buffer1) - 1] == '\\')\r
+               buffer1[strlen(buffer1) - 1] = '\0';\r
        \r
        /* return the current directory */\r
        if(!strcmp(totranslate,".") || !strcmp(totranslate,"./"))\r
@@ -363,65 +430,31 @@ translatepath(const char* totranslate, char** translated)
        {\r
                *translated = getcwd(NULL,0);\r
                (*translated)[2] = '\0';\r
+\r
                return (int)strlen(*translated);\r
        }\r
-       /* it's a relative directory name build the full directory name */\r
-       else if(!strchr(totranslate, '/') && !strchr(totranslate, '\\') && !stat(totranslate, &stat_buf) || S_ISDIR(stat_buf.st_mode))\r
+       /* it's a relative directory name build the full directory name (directory)*/\r
+       else if( buffer1[0] != '.' && buffer1[0] != '/' && buffer1[1] != ':' && !stat(totranslate, &stat_buf) && S_ISDIR(stat_buf.st_mode))\r
        {\r
+               for(i = 0; buffer1[i] !='\0'; i++)\r
+               {\r
+                       if(buffer1[i] == '/')\r
+                               buffer2[i] = '\\';\r
+                       else\r
+                               buffer2[i] = buffer1[i];\r
+               }\r
+               \r
+               memset(buffer1, 0, PATH_MAX + 1);\r
                getcwd(buffer1, PATH_MAX + 1);\r
                strcat(buffer1,"\\");\r
-               strcat(buffer1,totranslate);\r
+               strcat(buffer1,buffer2);\r
                \r
                *translated = (char*) calloc(strlen(buffer1) + 1, sizeof(char));\r
                strcpy(*translated, buffer1);\r
+\r
                return (int)strlen(*translated);\r
        }\r
-       \r
-       len = (int)strlen(totranslate);                                         \r
-       \r
-       strncpy(buffer1, totranslate, len);     \r
-       \r
-       if(buffer1[strlen(buffer1) - 1] == '/' || buffer1[strlen(buffer1) - 1] == '\\')\r
-               buffer1[strlen(buffer1) - 1] = '\0';\r
-       \r
-       while((p1 = strstr(buffer1, "//"))) \r
-               if(p1[2]) \r
-                       strcpy(p1, p1 + 1); \r
-               else \r
-                       p1[1] = '\0';\r
-       \r
-       for(i = 0, j = 0; buffer1[i] !='\0'; i++)\r
-       {\r
-               if(buffer1[i] == '/')\r
-               {\r
-                       j++;\r
-                       \r
-                       if(j > 1)\r
-                               break;\r
-               }\r
-       }\r
-       \r
-       if(j == 1 && buffer1[i - 1] == '/')\r
-       {\r
-               /* perhaps it's a relative directory : `dir/' */\r
-               strncpy(buffer2, buffer1, strlen(buffer1) - 1);\r
-               \r
-               if(!stat(buffer2, &stat_buf) || S_ISDIR(stat_buf.st_mode))\r
-               {\r
-                       getcwd(buffer1, PATH_MAX + 1);\r
-                       strcat(buffer1,"\\");\r
-                       strcat(buffer1,buffer2);\r
-                       \r
-                       *translated = (char*) calloc(strlen(buffer1) + 1, sizeof(char));\r
-                       strcpy(*translated, buffer1);\r
-                       return (int)strlen(*translated);\r
-               }\r
-               else\r
-                       memset(buffer2, 0, PATH_MAX + 1);\r
-               \r
-       }\r
-       \r
-       if(buffer1[0] == '~') \r
+       else if(buffer1[0] == '~') \r
        {\r
                /* TODO */\r
                *translated = NULL;\r
@@ -430,10 +463,10 @@ translatepath(const char* totranslate, char** translated)
        }\r
        else if (*buffer1 == '.') \r
        {\r
-               _fullpath(buffer2, buffer1, sizeof(buffer1));   \r
+               _fullpath(buffer2, buffer1, sizeof(buffer1));\r
        } \r
        else \r
-               strcpy(buffer2, buffer1);                       \r
+               strcpy(buffer2, buffer1);\r
        \r
        if(stat(buffer2, &stat_buf) || !S_ISDIR(stat_buf.st_mode))\r
        {\r
@@ -441,19 +474,22 @@ translatepath(const char* totranslate, char** translated)
                errno = ENOTDIR;\r
                return -1;\r
        }\r
-                                \r
+       \r
+\r
+       \r
        len = (int)strlen(buffer2);\r
        \r
+\r
+       \r
        *translated = (char*) calloc(len + 1, sizeof(char));\r
+       strcpy(*translated, buffer2);\r
        \r
        if(!(*translated))\r
        {\r
                *translated = NULL;\r
                return -1;\r
        }\r
-       \r
-       strncpy(*translated, buffer2, len);\r
-       \r
+\r
        return len;\r
 }\r
 #endif\r