From 634ad025e1036d02e0d094e1ee48feef8adefe57 Mon Sep 17 00:00:00 2001 From: Ed Maste Date: Wed, 2 Jul 2014 19:31:49 +0000 Subject: [PATCH] vtfontcvt: correct width calculation (.hex files and commandline) MFC after: 1 week Sponsored by: The FreeBSD Foundation --- usr.bin/vtfontcvt/vtfontcvt.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/usr.bin/vtfontcvt/vtfontcvt.c b/usr.bin/vtfontcvt/vtfontcvt.c index a6735b4468c..d2d4c8b980a 100644 --- a/usr.bin/vtfontcvt/vtfontcvt.c +++ b/usr.bin/vtfontcvt/vtfontcvt.c @@ -285,6 +285,16 @@ parse_bdf(FILE *fp, unsigned int map_idx) return (0); } +static void +set_width(int w) +{ + + if (w <= 0 || w > 128) + errx(1, "invalid width %d", w); + width = w; + wbytes = howmany(width, 8); +} + static int parse_hex(FILE *fp, unsigned int map_idx) { @@ -300,12 +310,12 @@ parse_hex(FILE *fp, unsigned int map_idx) if (strncmp(ln, "# Height: ", 10) == 0) { height = atoi(ln + 10); } else if (strncmp(ln, "# Width: ", 9) == 0) { - width = atoi(ln + 9); + set_width(atoi(ln + 9)); } else if (sscanf(ln, "%4x:", &curchar)) { p = ln + 5; chars_per_row = strlen(p) / height; dwidth = width; - if (chars_per_row / 2 > width / 8) + if (chars_per_row / 2 > (width + 7) / 8) dwidth *= 2; /* Double-width character. */ snprintf(fmt_str, sizeof(fmt_str), "%%%ux", chars_per_row); @@ -528,12 +538,7 @@ main(int argc, char *argv[]) verbose = 1; break; case 'w': - val = atoi(optarg); - if (val <= 0 || val > 128) { - errx(1, "Invalid width %d", val); - return (1); - } - width = val; + set_width(atoi(optarg)); break; case '?': default: