50 lines
897 B
C
50 lines
897 B
C
#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 = strtol(s+2, 0, 10);
|
|
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;
|
|
}
|