unesc.c 789 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /*
  2. * upas/unesc - interpret =?foo?bar?=char?= escapes
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. int
  7. hex(int c)
  8. {
  9. if('0' <= c && c <= '9')
  10. return c - '0';
  11. if('A' <= c && c <= 'F')
  12. return c - 'A' + 10;
  13. if('a' <= c && c <= 'f')
  14. return c - 'a' + 10;
  15. return 0;
  16. }
  17. void
  18. main(int argc, char **argv)
  19. {
  20. int c;
  21. while((c=getchar()) != EOF){
  22. if(c == '='){
  23. if((c=getchar()) == '?'){
  24. while((c=getchar()) != EOF && c != '?')
  25. continue;
  26. while((c=getchar()) != EOF && c != '?')
  27. continue;
  28. while((c=getchar()) != EOF && c != '?'){
  29. if(c == '='){
  30. c = hex(getchar()) << 4;
  31. c |= hex(getchar());
  32. }
  33. putchar(c);
  34. }
  35. (void) getchar(); /* consume '=' */
  36. }else{
  37. putchar('=');
  38. putchar(c);
  39. }
  40. }else
  41. putchar(c);
  42. }
  43. exit(0);
  44. }