summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--include/opkele/util.h7
-rw-r--r--lib/util.cc19
2 files changed, 26 insertions, 0 deletions
diff --git a/include/opkele/util.h b/include/opkele/util.h
index 6f3ddf6..719f951 100644
--- a/include/opkele/util.h
+++ b/include/opkele/util.h
@@ -91,24 +91,31 @@ namespace opkele {
91 */ 91 */
92 time_t w3c_to_time(const string& w); 92 time_t w3c_to_time(const string& w);
93 93
94 /** 94 /**
95 * Encode string to the representation suitable for using in URL. 95 * Encode string to the representation suitable for using in URL.
96 * @param str string to encode 96 * @param str string to encode
97 * @return encoded string 97 * @return encoded string
98 * @throw failed_conversion in case of failure 98 * @throw failed_conversion in case of failure
99 */ 99 */
100 string url_encode(const string& str); 100 string url_encode(const string& str);
101 101
102 /** 102 /**
103 * Make string suitable for using as x(ht)ml attribute.
104 * @param str string to escape
105 * @return escaped string
106 */
107 string attr_escape(const string& str);
108
109 /**
103 * Convert number to string 110 * Convert number to string
104 * @param l number 111 * @param l number
105 * @return string representation 112 * @return string representation
106 * @throw failed_conversion in case of failure 113 * @throw failed_conversion in case of failure
107 */ 114 */
108 string long_to_string(long l); 115 string long_to_string(long l);
109 /** 116 /**
110 * Convert string to number 117 * Convert string to number
111 * @param s string, containing the number 118 * @param s string, containing the number
112 * @return the number 119 * @return the number
113 * @throw failed_conversion in case of failure 120 * @throw failed_conversion in case of failure
114 */ 121 */
diff --git a/lib/util.cc b/lib/util.cc
index 54d6535..b7bc437 100644
--- a/lib/util.cc
+++ b/lib/util.cc
@@ -152,24 +152,43 @@ namespace opkele {
152 * 152 *
153 */ 153 */
154 154
155 string url_encode(const string& str) { 155 string url_encode(const string& str) {
156 char * t = curl_escape(str.c_str(),str.length()); 156 char * t = curl_escape(str.c_str(),str.length());
157 if(!t) 157 if(!t)
158 throw failed_conversion(OPKELE_CP_ "failed to curl_escape()"); 158 throw failed_conversion(OPKELE_CP_ "failed to curl_escape()");
159 string rv(t); 159 string rv(t);
160 curl_free(t); 160 curl_free(t);
161 return rv; 161 return rv;
162 } 162 }
163 163
164 string attr_escape(const string& str) {
165 static const char *unsafechars = "<>&\n\"'";
166 string rv;
167 string::size_type p=0;
168 while(true) {
169 string::size_type us = str.find_first_of(unsafechars,p);
170 if(us==string::npos) {
171 if(p!=str.length())
172 rv.append(str,p,str.length()-p);
173 return rv;
174 }
175 rv.append(str,p,us-p);
176 rv += "&#";
177 rv += long_to_string((long)str[us]);
178 rv += ';';
179 p = us+1;
180 }
181 }
182
164 string long_to_string(long l) { 183 string long_to_string(long l) {
165 char rv[32]; 184 char rv[32];
166 int r=snprintf(rv,sizeof(rv),"%ld",l); 185 int r=snprintf(rv,sizeof(rv),"%ld",l);
167 if(r<0 || r>=(int)sizeof(rv)) 186 if(r<0 || r>=(int)sizeof(rv))
168 throw failed_conversion(OPKELE_CP_ "failed to snprintf()"); 187 throw failed_conversion(OPKELE_CP_ "failed to snprintf()");
169 return rv; 188 return rv;
170 } 189 }
171 190
172 long string_to_long(const string& s) { 191 long string_to_long(const string& s) {
173 char *endptr = 0; 192 char *endptr = 0;
174 long rv = strtol(s.c_str(),&endptr,10); 193 long rv = strtol(s.c_str(),&endptr,10);
175 if((!endptr) || endptr==s.c_str()) 194 if((!endptr) || endptr==s.c_str())