15 getpath(const char* file, char** path)
17 char buffer1[MAX_PATH + 1] = {0};
18 char buffer2[MAX_PATH + 1] = {0};
19 char buffer3[MAX_PATH + 1] = {0};
21 size_t len = strlen(file);
22 char* last_delimiter = NULL;
23 struct stat buffer = {0};
25 strncpy(buffer1, file, len);
27 /* remove the /////// */
28 while((p1 = strstr(buffer1, "//")))
38 for(p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/'); *p2++ = *p1++);
41 if(buffer2[0] == '\0')
43 char* home = getenv("HOME");
47 strcpy(buffer2, home);
51 struct passwd* pw = getpwuid(getuid());
59 strcpy(buffer2,pw->pw_dir);
66 else if (buffer1[0] != '/')
69 getcwd(buffer2, MAX_PATH + 1);
71 if(buffer1[0] == '.' && buffer1[1] == '/')
73 strcat(buffer2, &buffer1[1]);
78 strcat(buffer2, buffer1);
83 strcpy(buffer2, buffer1); /* copy */
89 while((p1 = strstr( buffer2, "/.." )))
91 for( p2 = p1; --p2 > buffer2 && *p2 != '/'; );
100 * try to find links, and resolve them.
102 p1 = strtok( buffer2, "/" );
108 strcat( buffer3, "/" );
109 strcat( buffer3, p1 );
111 len = readlink(buffer3, buffer1, MAX_PATH);
115 *(buffer1 + len) = '\0';
116 strcpy(buffer3, buffer1 );
119 p1 = strtok( NULL, "/" );
122 if(stat(buffer3, &buffer) || !S_ISREG(buffer.st_mode))
129 last_delimiter = strrchr(buffer3, '/');
131 len = strlen(buffer3);
134 len -=strlen(last_delimiter);
136 *path = (char*) calloc(len + 1, sizeof(char));
144 strncpy(*path, buffer3, len);
152 translatepath(const char* totranslate, char** translated)
154 char buffer1[MAX_PATH + 1] = {0};
155 char buffer2[MAX_PATH + 1] = {0};
156 char buffer3[MAX_PATH + 1] = {0};
159 struct stat buffer = {0};
161 len = strlen(totranslate);
163 strncpy(buffer1, totranslate, len);
165 if(!strcmp(buffer1,"."))
167 *translated = getcwd(NULL,0);
168 return strlen(*translated);
170 else if(!strcmp(buffer1, "/.."))
172 *translated = strdup("/");
173 return strlen(*translated);
176 while((p1 = strstr(buffer1, "//")))
184 if (buffer1[0] == '~')
186 for (p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/'); *(p2++) = *(p1++));
190 if(buffer2[0] == '\0')
192 char* home = getenv("HOME");
196 strcpy(buffer2, home);
200 struct passwd* pw = getpwuid(getuid()); /* get entry */
208 strcpy(buffer2,pw->pw_dir);
214 else if (*buffer1 != '/')
217 getcwd(buffer2, MAX_PATH + 1);
219 if (*buffer1 == '.' && *(buffer1 + 1) == '/')
221 strcat(buffer2, buffer1+1);
225 strcat(buffer2, "/");
226 strcat(buffer2, buffer1);
231 strcpy(buffer2, buffer1);
237 while((p1 = strstr( buffer2, "/.." )))
239 for( p2 = p1; --p2 > buffer2 && *p2 != '/'; );
250 p1 = strtok( buffer2, "/" );
257 strcat( buffer3, "/" );
258 strcat( buffer3, p1 );
260 len = readlink(buffer3, buffer1, MAX_PATH);
264 *(buffer1 + len) = '\0';
265 strcpy(buffer3, buffer1 );
268 p1 = strtok( NULL, "/" );
272 strcpy(buffer3, "/" );
274 len = strlen(buffer3);
276 if(stat(buffer3, &buffer) || !S_ISDIR(buffer.st_mode))
284 *translated = (char*) calloc(len + 1, sizeof(char));
292 strncpy(*translated, buffer3, len);