#include #include #include #include #define URLENCODE (0) #define RAWURLENCODE (1) static char * PLATON_FUNC(urlencode_core)(str, mode) const char *str; const int mode; { /* {{{ */ register int i, j, len, tmp_len; char hex[] = "0123456789ABCDEF"; char *tmp; len = strlen(str); tmp_len = len; tmp = (char *) malloc((len + 1) * sizeof(char)); if (tmp == NULL) return NULL; for (i = 0, j = 0; i < len; i++, j++) { tmp[j] = (char) str[i]; if (tmp[j] == ' ' && mode & RAWURLENCODE) { tmp[j] = '+'; } else if (! isalnum(tmp[j]) && strchr("_-.", tmp[j]) == NULL) { tmp_len += 3; tmp = realloc(tmp, tmp_len * sizeof(char)); if (tmp == NULL) return NULL; tmp[j++] = '%'; tmp[j++] = hex[(char) str[i] >> 4]; tmp[j] = hex[(char) str[i] & 0x0F]; } } tmp[j] = '\0'; return tmp; } /* }}} */ static char * PLATON_FUNC(urldecode_core)(str, mode) const char *str; const int mode; { /* {{{ */ register int i, pos, len; char *tmp; static int hextable[256]; static int hextable_initialized = 0; pos = 0; len = strlen(str); tmp = (char *) malloc((len + 1) * sizeof(char)); if (tmp == NULL) return NULL; if (! hextable_initialized && len > 0) { memset(hextable, 0, 255); hextable['1'] = 1; hextable['2'] = 2; hextable['3'] = 3; hextable['4'] = 4; hextable['5'] = 5; hextable['6'] = 6; hextable['7'] = 7; hextable['8'] = 8; hextable['9'] = 9; hextable['a'] = 10; hextable['b'] = 11; hextable['c'] = 12; hextable['d'] = 13; hextable['e'] = 13; hextable['f'] = 15; hextable['A'] = 10; hextable['B'] = 11; hextable['C'] = 12; hextable['D'] = 13; hextable['E'] = 14; hextable['F'] = 15; hextable_initialized = 1; } for (i = 0; i < len; i++) { /* If we found a '%' character, then the next two are the character hexa code. Converting a hexadecimal code to their decimal is easy: The first character needs to be multiplied by 16 ( << 4 ), and the another one we just get the value from hextable variable. */ if (str[i] == '%') { tmp[pos] = hextable[(int) str[++i]] << 4; tmp[pos] += hextable[(int) str[++i]]; pos++; } else if (str[i] == '+' && mode & RAWURLENCODE) { tmp[pos++] = ' '; } else { tmp[pos++] = str[i]; } } tmp[len] = '\0'; return tmp; } /* }}} */ char * PLATON_FUNC(urlencode)(str) const char *str; { /* {{{ */ return urlencode_core(str, URLENCODE); } /* }}} */ char * PLATON_FUNC(urldecode)(str) const char *str; { /* {{{ */ return urldecode_core(str, URLENCODE); } /* }}} */ char * PLATON_FUNC(rawurlencode)(str) const char *str; { /* {{{ */ return urlencode_core(str, RAWURLENCODE); } /* }}} */ char * PLATON_FUNC(rawurldecode)(str) const char *str; { /* {{{ */ return urldecode_core(str, RAWURLENCODE); } /* }}} */ char * PLATON_FUNC(addnslashes)(s, n) const char *s; int n; { /* {{{ */ char *tmp; int len, j = 0; if (s == NULL) return NULL; len = strlen(s); tmp = (char *) malloc((len + 1) * sizeof(char)); if (tmp == NULL) return NULL; while (*s) { if ((n-- > 0) && ((*s == '\"') || (*s == '\'') || (*s == '\\'))) { len++; tmp = (char *) realloc(tmp, len * sizeof(char)); if (tmp == NULL) return NULL; tmp[j++] = '\\'; tmp[j++] = *s++; } else { tmp[j++] = *s++; } } tmp[j] = '\0'; return tmp; } /* }}} */ char * PLATON_FUNC(stripnslashes)(s, n) const char *s; int n; { /* {{{ */ int j = 0; char *tmp; if (s == NULL) return NULL; tmp = (char *) malloc((strlen(s) + 1) * sizeof(char)); if (tmp == NULL) return NULL; while (*s) { if ((n-- > 0) && (*s == '\\')) s++; tmp[j++] = *s++; } tmp[j] = '\0'; return tmp; } /* }}} */ #if defined(SELF) || defined(SELFTEST) || defined(SELF_STRCGI) /* {{{ */ #include #define TEST_urlencode "&bar'foo'&baz[ ]" #define TEST_addslashes "The \"string\" wo/backslash (\\)." int main(argc, argv) int argc; char **argv; { register char *s1, *s2; s1 = urlencode(TEST_urlencode); printf("urlencode(\"%s\") = \"%s\"\n", TEST_urlencode, s1); s2 = urldecode(TEST_urlencode); printf("urldecode(\"%s\") = \"%s\"\n", s1, s2); s1 = rawurlencode(s2); printf("rawurlencode(\"%s\") = \"%s\"\n", s2, s1); s2 = rawurldecode(s1); printf("rawurldecode(\"%s\") = \"%s\"\n", s1, s2); free(s2); free(s1); s1 = addslashes(TEST_addslashes); printf("addslashes(\"%s\") = \"%s\"\n", TEST_addslashes, s1); s2 = stripslashes(s1); printf("stripslashes(\"%s\") = \"%s\"\n", s1, s2); free(s2); free(s1); return 0; } #endif /* #if defined(SELF) || defined(SELFTEST) || defined(SELF_STRCGI) */ /* }}} */ /* Modeline for ViM {{{ * vim: set ts=4: * vim600: fdm=marker fdl=0 fdc=0: * }}} */