123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- /*
- +----------------------------------------------------------------------+
- | PHP Version 7 |
- +----------------------------------------------------------------------+
- | Copyright (c) 1997-2018 The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.01 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available through the world-wide-web at the following url: |
- | http://www.php.net/license/3_01.txt |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Author: Jim Winstead <jimw@php.net> |
- +----------------------------------------------------------------------+
- */
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include <sys/types.h>
- char *replace_controlchars_ex(char *str, size_t len)
- {
- unsigned char *s = (unsigned char *)str;
- unsigned char *e = (unsigned char *)str + len;
- if (!str) {
- return (NULL);
- }
- while (s < e) {
- if (iscntrl(*s)) {
- *s='_';
- }
- s++;
- }
- return (str);
- }
- char *replace_controlchars(char *str)
- {
- return replace_controlchars_ex(str, strlen(str));
- }
- static int htoi(char *s)
- {
- int value;
- int c;
- c = ((unsigned char *)s)[0];
- if (isupper(c))
- c = tolower(c);
- value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16;
- c = ((unsigned char *)s)[1];
- if (isupper(c))
- c = tolower(c);
- value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10;
- return (value);
- }
- /* rfc1738:
- ...The characters ";",
- "/", "?", ":", "@", "=" and "&" are the characters which may be
- reserved for special meaning within a scheme...
- ...Thus, only alphanumerics, the special characters "$-_.+!*'(),", and
- reserved characters used for their reserved purposes may be used
- unencoded within a URL...
- For added safety, we only leave -_. unencoded.
- */
- static unsigned char hexchars[] = "0123456789ABCDEF";
- void url_encode(char const *s, size_t len, char *out, size_t *out_len)
- {
- register unsigned char c;
- unsigned char *to;
- unsigned char const *from, *end;
- from = (unsigned char *)s;
- end = (unsigned char *)s + len;
- to = (unsigned char *)out;
- while (from < end) {
- c = *from++;
- if (c == ' ') {
- *to++ = '+';
- } else if ((c < '0' && c != '-' && c != '.') ||
- (c < 'A' && c > '9') ||
- (c > 'Z' && c < 'a' && c != '_') ||
- (c > 'z')) {
- to[0] = '%';
- to[1] = hexchars[c >> 4];
- to[2] = hexchars[c & 15];
- to += 3;
- } else {
- *to++ = c;
- }
- }
- *to = '\0';
- *out_len = (char *)to - out;
- }
- void url_decode(char *str, size_t len, char *out, size_t *out_len)
- {
- char *data = str;
- char *dest = out;
- while (len--) {
- if (*data == '+') {
- *dest = ' ';
- }
- else if (*data == '%' && len >= 2 && isxdigit((int) *(data + 1))
- && isxdigit((int) *(data + 2))) {
- *dest = (char) htoi(data + 1);
- data += 2;
- len -= 2;
- } else {
- *dest = *data;
- }
- data++;
- dest++;
- }
- *dest = '\0';
- *out_len = dest - out;
- }
- void raw_url_encode(char const *s, size_t len, char *out, size_t *out_len)
- {
- register size_t x, y;
- char *ret = out;
- for (x = 0, y = 0; len--; x++, y++) {
- char c = s[x];
- ret[y] = c;
- if ((c < '0' && c != '-' && c != '.') ||
- (c < 'A' && c > '9') ||
- (c > 'Z' && c < 'a' && c != '_') ||
- (c > 'z' && c != '~')) {
- ret[y++] = '%';
- ret[y++] = hexchars[(unsigned char) c >> 4];
- ret[y] = hexchars[(unsigned char) c & 15];
- }
- }
- ret[y] = '\0';
- *out_len = ret - out;
- }
- void raw_url_decode(char *str, size_t len, char *out, size_t *out_len)
- {
- char *dest = out;
- char *data = str;
- while (len--) {
- if (*data == '%' && len >= 2 && isxdigit((int) *(data + 1))
- && isxdigit((int) *(data + 2))) {
- *dest = (char) htoi(data + 1);
- data += 2;
- len -= 2;
- } else {
- *dest = *data;
- }
- data++;
- dest++;
- }
- *dest = '\0';
- *out_len = dest - out;
- }
- /*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
|