/* This file is in the public domain. */ #include #include #include static unsigned int *vec; static int vecl; static int vecn; static unsigned char *lead; static int leadl; static int leadn; static int state; #define S_NL 1 #define S_SKIP 2 #define S_DOL 3 #define S_DOLN 4 #define S_DNSP 5 #define S_EQL 6 #define S_SAVE 7 #define S_ZERO 8 #define S_ZX 9 static unsigned int v; static void savelead(char c) { if (leadl >= leadn) lead = realloc(lead,leadn=leadl+64); lead[leadl++] = c; } static void lf(char c) { fwrite(lead,1,leadl,stdout); putchar(c); leadl = 0; } static void droplead(void) { leadn = 0; } static void newvalue(void) { if (vecl >= vecn) vec = realloc(vec,(vecn=vecl+64)*sizeof(*vec)); vec[vecl++] = v; } static void flushvalues(void) { int i; for (i=vecl-1;i>=0;i--) printf("%08x",vec[i]); vecl = 0; } int main(void); int main(void) { int c; vec = 0; vecl = 0; vecn = 0; lead = 0; leadl = 0; leadn = 0; state = S_NL; while (1) { c = getchar(); if (c == EOF) break; switch (state) { case S_NL: switch (c) { case '$': state = S_DOL; savelead('$'); break; default: putchar(c); state = (c == '\n') ? S_NL : S_SKIP; break; } break; case S_SKIP: putchar(c); if (c == '\n') state = S_NL; break; case S_DOL: savelead(c); switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': state = S_DOLN; break; default: lf(c); break; } break; case S_DOLN: savelead(c); switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': break; case ' ': state = S_DNSP; break; default: lf(c); break; } break; case S_DNSP: savelead(c); switch (c) { case '=': state = S_EQL; break; default: lf(c); break; } break; case S_EQL: savelead(c); switch (c) { case ' ': break; case '{'/*}*/: droplead(); state = S_SAVE; break; default: lf(c); break; } break; case S_SAVE: switch (c) { case /*{*/'}': flushvalues(); state = S_SKIP; break; case '0': state = S_ZERO; v = 0; break; } break; case S_ZERO: switch (c) { case ',': newvalue(); state = S_SAVE; break; case 'x': case 'X': state = S_ZX; break; case /*{*/'}': newvalue(); flushvalues(); state = S_SKIP; break; } break; case S_ZX: switch (c) { case '0': v = (v << 4) | 0; break; case '1': v = (v << 4) | 1; break; case '2': v = (v << 4) | 2; break; case '3': v = (v << 4) | 3; break; case '4': v = (v << 4) | 4; break; case '5': v = (v << 4) | 5; break; case '6': v = (v << 4) | 6; break; case '7': v = (v << 4) | 7; break; case '8': v = (v << 4) | 8; break; case '9': v = (v << 4) | 9; break; case 'a': case 'A': v = (v << 4) | 10; break; case 'b': case 'B': v = (v << 4) | 11; break; case 'c': case 'C': v = (v << 4) | 12; break; case 'd': case 'D': v = (v << 4) | 13; break; case 'e': case 'E': v = (v << 4) | 14; break; case 'f': case 'F': v = (v << 4) | 15; break; case ',': newvalue(); state = S_SAVE; break; case /*{*/'}': newvalue(); flushvalues(); state = S_SKIP; break; } break; } } return(0); }