diff options
Diffstat (limited to 'locale/programs/charmap.c')
-rw-r--r-- | locale/programs/charmap.c | 69 |
1 files changed, 64 insertions, 5 deletions
diff --git a/locale/programs/charmap.c b/locale/programs/charmap.c index 2b71821ec0..f938d798b8 100644 --- a/locale/programs/charmap.c +++ b/locale/programs/charmap.c @@ -47,7 +47,9 @@ void *xmalloc (size_t __n); /* Prototypes for local functions. */ static struct charset_t *parse_charmap (const char *filename); - +static void new_width (struct linereader *cmfile, struct charset_t *result, + const char *from, const char *to, + unsigned long int width); struct charset_t * @@ -123,6 +125,8 @@ parse_charmap (const char *filename) /* Allocate room for result. */ result = (struct charset_t *) xmalloc (sizeof (struct charset_t)); memset (result, '\0', sizeof (struct charset_t)); + /* The default DEFAULT_WIDTH is 1. */ + result->width_default = 1; #define obstack_chunk_alloc xmalloc #define obstack_chunk_free free @@ -399,6 +403,10 @@ argument to <%s> must be a single character"), case 91: /* Waiting for WIDTH... */ + if (nowtok == tok_eol) + /* Ignore empty lines. */ + continue; + if (nowtok == tok_width_default) { state = 92; @@ -474,7 +482,10 @@ only WIDTH definitions are allowed to follow the CHARMAP definition")); case 94: if (nowtok == tok_ellipsis) - state = 95; + { + state = 95; + continue; + } case 96: if (nowtok != tok_number) @@ -482,8 +493,11 @@ only WIDTH definitions are allowed to follow the CHARMAP definition")); "WIDTH"); else { - /* XXX Store width for chars. */ + /* Store width for chars. */ + new_width (cmfile, result, from_name, to_name, now->val.num); + from_name = NULL; + to_name = NULL; } lr_ignore_rest (cmfile, nowtok == tok_number); @@ -507,8 +521,6 @@ only WIDTH definitions are allowed to follow the CHARMAP definition")); now->val.str.start, now->val.str.len); - lr_ignore_rest (cmfile, 1); - state = 96; continue; @@ -591,3 +603,50 @@ only WIDTH definitions are allowed to follow the CHARMAP definition")); return result; } + + +static void +new_width (struct linereader *cmfile, struct charset_t *result, + const char *from, const char *to, unsigned long int width) +{ + unsigned int from_val, to_val; + + from_val = charset_find_value (result, from, strlen (from)); + if (from_val == ILLEGAL_CHAR_VALUE) + { + lr_error (cmfile, _("unknown character `%s'"), from); + return; + } + + if (to == NULL) + to_val = from_val; + else + { + to_val = charset_find_value (result, to, strlen (to)); + if (to_val == ILLEGAL_CHAR_VALUE) + { + lr_error (cmfile, _("unknown character `%s'"), to); + return; + } + } + + if (result->nwidth_rules >= result->nwidth_rules_max) + { + size_t new_size = result->nwidth_rules + 32; + struct width_rule *new_rules = + (struct width_rule *) obstack_alloc (&result->mem_pool, + (new_size + * sizeof (struct width_rule))); + + memcpy (new_rules, result->width_rules, + result->nwidth_rules_max * sizeof (struct width_rule)); + + result->width_rules = new_rules; + result->nwidth_rules_max = new_size; + } + + result->width_rules[result->nwidth_rules].from = from_val; + result->width_rules[result->nwidth_rules].to = to_val; + result->width_rules[result->nwidth_rules].width = (unsigned int) width; + ++result->nwidth_rules; +} |