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