/* * urlenc -d * * -d specifies decoding; someday, other operations (such as encoding) * may be supported. * * This file is in the public domain. */ #include #include #include extern const char *__progname; static int hexval(char c) { switch (c) { case '0': return(0); break; case '1': return(1); break; case '2': return(2); break; case '3': return(3); break; case '4': return(4); break; case '5': return(5); break; case '6': return(6); break; case '7': return(7); break; case '8': return(8); break; case '9': return(9); break; case 'A': return(10); break; case 'B': return(11); break; case 'C': return(12); break; case 'D': return(13); break; case 'E': return(14); break; case 'F': return(15); break; case 'a': fprintf(stderr,"%s: lowercase hex digit in %% escape\n",__progname); return(10); break; case 'b': fprintf(stderr,"%s: lowercase hex digit in %% escape\n",__progname); return(11); break; case 'c': fprintf(stderr,"%s: lowercase hex digit in %% escape\n",__progname); return(12); break; case 'd': fprintf(stderr,"%s: lowercase hex digit in %% escape\n",__progname); return(13); break; case 'e': fprintf(stderr,"%s: lowercase hex digit in %% escape\n",__progname); return(14); break; case 'f': fprintf(stderr,"%s: lowercase hex digit in %% escape\n",__progname); return(15); break; } fprintf(stderr,"%s: bad hex digit in %% escape (ignoring)\n",__progname); return(-1); } static void decode(void) { int c; int v; int h; while (1) { c = getchar(); if (c == EOF) break; if (c != '%') { putchar(c); continue; } c = getchar(); if (c == EOF) { fprintf(stderr,"%s: EOF within %% escape\n",__progname); break; } h = hexval(c); if (h < 0) continue; v = h; c = getchar(); if (c == EOF) { fprintf(stderr,"%s: EOF within %% escape\n",__progname); break; } h = hexval(c); if (h < 0) continue; v = (v << 4) + h; putchar(v); } } int main(int, char **); int main(int ac, char **av) { if (0) { usage:; fprintf(stderr,"Usage: %s -d\n",__progname); exit(1); } if (ac != 2) goto usage; if (!strcmp(av[1],"-d")) decode(); else goto usage; exit(0); }