From: Ben Harris Date: Tue, 18 Nov 2025 22:33:13 +0000 (+0000) Subject: Switch to unsigned types for holding Unicode code points X-Git-Tag: bedstead-3.261~14 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~bjharris/git?a=commitdiff_plain;h=58496743a8523ac0e66bbb441f41d1bb9d804b45;p=bedstead.git Switch to unsigned types for holding Unicode code points We were only using negative numbers for the "no Unicode mapping" constant, and even there it was mostly cast to unsigned before we used it (because it needed to sort last). So just using an unsigned type throughout seems to be a bit cleaner. It will also make me less dubious about packing extra information in when I want to support variation selectors. --- diff --git a/bedstead.c b/bedstead.c index b8a08c0..45bff46 100644 --- a/bedstead.c +++ b/bedstead.c @@ -226,8 +226,8 @@ static struct glyph { char const *alias_of; int subr_idx; }; - int_least32_t unicode; -#define NU (-1) + uint_least32_t unicode; +#define NU (0xFFFFFFFF) char const *name; uint_least16_t flags; #define SEP 0x01 /* Separated graphics */ @@ -3503,8 +3503,8 @@ compare_glyphs_by_ffid(const void *va, const void *vb) if (strcmp(a->name, ".notdef") == 0) return -1; if (strcmp(b->name, ".notdef") == 0) return +1; /* Then characters with Unicode code-points in order. */ - if ((unsigned long)a->unicode < (unsigned long)b->unicode) return -1; - if ((unsigned long)a->unicode > (unsigned long)b->unicode) return +1; + if (a->unicode < b->unicode) return -1; + if (a->unicode > b->unicode) return +1; /* Finally sort by glyph name for an arbitrary stable order. */ return namecmp(a->name, b->name); } @@ -4073,10 +4073,10 @@ docmap(int pid, int eid, int format) } printf(">\n"); for (i = 0; i < lenof(glyphs); i++) - if (glyphs[i].unicode >= 0 && - glyphs[i].unicode < limit) + if (glyphs[i].unicode < limit) printf("\n", - (long)glyphs[i].unicode, glyphs[i].name); + (unsigned long)glyphs[i].unicode, + glyphs[i].name); printf("\n", format); } @@ -5160,9 +5160,8 @@ byunicode(const void *va, const void *vb) struct glyph const *a = *(struct glyph const **)va, *b = *(struct glyph const **)vb; - /* Cast to unsigned long so -1 sorts last. */ - if ((unsigned long)a->unicode < (unsigned long)b->unicode) return -1; - if ((unsigned long)a->unicode > (unsigned long)b->unicode) return +1; + if (a->unicode < b->unicode) return -1; + if (a->unicode > b->unicode) return +1; return namecmp(a->name, b->name); } @@ -5250,7 +5249,7 @@ glyph_complement() printf("gsave %d %d translate ", (col * 40), (int)-((g->unicode == NU ? - row++ : g->unicode % nrow) * 40)); + row++ : (int)(g->unicode % nrow)) * 40)); if (g->unicode != NU) printf("(U+%04lX)", (unsigned long)g->unicode); else