xref: /plan9/sys/src/cmd/upas/unesc/unesc.c (revision 7ad596ff0f87e7b1bf4052ceeca38bcec4a5e832)
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 Colombier hex(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 Colombier main(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