Subversion Repositories planix.SVN

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

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