+\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
+ if(!len)\r
+ {\r
+ *path = NULL;\r
+ return -1;\r
+ }\r
+ \r
+ if(stat(buffer, &info) || !S_ISREG(info.st_mode))\r
+ {\r
+ *path = NULL;\r
+ errno = ENOENT;\r
+ return -1;\r
+ } \r
+ \r
+ *path = (char*)calloc(strlen(buffer) - strlen(part), sizeof(char));\r
+\r
+\r
+ *path = strncpy(*path, buffer, strlen(buffer) - strlen(part) - 1);\r
+\r
+ return (int)(strlen(buffer) - strlen(part) -1);\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}