12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- #include <u.h>
- #include <libc.h>
- #include <bin.h>
- #include <httpd.h>
- /*
- * go from http with latin1 escapes to utf,
- * we assume that anything >= Runeself is already in utf
- */
- char *
- httpunesc(HConnect *cc, char *s)
- {
- char *t, *v;
- int c;
- Htmlesc *e;
- v = halloc(cc, UTFmax*strlen(s) + 1);
- for(t = v; c = *s;){
- if(c == '&'){
- if(s[1] == '#' && s[2] && s[3] && s[4] && s[5] == ';'){
- c = atoi(s+2);
- if(c < Runeself){
- *t++ = c;
- s += 6;
- continue;
- }
- if(c < 256 && c >= 161){
- e = &htmlesc[c-161];
- t += runetochar(t, &e->value);
- s += 6;
- continue;
- }
- } else {
- for(e = htmlesc; e->name != nil; e++)
- if(strncmp(e->name, s, strlen(e->name)) == 0)
- break;
- if(e->name != nil){
- t += runetochar(t, &e->value);
- s += strlen(e->name);
- continue;
- }
- }
- }
- *t++ = c;
- s++;
- }
- *t = 0;
- return v;
- }
|