12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- #include <u.h>
- #include <libc.h>
- #include <bin.h>
- #include <httpd.h>
- /* go from url with escaped utf to utf */
- char *
- hurlunesc(HConnect *cc, char *s)
- {
- char *t, *v, *u;
- Rune r;
- int c, n;
- /* unescape */
- u = halloc(cc, strlen(s)+1);
- for(t = u; c = *s; s++){
- if(c == '%'){
- n = s[1];
- if(n >= '0' && n <= '9')
- n = n - '0';
- else if(n >= 'A' && n <= 'F')
- n = n - 'A' + 10;
- else if(n >= 'a' && n <= 'f')
- n = n - 'a' + 10;
- else
- break;
- r = n;
- n = s[2];
- if(n >= '0' && n <= '9')
- n = n - '0';
- else if(n >= 'A' && n <= 'F')
- n = n - 'A' + 10;
- else if(n >= 'a' && n <= 'f')
- n = n - 'a' + 10;
- else
- break;
- s += 2;
- c = (r<<4)+n;
- }
- *t++ = c;
- }
- *t = '\0';
- /* convert to valid utf */
- v = halloc(cc, UTFmax*strlen(u) + 1);
- s = u;
- t = v;
- while(*s){
- /* in decoding error, assume latin1 */
- if((n=chartorune(&r, s)) == 1 && r == Runeerror)
- r = (uchar)*s;
- s += n;
- t += runetochar(t, &r);
- }
- *t = '\0';
- return v;
- }
|