#include #include #include char *argv0; int xtoi(int c) { if (c >= '0' && c <= '9') return c - '0'; if (c >= 'A' && c <= 'F') return c - 'A' + 10; if (c >= 'a' && c <= 'f') return c - 'a' + 10; return -1; } int d(FILE *fp) { int c, c1, c2; c = fgetc(fp); while (c != EOF) { if (c == '+') { putchar(' '); goto l; } if (c == '%') { c1 = fgetc(fp); if (isxdigit(c1) == 0) return 1; c2 = fgetc(fp); if (isxdigit(c2) == 0) return 1; printf("%c", xtoi(c1) * 16 + xtoi(c2)); goto l; } putchar(c); l: c = fgetc(fp); } if (ferror(fp) != 0) { perror(argv0); return 1; } return 0; } int main(int argc, char *argv[]) { FILE *fp; int i; argv0 = argv[0]; if (argc == 1) return d(stdin); for (i = 1; i < argc; i++) { fp = fopen(argv[i], "r"); if (!fp) { perror(argv[0]); return 1; } d(fp); } }