| #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; |
| } |