Blob
1 #include <u.h>2 #include <libc.h>3 #include <bin.h>4 #include <httpd.h>6 /* go from url with escaped utf to utf */7 char *8 hurlunesc(HConnect *cc, char *s)9 {10 char *t, *v, *u;11 Rune r;12 int c, n;14 /* unescape */15 u = halloc(cc, strlen(s)+1);16 for(t = u; c = *s; s++){17 if(c == '%'){18 n = s[1];19 if(n >= '0' && n <= '9')20 n = n - '0';21 else if(n >= 'A' && n <= 'F')22 n = n - 'A' + 10;23 else if(n >= 'a' && n <= 'f')24 n = n - 'a' + 10;25 else26 break;27 r = n;28 n = s[2];29 if(n >= '0' && n <= '9')30 n = n - '0';31 else if(n >= 'A' && n <= 'F')32 n = n - 'A' + 10;33 else if(n >= 'a' && n <= 'f')34 n = n - 'a' + 10;35 else36 break;37 s += 2;38 c = (r<<4)+n;39 }40 *t++ = c;41 }42 *t = '\0';44 /* convert to valid utf */45 v = halloc(cc, UTFmax*strlen(u) + 1);46 s = u;47 t = v;48 while(*s){49 /* in decoding error, assume latin1 */50 if((n=chartorune(&r, s)) == 1 && r == Runeerror)51 r = (uchar)*s;52 s += n;53 t += runetochar(t, &r);54 }55 *t = '\0';57 return v;58 }