diff options
Diffstat (limited to 'a8cat.c')
-rw-r--r-- | a8cat.c | 63 |
1 files changed, 56 insertions, 7 deletions
@@ -15,6 +15,7 @@ const char *inverse_on = "\x1b[7m"; const char *inverse_off = "\x1b[0m"; int underline = 0, reverse = 0, textmode = 0, ics = 0; +int magazine = 0, stripinv = 0; void print_help(void) { printf("Usage: a8cat [-i] [-u] [file ...]\n"); @@ -106,9 +107,11 @@ int a8cat(const char *file) { continue; } + if(stripinv) c &= 0x7f; + if(textmode) { switch(c) { - case 0x09: /* Atari TAB is same as ASCII */ + case 0x7f: /* tab */ putchar('\t'); continue; case 0xfd: /* bell */ @@ -127,16 +130,43 @@ int a8cat(const char *file) { if(c & 0x80) { if(!inv) { inv = 1; - inverse(1); + if(magazine) + fputs("{inv}", stdout); + else + inverse(1); } } else { if(inv) { inv = 0; - inverse(0); + if(magazine) + fputs("{norm}", stdout); + else + inverse(0); } } } + if(magazine) { + /* special cases: control codes with bit 7 set can't go + in the table since it's only got 128 entries. */ + switch(c) { + case 0x9c: + fputs("{del-line}", stdout); continue; + case 0x9d: + fputs("{ins-line}", stdout); continue; + case 0x9e: + fputs("{clr-tab}", stdout); continue; + case 0x9f: + fputs("{set-tab}", stdout); continue; + case 0xfd: + fputs("{bell}", stdout); continue; + case 0xfe: + fputs("{del-char}", stdout); continue; + case 0xff: + fputs("{ins-char}", stdout); continue; + } + } + fputs(table[c & 0x7f], stdout); if(underline && (c & 0x80)) { @@ -147,7 +177,12 @@ int a8cat(const char *file) { /* gotta turn off inverse, so if there's another file after this one, it doesn't start out being printed in inverse. */ - if(inv && !underline) inverse(0); + if(inv && !underline) { + if(magazine) + fputs("{norm}", stdout); + else + inverse(0); + } fclose(input); return 0; @@ -156,20 +191,34 @@ int a8cat(const char *file) { int main(int argc, char **argv) { int opt, result = 0; - while( (opt = getopt(argc, argv, "ihurt")) != -1) { + if(argc > 1 && strcmp(argv[1], "--help") == 0) { + print_help(); + exit(0); + } + + while( (opt = getopt(argc, argv, "ihurtms")) != -1) { switch(opt) { case 'i': table = ics2utf; ics = 1; break; case 'h': print_help(); exit(0); break; case 'u': underline = 1; break; case 'r': reverse = 1; break; case 't': textmode = 1; break; + case 'm': table = ata2mag; magazine = 1; break; + case 's': stripinv = 1; break; default: print_help(); exit(1); break; } } if(reverse) { - if(underline || textmode) { - fprintf(stderr, "-t and -u options don't make sense with -r.\n"); + if(underline || textmode || stripinv || magazine) { + fprintf(stderr, "-t, -u, -m, -s options don't make sense with -r.\n"); + exit(1); + } + } + + if(magazine) { + if(ics || stripinv || underline) { + fprintf(stderr, "-i, -s, -u options don't make sense with -m.\n"); exit(1); } } |