aboutsummaryrefslogtreecommitdiff
path: root/locale/programs/ld-measurement.c
diff options
context:
space:
mode:
Diffstat (limited to 'locale/programs/ld-measurement.c')
-rw-r--r--locale/programs/ld-measurement.c57
1 files changed, 52 insertions, 5 deletions
diff --git a/locale/programs/ld-measurement.c b/locale/programs/ld-measurement.c
index 38a6160b26..610eb5e09c 100644
--- a/locale/programs/ld-measurement.c
+++ b/locale/programs/ld-measurement.c
@@ -48,8 +48,11 @@ measurement_startup (struct linereader *lr, struct localedef_t *locale,
(struct locale_measurement_t *)
xcalloc (1, sizeof (struct locale_measurement_t));
- lr->translate_strings = 1;
- lr->return_widestr = 0;
+ if (lr != NULL)
+ {
+ lr->translate_strings = 1;
+ lr->return_widestr = 0;
+ }
}
@@ -58,11 +61,47 @@ measurement_finish (struct localedef_t *locale, struct charmap_t *charmap)
{
struct locale_measurement_t *measurement =
locale->categories[LC_MEASUREMENT].measurement;
+ int nothing = 0;
+
+ /* Now resolve copying and also handle completely missing definitions. */
+ if (measurement == NULL)
+ {
+ /* First see whether we were supposed to copy. If yes, find the
+ actual definition. */
+ if (locale->copy_name[LC_MEASUREMENT] != NULL)
+ {
+ /* Find the copying locale. This has to happen transitively since
+ the locale we are copying from might also copying another one. */
+ struct localedef_t *from = locale;
+
+ do
+ from = find_locale (LC_MEASUREMENT,
+ from->copy_name[LC_MEASUREMENT],
+ from->repertoire_name, charmap);
+ while (from->categories[LC_MEASUREMENT].measurement == NULL
+ && from->copy_name[LC_MEASUREMENT] != NULL);
+
+ measurement = locale->categories[LC_MEASUREMENT].measurement
+ = from->categories[LC_MEASUREMENT].measurement;
+ }
+
+ /* If there is still no definition issue an warning and create an
+ empty one. */
+ if (measurement == NULL)
+ {
+ error (0, 0, _("No definition for %s category found"),
+ "LC_MEASUREMENT");
+ measurement_startup (NULL, locale, 0);
+ measurement = locale->categories[LC_MEASUREMENT].measurement;
+ nothing = 1;
+ }
+ }
if (measurement->measurement == 0)
{
- error (0, 0, _("%s: field `%s' not defined"),
- "LC_MEASUREMENT", "measurement");
+ if (! nothing)
+ error (0, 0, _("%s: field `%s' not defined"),
+ "LC_MEASUREMENT", "measurement");
/* Use as the default value the value of the i18n locale. */
measurement->measurement = 1;
}
@@ -137,7 +176,7 @@ measurement_read (struct linereader *ldfile, struct localedef_t *result,
/* If we see `copy' now we are almost done. */
if (nowtok == tok_copy)
{
- handle_copy (ldfile, charmap, repertoire, tok_lc_measurement,
+ handle_copy (ldfile, charmap, repertoire, result, tok_lc_measurement,
LC_MEASUREMENT, "LC_MEASUREMENT", ignore_content);
return;
}
@@ -164,6 +203,14 @@ measurement_read (struct linereader *ldfile, struct localedef_t *result,
{
#define INT_ELEM(cat) \
case tok_##cat: \
+ /* Ignore the rest of the line if we don't need the input of \
+ this line. */ \
+ if (ignore_content) \
+ { \
+ lr_ignore_rest (ldfile, 0); \
+ break; \
+ } \
+ \
arg = lr_token (ldfile, charmap, NULL); \
if (arg->tok != tok_number) \
goto err_label; \