00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "judo.hpp"
00030 using namespace std;
00031
00032 void judo::unescape(const char* src, unsigned int srcLen, string& dest, bool append)
00033 {
00034 unsigned int i, j;
00035 int len;
00036
00037
00038 if (append)
00039 {
00040 len = j = dest.length();
00041 dest.resize(len + srcLen);
00042 }
00043 else
00044 {
00045 j = 0;
00046 len = 0;
00047 dest.resize(srcLen);
00048 }
00049
00050
00051 for (i = 0; i < srcLen; i++)
00052 {
00053
00054 if (src[i] == '&')
00055 {
00056 if (strncmp(&src[i+1],"amp;",4)==0)
00057 {
00058 dest[j] = '&';
00059 i += 4;
00060 } else if (strncmp(&src[i+1],"quot;",5)==0) {
00061 dest[j] = '\"';
00062 i += 5;
00063 } else if (strncmp(&src[i+1],"apos;",5)==0) {
00064 dest[j] = '\'';
00065 i += 5;
00066 } else if (strncmp(&src[i+1],"lt;",3)==0) {
00067 dest[j] = '<';
00068 i += 3;
00069 } else if (strncmp(&src[i+1],"gt;",3)==0) {
00070 dest[j] = '>';
00071 i += 3;
00072 } else {
00073 dest[j] = src[i];
00074 }
00075 }
00076
00077
00078 else
00079 dest[j] = src[i];
00080 j++;
00081 len++;
00082 }
00083
00084 dest.resize(len);
00085 }
00086
00087 string judo::escape(const string& src)
00088 {
00089 int i,j,oldlen,newlen;
00090
00091 if (src.empty())
00092 return string(src);
00093
00094 oldlen = newlen = src.length();
00095 for(i = 0; i < oldlen; i++)
00096 {
00097 switch(src[i])
00098 {
00099 case '<':
00100 case '>':
00101 newlen+=4; break;
00102 case '&' :
00103 newlen+=5; break;
00104 case '\'':
00105 case '\"':
00106 newlen+=6; break;
00107 }
00108 }
00109
00110 if(oldlen == newlen)
00111 return string(src);
00112
00113 string result;
00114 result.reserve(newlen);
00115
00116 for(i = j = 0; i < oldlen; i++)
00117 {
00118 switch(src[i])
00119 {
00120 case '&':
00121 result += "&"; break;
00122 case '\'':
00123 result += "'"; break;
00124 case '\"':
00125 result += """; break;
00126 case '<':
00127 result += "<"; break;
00128 case '>':
00129 result += ">"; break;
00130 default:
00131 result += src[i];
00132 }
00133 }
00134 return result;
00135 }