Sean CaronStyle cleanup48148178 years agoHistory
115 lines · 2.2 KB · C
RawDownload
/* bijou HTTP server for plan 9 by sean caron (scaron@umich.edu) */ #include "main.h" int uri_encode(char *ip, char **op) {    int i, j, t;    char temp[4];    int ol;     ol = strlen(ip);     *op = malloc ( sizeof(char) * (ol+1) );     if (*op == 0) {        exits("MALLOC");    }     i = 0;    j = 0;     /* catch null input */    if (strlen(ip) == 0) {        strcpy(*op, "");        return 0;    }     while (1) {        /* just pass unreserved characters through with no encoding */         if (((ip[i] >= 43) && (ip[i] <= 47)) || (ip[i] == 95) || (ip[i] == 126) || ((ip[i] >= 48) && (ip[i] <= 57)) || ((ip[i] >= 65) && (ip[i] <= 90)) || ((ip[i] >= 97) && (ip[i] <= 122))) {            *(*op+j) = ip[i];             i = i + 1;            j = j + 1;        }         /* otherwise express it in the uri encoded format */        else {            ol = ol + 3;             *op = realloc(*op, sizeof(char)*(ol+1) );             if (*op == 0) {                exits("REALLOC");            }             sprintf(temp, "%2.0x", ip[i] );             *(*op+j) = '%';            *(*op+j+1) = temp[0];            *(*op+j+2) = temp[1];             i = i + 1;            j = j + 3;        }         if (i == strlen(ip)) {            break;        }    }     *(*op+j) = '\0';     return 0;} int uri_decode(char *ip, char **op) {    int i, j, t;    char temp[4];     *op = malloc ( sizeof(char) * (strlen(ip)+1) );     if (*op == 0) {        exits("MALLOC");    }     i = 0;    j = 0;     /* catch null input */    if (strlen(ip) == 0) {        strcpy(*op, "");        return 0;    }     while (1) {        if ((ip[i] == '%') && isxdigit(ip[i+1]) && isxdigit(ip[i+2])) {            // ascii value of the encoded char is in ip[i+1] and ip[i+2] in hex; ip[i+1] is MSB.            sprintf(temp, "%c%c", ip[i+1], ip[i+2] );             t = (int)strtol(temp, (char**)NULL, 16);             *(*op+j) = (char)t;             i = i + 3;            j = j + 1;        }         else {            *(*op+j) = ip[i];             i = i + 1;            j = j + 1;        }         if (i == strlen(ip)) {            break;        }    }     *(*op+j) = '\0';     return 0;}