Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Change cmake variable HAVE_RUBY_H to HAVE_RUBY for homogeneity with other variables
[simgrid.git] / tools / tesh2 / src / getpath.c
index fc40068..ffd9e8c 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
@@ -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,15 +332,166 @@ 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, len;\r
+       \r
+       struct stat stat_buf = {0};\r
 \r
-       return 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
+       {\r
+               *translated = getcwd(NULL,0);\r
+               return (int)strlen(*translated);\r
+       }\r
+       /* return the previous directory */\r
+       else if(!strcmp(totranslate,"..") || !strcmp(totranslate,"../"))\r
+       {\r
+               getcwd(buffer1, PATH_MAX + 1);\r
+               p1 = strrchr(buffer1, '\\');\r
+               *translated = (char*) calloc((p1 - buffer1) + 1, sizeof(char));\r
+               strncpy(*translated, buffer1, (p1 - buffer1));\r
+               \r
+               return (int)strlen(*translated);\r
+       }\r
+       /* return the root directory */\r
+       else if(!strcmp(totranslate, "/"))\r
+       {\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 (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,buffer2);\r
+               \r
+               *translated = (char*) calloc(strlen(buffer1) + 1, sizeof(char));\r
+               strcpy(*translated, buffer1);\r
+\r
+               return (int)strlen(*translated);\r
+       }\r
+       else if(buffer1[0] == '~') \r
+       {\r
+               /* TODO */\r
+               *translated = NULL;\r
+               errno = ENOSYS;\r
+               return -1;\r
+       }\r
+       else if (*buffer1 == '.') \r
+       {\r
+               _fullpath(buffer2, buffer1, sizeof(buffer1));\r
+       } \r
+       else \r
+               strcpy(buffer2, buffer1);\r
+       \r
+       if(stat(buffer2, &stat_buf) || !S_ISDIR(stat_buf.st_mode))\r
+       {\r
+               *translated = NULL;\r
+               errno = ENOTDIR;\r
+               return -1;\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
+       return len;\r
+}\r
 #endif\r
 \r
 \r