aboutsummaryrefslogtreecommitdiff
path: root/catgets
diff options
context:
space:
mode:
Diffstat (limited to 'catgets')
-rw-r--r--catgets/catgets.c18
-rw-r--r--catgets/gencat.c91
-rw-r--r--catgets/open_catalog.c175
3 files changed, 138 insertions, 146 deletions
diff --git a/catgets/catgets.c b/catgets/catgets.c
index c6fd13d..86ff0ff 100644
--- a/catgets/catgets.c
+++ b/catgets/catgets.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper, <drepper@gnu.org>.
@@ -19,6 +19,7 @@
#include <alloca.h>
#include <errno.h>
+#include <locale.h>
#include <nl_types.h>
#include <stdlib.h>
#include <string.h>
@@ -43,20 +44,15 @@ catopen (const char *cat_name, int flag)
if (strchr (cat_name, '/') == NULL)
{
if (flag == NL_CAT_LOCALE)
- {
- env_var = getenv ("LC_ALL");
- if (env_var == NULL)
- env_var = getenv ("LC_MESSAGES");
-
- if (env_var != NULL)
- goto have_env_var;
- }
+ /* Use the current locale setting for LC_MESSAGES. */
+ env_var = setlocale (LC_MESSAGES, NULL);
+ else
+ /* Use the LANG environment variable. */
+ env_var = getenv ("LANG");
- env_var = getenv ("LANG");
if (env_var == NULL)
env_var = "C";
- have_env_var:
env_var_len = strlen (env_var) + 1;
nlspath = __secure_getenv ("NLSPATH");
diff --git a/catgets/gencat.c b/catgets/gencat.c
index eaeb59c..4609c63 100644
--- a/catgets/gencat.c
+++ b/catgets/gencat.c
@@ -1,6 +1,6 @@
-/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 1996.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
@@ -32,6 +32,7 @@
#include <limits.h>
#include <nl_types.h>
#include <obstack.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -237,7 +238,7 @@ print_version (FILE *stream, struct argp_state *state)
Copyright (C) %s Free Software Foundation, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "1999");
+"), "2000");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
@@ -492,13 +493,12 @@ this is the first definition"));
{
const char *ident = this_line;
int message_number;
- int any_space;
do
++this_line;
while (this_line[0] != '\0' && !isspace (this_line[0]));
- any_space = isspace (*this_line);
- *this_line++ = '\0'; /* Terminate the identifier. */
+ if (this_line[0] != '\0')
+ *this_line++ = '\0'; /* Terminate the identifier. */
/* Now we found the beginning of the message itself. */
@@ -522,24 +522,12 @@ this is the first definition"));
}
if (runp != NULL)
{
- if (any_space)
- {
- /* Oh, oh. There is already a message with this
- number in the message set. */
- error_at_line (0, 0, fname, start_line,
- gettext ("duplicated message number"));
- error_at_line (0, 0, runp->fname, runp->line,
- gettext ("this is the first definition"));
- }
- else
- {
- /* We have to remove this message. */
- if (lastp != NULL)
- lastp->next = runp->next;
- else
- current->current_set->messages = runp->next;
- free (runp);
- }
+ /* Oh, oh. There is already a message with this
+ number in the message set. */
+ error_at_line (0, 0, fname, start_line,
+ gettext ("duplicated message number"));
+ error_at_line (0, 0, runp->fname, runp->line,
+ gettext ("this is the first definition"));
message_number = 0;
}
ident = NULL; /* We don't have a symbol. */
@@ -564,24 +552,11 @@ this is the first definition"));
runp = runp->next;
if (runp != NULL)
{
- if (any_space)
- {
- /* The name is already used. */
- error_at_line (0, 0, fname, start_line,
- gettext ("\
+ /* The name is already used. */
+ error_at_line (0, 0, fname, start_line, gettext ("\
duplicated message identifier"));
- error_at_line (0, 0, runp->fname, runp->line,
- gettext ("this is the first definition"));
- }
- else
- {
- /* We have to remove this message. */
- if (lastp != NULL)
- lastp->next = runp->next;
- else
- current->current_set->messages = runp->next;
- free (runp);
- }
+ error_at_line (0, 0, runp->fname, runp->line,
+ gettext ("this is the first definition"));
message_number = 0;
}
else
@@ -673,7 +648,7 @@ write_out (struct catalog *catalog, const char *output_name,
struct obstack string_pool;
const char *strings;
size_t strings_size;
- u_int32_t *array1, *array2;
+ uint32_t *array1, *array2;
size_t cnt;
int fd;
@@ -751,10 +726,10 @@ write_out (struct catalog *catalog, const char *output_name,
/* Allocate room for all needed arrays. */
array1 =
- (u_int32_t *) alloca (best_size * best_depth * sizeof (u_int32_t) * 3);
- memset (array1, '\0', best_size * best_depth * sizeof (u_int32_t) * 3);
+ (uint32_t *) alloca (best_size * best_depth * sizeof (uint32_t) * 3);
+ memset (array1, '\0', best_size * best_depth * sizeof (uint32_t) * 3);
array2
- = (u_int32_t *) alloca (best_size * best_depth * sizeof (u_int32_t) * 3);
+ = (uint32_t *) alloca (best_size * best_depth * sizeof (uint32_t) * 3);
obstack_init (&string_pool);
set_run = catalog->all_sets;
@@ -812,11 +787,11 @@ write_out (struct catalog *catalog, const char *output_name,
/* We always write out the little endian version of the index
arrays. */
#if __BYTE_ORDER == __LITTLE_ENDIAN
- write (fd, array1, best_size * best_depth * sizeof (u_int32_t) * 3);
- write (fd, array2, best_size * best_depth * sizeof (u_int32_t) * 3);
+ write (fd, array1, best_size * best_depth * sizeof (uint32_t) * 3);
+ write (fd, array2, best_size * best_depth * sizeof (uint32_t) * 3);
#elif __BYTE_ORDER == __BIG_ENDIAN
- write (fd, array2, best_size * best_depth * sizeof (u_int32_t) * 3);
- write (fd, array1, best_size * best_depth * sizeof (u_int32_t) * 3);
+ write (fd, array2, best_size * best_depth * sizeof (uint32_t) * 3);
+ write (fd, array1, best_size * best_depth * sizeof (uint32_t) * 3);
#else
# error Cannot handle __BYTE_ORDER byte order
#endif
@@ -1034,7 +1009,8 @@ read_old (struct catalog *catalog, const char *file_name)
/* OK, we have the catalog loaded. Now read all messages and merge
them. When set and message number clash for any message the new
- one is used. */
+ one is used. If the new one is empty it indicates that the
+ message should be deleted. */
for (cnt = 0; cnt < old_cat_obj.plane_size * old_cat_obj.plane_depth; ++cnt)
{
struct message_list *message, *last;
@@ -1043,7 +1019,7 @@ read_old (struct catalog *catalog, const char *file_name)
/* No message in this slot. */
continue;
- if (old_cat_obj.name_ptr[cnt * 3 + 0] - 1 != (u_int32_t) last_set)
+ if (old_cat_obj.name_ptr[cnt * 3 + 0] - 1 != (uint32_t) last_set)
{
last_set = old_cat_obj.name_ptr[cnt * 3 + 0] - 1;
set = find_set (catalog, old_cat_obj.name_ptr[cnt * 3 + 0] - 1);
@@ -1053,14 +1029,14 @@ read_old (struct catalog *catalog, const char *file_name)
message = set->messages;
while (message != NULL)
{
- if ((u_int32_t) message->number >= old_cat_obj.name_ptr[cnt * 3 + 1])
+ if ((uint32_t) message->number >= old_cat_obj.name_ptr[cnt * 3 + 1])
break;
last = message;
message = message->next;
}
if (message == NULL
- || (u_int32_t) message->number > old_cat_obj.name_ptr[cnt * 3 + 1])
+ || (uint32_t) message->number > old_cat_obj.name_ptr[cnt * 3 + 1])
{
/* We have found a message which is not yet in the catalog.
Insert it at the right position. */
@@ -1082,5 +1058,14 @@ read_old (struct catalog *catalog, const char *file_name)
++catalog->total_messages;
}
+ else if (*message->message == '\0')
+ {
+ /* The new empty message has overridden the old one thus
+ "deleting" it as required. Now remove the empty remains. */
+ if (last == NULL)
+ set->messages = message->next;
+ else
+ last->next = message->next;
+ }
}
}
diff --git a/catgets/open_catalog.c b/catgets/open_catalog.c
index aefa34f..c5193e1 100644
--- a/catgets/open_catalog.c
+++ b/catgets/open_catalog.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper, <drepper@gnu.org>.
@@ -84,89 +84,100 @@ __open_catalog (__nl_catd catalog)
while (*run_nlspath != '\0')
{
bufact = 0;
- while (*run_nlspath != ':' && *run_nlspath != '\0')
- if (*run_nlspath == '%')
- {
- const char *tmp;
-
- ++run_nlspath; /* We have seen the `%'. */
- switch (*run_nlspath++)
- {
- case 'N':
- /* Use the catalog name. */
- len = strlen (catalog->cat_name);
- ENOUGH (len);
- memcpy (&buf[bufact], catalog->cat_name, len);
- bufact += len;
- break;
- case 'L':
- /* Use the current locale category value. */
- len = strlen (catalog->env_var);
- ENOUGH (len);
- memcpy (&buf[bufact], catalog->env_var, len);
- bufact += len;
- break;
- case 'l':
- /* Use language element of locale category value. */
- tmp = catalog->env_var;
- do
- {
- ENOUGH (1);
- buf[bufact++] = *tmp++;
- }
- while (*tmp != '\0' && *tmp != '_' && *tmp != '.');
- break;
- case 't':
- /* Use territory element of locale category value. */
- tmp = catalog->env_var;
- do
- ++tmp;
- while (*tmp != '\0' && *tmp != '_' && *tmp != '.');
- if (*tmp == '_')
- {
+
+ if (*run_nlspath == ':')
+ {
+ /* Leading colon or adjacent colons - treat same as %N. */
+ len = strlen (catalog->cat_name);
+ ENOUGH (len);
+ memcpy (&buf[bufact], catalog->cat_name, len);
+ bufact += len;
+ }
+ else
+ while (*run_nlspath != ':' && *run_nlspath != '\0')
+ if (*run_nlspath == '%')
+ {
+ const char *tmp;
+
+ ++run_nlspath; /* We have seen the `%'. */
+ switch (*run_nlspath++)
+ {
+ case 'N':
+ /* Use the catalog name. */
+ len = strlen (catalog->cat_name);
+ ENOUGH (len);
+ memcpy (&buf[bufact], catalog->cat_name, len);
+ bufact += len;
+ break;
+ case 'L':
+ /* Use the current locale category value. */
+ len = strlen (catalog->env_var);
+ ENOUGH (len);
+ memcpy (&buf[bufact], catalog->env_var, len);
+ bufact += len;
+ break;
+ case 'l':
+ /* Use language element of locale category value. */
+ tmp = catalog->env_var;
+ do
+ {
+ ENOUGH (1);
+ buf[bufact++] = *tmp++;
+ }
+ while (*tmp != '\0' && *tmp != '_' && *tmp != '.');
+ break;
+ case 't':
+ /* Use territory element of locale category value. */
+ tmp = catalog->env_var;
+ do
++tmp;
- do
- {
- ENOUGH (1);
- buf[bufact++] = *tmp;
- }
- while (*tmp != '\0' && *tmp != '.');
- }
- break;
- case 'c':
- /* Use code set element of locale category value. */
- tmp = catalog->env_var;
- do
- ++tmp;
- while (*tmp != '\0' && *tmp != '.');
- if (*tmp == '.')
- {
+ while (*tmp != '\0' && *tmp != '_' && *tmp != '.');
+ if (*tmp == '_')
+ {
+ ++tmp;
+ do
+ {
+ ENOUGH (1);
+ buf[bufact++] = *tmp++;
+ }
+ while (*tmp != '\0' && *tmp != '.');
+ }
+ break;
+ case 'c':
+ /* Use code set element of locale category value. */
+ tmp = catalog->env_var;
+ do
++tmp;
- do
- {
- ENOUGH (1);
- buf[bufact++] = *tmp;
- }
- while (*tmp != '\0');
- }
- break;
- case '%':
- ENOUGH (1);
- buf[bufact++] = '%';
- break;
- default:
- /* Unknown variable: ignore this path element. */
- bufact = 0;
- while (*run_nlspath != '\0' && *run_nlspath != ':')
- ++run_nlspath;
- break;
- }
- }
- else
- {
- ENOUGH (1);
- buf[bufact++] = *run_nlspath++;
- }
+ while (*tmp != '\0' && *tmp != '.');
+ if (*tmp == '.')
+ {
+ ++tmp;
+ do
+ {
+ ENOUGH (1);
+ buf[bufact++] = *tmp++;
+ }
+ while (*tmp != '\0');
+ }
+ break;
+ case '%':
+ ENOUGH (1);
+ buf[bufact++] = '%';
+ break;
+ default:
+ /* Unknown variable: ignore this path element. */
+ bufact = 0;
+ while (*run_nlspath != '\0' && *run_nlspath != ':')
+ ++run_nlspath;
+ break;
+ }
+ }
+ else
+ {
+ ENOUGH (1);
+ buf[bufact++] = *run_nlspath++;
+ }
+
ENOUGH (1);
buf[bufact] = '\0';