2015-07-29 12:45:08 (UTC-03:00)
Marcel Rodrigues <marcelgmr@gmail.com>
Create struct Options to improve readability.
diff --git a/main.c b/main.c index ad08668..d9c2c8f 100644 --- a/main.c +++ b/main.c @@ -15,10 +15,23 @@ #include "mbf.h" #include "gif.h" +#define MIN(A, B) ((A) < (B) ? (A) : (B)) #define MAX(A, B) ((A) > (B) ? (A) : (B)) #define MIN_DELAY 6 +static struct Options { + char *timings, *dialogue; + char *output; + float maxdelay, divisor; + int loop; + char *font; + int height, width; + int cursor; + int quiet; + int barsize; +} options; + int get_index(Font *font, uint16_t code) { @@ -109,9 +122,7 @@ render(Term *term, Font *font, GIF *gif, uint16_t delay) } int -convert_script(Term *term, const char *timing, const char *dialogue, - const char *mbf, const char *anim, float div, float max, - int loop, int cur, int pbcols) +convert_script(Term *term) { FILE *ft; int fd; @@ -124,38 +135,38 @@ convert_script(Term *term, const char *timing, const char *dialogue, float d; uint16_t rd; float lastdone, done; - char pb[pbcols+1]; + char pb[options.barsize+1]; GIF *gif; - ft = fopen(timing, "r"); + ft = fopen(options.timings, "r"); if (!ft) { - fprintf(stderr, "error: could not load timings: %s\n", timing); + fprintf(stderr, "error: could not load timings: %s\n", options.timings); goto no_ft; } - fd = open(dialogue, O_RDONLY); + fd = open(options.dialogue, O_RDONLY); if (fd == -1) { - fprintf(stderr, "error: could not load dialogue: %s\n", dialogue); + fprintf(stderr, "error: could not load dialogue: %s\n", options.dialogue); goto no_fd; } - font = load_font(mbf); + font = load_font(options.font); if (!font) { - fprintf(stderr, "error: could not load font: %s\n", mbf); + fprintf(stderr, "error: could not load font: %s\n", options.font); goto no_font; } w = term->cols * font->header.w; h = term->rows * font->header.h; - gif = new_gif(anim, w, h, term->plt, loop); + gif = new_gif(options.output, w, h, term->plt, options.loop); if (!gif) { - fprintf(stderr, "error: could not create GIF: %s\n", anim); + fprintf(stderr, "error: could not create GIF: %s\n", options.output); goto no_gif; } /* discard first line of dialogue */ do read(fd, &ch, 1); while (ch != '\n'); - if (pbcols) { + if (options.barsize) { pb[0] = '['; - pb[pbcols-1] = ']'; - pb[pbcols] = '\0'; - for (i = 1; i < pbcols-1; i++) + pb[options.barsize-1] = ']'; + pb[options.barsize] = '\0'; + for (i = 1; i < options.barsize-1; i++) pb[i] = '-'; lastdone = 0; printf("%s\r[", pb); @@ -166,8 +177,8 @@ convert_script(Term *term, const char *timing, const char *dialogue, i = 0; d = rd = 0; while (fscanf(ft, "%f %d\n", &t, &n) == 2) { - if (pbcols) { - done = i * (pbcols-1) / c; + if (options.barsize) { + done = i * (options.barsize-1) / c; if (done > lastdone) { while (done > lastdone) { putchar('#'); @@ -176,7 +187,7 @@ convert_script(Term *term, const char *timing, const char *dialogue, fflush(stdout); } } - d += ((t > max ? max : t) * 100.0 / div); + d += (MIN(t, options.maxdelay) * 100.0 / options.divisor); rd = (uint16_t) (d + 0.5); if (i && rd >= MIN_DELAY) { render(term, font, gif, rd); @@ -186,12 +197,12 @@ convert_script(Term *term, const char *timing, const char *dialogue, read(fd, &ch, 1); parse(term, ch); } - if (!cur) + if (!options.cursor) term->mode &= ~M_CURSORVIS; i++; } - if (pbcols) { - while (lastdone < pbcols-2) { + if (options.barsize) { + while (lastdone < options.barsize-2) { putchar('#'); lastdone++; } @@ -231,63 +242,62 @@ help(char *name) , name); } +void +set_defaults(struct winsize *size) +{ + + options.output = "con.gif"; + options.maxdelay = FLT_MAX; + options.divisor = 1.0; + options.loop = -1; + options.font = "misc-fixed-6x10.mbf"; + options.height = size->ws_row; + options.width = size->ws_col; + options.cursor = 1; + options.quiet = 0; +} + int main(int argc, char *argv[]) { int opt; - int w, h; - char *f; - char *o; - float d, m; - int l; - char *t; - char *s; - int c; - int q; int ret; Term *term; struct winsize size; ioctl(0, TIOCGWINSZ, &size); - h = size.ws_row; - w = size.ws_col; - f = "misc-fixed-6x10.mbf"; - o = "con.gif"; - d = 1.0; m = FLT_MAX; - l = -1; - c = 1; - q = 0; + set_defaults(&size); while ((opt = getopt(argc, argv, "o:m:d:l:f:h:w:c:qv")) != -1) { switch (opt) { case 'o': - o = optarg; + options.output = optarg; break; case 'm': - m = atof(optarg); + options.maxdelay = atof(optarg); break; case 'd': - d = atof(optarg); + options.divisor = atof(optarg); break; case 'l': - l = atoi(optarg); + options.loop = atoi(optarg); break; case 'f': - f = optarg; + options.font = optarg; break; case 'h': - h = atoi(optarg); + options.height = atoi(optarg); break; case 'w': - w = atoi(optarg); + options.width = atoi(optarg); break; case 'c': if (!strcmp(optarg, "on") || !strcmp(optarg, "1")) - c = 1; + options.cursor = 1; else if (!strcmp(optarg, "off") || !strcmp(optarg, "0")) - c = 0; + options.cursor = 0; break; case 'q': - q = 1; + options.quiet = 1; break; case 'v': set_verbosity(1); @@ -302,10 +312,11 @@ main(int argc, char *argv[]) help(argv[0]); return 1; } - t = argv[optind++]; - s = argv[optind++]; - term = new_term(h, w); - ret = convert_script(term, t, s, f, o, d, m, l, c, q ? 0 : size.ws_col-1); + options.timings = argv[optind++]; + options.dialogue = argv[optind++]; + options.barsize = options.quiet ? 0 : size.ws_col-1; + term = new_term(options.height, options.width); + ret = convert_script(term); free(term); return ret; }