diff --git a/bedstead.c b/bedstead.c index bbae63d..37a3120 100644 --- a/bedstead.c +++ b/bedstead.c @@ -2723,6 +2723,24 @@ static struct alt_sub_override { { "ugrave", { "ugrave.roundjoined", "ugrave.sc" } }, }; +/* + * Define all the Character Variant features using X macros. These + * are then used to create 'cvXX' features and grouped into 'ssXX' + * features. + */ +#define CV12 VAR2("comma", ".left") +#define CV14 VAR2("period", ".large") +#define CV26 VAR2("colon", ".leftsmall") +#define CV27 VAR2("semicolon", ".left") +#define CV31 VAR2("question", ".open") +#define CV42 VAR2("J", ".narrow") +#define CV44 VAR2("L", ".narrow") +#define CV61 VAR2("ugrave",".roundjoined") +#define CV74 VAR2("j", ".serif") +#define CV79 VAR2("ocircumflex", ".large") +#define CV84 VAR2("t", ".small") +#define CV96 VAR2("ccedilla", ".angular") + static struct gsub_feature { char const *tag; #define SCRIPT_DFLT 0x01 @@ -2742,24 +2760,15 @@ static struct gsub_feature { { "rtlm", SCRIPT_ALL, .suffix = ".rtlm" }, #define SINGLESUB(in, out) "\n" #define SUFFIXSUB(base, suffix) SINGLESUB(base, base suffix) +#define VAR2 SUFFIXSUB { "ss01", SCRIPT_ALL, .name = "SAA5051", - .xml = "\n" SUFFIXSUB("comma", ".left") - SUFFIXSUB("period", ".large") SUFFIXSUB("colon", ".leftsmall") - SUFFIXSUB("semicolon", ".left") SUFFIXSUB("question", ".open") - SUFFIXSUB("D", ".serif") SUFFIXSUB("J", ".narrow") - SUFFIXSUB("L", ".narrow") SUFFIXSUB("j", ".serif") - SUFFIXSUB("t", ".small") "\n" }, + .xml = "\n" CV12 CV14 CV26 CV27 CV31 + SUFFIXSUB("D", ".serif") CV42 CV44 CV74 CV84 "\n" }, { "ss02", SCRIPT_ALL, .name = "SAA5052", - .xml = "\n" SUFFIXSUB("comma", ".left") - SUFFIXSUB("period", ".large") SUFFIXSUB("colon", ".leftsmall") - SUFFIXSUB("semicolon", ".left") SUFFIXSUB("question", ".open") - SUFFIXSUB("D", ".narrow") SUFFIXSUB("J", ".narrow") - SUFFIXSUB("L", ".narrow") SUFFIXSUB("j", ".serif") - SUFFIXSUB("t", ".small") "\n" }, + .xml = "\n" CV12 CV14 CV26 CV27 CV31 + SUFFIXSUB("D", ".narrow") CV42 CV44 CV74 CV84 "\n" }, { "ss04", SCRIPT_ALL, .name = "SAA5054", - .xml = "\n" SUFFIXSUB("ugrave", ".roundjoined") - SUFFIXSUB("ocircumflex", ".large") SUFFIXSUB("ccedilla", ".angular") - "\n" }, + .xml = "\n" CV61 CV79 CV96 "\n" }, #define ALT1(g) "" #define ALT2(a, b) ALT1(a) ALT1(b) #define ALT3(a, b, c) ALT1(a) ALT2(b, c) @@ -2771,37 +2780,27 @@ static struct gsub_feature { ALTSET(b, ALT3(a, b, c)) \ ALTSET(c, ALT3(a, b, c))) #define CV2(base, a) CROSSALT2(base, base a) +#undef VAR2 +#define VAR2 CV2 #define CV3(base, a, b) CROSSALT3(base, base a, base b) /* * Where possible, Character Variant features have numbers * that are 32 less than the ASCII code of the base character. */ - { "cv12", SCRIPT_ALL, .name = "comma variants", - .xml = CV2("comma", ".left") }, - { "cv14", SCRIPT_ALL, .name = "full-stop variants", - .xml = CV2("period", ".large") }, - { "cv26", SCRIPT_ALL, .name = "colon variants", - .xml = CV2("colon", ".leftsmall") }, - { "cv27", SCRIPT_ALL, .name = "semicolon variants", - .xml = CV2("semicolon", ".left") }, - { "cv31", SCRIPT_ALL, .name = "question-mark variants", - .xml = CV2("question", ".open") }, + { "cv12", SCRIPT_ALL, .name = "comma variants", .xml = CV12 }, + { "cv14", SCRIPT_ALL, .name = "full-stop variants", .xml = CV14 }, + { "cv26", SCRIPT_ALL, .name = "colon variants", .xml = CV26 }, + { "cv27", SCRIPT_ALL, .name = "semicolon variants", .xml = CV27 }, + { "cv31", SCRIPT_ALL, .name = "question-mark variants", .xml = CV31 }, { "cv38", SCRIPT_ALL, .name = "capital-D variants", .xml = CV3("D", ".serif", ".narrow") }, - { "cv42", SCRIPT_ALL, .name = "capital-J variants", - .xml = CV2("J", ".narrow") }, - { "cv44", SCRIPT_ALL, .name = "capital-L variants", - .xml = CV2("L", ".narrow") }, - { "cv61", SCRIPT_ALL, .name = "small-u-grave variants", - .xml = CV2("ugrave",".roundjoined") }, - { "cv74", SCRIPT_ALL, .name = "small-j variants", - .xml = CV2("j", ".serif") }, - { "cv79", SCRIPT_ALL, .name = "small-o variants", - .xml = CV2("ocircumflex", ".large") }, - { "cv84", SCRIPT_ALL, .name = "small-t variants", - .xml = CV2("t", ".small") }, - { "cv96", SCRIPT_ALL, .name = "cedilla variants", - .xml = CV2("ccedilla", ".angular") }, + { "cv42", SCRIPT_ALL, .name = "capital-J variants", .xml = CV42 }, + { "cv44", SCRIPT_ALL, .name = "capital-L variants", .xml = CV44 }, + { "cv61", SCRIPT_ALL, .name = "small-u-grave variants", .xml = CV61 }, + { "cv74", SCRIPT_ALL, .name = "small-j variants", .xml = CV74 }, + { "cv79", SCRIPT_ALL, .name = "small-o variants", .xml = CV79 }, + { "cv84", SCRIPT_ALL, .name = "small-t variants", .xml = CV84 }, + { "cv96", SCRIPT_ALL, .name = "cedilla variants", .xml = CV96 }, { "ss14", SCRIPT_ALL, ".sep4", .name = "4-cell separated graphics" }, { "ss16", SCRIPT_ALL, ".sep6", .name = "6-cell separated graphics" }, };