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
192 if (buffer1[0] == '~')
\r
194 for (p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/'); *(p2++) = *(p1++));
\r
198 if(buffer2[0] == '\0')
\r
200 char* home = getenv("HOME");
\r
204 strcpy(buffer2, home);
\r
208 struct passwd* pw = getpwuid(getuid()); /* get entry */
\r
212 *translated = NULL;
\r
216 strcpy(buffer2,pw->pw_dir);
\r
219 strcat(buffer2, p1);
\r
222 else if (*buffer1 != '/')
\r
225 getcwd(buffer2, PATH_MAX + 1);
\r
227 if (*buffer1 == '.' && *(buffer1 + 1) == '/')
\r
229 strcat(buffer2, buffer1+1);
\r
233 strcat(buffer2, "/");
\r
234 strcat(buffer2, buffer1);
\r
239 strcpy(buffer2, buffer1);
\r
245 while((p1 = strstr( buffer2, "/.." )))
\r
247 for( p2 = p1; --p2 > buffer2 && *p2 != '/'; );
\r
250 memmove(p2, p1+3, strlen(p1+3)+1);
\r
256 * try to find links.
\r
258 p1 = strtok( buffer2, "/" );
\r
265 strcat( buffer3, "/" );
\r
266 strcat( buffer3, p1 );
\r
268 len = readlink(buffer3, buffer1, PATH_MAX);
\r
272 *(buffer1 + len) = '\0';
\r
273 strcpy(buffer3, buffer1 );
\r
276 p1 = strtok( NULL, "/" );
\r
280 strcpy(buffer3, "/" );
\r
282 len = strlen(buffer3);
\r
284 if(stat(buffer3, &buffer) || !S_ISDIR(buffer.st_mode))
\r
286 *translated = NULL;
\r
292 *translated = (char*) calloc(len + 1, sizeof(char));
\r
296 *translated = NULL;
\r
300 strncpy(*translated, buffer3, len);
\r
306 getpath(const char* file, char** path)
\r
310 char buffer[PATH_MAX + 1] = {0};
\r
311 struct stat info = {0};
\r
313 len = GetFullPathName(file, PATH_MAX, buffer, &part );
\r
322 if(stat(buffer, &info) || !S_ISREG(info.st_mode))
\r
329 *path = (char*)calloc(strlen(buffer) - strlen(part), sizeof(char));
\r
332 *path = strncpy(*path, buffer, strlen(buffer) - strlen(part) - 1);
\r
334 return (int)(strlen(buffer) - strlen(part) -1);
\r
338 translatepath(const char* totranslate, char** translated)
\r