As it turns out, font selection is almost as trivial to implement as the persistent count file, above.
We had to add a -r option (for render), and a little bit of logic to determine which font was being specified:
case 'r': if (!strcmp (optarg, "8x8")) { optr = render_8x8; } else if (!strcmp (optarg, "7seg")) { optr = render_7segment; } else { // error message exit (EXIT_FAILURE); } break;
The specified font is selected by storing a function pointer to the font-rendering function in the optr variable. Once that's done, it's a simple matter of storing the function pointer into a new field (called render) within the OCB:
typedef struct my_ocb_s { iofunc_ocb_t base; unsigned char *output; int size; void (*render) (char *string, unsigned char *bitmap, int x, int y); } my_ocb_t;
Then, in io_read(), we replaced the hard-coded call to render_7segment():
render_7segment (string, input, optx, opty);
with a call through the OCB's new pointer:
(*ocb -> render) (string, input, optx, opty);
Fairly painless. Of course, we needed to create a new font and font-rendering module, which probably took more time to do than the actual modifications. See the source in 8x8.c for the details of the new font.