1ba64361bSDavid du Colombier /* 2ba64361bSDavid du Colombier * upas/unesc - interpret =?foo?bar?=char?= escapes 3ba64361bSDavid du Colombier */ 4*7ad596ffSDavid du Colombier #include <u.h> 5*7ad596ffSDavid du Colombier #include <libc.h> 6*7ad596ffSDavid du Colombier #include <bio.h> 7ba64361bSDavid du Colombier 8ba64361bSDavid du Colombier int hex(int c)9ba64361bSDavid du Colombierhex(int c) 10ba64361bSDavid du Colombier { 11ba64361bSDavid du Colombier if('0' <= c && c <= '9') 12ba64361bSDavid du Colombier return c - '0'; 13ba64361bSDavid du Colombier if('a' <= c && c <= 'f') 14ba64361bSDavid du Colombier return c - 'a' + 10; 15*7ad596ffSDavid du Colombier if('A' <= c && c <= 'F') 16*7ad596ffSDavid du Colombier return c - 'A' + 10; 17ba64361bSDavid du Colombier return 0; 18ba64361bSDavid du Colombier } 19ba64361bSDavid du Colombier 20ba64361bSDavid du Colombier void main(void)21*7ad596ffSDavid du Colombiermain(void) 22ba64361bSDavid du Colombier { 23ba64361bSDavid du Colombier int c; 24*7ad596ffSDavid du Colombier Biobuf bin, bout; 25ba64361bSDavid du Colombier 26*7ad596ffSDavid du Colombier Binit(&bin, 0, OREAD); 27*7ad596ffSDavid du Colombier Binit(&bout, 1, OWRITE); 28*7ad596ffSDavid du Colombier while((c = Bgetc(&bin)) != Beof) 29*7ad596ffSDavid du Colombier if(c != '=') 30*7ad596ffSDavid du Colombier Bputc(&bout, c); 31*7ad596ffSDavid du Colombier else if((c = Bgetc(&bin)) != '?'){ 32*7ad596ffSDavid du Colombier Bputc(&bout, '='); 33*7ad596ffSDavid du Colombier Bputc(&bout, c); 34ba64361bSDavid du Colombier } else { 35*7ad596ffSDavid du Colombier while((c = Bgetc(&bin)) != Beof && c != '?') 36*7ad596ffSDavid du Colombier continue; /* consume foo */ 37*7ad596ffSDavid du Colombier while((c = Bgetc(&bin)) != Beof && c != '?') 38*7ad596ffSDavid du Colombier continue; /* consume bar */ 39*7ad596ffSDavid du Colombier while((c = Bgetc(&bin)) != Beof && c != '?'){ 40*7ad596ffSDavid du Colombier if(c == '='){ 41*7ad596ffSDavid du Colombier c = hex(Bgetc(&bin)) << 4; 42*7ad596ffSDavid du Colombier c |= hex(Bgetc(&bin)); 43ba64361bSDavid du Colombier } 44*7ad596ffSDavid du Colombier Bputc(&bout, c); 45ba64361bSDavid du Colombier } 46*7ad596ffSDavid du Colombier c = Bgetc(&bin); /* consume '=' */ 47*7ad596ffSDavid du Colombier if (c != '=') 48*7ad596ffSDavid du Colombier Bungetc(&bin); 49*7ad596ffSDavid du Colombier } 50*7ad596ffSDavid du Colombier Bterm(&bout); 51*7ad596ffSDavid du Colombier exits(0); 52ba64361bSDavid du Colombier } 53