Blame


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>
5 9df487d7 2003-11-23 devnull
6 9df487d7 2003-11-23 devnull /* go from url with escaped utf to utf */
7 9df487d7 2003-11-23 devnull char *
8 9df487d7 2003-11-23 devnull hurlunesc(HConnect *cc, char *s)
9 9df487d7 2003-11-23 devnull {
10 9df487d7 2003-11-23 devnull char *t, *v, *u;
11 9df487d7 2003-11-23 devnull Rune r;
12 9df487d7 2003-11-23 devnull int c, n;
13 9df487d7 2003-11-23 devnull
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;
25 9df487d7 2003-11-23 devnull else
26 9df487d7 2003-11-23 devnull break;
27 9df487d7 2003-11-23 devnull r = n;
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;
35 9df487d7 2003-11-23 devnull else
36 9df487d7 2003-11-23 devnull break;
37 9df487d7 2003-11-23 devnull s += 2;
38 9df487d7 2003-11-23 devnull c = (r<<4)+n;
39 9df487d7 2003-11-23 devnull }
40 9df487d7 2003-11-23 devnull *t++ = c;
41 9df487d7 2003-11-23 devnull }
42 9df487d7 2003-11-23 devnull *t = '\0';
43 9df487d7 2003-11-23 devnull
44 9df487d7 2003-11-23 devnull /* convert to valid utf */
45 9df487d7 2003-11-23 devnull v = halloc(cc, UTFmax*strlen(u) + 1);
46 9df487d7 2003-11-23 devnull s = u;
47 9df487d7 2003-11-23 devnull t = v;
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;
52 9df487d7 2003-11-23 devnull s += n;
53 9df487d7 2003-11-23 devnull t += runetochar(t, &r);
54 9df487d7 2003-11-23 devnull }
55 9df487d7 2003-11-23 devnull *t = '\0';
56 9df487d7 2003-11-23 devnull
57 9df487d7 2003-11-23 devnull return v;
58 9df487d7 2003-11-23 devnull }