3 /*#include <stdlib.h>
\r
8 #include <sys/types.h>
\r
9 #include <sys/stat.h>
\r
17 #include <getpath.h>
\r
20 #define PATH_MAX 255
\r
25 getpath(const char* file, char** path)
\r
27 char buffer1[PATH_MAX + 1] = {0};
\r
28 char buffer2[PATH_MAX + 1] = {0};
\r
29 char buffer3[PATH_MAX + 1] = {0};
\r
31 size_t len = strlen(file);
\r
32 char* last_delimiter = NULL;
\r
33 struct stat buffer = {0};
\r
35 strncpy(buffer1, file, len);
\r
37 /* remove the /////// */
\r
38 while((p1 = strstr(buffer1, "//")))
\r
41 strcpy(p1, p1 + 1);
\r
46 if(*buffer1 == '~')
\r
48 for(p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/'); *p2++ = *p1++);
\r
51 if(buffer2[0] == '\0')
\r
53 char* home = getenv("HOME");
\r
57 strcpy(buffer2, home);
\r
61 struct passwd* pw = getpwuid(getuid());
\r
69 strcpy(buffer2,pw->pw_dir);
\r
72 strcat(buffer2, p1);
\r
76 else if (buffer1[0] != '/')
\r
79 getcwd(buffer2, PATH_MAX + 1);
\r
81 if(buffer1[0] == '.' && buffer1[1] == '/')
\r
83 strcat(buffer2, &buffer1[1]);
\r
87 strcat(buffer2, "/");
\r
88 strcat(buffer2, buffer1);
\r
93 strcpy(buffer2, buffer1); /* copy */
\r
99 while((p1 = strstr( buffer2, "/.." )))
\r
101 for( p2 = p1; --p2 > buffer2 && *p2 != '/'; );
\r
104 memmove(p2, p1+3, strlen(p1+3)+1);
\r
110 * try to find links, and resolve them.
\r
112 p1 = strtok( buffer2, "/" );
\r
118 strcat( buffer3, "/" );
\r
119 strcat( buffer3, p1 );
\r
121 len = readlink(buffer3, buffer1, PATH_MAX);
\r
125 *(buffer1 + len) = '\0';
\r
126 strcpy(buffer3, buffer1 );
\r
129 p1 = strtok( NULL, "/" );
\r
132 if(stat(buffer3, &buffer) || !S_ISREG(buffer.st_mode))
\r
139 last_delimiter = strrchr(buffer3, '/');
\r
141 len = strlen(buffer3);
\r
144 len -=strlen(last_delimiter);
\r
146 *path = (char*) calloc(len + 1, sizeof(char));
\r
154 strncpy(*path, buffer3, len);
\r
160 translatepath(const char* totranslate, char** translated)
\r
162 char buffer1[PATH_MAX + 1] = {0};
\r
163 char buffer2[PATH_MAX + 1] = {0};
\r
164 char buffer3[PATH_MAX + 1] = {0};
\r
167 struct stat buffer = {0};
\r
169 len = strlen(totranslate);
\r
171 strncpy(buffer1, totranslate, len);
\r
173 if(!strcmp(buffer1,"."))
\r
175 *translated = getcwd(NULL,0);
\r
176 return strlen(*translated);
\r
178 else if(!strcmp(buffer1, "/.."))
\r
180 *translated = strdup("/");
\r
181 return strlen(*translated);
\r
184 while((p1 = strstr(buffer1, "//")))
\r
186 strcpy(p1, p1 + 1);
\r
190 if (buffer1[0] == '~')
\r
192 for (p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/'); *(p2++) = *(p1++));
\r
196 if(buffer2[0] == '\0')
\r
198 char* home = getenv("HOME");
\r
202 strcpy(buffer2, home);
\r
206 struct passwd* pw = getpwuid(getuid()); /* get entry */
\r
210 *translated = NULL;
\r
214 strcpy(buffer2,pw->pw_dir);
\r
217 strcat(buffer2, p1);
\r
220 else if (*buffer1 != '/')
\r
223 getcwd(buffer2, PATH_MAX + 1);
\r
225 if (*buffer1 == '.' && *(buffer1 + 1) == '/')
\r
227 strcat(buffer2, buffer1+1);
\r
231 strcat(buffer2, "/");
\r
232 strcat(buffer2, buffer1);
\r
237 strcpy(buffer2, buffer1);
\r
243 while((p1 = strstr( buffer2, "/.." )))
\r
245 for( p2 = p1; --p2 > buffer2 && *p2 != '/'; );
\r
248 memmove(p2, p1+3, strlen(p1+3)+1);
\r
254 * try to find links.
\r
256 p1 = strtok( buffer2, "/" );
\r
263 strcat( buffer3, "/" );
\r
264 strcat( buffer3, p1 );
\r
266 len = readlink(buffer3, buffer1, PATH_MAX);
\r
270 *(buffer1 + len) = '\0';
\r
271 strcpy(buffer3, buffer1 );
\r
274 p1 = strtok( NULL, "/" );
\r
278 strcpy(buffer3, "/" );
\r
280 len = strlen(buffer3);
\r
282 if(stat(buffer3, &buffer) || !S_ISDIR(buffer.st_mode))
\r
284 *translated = NULL;
\r
290 *translated = (char*) calloc(len + 1, sizeof(char));
\r
294 *translated = NULL;
\r
298 strncpy(*translated, buffer3, len);
\r
304 getpath(const char* file, char** path)
\r
308 char buffer[PATH_MAX + 1] = {0};
\r
309 struct stat info = {0};
\r
311 len = GetFullPathName(file, PATH_MAX, buffer, &part );
\r
320 if(stat(buffer, &info) || !S_ISREG(info.st_mode))
\r
327 *path = (char*)calloc(strlen(buffer) - strlen(part), sizeof(char));
\r
330 *path = strncpy(*path, buffer, strlen(buffer) - strlen(part) - 1);
\r
332 return (int)(strlen(buffer) - strlen(part) -1);
\r
336 translatepath(const char* totranslate, char** translated)
\r
338 char buffer1[PATH_MAX + 1] = {0};
\r
339 char buffer2[PATH_MAX + 1] = {0};
\r
343 struct stat stat_buf = {0};
\r
345 /* return the current directory */
\r
346 if(!strcmp(totranslate,".") || !strcmp(totranslate,"./"))
\r
348 *translated = getcwd(NULL,0);
\r
349 return (int)strlen(*translated);
\r
351 /* return the previous directory */
\r
352 else if(!strcmp(totranslate,"..") || !strcmp(totranslate,"../"))
\r
354 getcwd(buffer1, PATH_MAX + 1);
\r
355 p1 = strrchr(buffer1, '\\');
\r
356 *translated = (char*) calloc((p1 - buffer1) + 1, sizeof(char));
\r
357 strncpy(*translated, buffer1, (p1 - buffer1));
\r
359 return (int)strlen(*translated);
\r
361 /* return the root directory */
\r
362 else if(!strcmp(totranslate, "/"))
\r
364 *translated = getcwd(NULL,0);
\r
365 (*translated)[2] = '\0';
\r
366 return (int)strlen(*translated);
\r
368 /* it's a relative directory name build the full directory name */
\r
369 else if(!strchr(totranslate, '/') && !strchr(totranslate, '\\') && !stat(totranslate, &stat_buf) && S_ISDIR(stat_buf.st_mode))
\r
371 getcwd(buffer1, PATH_MAX + 1);
\r
372 strcat(buffer1,"\\");
\r
373 strcat(buffer1,totranslate);
\r
375 *translated = (char*) calloc(strlen(buffer1) + 1, sizeof(char));
\r
376 strcpy(*translated, buffer1);
\r
378 return (int)strlen(*translated);
\r
381 len = (int)strlen(totranslate);
\r
383 strncpy(buffer1, totranslate, len);
\r
385 if(buffer1[strlen(buffer1) - 1] == '/' || buffer1[strlen(buffer1) - 1] == '\\')
\r
386 buffer1[strlen(buffer1) - 1] = '\0';
\r
388 while((p1 = strstr(buffer1, "//")))
\r
390 strcpy(p1, p1 + 1);
\r
394 for(i = 0, j = 0; buffer1[i] !='\0'; i++)
\r
396 if(buffer1[i] == '/')
\r
405 if(j == 1 && buffer1[i - 1] == '/')
\r
407 /* perhaps it's a relative directory : `dir/' */
\r
408 strncpy(buffer2, buffer1, strlen(buffer1) - 1);
\r
410 if(!stat(buffer2, &stat_buf) && S_ISDIR(stat_buf.st_mode))
\r
412 getcwd(buffer1, PATH_MAX + 1);
\r
413 strcat(buffer1,"\\");
\r
414 strcat(buffer1,buffer2);
\r
416 *translated = (char*) calloc(strlen(buffer1) + 1, sizeof(char));
\r
417 strcpy(*translated, buffer1);
\r
419 return (int)strlen(*translated);
\r
422 memset(buffer2, 0, PATH_MAX + 1);
\r
426 if(buffer1[0] == '~')
\r
429 *translated = NULL;
\r
433 else if (*buffer1 == '.')
\r
435 _fullpath(buffer2, buffer1, sizeof(buffer1));
\r
438 strcpy(buffer2, buffer1);
\r
440 if(stat(buffer2, &stat_buf) || !S_ISDIR(stat_buf.st_mode))
\r
442 *translated = NULL;
\r
447 len = (int)strlen(buffer2);
\r
449 *translated = (char*) calloc(len + 1, sizeof(char));
\r
453 *translated = NULL;
\r