plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }