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