Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

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