|
|
| version 1.2.6.2, 2012/07/31 22:59:33 | version 1.3.2.1, 2012/08/06 11:08:08 |
|---|---|
| Line 60 www_cmp(const char *ct, const char *s) | Line 60 www_cmp(const char *ct, const char *s) |
| assert(ct && s); | assert(ct && s); |
| while (isspace(*ct)) | while (isspace((int) *ct)) |
| ct++; | ct++; |
| if (!(sc = strchr(ct, ';'))) | if (!(sc = strchr(ct, ';'))) |
| sc = strchr(ct, '\x0'); | sc = strchr(ct, '\x0'); |
| while (isspace(*(sc - 1))) | while (isspace((int) *(sc - 1))) |
| sc--; | sc--; |
| if (strlen(s) != sc - ct) | if (strlen(s) != sc - ct) |
| Line 87 www_cmptype(const char *ct, const char *type) | Line 87 www_cmptype(const char *ct, const char *type) |
| assert(ct && type); | assert(ct && type); |
| while (isspace(*ct)) | while (isspace((int) *ct)) |
| ct++; | ct++; |
| if (!(sl = strchr(ct, '/'))) | if (!(sl = strchr(ct, '/'))) |
| Line 162 www_unescape(char * __restrict str) | Line 162 www_unescape(char * __restrict str) |
| { | { |
| register int i, j; | register int i, j; |
| assert(str); | if (!str) |
| return; | |
| for (i = j = 0; str[j]; i++, j++) { | for (i = j = 0; str[j]; i++, j++) { |
| str[i] = str[j]; | str[i] = str[j]; |
| Line 176 www_unescape(char * __restrict str) | Line 177 www_unescape(char * __restrict str) |
| } | } |
| str[i] = 0; | str[i] = 0; |
| } | |
| /* | |
| * www_undot() - Undotted and clean WWW query filename | |
| * | |
| * @fname = query filename | |
| * return: none | |
| */ | |
| void | |
| www_undot(const char * __restrict fname) | |
| { | |
| char *s, *s2; | |
| int l; | |
| if (!fname) | |
| return; | |
| /* collapse / sequences */ | |
| if ((s = strstr(fname, "//"))) { | |
| s2 = s + 1; | |
| for (s2 = ++s; *s2 == '/'; s2++); | |
| memmove(s, s2, strlen(s2) + 1); | |
| } | |
| /* escaped ./ and /./ sequences */ | |
| while (!strncmp(fname, "./", 2)) | |
| memmove((void*) fname, fname + 2, strlen(fname + 1)); | |
| while ((s = strstr(fname, "/./"))) | |
| memmove(s, s + 2, strlen(s + 1)); | |
| /* alternate between removing leading ../ and removing xxx/../ */ | |
| while (42) { | |
| while (!strncmp(fname, "../", 3)) | |
| memmove((void*) fname, fname + 3, strlen(fname + 2)); | |
| if (!(s = strstr(fname, "/../"))) | |
| break; | |
| for (s2 = s - 1; s2 >= fname && *s2 != '/'; --s2); | |
| memmove(s2 + 1, s + 4, strlen(s + 3)); | |
| } | |
| /* elide any /.. at the end */ | |
| while ((l = strlen(fname)) > 3 && | |
| !strcmp((s = (char*) fname + l - 3), "/..")) { | |
| for (s2 = s - 1; s2 >= fname && *s2 != '/'; --s2); | |
| if (s2 < fname) | |
| break; | |
| *s2 = 0; | |
| } | |
| } | } |