Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
sanitize the use of logs in unit testing of parmap to fix supernovae
[simgrid.git] / tools / tesh2 / src / getpath.c
index a46c4fe..d3e9913 100644 (file)
 #include <com.h>\r
-\r
+\r XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(tesh);
+\r\r
 /*#include <stdlib.h>\r
 #include <string.h>\r
 \r
-*/\r
-\r
+*/ \r
+    \r
 #include <sys/types.h>\r
 #include <sys/stat.h>\r
-\r
-#ifndef WIN32\r
+    \r
+#ifndef _XBT_WIN32\r
 #include <pwd.h>\r
-#else\r
-#endif\r
-\r
+#else   /* \r */
+#endif  /* \r */
+    \r
 #include <errno.h>\r
 #include <getpath.h>\r
-\r
+    \r
 #ifndef PATH_MAX\r
 #define PATH_MAX 255\r
-#endif\r
+#endif  /* \r */
+    \r
+#ifndef _XBT_WIN32\r
+int \r getpath(const char *file, char **path) \r
+{
+  \rchar buffer1[PATH_MAX + 1] = { 0 };
+  \rchar buffer2[PATH_MAX + 1] = { 0 };
+  \rchar buffer3[PATH_MAX + 1] = { 0 };
+  \rchar *p1, *p2;
+  \rsize_t len = strlen(file);
+  \rchar *last_delimiter = NULL;
+  \rstruct stat buffer = { 0 };
+  \r\rstrncpy(buffer1, file, len);
+  \r\r
+      /* remove the /////// */ \r
+      while ((p1 = strstr(buffer1, "//")))
+    \r {
+    \rif (p1[2])
+      \rstrcpy(p1, p1 + 1);
+    \r
+    else
+      \rp1[1] = '\0';
+    \r}
+  \r\rif (*buffer1 == '~')
+    \r {
+    \rfor (p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/');
+          *p2++ = *p1++);
+    \r*p2 = '\0';
+    \r\rif (buffer2[0] == '\0')
+      \r {
+      \rchar *home = getenv("HOME");
+      \r\rif (home)
+        \r {
+        \rstrcpy(buffer2, home);
+        \r}
+      \r
+      else
+        \r {
+        \rstruct passwd *pw = getpwuid(getuid());
+        \r\rif (!pw)
+          \r {
+          \r*path = NULL;
+          \rreturn -1;
+          \r}
+        \r\rstrcpy(buffer2, pw->pw_dir);
+        \r}
+      \r\rstrcat(buffer2, p1);
+      \r}
+    \r\r}
+  \r
+  else if (buffer1[0] != '/')
+    \r {
+    \r\rgetcwd(buffer2, PATH_MAX + 1);
+    \r\rif (buffer1[0] == '.' && buffer1[1] == '/')
+      \r {                       /* replace */
+      \rstrcat(buffer2, &buffer1[1]);
+      \r}
+    \r
+    else
+      \r {
+      \rstrcat(buffer2, "/");
+      \rstrcat(buffer2, buffer1);
+      \r}
+    \r}
+  \r
+  else
+    \r {
+    \rstrcpy(buffer2, buffer1);  /* copy */
+    \r}
+  \r\r
+      /*\r
+       * check for /..\r
+       */ \r
+      while ((p1 = strstr(buffer2, "/..")))
+    \r {
+    \rfor (p2 = p1; --p2 > buffer2 && *p2 != '/';);
+    \r\rif (*(p1 + 3))
+      \rmemmove(p2, p1 + 3, strlen(p1 + 3) + 1);
+    \r
+    else
+      \r*p2 = '\0';
+    \r}
+  \r\r
+      /*\r
+       * try to find links, and resolve them.\r
+       */ \r
+      p1 = strtok(buffer2, "/");
+  \r\r*buffer3 = '\0';
+  \r\rwhile (p1)
+    \r {
+    \rstrcat(buffer3, "/");
+    \rstrcat(buffer3, p1);
+    \r\rlen = readlink(buffer3, buffer1, PATH_MAX);
+    \r\rif (len != -1)
+      \r {
+      \r*(buffer1 + len) = '\0';
+      \rstrcpy(buffer3, buffer1);
+      \r}
+    \r\rp1 = strtok(NULL, "/");
+    \r}
+  \r\rif (stat(buffer3, &buffer) || !S_ISREG(buffer.st_mode))
+    \r {
+    \r*path = NULL;
+    \rerrno = ENOENT;
+    \rreturn -1;
+    \r}
+  \r\rlast_delimiter = strrchr(buffer3, '/');
+  \r\rlen = strlen(buffer3);
+  \r\rif (last_delimiter)
+    \rlen -= strlen(last_delimiter);
+  \r\r*path = (char *) calloc(len + 1, sizeof(char));
+  \r\rif (!(*path))
+    \r {
+    \r*path = NULL;
+    \rreturn -1;
+    \r}
+  \r\rstrncpy(*path, buffer3, len);
+  \r\rreturn len;
+\r}
+
+\r\rint \r translatepath(const char *totranslate, char **translated) \r
+{
+  \rchar buffer1[PATH_MAX + 1] = { 0 };
+  \rchar buffer2[PATH_MAX + 1] = { 0 };
+  \rchar buffer3[PATH_MAX + 1] = { 0 };
+  \rchar *p1, *p2;
+  \rsize_t len;
+  \rstruct stat buffer = { 0 };
+  \r\rlen = strlen(totranslate);
+  \r\rstrncpy(buffer1, totranslate, len);
+  \r\rif (!strcmp(buffer1, "."))
+    \r {
+    \r*translated = getcwd(NULL, 0);
+    \rreturn strlen(*translated);
+    \r}
+  \r
+  else if (!strcmp(buffer1, "/.."))
+    \r {
+    \r*translated = strdup("/");
+    \rreturn strlen(*translated);
+    \r}
+  \r\rwhile ((p1 = strstr(buffer1, "//")))
+    \rif (p1[2])
+      \rstrcpy(p1, p1 + 1);
+  \r
+    else
+      \rp1[1] = '\0';
+  \r\rif (buffer1[0] == '~')
+    \r {
+    \rfor (p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/');
+          *(p2++) = *(p1++));
+    \r\r*p2 = '\0';
+    \r\rif (buffer2[0] == '\0')
+      \r {
+      \rchar *home = getenv("HOME");
+      \r\rif (home)
+        \r {
+        \rstrcpy(buffer2, home);
+        \r}
+      \r
+      else
+        \r {
+        \rstruct passwd *pw = getpwuid(getuid());        /* get entry */
+        \r\rif (!pw)
+          \r {
+          \r*translated = NULL;
+          \rreturn -1;
+          \r}
+        \r\rstrcpy(buffer2, pw->pw_dir);
+        \r}
+      \r\rstrcat(buffer2, p1);
+      \r}
+    \r}
+  \r
+  else if (*buffer1 != '/')
+    \r {
+    \r\rgetcwd(buffer2, PATH_MAX + 1);
+    \r\rif (*buffer1 == '.' && *(buffer1 + 1) == '/')
+      \r {
+      \rstrcat(buffer2, buffer1 + 1);
+      \r}
+    \r
+    else
+      \r {
+      \rstrcat(buffer2, "/");
+      \rstrcat(buffer2, buffer1);
+      \r}
+    \r}
+  \r
+  else
+    \r {
+    \rstrcpy(buffer2, buffer1);
+    \r}
+  \r\r
+      /*\r
+       * check for /..\r
+       */ \r
+      while ((p1 = strstr(buffer2, "/..")))
+    \r {
+    \rfor (p2 = p1; --p2 > buffer2 && *p2 != '/';);
+    \r\rif (*(p1 + 3))
+      \rmemmove(p2, p1 + 3, strlen(p1 + 3) + 1);
+    \r
+    else
+      \r*p2 = '\0';
+    \r}
+  \r\r
+      /*\r
+       * try to find links.\r
+       */ \r
+      p1 = strtok(buffer2, "/");
+  \r\r\r*buffer3 = '\0';
+  \r\rwhile (p1)
+    \r {
+    \rstrcat(buffer3, "/");
+    \rstrcat(buffer3, p1);
+    \r\rlen = readlink(buffer3, buffer1, PATH_MAX);
+    \r\rif (len != -1)
+      \r {
+      \r*(buffer1 + len) = '\0';
+      \rstrcpy(buffer3, buffer1);
+      \r}
+    \r\rp1 = strtok(NULL, "/");
+    \r}
+  \r\rif (!(*buffer3))
+    \rstrcpy(buffer3, "/");
+  \r\rlen = strlen(buffer3);
+  \r\rif (stat(buffer3, &buffer) || !S_ISDIR(buffer.st_mode))
+    \r {
+    \r*translated = NULL;
+    \rerrno = ENOTDIR;
+    \rreturn -1;
+    \r}
+  \r\r\r*translated = (char *) calloc(len + 1, sizeof(char));
+  \r\rif (!(*translated))
+    \r {
+    \r*translated = NULL;
+    \rreturn -1;
+    \r}
+  \r\rstrncpy(*translated, buffer3, len);
+  \r\rreturn len;
+\r}
+
 \r
-#ifndef WIN32\r
-int\r
-getpath(const char* file, char** path)\r
-{\r
-       char buffer1[PATH_MAX + 1] = {0};\r
-       char buffer2[PATH_MAX + 1] = {0};\r
-       char buffer3[PATH_MAX + 1] = {0};       \r
-       char *p1,*p2;\r
-       size_t len = strlen(file);\r
-       char* last_delimiter = NULL;\r
-       struct stat buffer = {0};               \r
-       \r
-       strncpy(buffer1, file, len);    \r
-       \r
-       /* remove the /////// */\r
-       while((p1 = strstr(buffer1, "//"))) \r
-       {\r
-               if(p1[2]) \r
-                       strcpy(p1, p1 + 1); \r
-               else \r
-                       p1[1] = '\0';\r
-       }\r
-       \r
-       if(*buffer1 == '~') \r
-       {\r
-               for(p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/'); *p2++ = *p1++);\r
-                       *p2 = '\0';                             \r
-               \r
-               if(buffer2[0] == '\0') \r
-               {\r
-                       char* home = getenv("HOME");\r
-       \r
-                       if(home) \r
-                       {\r
-                               strcpy(buffer2, home);          \r
-                       } \r
-                       else \r
-                       {\r
-                               struct passwd* pw = getpwuid(getuid());  \r
-                               \r
-                               if(!pw) \r
-                               {\r
-                                       *path = NULL;\r
-                                       return -1;      \r
-                               }\r
-                               \r
-                               strcpy(buffer2,pw->pw_dir);     \r
-                       }\r
-                       \r
-                       strcat(buffer2, p1);\r
-               } \r
-               \r
-       }\r
-       else if (buffer1[0] != '/') \r
-       {\r
-       \r
-               getcwd(buffer2, PATH_MAX + 1);  \r
-               \r
-               if(buffer1[0] == '.' && buffer1[1] == '/') \r
-               {       /* replace */\r
-                       strcat(buffer2, &buffer1[1]);           \r
-               } \r
-               else \r
-               {       \r
-                       strcat(buffer2, "/");                   \r
-                       strcat(buffer2, buffer1);               \r
-               }\r
-       } \r
-       else \r
-       {       \r
-               strcpy(buffer2, buffer1);                       /* copy */\r
-       }\r
-               \r
-       /*\r
-        * check for /..\r
-        */\r
-       while((p1 = strstr( buffer2, "/.." ))) \r
-       {\r
-               for( p2 = p1; --p2 > buffer2 && *p2 != '/'; );\r
-               \r
-               if (*(p1 + 3)) \r
-                       memmove(p2, p1+3, strlen(p1+3)+1);\r
-               else \r
-                       *p2 = '\0';\r
-       }\r
-       \r
-       /*\r
-        * try to find links, and resolve them.\r
-        */\r
-       p1 = strtok( buffer2, "/" );\r
-       \r
-       *buffer3 = '\0';\r
-       \r
-       while(p1) \r
-       {\r
-               strcat( buffer3, "/" );\r
-               strcat( buffer3, p1 );\r
-               \r
-               len = readlink(buffer3, buffer1, PATH_MAX);\r
-               \r
-               if (len != -1) \r
-               {\r
-                       *(buffer1 + len) = '\0';\r
-                       strcpy(buffer3, buffer1 );\r
-               }\r
-               \r
-               p1 = strtok( NULL, "/" );\r
-       }\r
-       \r
-       if(stat(buffer3, &buffer) || !S_ISREG(buffer.st_mode))\r
-       {\r
-               *path = NULL;\r
-               errno = ENOENT;\r
-               return -1;\r
-       }                                                               \r
-               \r
-       last_delimiter = strrchr(buffer3, '/');\r
-       \r
-       len = strlen(buffer3);\r
-       \r
-       if(last_delimiter)\r
-               len -=strlen(last_delimiter);                    \r
-       \r
-       *path = (char*) calloc(len + 1, sizeof(char));\r
-       \r
-       if(!(*path))\r
-       {\r
-               *path = NULL;\r
-               return -1;\r
-       }\r
-               \r
-       strncpy(*path, buffer3, len);\r
-\r
-       return len;\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 buffer3[PATH_MAX + 1] = {0};       \r
-       char *p1,*p2;\r
-       size_t len;     \r
-       struct stat buffer = {0};\r
-       \r
-       len = strlen(totranslate);                                              \r
-       \r
-       strncpy(buffer1, totranslate, len);     \r
-       \r
-       if(!strcmp(buffer1,"."))\r
-       {\r
-               *translated = getcwd(NULL,0);\r
-               return strlen(*translated);\r
-       }\r
-       else if(!strcmp(buffer1, "/.."))\r
-       {\r
-               *translated = strdup("/");\r
-               return strlen(*translated);\r
-       }\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[0] == '~') \r
-       {\r
-               for (p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/'); *(p2++) = *(p1++));\r
-               \r
-               *p2 = '\0';                             \r
-               \r
-               if(buffer2[0] == '\0') \r
-               {\r
-                       char* home = getenv("HOME");\r
-       \r
-                       if(home) \r
-                       {\r
-                               strcpy(buffer2, home);\r
-                       } \r
-                       else \r
-                       {\r
-                               struct passwd* pw = getpwuid(getuid());  /* get entry */\r
-                               \r
-                               if(!pw)\r
-                               {\r
-                                       *translated = NULL; \r
-                                       return -1;\r
-                               }\r
-                               \r
-                               strcpy(buffer2,pw->pw_dir);     \r
-                       }\r
-                       \r
-                       strcat(buffer2, p1);\r
-               } \r
-       }\r
-       else if (*buffer1 != '/') \r
-       {\r
-       \r
-               getcwd(buffer2, PATH_MAX + 1);\r
-               \r
-               if (*buffer1 == '.' && *(buffer1 + 1) == '/') \r
-               {\r
-                       strcat(buffer2, buffer1+1);             \r
-               } \r
-               else \r
-               {       \r
-                       strcat(buffer2, "/");                   \r
-                       strcat(buffer2, buffer1);               \r
-               }\r
-       } \r
-       else \r
-       {       \r
-               strcpy(buffer2, buffer1);                       \r
-       }\r
-       \r
-       /*\r
-        * check for /..\r
-        */\r
-       while((p1 = strstr( buffer2, "/.." ))) \r
-       {\r
-               for( p2 = p1; --p2 > buffer2 && *p2 != '/'; );\r
-               \r
-               if (*(p1 + 3)) \r
-                       memmove(p2, p1+3, strlen(p1+3)+1);\r
-               else \r
-                       *p2 = '\0';\r
-       }\r
-       \r
-       /*\r
-        * try to find links.\r
-        */\r
-       p1 = strtok( buffer2, "/" );\r
-       \r
-       \r
-       *buffer3 = '\0';\r
-       \r
-       while(p1) \r
-       {\r
-               strcat( buffer3, "/" );\r
-               strcat( buffer3, p1 );\r
-               \r
-               len = readlink(buffer3, buffer1, PATH_MAX);\r
-               \r
-               if (len != -1) \r
-               {\r
-                       *(buffer1 + len) = '\0';\r
-                       strcpy(buffer3, buffer1 );\r
-               }\r
-               \r
-               p1 = strtok( NULL, "/" );\r
-       }\r
-       \r
-       if (!(*buffer3)) \r
-               strcpy(buffer3, "/" );          \r
-       \r
-       len = strlen(buffer3);\r
-       \r
-       if(stat(buffer3, &buffer) || !S_ISDIR(buffer.st_mode))\r
-       {\r
-               *translated = NULL;\r
-               errno = ENOTDIR;\r
-               return -1;\r
-       }\r
-                                \r
-       \r
-       *translated = (char*) calloc(len + 1, sizeof(char));\r
-       \r
-       if(!(*translated))\r
-       {\r
-               *translated = NULL;\r
-               return -1;\r
-       }\r
-       \r
-       strncpy(*translated, buffer3, len);\r
-       \r
-       return len;\r
-}\r
-#else\r
-int\r
+#else   /* \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 +280,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,132 +294,144 @@ 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
-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
-       \r
-       struct stat stat_buf = {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
-               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
-       {\r
-               getcwd(buffer1, PATH_MAX + 1);\r
-               strcat(buffer1,"\\");\r
-               strcat(buffer1,totranslate);\r
-               \r
-               *translated = (char*) calloc(strlen(buffer1) + 1, sizeof(char));\r
-               strcpy(*translated, buffer1);\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
-       {\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
-       len = (int)strlen(buffer2);\r
-       \r
-       *translated = (char*) calloc(len + 1, sizeof(char));\r
-       \r
-       if(!(*translated))\r
-       {\r
-               *translated = NULL;\r
-               return -1;\r
-       }\r
-       \r
-       strncpy(*translated, buffer2, len);\r
-       \r
-       return len;\r
-}\r
-#endif\r
-\r
+}*/ \r
+\rint \r getpath(const char *file, char **path) \r
+{
+  \rchar buf1[PATH_MAX + 1] = { 0 };
+  \rchar buf2[PATH_MAX + 1] = { 0 };
+  \rstruct stat info = { 0 };
+  \r\rchar *delimiter;
+  \r\rif (!file)
+    \r {
+    \r*path = NULL;
+    \rreturn -1;
+    \r}
+  \r\rdelimiter = strrchr(file, '/');
+  \r\rif (!delimiter)
+    \rdelimiter = strrchr(file, '\\');
+  \r\rif (!delimiter)
+    \r {
+    \r*path = getcwd(NULL, 0);
+    \r}
+  \r
+  else
+    \r {
+    \rstrncpy(buf2, file, (delimiter - file));
+    \r\rif (translatepath(buf2, path) < 0)
+      \r {
+      \rif (errno == ENOTDIR)
+        \rerrno = ENOENT;
+      \r\rreturn -1;
+      \r}
+    \r}
+  \r\rsprintf(buf1, "%s\\%s", *path, delimiter ? delimiter + 1 : file);
+  \r\r\rif (stat(buf1, &info) || !S_ISREG(info.st_mode))
+    \r {
+    \rfree(*path);
+    \r*path = NULL;
+    \rerrno = ENOENT;
+    \rreturn -1;
+    \r}
+  \r\rreturn (int) strlen(*path);
+\r\r\r\rint \r translatepath(const char *totranslate, char **translated) \r
+{
+  \rchar buffer1[PATH_MAX + 1] = { 0 };
+  \rchar buffer2[PATH_MAX + 1] = { 0 };
+  \rchar *p1;
+  \rint i, len;
+  \r\rstruct stat stat_buf = { 0 };
+  \r\rlen = (int) strlen(totranslate);
+  \r\rstrncpy(buffer1, totranslate, len);
+  \r\rwhile ((p1 = strstr(buffer1, "//")))
+    \rif (p1[2])
+      \rstrcpy(p1, p1 + 1);
+  \r
+    else
+      \rp1[1] = '\0';
+  \r\rif (buffer1[strlen(buffer1) - 1] == '/'
+        || buffer1[strlen(buffer1) - 1] == '\\')
+    \rbuffer1[strlen(buffer1) - 1] = '\0';
+  \r\r
+      /* return the current directory */ \r
+      if (!strcmp(totranslate, ".") || !strcmp(totranslate, "./"))
+    \r {
+    \r*translated = getcwd(NULL, 0);
+    \rreturn (int) strlen(*translated);
+    \r}
+  \r
+      /* return the previous directory */ \r
+      else if (!strcmp(totranslate, "..") || !strcmp(totranslate, "../"))
+    \r {
+    \rgetcwd(buffer1, PATH_MAX + 1);
+    \rp1 = strrchr(buffer1, '\\');
+    \r*translated = (char *) calloc((p1 - buffer1) + 1, sizeof(char));
+    \rstrncpy(*translated, buffer1, (p1 - buffer1));
+    \r\rreturn (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\rreturn (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 {
+    \rfor (i = 0; buffer1[i] != '\0'; i++)
+      \r {
+      \rif (buffer1[i] == '/')
+        \rbuffer2[i] = '\\';
+      \r
+      else
+        \rbuffer2[i] = buffer1[i];
+      \r}
+    \r\rmemset(buffer1, 0, PATH_MAX + 1);
+    \rgetcwd(buffer1, PATH_MAX + 1);
+    \rstrcat(buffer1, "\\");
+    \rstrcat(buffer1, buffer2);
+    \r\r*translated = (char *) calloc(strlen(buffer1) + 1, sizeof(char));
+    \rstrcpy(*translated, buffer1);
+    \r\rreturn (int) strlen(*translated);
+    \r}
+  \r
+  else if (buffer1[0] == '~')
+    \r {
+    \r
+        /* TODO */ \r
+        *translated = NULL;
+    \rerrno = ENOSYS;
+    \rreturn -1;
+    \r}
+  \r
+  else if (*buffer1 == '.')
+    \r {
+    \r_fullpath(buffer2, buffer1, sizeof(buffer1));
+    \r}
+  \r
+  else
+    \rstrcpy(buffer2, buffer1);
+  \r\rif (stat(buffer2, &stat_buf) || !S_ISDIR(stat_buf.st_mode))
+    \r {
+    \r*translated = NULL;
+    \rerrno = ENOTDIR;
+    \rreturn -1;
+    \r}
+  \r\r\r\rlen = (int) strlen(buffer2);
+  \r\r\r\r*translated = (char *) calloc(len + 1, sizeof(char));
+  \rstrcpy(*translated, buffer2);
+  \r\rif (!(*translated))
+    \r {
+    \r*translated = NULL;
+    \rreturn -1;
+    \r}
+  \r\rreturn len;
+\r}
+
 \r
+#endif  /* \r */
+    \r\r