unesc.c (788B)
1 /* 2 * upas/unesc - interpret =?foo?bar?=char?= escapes 3 */ 4 5 #include <stdio.h> 6 #include <stdlib.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 int 21 main(int argc, char **argv) 22 { 23 int c; 24 25 while((c=getchar()) != EOF){ 26 if(c == '='){ 27 if((c=getchar()) == '?'){ 28 while((c=getchar()) != EOF && c != '?') 29 continue; 30 while((c=getchar()) != EOF && c != '?') 31 continue; 32 while((c=getchar()) != EOF && c != '?'){ 33 if(c == '='){ 34 c = hex(getchar()) << 4; 35 c |= hex(getchar()); 36 } 37 putchar(c); 38 } 39 (void) getchar(); /* consume '=' */ 40 }else{ 41 putchar('='); 42 putchar(c); 43 } 44 }else 45 putchar(c); 46 } 47 exit(0); 48 }