encode.c
上传用户:qunlip
上传日期:2007-01-04
资源大小:203k
文件大小:3k
源码类别:

代理服务器

开发平台:

Visual C++

  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. #include <stdio.h>
  7. #include <string.h>
  8. #include <ctype.h>
  9. #ifdef REGEX
  10. #include "gnu_regex.h"
  11. #endif
  12. #include "jcc.h"
  13. char *url_code_map[256];
  14. char *html_code_map[256];
  15. char *cookie_code_map[256];
  16. char *
  17. url_encode(char **code_map, unsigned char *s)
  18. {
  19. char *buf;
  20. unsigned char c, *p;
  21. char *m;
  22. static int one_shot = 1;
  23. if(one_shot) {
  24. char tmp[BUFSIZ];
  25. /* initialize the code maps */
  26. int i;
  27. one_shot = 0;
  28. /* for cookies, we turn white-space into '+'
  29.  * hex encode comma and semi-colons
  30.  * and leave everything else alone.
  31.  */
  32. cookie_code_map[' '] = "+";
  33. sprintf(tmp, "%%%02X", ',');
  34. cookie_code_map[','] = strdup(tmp);
  35. sprintf(tmp, "%%%02X", ';');
  36. cookie_code_map[';'] = strdup(tmp);
  37. /* for url's, we do full URL encoding. */
  38. /* non-alphanumerics get turned into hex ... */
  39. for(i=0; i < 256; i++) {
  40. if(isalnum(i) == 0) {
  41. sprintf(tmp, "%%%02X", i);
  42. url_code_map[i] = strdup(tmp);
  43. }
  44. }
  45. /* ... with the following 6 exceptions: */
  46. /* white-space gets turned into '+' ... */
  47. url_code_map[' '] = "+";
  48. /* ... and these punctuation chars map to themselves */
  49. url_code_map['-'] = "-";
  50. url_code_map['_'] = "_";
  51. url_code_map['.'] = ".";
  52. url_code_map['*'] = "*";
  53. url_code_map['@'] = "@";
  54. /* for html, we encode the four "special" characters */
  55. html_code_map['"'] = "&quot;" ;
  56. html_code_map['&'] = "&amp;"  ;
  57. html_code_map['>'] = "&gt;"   ;
  58. html_code_map['<'] = "&lt;"   ;
  59. }
  60. /* each input char can expand to at most 6 chars */
  61. buf = zalloc((strlen((char *) s) + 1) * 6);
  62. for(p = (unsigned char *) buf; (c = *s); s++) {
  63. if((m = code_map[c])) {
  64. strcpy((char *) p, m);
  65. p += strlen(m);
  66. } else {
  67. *p++ = c;
  68. }
  69. }
  70. *p = '';
  71. return(buf);
  72. }
  73. /* these decode a URL */
  74. int
  75. xdtoi(char d)
  76. {
  77. if((d >= '0') && (d <= '9')) return(d - '0'     );
  78. if((d >= 'a') && (d <= 'f')) return(d - 'a' + 10);
  79. if((d >= 'A') && (d <= 'F')) return(d - 'A' + 10);
  80. return(0);
  81. }
  82. int
  83. xtoi(char *s)
  84. {
  85. char d1, d2;
  86. int ret = 0;
  87. if(isxdigit(*s)) {
  88. d1 = *s++;
  89. if(isxdigit(*s)) {
  90. d2 = *s++;
  91. ret = (xdtoi(d1) * 16) + xdtoi(d2);
  92. }
  93. }
  94. return(ret);
  95. }
  96. char *
  97. url_decode(char *str)
  98. {
  99. char *ret = strdup(str);
  100. char *p, *q;
  101. p = str;
  102. q = ret;
  103. while(*p) {
  104. switch(*p) {
  105. case '+':
  106. p++;
  107. *q++ = ' ';
  108. break;
  109. case '%':
  110. if((*q = xtoi(p+1))) {
  111. p += 3;
  112. q++;
  113. } else {
  114. /* malformed, just use it */
  115. *q++ = *p++;
  116. }
  117. break;
  118. default:
  119. *q++ = *p++;
  120. break;
  121. }
  122. }
  123. *q = '';
  124. return(ret);
  125. }