|
version 1.1.1.1.2.1, 2012/03/09 12:33:07
|
version 1.3.2.1, 2012/08/06 11:08:08
|
|
Line 44 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF TH
|
Line 44 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF TH
|
| SUCH DAMAGE. |
SUCH DAMAGE. |
| */ |
*/ |
| #include "global.h" |
#include "global.h" |
| #include "tools.h" |
|
| |
|
| |
|
| |
/* |
| |
* www_cmp() - Compare two string |
| |
* |
| |
* @ct = content text from www |
| |
* @s = string |
| |
* return: 0 are equal or !0 are different |
| |
*/ |
| int |
int |
| www_cmp(const char *ct, const char *s) |
www_cmp(const char *ct, const char *s) |
| { |
{ |
|
Line 54 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 67 www_cmp(const char *ct, const char *s)
|
Line 73 www_cmp(const char *ct, const char *s)
|
| return strncasecmp(ct, s, sc - ct); |
return strncasecmp(ct, s, sc - ct); |
| } |
} |
| |
|
| |
/* |
| |
* www_cmptype() - Compare context type |
| |
* |
| |
* @ct = content text from www |
| |
* @type = content type |
| |
* return: 0 are equal or !0 are different |
| |
*/ |
| int |
int |
| www_cmptype(const char *ct, const char *type) |
www_cmptype(const char *ct, const char *type) |
| { |
{ |
|
Line 74 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 85 www_cmptype(const char *ct, const char *type)
|
Line 98 www_cmptype(const char *ct, const char *type)
|
| return strncasecmp(ct, type, sl - ct); |
return strncasecmp(ct, type, sl - ct); |
| } |
} |
| |
|
| char * | /* |
| | * www_getpair() - Get AV pair from WWW query string |
| | * |
| | * @str = query string |
| | * @delim = delimiter |
| | * return: NULL error or AV pair, must be io_free() after use! |
| | */ |
| | ait_val_t * |
| www_getpair(char ** __restrict str, const char *delim) |
www_getpair(char ** __restrict str, const char *delim) |
| { |
{ |
| char *tr, *s = NULL; | char *tr; |
| int cx; |
int cx; |
| |
ait_val_t *s; |
| |
|
| assert(str && *str && delim); |
assert(str && *str && delim); |
| |
|
| cx = strcspn(*str, delim); | s = io_allocVar(); |
| tr = *str + cx; | |
| |
| s = malloc(cx + 1); | |
| if (!s) { |
if (!s) { |
| LOGERR; | www_SetErr(io_GetErrno(), "%s", io_GetError()); |
| return NULL; |
return NULL; |
| } else { |
|
| strncpy(s, *str, cx); |
|
| s[cx] = 0; |
|
| } |
} |
| |
|
| *str = tr; | cx = strcspn(*str, delim); |
| if (**str) | tr = *str + cx; |
| (*str)++; | if (*tr) |
| | *tr++ = 0; |
| |
|
| |
AIT_SET_STR(s, *str); |
| |
|
| |
*str = tr; |
| return s; |
return s; |
| } |
} |
| |
|
| |
/* |
| |
* www_x2c() - Hex from string to digit |
| |
* |
| |
* @str = string |
| |
* return: digit |
| |
*/ |
| inline char |
inline char |
| www_x2c(const char *str) |
www_x2c(const char *str) |
| { |
{ |
|
Line 126 www_x2c(const char *str)
|
Line 151 www_x2c(const char *str)
|
| return digit; |
return digit; |
| } |
} |
| |
|
| |
/* |
| |
* www_unescape() - Unescape/decode WWW query string to host string |
| |
* |
| |
* @str = string |
| |
* return: none |
| |
*/ |
| inline void |
inline void |
| www_unescape(char * __restrict str) |
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 145 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; |
| |
} |
| } |
} |