2015-07-21 13:07:28 (UTC-03:00)
Marcel Rodrigues <marcelgmr@gmail.com>
Make parser logging optional.
diff --git a/main.c b/main.c index 9129984..4376974 100644 --- a/main.c +++ b/main.c @@ -214,6 +214,7 @@ help(char *name) " -d divisor Speedup, as in scriptreplay(1)\n" " -m maxdelay Maximum delay, as in scriptreplay(1)\n" " -c on|off Show/hide cursor\n\n" + " -v Verbose mode\n" "timings: File generated by script(1)'s -t option\n" "dialogue: File generated by script(1)'s regular output\n" , name); @@ -241,7 +242,7 @@ main(int argc, char *argv[]) o = "con.gif"; d = 1.0; m = FLT_MAX; c = 1; - while ((opt = getopt(argc, argv, "w:h:f:o:d:m:c:")) != -1) { + while ((opt = getopt(argc, argv, "w:h:f:o:d:m:c:v")) != -1) { switch (opt) { case 'w': w = atoi(optarg); @@ -267,6 +268,9 @@ main(int argc, char *argv[]) else if (!strcmp(optarg, "off") || !strcmp(optarg, "0")) c = 0; break; + case 'v': + set_verbosity(1); + break; default: help(argv[0]); return 1; diff --git a/term.c b/term.c index afd9b8b..b8eb178 100644 --- a/term.c +++ b/term.c @@ -2,6 +2,7 @@ #include <stdlib.h> #include <stdint.h> #include <string.h> +#include <stdarg.h> #include "term.h" #include "default.h" @@ -10,6 +11,24 @@ #define MAX(A, B) ((A) > (B) ? (A) : (B)) +static int verbose = 0; + +static void +logfmt(char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + if (verbose) + vfprintf(stderr, fmt, args); + va_end(args); +} + +void +set_verbosity(int level) +{ + verbose = level; +} + static void save_cursor(Term *term) { @@ -108,9 +127,9 @@ static int within_bounds(Term *term, int row, int col) { if (row < 0 || row >= term->rows || col < 0 || col >= term->cols) { - fprintf(stderr, "error: cursor out of bounds, check terminal size\n"); - fprintf(stderr, " position: (%3d, %3d)\n", row+1, col+1); - fprintf(stderr, " dimensions: (%3d, %3d)\n", term->rows, term->cols); + logfmt("error: cursor out of bounds, check terminal size\n"); + logfmt(" position: (%3d, %3d)\n", row+1, col+1); + logfmt(" dimensions: (%3d, %3d)\n", term->rows, term->cols); return 0; } else { return 1; @@ -203,7 +222,7 @@ ctrlchar(Term *term, uint8_t byte) break; case 0x09: /* TODO: go to next tab stop or end of line */ - fprintf(stderr, "NYI: Control Character 0x09 (TAB)\n"); + logfmt("NYI: Control Character 0x09 (TAB)\n"); break; case 0x0A: case 0x0B: case 0x0C: linefeed(term); @@ -252,7 +271,7 @@ escseq(Term *term, uint8_t byte) break; case 'H': /* TODO: set tab stop at current column */ - fprintf(stderr, "NYI: ESC Sequence H (HTS)\n"); + logfmt("NYI: ESC Sequence H (HTS)\n"); break; case 'M': if (term->row == term->top) @@ -262,7 +281,7 @@ escseq(Term *term, uint8_t byte) break; case 'Z': /* TODO: DEC private identification */ - fprintf(stderr, "NYI: ESC Sequence Z (DECID)\n"); + logfmt("NYI: ESC Sequence Z (DECID)\n"); break; case '7': save_misc(term); @@ -272,11 +291,11 @@ escseq(Term *term, uint8_t byte) break; case '%': /* TODO: select charset */ - fprintf(stderr, "NYI: ESC Sequence %% (character set selection)\n"); + logfmt("NYI: ESC Sequence %% (character set selection)\n"); break; case '#': /* TODO: DEC screen alignment test */ - fprintf(stderr, "NYI: ESC Sequence # (DECALN)\n"); + logfmt("NYI: ESC Sequence # (DECALN)\n"); break; case '(': switch (second) { @@ -290,7 +309,7 @@ escseq(Term *term, uint8_t byte) term->cs_array[0] = CS_437; break; case 'K': - fprintf(stderr, "UNS: user-defined mapping\n"); + logfmt("UNS: user-defined mapping\n"); } break; case ')': @@ -305,19 +324,19 @@ escseq(Term *term, uint8_t byte) term->cs_array[1] = CS_437; break; case 'K': - fprintf(stderr, "UNS: user-defined mapping\n"); + logfmt("UNS: user-defined mapping\n"); } break; case '>': /* TODO: set numeric keypad mode */ - fprintf(stderr, "NYI: ESC Sequence > (DECPNM)\n"); + logfmt("NYI: ESC Sequence > (DECPNM)\n"); break; case '=': /* TODO: set application keypad mode */ - fprintf(stderr, "NYI: ESC Sequence = (DECPAM)\n"); + logfmt("NYI: ESC Sequence = (DECPAM)\n"); break; default: - fprintf(stderr, "UNS: ESC Sequence %c\n", first); + logfmt("UNS: ESC Sequence %c\n", first); } } @@ -354,7 +373,7 @@ modeswitch(Term *term, int private, int number, int value) break; case 3: /* TODO: 80/132 columns mode switch */ - fprintf(stderr, "NYI: DEC mode 3\n"); + logfmt("NYI: DEC mode 3\n"); break; case 5: SWITCH(term, M_REVERSE, value); @@ -380,7 +399,7 @@ modeswitch(Term *term, int private, int number, int value) SWITCH(term, M_MOUSEX11, value); break; default: - fprintf(stderr, "UNS: DEC mode %d\n", number); + logfmt("UNS: DEC mode %d\n", number); } } else { /* ANSI modes */ @@ -395,7 +414,7 @@ modeswitch(Term *term, int private, int number, int value) SWITCH(term, M_NEWLINE, value); break; default: - fprintf(stderr, "UNS: ANSI mode %d\n", number); + logfmt("UNS: ANSI mode %d\n", number); } } } @@ -471,7 +490,7 @@ sgr(Term *term, int number) term->pair = (term->pair & 0xF0) | DEF_BACK; break; default: - fprintf(stderr, "UNS: SGR %d\n", number); + logfmt("UNS: SGR %d\n", number); } } @@ -502,7 +521,7 @@ ctrlseq(Term *term, uint8_t byte) switch (byte) { case '@': /* TODO: insert the indicated # of blank characters */ - fprintf(stderr, "BYI: Control Sequence @ (ICH)\n"); + logfmt("BYI: Control Sequence @ (ICH)\n"); break; case 'A': term->row -= k1; @@ -611,14 +630,14 @@ ctrlseq(Term *term, uint8_t byte) break; case 'c': /* TODO: answer ESC [ ? 6 c */ - fprintf(stderr, "NYI: Control Sequence c (DA)\n"); + logfmt("NYI: Control Sequence c (DA)\n"); break; case 'd': term->row = k1 - 1; break; case 'g': /* TODO: clear tab stop */ - fprintf(stderr, "NYI: Control Sequence g (TBC)\n"); + logfmt("NYI: Control Sequence g (TBC)\n"); break; case 'h': for (i = 0; i < n; i++) @@ -634,11 +653,11 @@ ctrlseq(Term *term, uint8_t byte) break; case 'n': /* TODO: status report */ - fprintf(stderr, "NYI: Control Sequence n (DSR)\n"); + logfmt("NYI: Control Sequence n (DSR)\n"); break; case 'q': /* TODO: set keyboard LEDs */ - fprintf(stderr, "NYI: Control Sequence q (DECLL)\n"); + logfmt("NYI: Control Sequence q (DECLL)\n"); break; case 'r': if (n == 2) { @@ -658,7 +677,7 @@ ctrlseq(Term *term, uint8_t byte) load_cursor(term); break; default: - fprintf(stderr, "UNS: Control Sequence %c\n", byte); + logfmt("UNS: Control Sequence %c\n", byte); } } @@ -735,7 +754,7 @@ parse(Term *term, uint8_t byte) break; case S_OSC: /* TODO: set/reset palette entries */ - fprintf(stderr, "NYI: Operating System Sequence\n"); + logfmt("NYI: Operating System Sequence\n"); RESET_STATE(term); break; case S_UNI: diff --git a/term.h b/term.h index 3785f53..966c418 100644 --- a/term.h +++ b/term.h @@ -74,5 +74,6 @@ typedef struct Term { uint8_t plt[0x30]; } Term; +void set_verbosity(int level); Term *new_term(int rows, int cols); void parse(Term *term, uint8_t byte);