]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/upas/unesc/unesc.c
upas/fs: fix more locking bugs, remove debugging clutter, remove planb mbox code
[plan9front.git] / sys / src / cmd / upas / unesc / unesc.c
1 /*
2  *      upas/unesc - interpret =?foo?bar?=char?= escapes
3  */
4 #include <u.h>
5 #include <libc.h>
6 #include <bio.h>
7
8 int
9 hex(int c)
10 {
11         if('0' <= c && c <= '9')
12                 return c - '0';
13         if('a' <= c && c <= 'f')
14                 return c - 'a' + 10;
15         if('A' <= c && c <= 'F')
16                 return c - 'A' + 10;
17         return 0;
18 }
19
20 void
21 main(void)
22 {
23         int c;
24         Biobuf bin, bout;
25
26         Binit(&bin,  0, OREAD);
27         Binit(&bout, 1, OWRITE);
28         while((c = Bgetc(&bin)) != Beof)
29                 if(c != '=')
30                         Bputc(&bout, c);
31                 else if((c = Bgetc(&bin)) != '?'){
32                         Bputc(&bout, '=');
33                         Bputc(&bout, c);
34                 } else {
35                         while((c = Bgetc(&bin)) != Beof && c != '?')
36                                 continue;               /* consume foo */
37                         while((c = Bgetc(&bin)) != Beof && c != '?')
38                                 continue;               /* consume bar */
39                         while((c = Bgetc(&bin)) != Beof && c != '?'){
40                                 if(c == '='){
41                                         c  = hex(Bgetc(&bin)) << 4;
42                                         c |= hex(Bgetc(&bin));
43                                 }
44                                 Bputc(&bout, c);
45                         }
46                         c = Bgetc(&bin);                /* consume '=' */
47                         if (c != '=')   
48                                 Bungetc(&bin);
49                 }
50         Bterm(&bout);
51         exits(0);
52 }