#define DECODE_PLUS #include #include int main() { int pos=0; char b; char out=0; int got=0; while (fread(&b, 1, 1, stdin)) { switch (got) { case 0: if (b == '%') { got=1; break; } #ifdef DECODE_PLUS if (b == '+') { printf(" "); break; } #endif printf("%c", b); break; case 1: b=tolower(b); if (!((b >= '0' && b <= '9') || (b >= 'a' && b <= 'z'))) { fprintf(stderr, "invalid input sequence at position %d\n", pos); got=0; break; } got=2; b-=48; if (b > 9) b-=39; out=b << 4; break; case 2: got=0; b=tolower(b); if (!((b >= '0' && b <= '9') || (b >= 'a' && b <= 'z'))) { fprintf(stderr, "invalid input sequence at position %d\n", pos); break; } b-=48; if (b > 9) b-=39; out|=b; printf("%c", out); break; } pos++; } return 0; }