From: Ben Harris Date: Mon, 8 Sep 2025 20:49:47 +0000 (+0100) Subject: Better UALIAS() macro X-Git-Tag: bedstead-3.261~92 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~bjharris/git?a=commitdiff_plain;h=b9adf83301963edf9f87cf3e41d021989f442da7;p=bedstead.git Better UALIAS() macro Now you _can_ pass an instance of U() as the first two arguments. --- diff --git a/bedstead.c b/bedstead.c index 4621f49..b762822 100644 --- a/bedstead.c +++ b/bedstead.c @@ -197,10 +197,20 @@ static struct weight { static struct weight const *weight = &weights[0]; +/* + * Slightly evil macro for overloading based on argument count. + * See https://jadlevesque.github.io/PPMP-Iceberg/explanations#overloading-macros-based-on-argument-count + */ +#define GET_MACRO(_1, _2, _3, x, ...) x + /* U(N) sets the code point and name of a glyph not in AGLFN */ #define U(N) 0x ## N, 0x ## N >= 0x10000 ? "u" #N : "uni" #N -#define UALIAS(alias_unicode, alias_name, canonical) \ +/* UALIAS2 is for passing U(N) as the first two arguments. */ +#define UALIAS2(alias_unicode_name, canonical) \ + { { .alias_of = canonical }, alias_unicode_name, IS_ALIAS } +#define UALIAS3(alias_unicode, alias_name, canonical) \ { { .alias_of = canonical }, alias_unicode, alias_name, IS_ALIAS } +#define UALIAS(...) GET_MACRO(__VA_ARGS__, UALIAS3, UALIAS2)(__VA_ARGS__) #define ALIAS(alias, canonical) UALIAS(-1, alias, canonical) static struct glyph { @@ -916,7 +926,7 @@ static struct glyph { {"\16\21\01\01\01\21\16\00\00", U(0186) }, /* open O */ {"\00\00\16\21\01\21\16\00\00", -1, "uni0186.c2sc" }, {"\03\02\17\20\20\20\17\00\00", U(0188) }, /* Hooktop C */ - UALIAS(0x0189, "uni0189", "Eth"), /* African D */ + UALIAS(U(0189), "Eth"), /* African D */ ALIAS("uni0189.serif", "Eth.serif"), ALIAS("uni0189.c2sc", "Eth.c2sc"), ALIAS("uni0189.c2sc.serif", "Eth.c2sc.serif"), @@ -1136,11 +1146,11 @@ static struct glyph { /* Spacing modifier letters */ {"\20\20\30\24\24\00\00\00\00", U(02B0) }, /* Superscript h */ {"\10\00\10\10\10\20\00\00\00", U(02B2) }, /* Superscript j */ - UALIAS(0x02b9, "uni02B9", "minute"), - UALIAS(0x02ba, "uni02BA", "second"), - UALIAS(0x02bb, "uni02BB", "quoteleft"), - UALIAS(0x02bc, "uni02BC", "quoteright"), - UALIAS(0x02bd, "uni02BD", "quotereversed"), + UALIAS(U(02B9), "minute"), + UALIAS(U(02BA), "second"), + UALIAS(U(02BB), "quoteleft"), + UALIAS(U(02BC), "quoteright"), + UALIAS(U(02BD), "quotereversed"), {"\04\12\00\00\00\00\00\00\00", 0x02c6, "circumflex" }, {"\12\04\00\00\00\00\00\00\00", 0x02c7, "caron" }, {"\04\04\04\00\00\00\00\00\00", U(02C8) }, /* Vertical stroke (superior) */ @@ -3049,7 +3059,6 @@ static struct gsub_feature { ALTSET(c, ALT3(a, b, c)) #define CV2(base, a) CROSSALT2(base, base a) #define CV3(base, a, b) CROSSALT3(base, base a, base b) -#define GET_MACRO(_1, _2, _3, x, ...) x #define CV(...) GET_MACRO(__VA_ARGS__, CV3, CV2)(__VA_ARGS__) /* * Where possible, Character Variant features have numbers