#include #include void main(int argc, char *argv[]) { char buf[1000]; int linenr = 0; int new_block = 1; int new_line = 1; int col = 0; int nrbytes = 0; int basln = 0; int baslns = 0; int isbasic = argc > 1; while (gets(buf) && !feof(stdin)) { char *s = buf; int special = 0; int correct = 0; unsigned char ch = '\0'; int skip = 0; linenr++; if (*s == '@') { special = 1; s++; } if (*s == '<') { new_block = 1; skip = 1; } else if (*s == '#') ; // just skip else if (*s == '1') { s++; correct = 1; for (int i = 0, k = 0x01; i < 8; i++, s++, k=k*2) { if (*s == '1') ch |= k; else if (*s == '0') ; else { correct = 0; break; } } ch = ~ch; //ch &= 0x7F; } if (skip == 0 && correct == 0) { skip = 1; for (; *s != '\0'; s++) if (*s != '_' && *s != '<' && *s != '>') { skip = 0; break; } } if (special) { printf("\n## character %c %02X\n", ch & 0x7F, ch); } else if (correct) { col++; if (new_block) { printf("[", col); new_block = 0; new_line = 0; col = 0; nrbytes = 0; } else if (new_line) { printf("\n"); new_line = 0; } if (col < 4) ; else if (col == 4) { if (' ' <= ch && ch < 127) { printf("%c", ch & 0x7F); col--; } else printf("| "); } else if (col < 13) { printf("%02X", ch); if (col == 12) printf("]"); if (col == 8) { nrbytes = (unsigned char)ch; printf("!"); } } else if (col < 14 + nrbytes) { if (baslns == 3 || baslns == 2) { basln = basln * 256 + ch; baslns--; } else if (ch == '\r') { baslns = 3; basln = 0; } else if (baslns == 1) { if (isbasic) printf("\n%5d ", basln); else printf("\n{%5d}", basln); baslns = 0; } if (!isbasic || !baslns) printf(ch < ' ' || ch >= 127 || ch == '#' ? "#%02X" : "%c", ch); } } else if (skip == 0) { //printf("\n## %d |%s|", linenr, buf); new_line = 1; } } }