summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/strgen/strgen_base.cpp11
-rw-r--r--src/table/strgen_tables.h205
2 files changed, 113 insertions, 103 deletions
diff --git a/src/strgen/strgen_base.cpp b/src/strgen/strgen_base.cpp
index 95d3291e4..c41f3d9b4 100644
--- a/src/strgen/strgen_base.cpp
+++ b/src/strgen/strgen_base.cpp
@@ -388,7 +388,7 @@ static void EmitWordList(Buffer *buffer, const char * const *words, uint nw)
void EmitPlural(Buffer *buffer, char *buf, int value)
{
int argidx = _cur_argidx;
- int offset = 0;
+ int offset = -1;
int expected = _plural_forms[_lang.plural_form].plural_count;
const char **words = AllocaM(const char *, max(expected, MAX_PLURALS));
int nw = 0;
@@ -396,6 +396,15 @@ void EmitPlural(Buffer *buffer, char *buf, int value)
/* Parse out the number, if one exists. Otherwise default to prev arg. */
if (!ParseRelNum(&buf, &argidx, &offset)) argidx--;
+ const CmdStruct *cmd = _cur_pcs.cmd[argidx];
+ if (offset == -1) {
+ /* Use default offset */
+ if (cmd == NULL || cmd->default_plural_offset < 0) {
+ strgen_fatal("Command '%s' has no (default) plural position", cmd == NULL ? "<empty>" : cmd->cmd);
+ }
+ offset = cmd->default_plural_offset;
+ }
+
/* Parse each string */
for (nw = 0; nw < MAX_PLURALS; nw++) {
words[nw] = ParseWord(&buf);
diff --git a/src/table/strgen_tables.h b/src/table/strgen_tables.h
index e6924e29c..322f1bc6b 100644
--- a/src/table/strgen_tables.h
+++ b/src/table/strgen_tables.h
@@ -27,6 +27,7 @@ struct CmdStruct {
ParseCmdProc proc;
long value;
uint8 consumes;
+ int8 default_plural_offset;
CmdFlags flags;
};
@@ -36,115 +37,115 @@ extern void EmitGender(Buffer *buffer, char *buf, int value);
static const CmdStruct _cmd_structs[] = {
/* Font size */
- {"TINY_FONT", EmitSingleChar, SCC_TINYFONT, 0, C_NONE},
- {"BIG_FONT", EmitSingleChar, SCC_BIGFONT, 0, C_NONE},
+ {"TINY_FONT", EmitSingleChar, SCC_TINYFONT, 0, -1, C_NONE},
+ {"BIG_FONT", EmitSingleChar, SCC_BIGFONT, 0, -1, C_NONE},
/* Colours */
- {"BLUE", EmitSingleChar, SCC_BLUE, 0, C_DONTCOUNT},
- {"SILVER", EmitSingleChar, SCC_SILVER, 0, C_DONTCOUNT},
- {"GOLD", EmitSingleChar, SCC_GOLD, 0, C_DONTCOUNT},
- {"RED", EmitSingleChar, SCC_RED, 0, C_DONTCOUNT},
- {"PURPLE", EmitSingleChar, SCC_PURPLE, 0, C_DONTCOUNT},
- {"LTBROWN", EmitSingleChar, SCC_LTBROWN, 0, C_DONTCOUNT},
- {"ORANGE", EmitSingleChar, SCC_ORANGE, 0, C_DONTCOUNT},
- {"GREEN", EmitSingleChar, SCC_GREEN, 0, C_DONTCOUNT},
- {"YELLOW", EmitSingleChar, SCC_YELLOW, 0, C_DONTCOUNT},
- {"DKGREEN", EmitSingleChar, SCC_DKGREEN, 0, C_DONTCOUNT},
- {"CREAM", EmitSingleChar, SCC_CREAM, 0, C_DONTCOUNT},
- {"BROWN", EmitSingleChar, SCC_BROWN, 0, C_DONTCOUNT},
- {"WHITE", EmitSingleChar, SCC_WHITE, 0, C_DONTCOUNT},
- {"LTBLUE", EmitSingleChar, SCC_LTBLUE, 0, C_DONTCOUNT},
- {"GRAY", EmitSingleChar, SCC_GRAY, 0, C_DONTCOUNT},
- {"DKBLUE", EmitSingleChar, SCC_DKBLUE, 0, C_DONTCOUNT},
- {"BLACK", EmitSingleChar, SCC_BLACK, 0, C_DONTCOUNT},
-
- {"REV", EmitSingleChar, SCC_REVISION, 0, C_NONE}, // openttd revision string
-
- {"STRING1", EmitSingleChar, SCC_STRING1, 2, C_CASE | C_GENDER}, // included string that consumes the string id and ONE argument
- {"STRING2", EmitSingleChar, SCC_STRING2, 3, C_CASE | C_GENDER}, // included string that consumes the string id and TWO arguments
- {"STRING3", EmitSingleChar, SCC_STRING3, 4, C_CASE | C_GENDER}, // included string that consumes the string id and THREE arguments
- {"STRING4", EmitSingleChar, SCC_STRING4, 5, C_CASE | C_GENDER}, // included string that consumes the string id and FOUR arguments
- {"STRING5", EmitSingleChar, SCC_STRING5, 6, C_CASE | C_GENDER}, // included string that consumes the string id and FIVE arguments
- {"STRING6", EmitSingleChar, SCC_STRING6, 7, C_CASE | C_GENDER}, // included string that consumes the string id and SIX arguments
- {"STRING7", EmitSingleChar, SCC_STRING7, 8, C_CASE | C_GENDER}, // included string that consumes the string id and SEVEN arguments
-
- {"STATION_FEATURES", EmitSingleChar, SCC_STATION_FEATURES, 1, C_NONE}, // station features string, icons of the features
- {"INDUSTRY", EmitSingleChar, SCC_INDUSTRY_NAME, 1, C_CASE | C_GENDER}, // industry, takes an industry #, can have cases
- {"CARGO_LONG", EmitSingleChar, SCC_CARGO_LONG, 2, C_NONE | C_GENDER},
- {"CARGO_SHORT", EmitSingleChar, SCC_CARGO_SHORT, 2, C_NONE}, // short cargo description, only ### tons, or ### litres
- {"CARGO_TINY", EmitSingleChar, SCC_CARGO_TINY, 2, C_NONE}, // tiny cargo description with only the amount, not a specifier for the amount or the actual cargo name
- {"CARGO_LIST", EmitSingleChar, SCC_CARGO_LIST, 1, C_CASE},
- {"POWER", EmitSingleChar, SCC_POWER, 1, C_NONE},
- {"VOLUME_LONG", EmitSingleChar, SCC_VOLUME_LONG, 1, C_NONE},
- {"VOLUME_SHORT", EmitSingleChar, SCC_VOLUME_SHORT, 1, C_NONE},
- {"WEIGHT_LONG", EmitSingleChar, SCC_WEIGHT_LONG, 1, C_NONE},
- {"WEIGHT_SHORT", EmitSingleChar, SCC_WEIGHT_SHORT, 1, C_NONE},
- {"FORCE", EmitSingleChar, SCC_FORCE, 1, C_NONE},
- {"VELOCITY", EmitSingleChar, SCC_VELOCITY, 1, C_NONE},
- {"HEIGHT", EmitSingleChar, SCC_HEIGHT, 1, C_NONE},
-
- {"P", EmitPlural, 0, 0, C_DONTCOUNT}, // plural specifier
- {"G", EmitGender, 0, 0, C_DONTCOUNT}, // gender specifier
-
- {"DATE_TINY", EmitSingleChar, SCC_DATE_TINY, 1, C_NONE},
- {"DATE_SHORT", EmitSingleChar, SCC_DATE_SHORT, 1, C_CASE},
- {"DATE_LONG", EmitSingleChar, SCC_DATE_LONG, 1, C_CASE},
- {"DATE_ISO", EmitSingleChar, SCC_DATE_ISO, 1, C_NONE},
-
- {"STRING", EmitSingleChar, SCC_STRING, 1, C_CASE | C_GENDER},
- {"RAW_STRING", EmitSingleChar, SCC_RAW_STRING_POINTER, 1, C_NONE | C_GENDER},
+ {"BLUE", EmitSingleChar, SCC_BLUE, 0, -1, C_DONTCOUNT},
+ {"SILVER", EmitSingleChar, SCC_SILVER, 0, -1, C_DONTCOUNT},
+ {"GOLD", EmitSingleChar, SCC_GOLD, 0, -1, C_DONTCOUNT},
+ {"RED", EmitSingleChar, SCC_RED, 0, -1, C_DONTCOUNT},
+ {"PURPLE", EmitSingleChar, SCC_PURPLE, 0, -1, C_DONTCOUNT},
+ {"LTBROWN", EmitSingleChar, SCC_LTBROWN, 0, -1, C_DONTCOUNT},
+ {"ORANGE", EmitSingleChar, SCC_ORANGE, 0, -1, C_DONTCOUNT},
+ {"GREEN", EmitSingleChar, SCC_GREEN, 0, -1, C_DONTCOUNT},
+ {"YELLOW", EmitSingleChar, SCC_YELLOW, 0, -1, C_DONTCOUNT},
+ {"DKGREEN", EmitSingleChar, SCC_DKGREEN, 0, -1, C_DONTCOUNT},
+ {"CREAM", EmitSingleChar, SCC_CREAM, 0, -1, C_DONTCOUNT},
+ {"BROWN", EmitSingleChar, SCC_BROWN, 0, -1, C_DONTCOUNT},
+ {"WHITE", EmitSingleChar, SCC_WHITE, 0, -1, C_DONTCOUNT},
+ {"LTBLUE", EmitSingleChar, SCC_LTBLUE, 0, -1, C_DONTCOUNT},
+ {"GRAY", EmitSingleChar, SCC_GRAY, 0, -1, C_DONTCOUNT},
+ {"DKBLUE", EmitSingleChar, SCC_DKBLUE, 0, -1, C_DONTCOUNT},
+ {"BLACK", EmitSingleChar, SCC_BLACK, 0, -1, C_DONTCOUNT},
+
+ {"REV", EmitSingleChar, SCC_REVISION, 0, -1, C_NONE}, // openttd revision string
+
+ {"STRING1", EmitSingleChar, SCC_STRING1, 2, -1, C_CASE | C_GENDER}, // included string that consumes the string id and ONE argument
+ {"STRING2", EmitSingleChar, SCC_STRING2, 3, -1, C_CASE | C_GENDER}, // included string that consumes the string id and TWO arguments
+ {"STRING3", EmitSingleChar, SCC_STRING3, 4, -1, C_CASE | C_GENDER}, // included string that consumes the string id and THREE arguments
+ {"STRING4", EmitSingleChar, SCC_STRING4, 5, -1, C_CASE | C_GENDER}, // included string that consumes the string id and FOUR arguments
+ {"STRING5", EmitSingleChar, SCC_STRING5, 6, -1, C_CASE | C_GENDER}, // included string that consumes the string id and FIVE arguments
+ {"STRING6", EmitSingleChar, SCC_STRING6, 7, -1, C_CASE | C_GENDER}, // included string that consumes the string id and SIX arguments
+ {"STRING7", EmitSingleChar, SCC_STRING7, 8, -1, C_CASE | C_GENDER}, // included string that consumes the string id and SEVEN arguments
+
+ {"STATION_FEATURES", EmitSingleChar, SCC_STATION_FEATURES, 1, -1, C_NONE}, // station features string, icons of the features
+ {"INDUSTRY", EmitSingleChar, SCC_INDUSTRY_NAME, 1, -1, C_CASE | C_GENDER}, // industry, takes an industry #, can have cases
+ {"CARGO_LONG", EmitSingleChar, SCC_CARGO_LONG, 2, 1, C_NONE | C_GENDER},
+ {"CARGO_SHORT", EmitSingleChar, SCC_CARGO_SHORT, 2, 1, C_NONE}, // short cargo description, only ### tons, or ### litres
+ {"CARGO_TINY", EmitSingleChar, SCC_CARGO_TINY, 2, 1, C_NONE}, // tiny cargo description with only the amount, not a specifier for the amount or the actual cargo name
+ {"CARGO_LIST", EmitSingleChar, SCC_CARGO_LIST, 1, -1, C_CASE},
+ {"POWER", EmitSingleChar, SCC_POWER, 1, 0, C_NONE},
+ {"VOLUME_LONG", EmitSingleChar, SCC_VOLUME_LONG, 1, 0, C_NONE},
+ {"VOLUME_SHORT", EmitSingleChar, SCC_VOLUME_SHORT, 1, 0, C_NONE},
+ {"WEIGHT_LONG", EmitSingleChar, SCC_WEIGHT_LONG, 1, 0, C_NONE},
+ {"WEIGHT_SHORT", EmitSingleChar, SCC_WEIGHT_SHORT, 1, 0, C_NONE},
+ {"FORCE", EmitSingleChar, SCC_FORCE, 1, 0, C_NONE},
+ {"VELOCITY", EmitSingleChar, SCC_VELOCITY, 1, 0, C_NONE},
+ {"HEIGHT", EmitSingleChar, SCC_HEIGHT, 1, 0, C_NONE},
+
+ {"P", EmitPlural, 0, 0, -1, C_DONTCOUNT}, // plural specifier
+ {"G", EmitGender, 0, 0, -1, C_DONTCOUNT}, // gender specifier
+
+ {"DATE_TINY", EmitSingleChar, SCC_DATE_TINY, 1, -1, C_NONE},
+ {"DATE_SHORT", EmitSingleChar, SCC_DATE_SHORT, 1, -1, C_CASE},
+ {"DATE_LONG", EmitSingleChar, SCC_DATE_LONG, 1, -1, C_CASE},
+ {"DATE_ISO", EmitSingleChar, SCC_DATE_ISO, 1, -1, C_NONE},
+
+ {"STRING", EmitSingleChar, SCC_STRING, 1, -1, C_CASE | C_GENDER},
+ {"RAW_STRING", EmitSingleChar, SCC_RAW_STRING_POINTER, 1, -1, C_NONE | C_GENDER},
/* Numbers */
- {"COMMA", EmitSingleChar, SCC_COMMA, 1, C_NONE}, // Number with comma
- {"DECIMAL", EmitSingleChar, SCC_DECIMAL, 2, C_NONE}, // Number with comma and fractional part. Second parameter is number of fractional digits, first parameter is number times 10**(second parameter).
- {"NUM", EmitSingleChar, SCC_NUM, 1, C_NONE}, // Signed number
- {"ZEROFILL_NUM", EmitSingleChar, SCC_ZEROFILL_NUM, 2, C_NONE}, // Unsigned number with zero fill, e.g. "02". First parameter is number, second minimum length
- {"BYTES", EmitSingleChar, SCC_BYTES, 1, C_NONE}, // Unsigned number with "bytes", i.e. "1.02 MiB or 123 KiB"
- {"HEX", EmitSingleChar, SCC_HEX, 1, C_NONE}, // Hexadecimally printed number
-
- {"CURRENCY_LONG", EmitSingleChar, SCC_CURRENCY_LONG, 1, C_NONE},
- {"CURRENCY_SHORT", EmitSingleChar, SCC_CURRENCY_SHORT, 1, C_NONE}, // compact currency
-
- {"WAYPOINT", EmitSingleChar, SCC_WAYPOINT_NAME, 1, C_NONE | C_GENDER}, // waypoint name
- {"STATION", EmitSingleChar, SCC_STATION_NAME, 1, C_NONE | C_GENDER},
- {"DEPOT", EmitSingleChar, SCC_DEPOT_NAME, 2, C_NONE | C_GENDER},
- {"TOWN", EmitSingleChar, SCC_TOWN_NAME, 1, C_NONE | C_GENDER},
- {"GROUP", EmitSingleChar, SCC_GROUP_NAME, 1, C_NONE | C_GENDER},
- {"SIGN", EmitSingleChar, SCC_SIGN_NAME, 1, C_NONE | C_GENDER},
- {"ENGINE", EmitSingleChar, SCC_ENGINE_NAME, 1, C_NONE | C_GENDER},
- {"VEHICLE", EmitSingleChar, SCC_VEHICLE_NAME, 1, C_NONE | C_GENDER},
- {"COMPANY", EmitSingleChar, SCC_COMPANY_NAME, 1, C_NONE | C_GENDER},
- {"COMPANY_NUM", EmitSingleChar, SCC_COMPANY_NUM, 1, C_NONE},
- {"PRESIDENT_NAME", EmitSingleChar, SCC_PRESIDENT_NAME, 1, C_NONE | C_GENDER},
-
- {"", EmitSingleChar, '\n', 0, C_DONTCOUNT},
- {"{", EmitSingleChar, '{', 0, C_DONTCOUNT},
- {"UP_ARROW", EmitSingleChar, SCC_UP_ARROW, 0, C_DONTCOUNT},
- {"SMALL_UP_ARROW", EmitSingleChar, SCC_SMALL_UP_ARROW, 0, C_DONTCOUNT},
- {"SMALL_DOWN_ARROW", EmitSingleChar, SCC_SMALL_DOWN_ARROW, 0, C_DONTCOUNT},
- {"TRAIN", EmitSingleChar, SCC_TRAIN, 0, C_DONTCOUNT},
- {"LORRY", EmitSingleChar, SCC_LORRY, 0, C_DONTCOUNT},
- {"BUS", EmitSingleChar, SCC_BUS, 0, C_DONTCOUNT},
- {"PLANE", EmitSingleChar, SCC_PLANE, 0, C_DONTCOUNT},
- {"SHIP", EmitSingleChar, SCC_SHIP, 0, C_DONTCOUNT},
- {"NBSP", EmitSingleChar, 0xA0, 0, C_DONTCOUNT},
- {"COPYRIGHT", EmitSingleChar, 0xA9, 0, C_DONTCOUNT},
- {"DOWN_ARROW", EmitSingleChar, SCC_DOWN_ARROW, 0, C_DONTCOUNT},
- {"CHECKMARK", EmitSingleChar, SCC_CHECKMARK, 0, C_DONTCOUNT},
- {"CROSS", EmitSingleChar, SCC_CROSS, 0, C_DONTCOUNT},
- {"RIGHT_ARROW", EmitSingleChar, SCC_RIGHT_ARROW, 0, C_DONTCOUNT},
- {"SMALL_LEFT_ARROW", EmitSingleChar, SCC_LESS_THAN, 0, C_DONTCOUNT},
- {"SMALL_RIGHT_ARROW", EmitSingleChar, SCC_GREATER_THAN, 0, C_DONTCOUNT},
+ {"COMMA", EmitSingleChar, SCC_COMMA, 1, 0, C_NONE}, // Number with comma
+ {"DECIMAL", EmitSingleChar, SCC_DECIMAL, 2, 0, C_NONE}, // Number with comma and fractional part. Second parameter is number of fractional digits, first parameter is number times 10**(second parameter).
+ {"NUM", EmitSingleChar, SCC_NUM, 1, 0, C_NONE}, // Signed number
+ {"ZEROFILL_NUM", EmitSingleChar, SCC_ZEROFILL_NUM, 2, 0, C_NONE}, // Unsigned number with zero fill, e.g. "02". First parameter is number, second minimum length
+ {"BYTES", EmitSingleChar, SCC_BYTES, 1, 0, C_NONE}, // Unsigned number with "bytes", i.e. "1.02 MiB or 123 KiB"
+ {"HEX", EmitSingleChar, SCC_HEX, 1, 0, C_NONE}, // Hexadecimally printed number
+
+ {"CURRENCY_LONG", EmitSingleChar, SCC_CURRENCY_LONG, 1, 0, C_NONE},
+ {"CURRENCY_SHORT", EmitSingleChar, SCC_CURRENCY_SHORT, 1, 0, C_NONE}, // compact currency
+
+ {"WAYPOINT", EmitSingleChar, SCC_WAYPOINT_NAME, 1, -1, C_NONE | C_GENDER}, // waypoint name
+ {"STATION", EmitSingleChar, SCC_STATION_NAME, 1, -1, C_NONE | C_GENDER},
+ {"DEPOT", EmitSingleChar, SCC_DEPOT_NAME, 2, -1, C_NONE | C_GENDER},
+ {"TOWN", EmitSingleChar, SCC_TOWN_NAME, 1, -1, C_NONE | C_GENDER},
+ {"GROUP", EmitSingleChar, SCC_GROUP_NAME, 1, -1, C_NONE | C_GENDER},
+ {"SIGN", EmitSingleChar, SCC_SIGN_NAME, 1, -1, C_NONE | C_GENDER},
+ {"ENGINE", EmitSingleChar, SCC_ENGINE_NAME, 1, -1, C_NONE | C_GENDER},
+ {"VEHICLE", EmitSingleChar, SCC_VEHICLE_NAME, 1, -1, C_NONE | C_GENDER},
+ {"COMPANY", EmitSingleChar, SCC_COMPANY_NAME, 1, -1, C_NONE | C_GENDER},
+ {"COMPANY_NUM", EmitSingleChar, SCC_COMPANY_NUM, 1, -1, C_NONE},
+ {"PRESIDENT_NAME", EmitSingleChar, SCC_PRESIDENT_NAME, 1, -1, C_NONE | C_GENDER},
+
+ {"", EmitSingleChar, '\n', 0, -1, C_DONTCOUNT},
+ {"{", EmitSingleChar, '{', 0, -1, C_DONTCOUNT},
+ {"UP_ARROW", EmitSingleChar, SCC_UP_ARROW, 0, -1, C_DONTCOUNT},
+ {"SMALL_UP_ARROW", EmitSingleChar, SCC_SMALL_UP_ARROW, 0, -1, C_DONTCOUNT},
+ {"SMALL_DOWN_ARROW", EmitSingleChar, SCC_SMALL_DOWN_ARROW, 0, -1, C_DONTCOUNT},
+ {"TRAIN", EmitSingleChar, SCC_TRAIN, 0, -1, C_DONTCOUNT},
+ {"LORRY", EmitSingleChar, SCC_LORRY, 0, -1, C_DONTCOUNT},
+ {"BUS", EmitSingleChar, SCC_BUS, 0, -1, C_DONTCOUNT},
+ {"PLANE", EmitSingleChar, SCC_PLANE, 0, -1, C_DONTCOUNT},
+ {"SHIP", EmitSingleChar, SCC_SHIP, 0, -1, C_DONTCOUNT},
+ {"NBSP", EmitSingleChar, 0xA0, 0, -1, C_DONTCOUNT},
+ {"COPYRIGHT", EmitSingleChar, 0xA9, 0, -1, C_DONTCOUNT},
+ {"DOWN_ARROW", EmitSingleChar, SCC_DOWN_ARROW, 0, -1, C_DONTCOUNT},
+ {"CHECKMARK", EmitSingleChar, SCC_CHECKMARK, 0, -1, C_DONTCOUNT},
+ {"CROSS", EmitSingleChar, SCC_CROSS, 0, -1, C_DONTCOUNT},
+ {"RIGHT_ARROW", EmitSingleChar, SCC_RIGHT_ARROW, 0, -1, C_DONTCOUNT},
+ {"SMALL_LEFT_ARROW", EmitSingleChar, SCC_LESS_THAN, 0, -1, C_DONTCOUNT},
+ {"SMALL_RIGHT_ARROW", EmitSingleChar, SCC_GREATER_THAN, 0, -1, C_DONTCOUNT},
/* The following are directional formatting codes used to get the RTL strings right:
* http://www.unicode.org/unicode/reports/tr9/#Directional_Formatting_Codes */
- {"LRM", EmitSingleChar, CHAR_TD_LRM, 0, C_DONTCOUNT},
- {"RLM", EmitSingleChar, CHAR_TD_RLM, 0, C_DONTCOUNT},
- {"LRE", EmitSingleChar, CHAR_TD_LRE, 0, C_DONTCOUNT},
- {"RLE", EmitSingleChar, CHAR_TD_RLE, 0, C_DONTCOUNT},
- {"LRO", EmitSingleChar, CHAR_TD_LRO, 0, C_DONTCOUNT},
- {"RLO", EmitSingleChar, CHAR_TD_RLO, 0, C_DONTCOUNT},
- {"PDF", EmitSingleChar, CHAR_TD_PDF, 0, C_DONTCOUNT},
+ {"LRM", EmitSingleChar, CHAR_TD_LRM, 0, -1, C_DONTCOUNT},
+ {"RLM", EmitSingleChar, CHAR_TD_RLM, 0, -1, C_DONTCOUNT},
+ {"LRE", EmitSingleChar, CHAR_TD_LRE, 0, -1, C_DONTCOUNT},
+ {"RLE", EmitSingleChar, CHAR_TD_RLE, 0, -1, C_DONTCOUNT},
+ {"LRO", EmitSingleChar, CHAR_TD_LRO, 0, -1, C_DONTCOUNT},
+ {"RLO", EmitSingleChar, CHAR_TD_RLO, 0, -1, C_DONTCOUNT},
+ {"PDF", EmitSingleChar, CHAR_TD_PDF, 0, -1, C_DONTCOUNT},
};
/** Description of a plural form */