home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 April / PCWorld_2001-04_cd.bin / Software / TemaCD / junkbust / encode.c < prev    next >
C/C++ Source or Header  |  1998-10-30  |  3KB  |  158 lines

  1. char *encode_rcs = "$Id: encode.c,v 2.8 1998/10/23 02:13:27 ACJC Exp $";
  2. /* Written and copyright 1997 Anonymous Coders and Junkbusters Corporation.
  3.  * Distributed under the GNU General Public License; see the README file.
  4.  * This code comes with NO WARRANTY. http://www.junkbusters.com/ht/en/gpl.html
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <ctype.h>
  10.  
  11. #ifdef REGEX
  12. #include "gnu_regex.h"
  13. #endif
  14.  
  15. #include "jcc.h"
  16.  
  17. char *url_code_map[256];
  18. char *html_code_map[256];
  19. char *cookie_code_map[256];
  20.  
  21. char *
  22. url_encode(char **code_map, unsigned char *s)
  23. {
  24.     char *buf;
  25.     unsigned char c, *p;
  26.     char *m;
  27.  
  28.     static int one_shot = 1;
  29.  
  30.     if(one_shot) {
  31.         char tmp[BUFSIZ];
  32.  
  33.         /* initialize the code maps */
  34.  
  35.         int i;
  36.  
  37.         one_shot = 0;
  38.  
  39.         /* for cookies, we turn white-space into '+'
  40.          * hex encode comma and semi-colons
  41.          * and leave everything else alone.
  42.          */
  43.  
  44.         cookie_code_map[' '] = "+";
  45.  
  46.         sprintf(tmp, "%%%02X", ',');
  47.         cookie_code_map[','] = strdup(tmp);
  48.  
  49.         sprintf(tmp, "%%%02X", ';');
  50.         cookie_code_map[';'] = strdup(tmp);
  51.  
  52.         /* for url's, we do full URL encoding.        */
  53.         /* non-alphanumerics get turned into hex ...    */
  54.         for(i=0; i < 256; i++) {
  55.             if(isalnum(i) == 0) {
  56.                 sprintf(tmp, "%%%02X", i);
  57.                 url_code_map[i] = strdup(tmp);
  58.             }
  59.         }
  60.  
  61.         /* ... with the following 6 exceptions:        */
  62.         /* white-space gets turned into '+' ...        */
  63.  
  64.         url_code_map[' '] = "+";
  65.  
  66.         /* ... and these punctuation chars map to themselves */
  67.         url_code_map['-'] = "-";
  68.         url_code_map['_'] = "_";
  69.         url_code_map['.'] = ".";
  70.         url_code_map['*'] = "*";
  71.         url_code_map['@'] = "@";
  72.  
  73.         /* for html, we encode the four "special" characters */
  74.         html_code_map['"'] = """ ;
  75.         html_code_map['&'] = "&"  ;
  76.         html_code_map['>'] = ">"   ;
  77.         html_code_map['<'] = "<"   ;
  78.     }
  79.  
  80.     /* each input char can expand to at most 6 chars */
  81.     buf = zalloc((strlen((char *) s) + 1) * 6);
  82.  
  83.     for(p = (unsigned char *) buf; (c = *s); s++) {
  84.         if((m = code_map[c])) {
  85.             strcpy((char *) p, m);
  86.             p += strlen(m);
  87.         } else {
  88.             *p++ = c;
  89.         }
  90.     }
  91.  
  92.     *p = '\0';
  93.  
  94.     return(buf);
  95. }
  96.  
  97. /* these decode a URL */
  98.  
  99. int
  100. xdtoi(char d)
  101. {
  102.     if((d >= '0') && (d <= '9')) return(d - '0'     );
  103.     if((d >= 'a') && (d <= 'f')) return(d - 'a' + 10);
  104.     if((d >= 'A') && (d <= 'F')) return(d - 'A' + 10);
  105.     return(0);
  106. }
  107.  
  108. int
  109. xtoi(char *s)
  110. {
  111.     char d1, d2;
  112.     int ret = 0;
  113.  
  114.     if(isxdigit(*s)) {
  115.         d1 = *s++;
  116.         if(isxdigit(*s)) {
  117.             d2 = *s++;
  118.             
  119.             ret = (xdtoi(d1) * 16) + xdtoi(d2);
  120.         }
  121.     }
  122.  
  123.     return(ret);
  124. }
  125.  
  126. char *
  127. url_decode(char *str)
  128. {
  129.     char *ret = strdup(str);
  130.     char *p, *q;
  131.  
  132.     p = str;
  133.     q = ret;
  134.  
  135.     while(*p) {
  136.         switch(*p) {
  137.         case '+':
  138.             p++;
  139.             *q++ = ' ';
  140.             break;
  141.         case '%':
  142.             if((*q = xtoi(p+1))) {
  143.                 p += 3;
  144.                 q++;
  145.             } else {
  146.                 /* malformed, just use it */
  147.                 *q++ = *p++;
  148.             }
  149.             break;
  150.         default:
  151.             *q++ = *p++;
  152.             break;
  153.         }
  154.     }
  155.     *q = '\0';
  156.     return(ret);
  157. }
  158.