Module Name: xsrc Committed By: macallan Date: Tue Oct 25 12:55:04 UTC 2022
Modified Files: xsrc/local/programs/bdfload: bdfload.c Log Message: do not rely on every STARTCHAR/ENDCHAR sequence starting with ENCODING - the standard doesn't specify in which order each glyph's properties are listed To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 xsrc/local/programs/bdfload/bdfload.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: xsrc/local/programs/bdfload/bdfload.c diff -u xsrc/local/programs/bdfload/bdfload.c:1.16 xsrc/local/programs/bdfload/bdfload.c:1.17 --- xsrc/local/programs/bdfload/bdfload.c:1.16 Tue Sep 27 18:29:08 2022 +++ xsrc/local/programs/bdfload/bdfload.c Tue Oct 25 12:55:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: bdfload.c,v 1.16 2022/09/27 18:29:08 christos Exp $ */ +/* $NetBSD: bdfload.c,v 1.17 2022/10/25 12:55:04 macallan Exp $ */ /* * Copyright (c) 2018 Michael Lorenz @@ -232,7 +232,7 @@ write_header(const char *filename, struc void interpret(FILE *foo) { - char line[128], *arg, name[64] = "foo", *buffer; + char line[128], *arg, name[64] = "foo", *buffer, *cbitmap; int buflen = -1; int in_char = 0, current = -1, stride = 0, charsize = 0; int width, height, x, y, num; @@ -288,21 +288,30 @@ interpret(FILE *foo) "no fonts wider than 16 work for now\n"); } charsize = height * stride; - buflen = 256 * charsize; + buflen = 257 * charsize; buffer = calloc(1, buflen); if (buffer == NULL) { err(EXIT_FAILURE, "failed to allocate %dKB for glyphs\n", buflen); } + cbitmap = buffer + 256 * charsize; } else if (strcmp(line, "CHARS") == 0) { if (sscanf(arg, "%d", &num) == 1) if (verbose) printf("number of characters: %d\n", num); } else if (strcmp(line, "STARTCHAR") == 0) { in_char = 1; + if (charsize <= 1) err(EXIT_FAILURE, + "syntax error - no valid FONTBOUNDINGBOX\n"); + memset(cbitmap, 0, charsize); } else if (strcmp(line, "ENDCHAR") == 0) { in_char = 0; + /* only commit the glyph if it's in range */ + if ((current >= 0) && (current < 256)) { + memcpy(&buffer[charsize * current], + cbitmap, charsize); + } current = -1; } else if (strcmp(line, "ENCODING") == 0) { if (sscanf(arg, "%d", ¤t) == 1) { @@ -329,7 +338,7 @@ interpret(FILE *foo) } else if (strcmp(line, "BITMAP") == 0) { int i, j, k, l; char num[32]; - char *gptr = &buffer[charsize * current]; + char *gptr = cbitmap; char *bptr = gptr + top; uint16_t *bptr16 = (uint16_t *)gptr; bptr16 += top; @@ -351,7 +360,7 @@ interpret(FILE *foo) } } if (dump) { - gptr = &buffer[charsize * current]; + gptr = cbitmap; for (i = 0; i < height; i++) { dump_line(gptr, stride); gptr += stride;