diff options
27 files changed, 1058 insertions, 304 deletions
@@ -1,3 +1,43 @@ +2001-02-04 Ulrich Drepper <drepper@redhat.com> + + * iconv/Makefile (iconv_prog-modules): Define. Add vpath to find + files in locale/programs. Add CFLAGS definition to allow compiling + localedef files. + * iconv/dummy-repertoire.c: New file. + * iconv/iconv_charmap.c: New file. + * iconv/iconv_prog.h: New file. + * iconv/iconv_prog.c: Make verbose and omit_invalid global. + (main): If parameter for -f and -t contain slashes try first to resolve + the strings as filenames of charmap files. Use them for conversion + in this case. + * iconvdata/run-iconv-test.sh: If charmaps exist also run tests with + iconv getting charmap names as parameters. + * locale/programs/linereader.c (lr_token): Take extra parameters + verbose and pass it to get_string. + (get_string): Take extra parameters verbose. + * locale/programs/charmap.c (parse_charmap): Take extra parameters + verbose and be_quiet. Change all callers of lr_token and + parse_charmap. + * locale/programs/charmap.h: Likewise. + * locale/programs/ld-address.c: Likewise. + * locale/programs/ld-collate.c: Likewise. + * locale/programs/ld-ctype.c: Likewise. + * locale/programs/ld-identification.c: Likewise. + * locale/programs/ld-measurement.c: Likewise. + * locale/programs/ld-messages.c: Likewise. + * locale/programs/ld-monetary.c: Likewise. + * locale/programs/ld-name.c: Likewise. + * locale/programs/ld-numeric.c: Likewise. + * locale/programs/ld-paper.c: Likewise. + * locale/programs/ld-telephone.c: Likewise. + * locale/programs/ld-time.c: Likewise. + * locale/programs/linereader.c: Likewise. + * locale/programs/linereader.h: Likewise. + * locale/programs/localedef.c: Likewise. + * locale/programs/locfile.c: Likewise. + * locale/programs/locfile.h: Likewise. + * locale/programs/repertoire.c: Likewise. + 2001-02-03 Ulrich Drepper <drepper@redhat.com> * iconv/iconv_prog.c (main): If output file name is "-" write to diff --git a/iconv/Makefile b/iconv/Makefile index b6c4f23..e92eb0b 100644 --- a/iconv/Makefile +++ b/iconv/Makefile @@ -34,9 +34,19 @@ CFLAGS-gconv_db.c = -DSTATIC_GCONV CFLAGS-gconv_simple.c = -DSTATIC_GCONV endif +vpath %.c ../locale/programs + +iconv_prog-modules = iconv_charmap charmap charmap-dir linereader \ + dummy-repertoire simple-hash xstrdup xmalloc +CFLAGS-iconv_prog.c = -I../locale/programs +CFLAGS-iconv_charmap.c = -I../locale/programs +CFLAGS-dummy-repertoire.c = -I../locale/programs +CFLAGS-charmap.c = -DCHARMAP_PATH='"$(i18ndir)/charmaps"' \ + -DDEFAULT_CHARMAP=null_pointer + tests = tst-iconv1 tst-iconv2 tst-iconv3 -distribute = gconv_builtin.h gconv_int.h loop.c skeleton.c +distribute = gconv_builtin.h gconv_int.h loop.c skeleton.c iconv_prog.h others = iconv_prog install-others = $(inst_bindir)/iconv @@ -47,3 +57,5 @@ include ../Rules $(inst_bindir)/iconv: $(objpfx)iconv_prog $(+force) $(do-install-program) + +$(objpfx)iconv_prog: $(iconv_prog-modules:%=$(objpfx)%.o) diff --git a/iconv/dummy-repertoire.c b/iconv/dummy-repertoire.c new file mode 100644 index 0000000..d3b455e --- /dev/null +++ b/iconv/dummy-repertoire.c @@ -0,0 +1,37 @@ +/* Copyright (C) 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@redhat.com>, 2001. + + 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 + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* For iconv we don't have to handle repertoire maps. Provide dummy + definitions to allow the use of linereader.c unchanged. */ +#include <repertoire.h> + + +uint32_t +repertoire_find_value (const struct repertoire_t *repertoire, const char *name, + size_t len) +{ + return ILLEGAL_CHAR_VALUE; +} + + +const char * +repertoire_find_symbol (const struct repertoire_t *repertoire, uint32_t ucs) +{ + return NULL; +} diff --git a/iconv/iconv_charmap.c b/iconv/iconv_charmap.c new file mode 100644 index 0000000..4b72b1b --- /dev/null +++ b/iconv/iconv_charmap.c @@ -0,0 +1,563 @@ +/* Convert using charmaps and possibly iconv(). + Copyright (C) 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@redhat.com>, 2001. + + 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 + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <assert.h> +#include <errno.h> +#include <error.h> +#include <fcntl.h> +#include <iconv.h> +#include <libintl.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/mman.h> +#include <sys/stat.h> + +#include "iconv_prog.h" + + +/* Prototypes for a few program-wide used functions. */ +extern void *xmalloc (size_t __n); +extern void *xcalloc (size_t __n, size_t __s); + + +struct convtable +{ + int term[256 / 8]; + union + { + struct convtable *sub; + struct charseq *out; + } val[256]; +}; + + +static inline struct convtable * +allocate_table (void) +{ + return (struct convtable *) xcalloc (1, sizeof (struct convtable)); +} + + +static inline int +is_term (struct convtable *tbl, unsigned int idx) +{ + return tbl->term[idx / 8] & (1 << (idx % 8)); +} + + +static inline void +clear_term (struct convtable *tbl, unsigned int idx) +{ + tbl->term[idx / 8] &= ~(1 << (idx % 8)); +} + + +static inline void +set_term (struct convtable *tbl, unsigned int idx) +{ + tbl->term[idx / 8] |= 1 << (idx % 8); +} + + +/* Generate the conversion table. */ +static struct convtable *use_from_charmap (struct charmap_t *from_charmap, + const char *to_code); +static struct convtable *use_to_charmap (const char *from_code, + struct charmap_t *to_charmap); +static struct convtable *use_both_charmaps (struct charmap_t *from_charmap, + struct charmap_t *to_charmap); + +/* Prototypes for the functions doing the actual work. */ +static int process_block (struct convtable *tbl, char *addr, size_t len, + FILE *output); +static int process_fd (struct convtable *tbl, int fd, FILE *output); +static int process_file (struct convtable *tbl, FILE *input, FILE *output); + + +int +charmap_conversion (const char *from_code, struct charmap_t *from_charmap, + const char *to_code, struct charmap_t *to_charmap, + int argc, int remaining, char *argv[], FILE *output) +{ + struct convtable *cvtbl; + int status = EXIT_SUCCESS; + + /* We have three different cases to handle: + + - both, from_charmap and to_charmap, are available. This means we + can assume that the symbolic names match and use them to create + the mapping. + + - only from_charmap is available. In this case we can only hope that + the symbolic names used are of the <Uxxxx> form in which case we + can use a UCS4->"to_code" iconv() conversion for the second step. + + - only to_charmap is available. This is similar, only that we would + use iconv() for the "to_code"->UCS4 conversion. + + We first create a table which maps input bytes into output bytes. + Once this is done we can handle all three of the cases above + equally. */ + if (from_charmap != NULL) + { + if (to_charmap == NULL) + cvtbl = use_from_charmap (from_charmap, to_code); + else + cvtbl = use_both_charmaps (from_charmap, to_charmap); + } + else + { + assert (to_charmap != NULL); + cvtbl = use_to_charmap (from_code, to_charmap); + } + + /* If we couldn't generate a table stop now. */ + if (cvtbl == NULL) + return EXIT_FAILURE; + + /* We can now start the conversion. */ + if (remaining == argc) + { + if (process_file (cvtbl, stdin, output) != 0) + status = EXIT_FAILURE; + } + else + do + { + struct stat st; + char *addr; + int fd; + + if (verbose) + printf ("%s:\n", argv[remaining]); + if (strcmp (argv[remaining], "-") == 0) + fd = 0; + else + { + fd = open (argv[remaining], O_RDONLY); + + if (fd == -1) + { + error (0, errno, _("cannot open input file `%s'"), + argv[remaining]); + status = EXIT_FAILURE; + continue; + } + } + +#ifdef _POSIX_MAPPED_FILES + /* We have possibilities for reading the input file. First try + to mmap() it since this will provide the fastest solution. */ + if (fstat (fd, &st) == 0 + && ((addr = mmap (NULL, st.st_size, PROT_READ, MAP_PRIVATE, + fd, 0)) != MAP_FAILED)) + { + /* Yes, we can use mmap(). The descriptor is not needed + anymore. */ + if (close (fd) != 0) + error (EXIT_FAILURE, errno, + _("error while closing input `%s'"), argv[remaining]); + + if (process_block (cvtbl, addr, st.st_size, output) < 0) + { + /* Something went wrong. */ + status = EXIT_FAILURE; + + /* We don't need the input data anymore. */ + munmap ((void *) addr, st.st_size); + + /* We cannot go on with producing output since it might + lead to problem because the last output might leave + the output stream in an undefined state. */ + break; + } + + /* We don't need the input data anymore. */ + munmap ((void *) addr, st.st_size); + } + else +#endif /* _POSIX_MAPPED_FILES */ + { + /* Read the file in pieces. */ + if (process_fd (cvtbl, fd, output) != 0) + { + /* Something went wrong. */ + status = EXIT_FAILURE; + + /* We don't need the input file anymore. */ + close (fd); + + /* We cannot go on with producing output since it might + lead to problem because the last output might leave + the output stream in an undefined state. */ + break; + } + + /* Now close the file. */ + close (fd); + } + } + while (++remaining < argc); + + /* All done. */ + return status; +} + + +static void +add_bytes (struct convtable *tbl, struct charseq *in, struct charseq *out) +{ + int n = 0; + unsigned int byte; + + assert (in->nbytes > 0); + + byte = ((unsigned char *) in->bytes)[n]; + while (n + 1 < in->nbytes) + { + if (is_term (tbl, byte) || tbl->val[byte].sub == NULL) + { + /* Note that we simply ignore a definition for a byte sequence + which is also the prefix for a longer one. */ + clear_term (tbl, byte); + tbl->val[byte].sub = + (struct convtable *) xcalloc (1, sizeof (struct convtable)); + } + + tbl = tbl->val[byte].sub; + + byte = ((unsigned char *) in->bytes)[++n]; + } + + /* Only add the new sequence if there is none yet and the byte sequence + is not part of an even longer one. */ + if (! is_term (tbl, byte) && tbl->val[byte].sub == NULL) + { + set_term (tbl, byte); + tbl->val[byte].out = out; + } +} + + +static struct convtable * +use_from_charmap (struct charmap_t *from_charmap, const char *to_code) +{ + /* We iterate over all entries in the from_charmap and for those which + have a known UCS4 representation we use an iconv() call to determine + the mapping to the to_code charset. */ + struct convtable *rettbl; + iconv_t cd; + void *ptr = NULL; + const void *key; + size_t keylen; + void *data; + + cd = iconv_open (to_code, "WCHAR_T"); + if (cd == (iconv_t) -1) + /* We cannot do anything. */ + return NULL; + + rettbl = allocate_table (); + + while (iterate_table (&from_charmap->char_table, &ptr, &key, &keylen, &data) + >= 0) + { + struct charseq *in = (struct charseq *) data; + + if (in->ucs4 != UNINITIALIZED_CHAR_VALUE) + { + /* There is a chance. Try the iconv module. */ + wchar_t inbuf[1] = { in->ucs4 }; + unsigned char outbuf[64]; + char *inptr = (char *) inbuf; + size_t inlen = sizeof (inbuf); + char *outptr = (char *) outbuf; + size_t outlen = sizeof (outbuf); + + (void) iconv (cd, &inptr, &inlen, &outptr, &outlen); + + if (outptr != (char *) outbuf) + { + /* We got some output. Good, use it. */ + struct charseq *newp; + + outlen = sizeof (outbuf) - outlen; + assert ((char *) outbuf + outlen == outptr); + + newp = (struct charseq *) xmalloc (sizeof (struct charseq) + + outlen); + newp->name = in->name; + newp->ucs4 = in->ucs4; + newp->nbytes = outlen; + memcpy (newp->bytes, outbuf, outlen); + + add_bytes (rettbl, in, newp); + } + + /* Clear any possible state left behind. */ + (void) iconv (cd, NULL, NULL, NULL, NULL); + } + } + + iconv_close (cd); + + return rettbl; +} + + +static struct convtable * +use_to_charmap (const char *from_code, struct charmap_t *to_charmap) +{ + /* We iterate over all entries in the to_charmap and for those which + have a known UCS4 representation we use an iconv() call to determine + the mapping to the from_code charset. */ + struct convtable *rettbl; + iconv_t cd; + void *ptr = NULL; + const void *key; + size_t keylen; + void *data; + + /* Note that the conversion we use here is the reverse direction. Without + exhaustive search we cannot figure out which input yields the UCS4 + character we are looking for. Therefore we determine it the other + way round. */ + cd = iconv_open (from_code, "WCHAR_T"); + if (cd == (iconv_t) -1) + /* We cannot do anything. */ + return NULL; + + rettbl = allocate_table (); + + while (iterate_table (&to_charmap->char_table, &ptr, &key, &keylen, &data) + >= 0) + { + struct charseq *out = (struct charseq *) data; + + if (out->ucs4 != UNINITIALIZED_CHAR_VALUE) + { + /* There is a chance. Try the iconv module. */ + wchar_t inbuf[1] = { out->ucs4 }; + unsigned char outbuf[64]; + char *inptr = (char *) inbuf; + size_t inlen = sizeof (inbuf); + char *outptr = (char *) outbuf; + size_t outlen = sizeof (outbuf); + + (void) iconv (cd, &inptr, &inlen, &outptr, &outlen); + + if (outptr != (char *) outbuf) + { + /* We got some output. Good, use it. */ + struct charseq *newp; + + outlen = sizeof (outbuf) - outlen; + assert ((char *) outbuf + outlen == outptr); + + newp = (struct charseq *) xmalloc (sizeof (struct charseq) + + outlen); + newp->name = out->name; + newp->ucs4 = out->ucs4; + newp->nbytes = outlen; + memcpy (newp->bytes, outbuf, outlen); + + add_bytes (rettbl, newp, out); + } + + /* Clear any possible state left behind. */ + (void) iconv (cd, NULL, NULL, NULL, NULL); + } + } + + iconv_close (cd); + + return rettbl; +} + + +static struct convtable * +use_both_charmaps (struct charmap_t *from_charmap, + struct charmap_t *to_charmap) +{ + /* In this case we iterate over all the entries in the from_charmap, + determine the internal name, and find an appropriate entry in the + to_charmap (if it exists). */ + struct convtable *rettbl = allocate_table (); + void *ptr = NULL; + const void *key; + size_t keylen; + void *data; + + while (iterate_table (&from_charmap->char_table, &ptr, &key, &keylen, &data) + >= 0) + { + struct charseq *in = (struct charseq *) data; + struct charseq *out = charmap_find_value (to_charmap, key, keylen); + + if (out != NULL) + add_bytes (rettbl, in, out); + } + + return rettbl; +} + + +static int +process_block (struct convtable *tbl, char *addr, size_t len, FILE *output) +{ + size_t n = 0; + + while (n < len) + { + struct convtable *cur = tbl; + unsigned char *curp = (unsigned char *) addr; + unsigned int byte = *curp; + int cnt; + struct charseq *out; + + while (! is_term (cur, byte)) + if (cur->val[byte].sub == NULL) + { + /* This is a invalid sequence. Skip the first byte if we are + ignoring errors. Otherwise punt. */ + if (! omit_invalid) + { + error (0, 0, _("illegal input sequence at position %Zd"), n); + return -1; + } + + n -= curp - (unsigned char *) addr; + + byte = *(curp = (unsigned char *) ++addr); + if (++n >= len) + /* All converted. */ + return 0; + + cur = tbl; + } + else + { + cur = cur->val[byte].sub; + + if (++n >= len) + { + error (0, 0, _("\ +incomplete character or shift sequence at end of buffer")); + return -1; + } + + byte = *++curp; + } + + /* We found a final byte. Write the output bytes. */ + out = cur->val[byte].out; + for (cnt = 0; cnt < out->nbytes; ++cnt) + fputc_unlocked (out->bytes[cnt], output); + + addr = (char *) curp + 1; + ++n; + } + + return 0; +} + + +static int +process_fd (struct convtable *tbl, int fd, FILE *output) +{ + /* we have a problem with reading from a desriptor since we must not + provide the iconv() function an incomplete character or shift + sequence at the end of the buffer. Since we have to deal with + arbitrary encodings we must read the whole text in a buffer and + process it in one step. */ + static char *inbuf = NULL; + static size_t maxlen = 0; + char *inptr = NULL; + size_t actlen = 0; + + while (actlen < maxlen) + { + ssize_t n = read (fd, inptr, maxlen - actlen); + + if (n == 0) + /* No more text to read. */ + break; + + if (n == -1) + { + /* Error while reading. */ + error (0, errno, _("error while reading the input")); + return -1; + } + + inptr += n; + actlen += n; + } + + if (actlen == maxlen) + while (1) + { + ssize_t n; + + /* Increase the buffer. */ + maxlen += 32768; + inbuf = realloc (inbuf, maxlen); + if (inbuf == NULL) + error (0, errno, _("unable to allocate buffer for input")); + inptr = inbuf + actlen; + + do + { + n = read (fd, inptr, maxlen - actlen); + + if (n == 0) + /* No more text to read. */ + break; + + if (n == -1) + { + /* Error while reading. */ + error (0, errno, _("error while reading the input")); + return -1; + } + + inptr += n; + actlen += n; + } + while (actlen < maxlen); + + if (n == 0) + /* Break again so we leave both loops. */ + break; + } + + /* Now we have all the input in the buffer. Process it in one run. */ + return process_block (tbl, inbuf, actlen, output); +} + + +static int +process_file (struct convtable *tbl, FILE *input, FILE *output) +{ + /* This should be safe since we use this function only for `stdin' and + we haven't read anything so far. */ + return process_fd (tbl, fileno (input), output); +} diff --git a/iconv/iconv_prog.c b/iconv/iconv_prog.c index 6b9930e..24521c0 100644 --- a/iconv/iconv_prog.c +++ b/iconv/iconv_prog.c @@ -36,7 +36,9 @@ #ifdef _POSIX_MAPPED_FILES # include <sys/mman.h> #endif +#include <charmap.h> #include <gconv_int.h> +#include "iconv_prog.h" /* Get libc version number. */ #include "../version.h" @@ -94,13 +96,13 @@ static const char *to_code; static const char *output_file; /* Nonzero if verbose ouput is wanted. */ -static int verbose; +int verbose; /* Nonzero if list of all coded character sets is wanted. */ static int list; /* If nonzero omit invalid character from output. */ -static int omit_invalid; +int omit_invalid; /* Prototypes for the functions doing the actual work. */ static int process_block (iconv_t cd, char *addr, size_t len, FILE *output); @@ -117,6 +119,8 @@ main (int argc, char *argv[]) FILE *output; iconv_t cd; const char *orig_to_code; + struct charmap_t *from_charmap = NULL; + struct charmap_t *to_charmap = NULL; /* Set locale via LC_ALL. */ setlocale (LC_ALL, ""); @@ -179,18 +183,23 @@ main (int argc, char *argv[]) to_code = newp; } - /* Let's see whether we have these coded character sets. */ - cd = iconv_open (to_code, from_code); - if (cd == (iconv_t) -1) - { - if (errno == EINVAL) - error (EXIT_FAILURE, 0, - _("conversion from `%s' to `%s' not supported"), - from_code, orig_to_code); - else - error (EXIT_FAILURE, errno, - _("failed to start conversion processing")); - } + /* POSIX 1003.2b introduces a silly thing: the arguments to -t anf -f + can be file names of charmaps. In this case iconv will have to read + those charmaps and use them to do the conversion. But there are + holes in the specification. There is nothing said that if -f is a + charmap filename that -t must be, too. And vice versa. There is + also no word about the symbolic names used. What if they don't + match? */ + if (strchr (from_code, '/') != NULL) + /* The from-name might be a charmap file name. Try reading the + file. */ + from_charmap = charmap_read (from_code, /*0, 1*/1, 0, 0); + + if (strchr (orig_to_code, '/') != NULL) + /* The to-name might be a charmap file name. Try reading the + file. */ + to_charmap = charmap_read (orig_to_code, /*0, 1,*/1,0, 0); + /* Determine output file. */ if (output_file != NULL && strcmp (output_file, "-") != 0) @@ -202,92 +211,117 @@ main (int argc, char *argv[]) else output = stdout; - /* Now process the remaining files. Write them to stdout or the file - specified with the `-o' parameter. If we have no file given as - the parameter process all from stdin. */ - if (remaining == argc) - { - if (process_file (cd, stdin, output) != 0) - status = EXIT_FAILURE; - } + /* At this point we have to handle two cases. The first one is + where a charmap is used for the from- or to-charset, or both. We + handle this special since it is very different from the sane way of + doing things. The other case allows converting using the iconv() + function. */ + if (from_charmap != NULL || to_charmap != NULL) + /* Construct the conversion table and do the conversion. */ + status = charmap_conversion (from_code, from_charmap, to_code, to_charmap, + argc, remaining, argv, output); else - do - { - struct stat st; - char *addr; - int fd; - + { + /* Let's see whether we have these coded character sets. */ + cd = iconv_open (to_code, from_code); + if (cd == (iconv_t) -1) + { + if (errno == EINVAL) + error (EXIT_FAILURE, 0, + _("conversion from `%s' to `%s' not supported"), + from_code, orig_to_code); + else + error (EXIT_FAILURE, errno, + _("failed to start conversion processing")); + } - if (verbose) - printf ("%s:\n", argv[remaining]); - if (strcmp (argv[remaining], "-") == 0) - fd = 0; - else + /* Now process the remaining files. Write them to stdout or the file + specified with the `-o' parameter. If we have no file given as + the parameter process all from stdin. */ + if (remaining == argc) + { + if (process_file (cd, stdin, output) != 0) + status = EXIT_FAILURE; + } + else + do { - fd = open (argv[remaining], O_RDONLY); - - if (fd == -1) + struct stat st; + char *addr; + int fd; + + if (verbose) + printf ("%s:\n", argv[remaining]); + if (strcmp (argv[remaining], "-") == 0) + fd = 0; + else { - error (0, errno, _("cannot open input file `%s'"), - argv[remaining]); - status = EXIT_FAILURE; - continue; + fd = open (argv[remaining], O_RDONLY); + + if (fd == -1) + { + error (0, errno, _("cannot open input file `%s'"), + argv[remaining]); + status = EXIT_FAILURE; + continue; + } } - } #ifdef _POSIX_MAPPED_FILES - /* We have possibilities for reading the input file. First try - to mmap() it since this will provide the fastest solution. */ - if (fstat (fd, &st) == 0 - && ((addr = mmap (NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0)) - != MAP_FAILED)) - { - /* Yes, we can use mmap(). The descriptor is not needed - anymore. */ - if (close (fd) != 0) - error (EXIT_FAILURE, errno, _("error while closing input `%s'"), - argv[remaining]); - - if (process_block (cd, addr, st.st_size, output) < 0) + /* We have possibilities for reading the input file. First try + to mmap() it since this will provide the fastest solution. */ + if (fstat (fd, &st) == 0 + && ((addr = mmap (NULL, st.st_size, PROT_READ, MAP_PRIVATE, + fd, 0)) != MAP_FAILED)) { - /* Something went wrong. */ - status = EXIT_FAILURE; + /* Yes, we can use mmap(). The descriptor is not needed + anymore. */ + if (close (fd) != 0) + error (EXIT_FAILURE, errno, + _("error while closing input `%s'"), + argv[remaining]); + + if (process_block (cd, addr, st.st_size, output) < 0) + { + /* Something went wrong. */ + status = EXIT_FAILURE; + + /* We don't need the input data anymore. */ + munmap ((void *) addr, st.st_size); + + /* We cannot go on with producing output since it might + lead to problem because the last output might leave + the output stream in an undefined state. */ + break; + } /* We don't need the input data anymore. */ munmap ((void *) addr, st.st_size); - - /* We cannot go on with producing output since it might - lead to problem because the last output might leave - the output stream in an undefined state. */ - break; } - - /* We don't need the input data anymore. */ - munmap ((void *) addr, st.st_size); - } - else + else #endif /* _POSIX_MAPPED_FILES */ - { - /* Read the file in pieces. */ - if (process_fd (cd, fd, output) != 0) { - /* Something went wrong. */ - status = EXIT_FAILURE; - - /* We don't need the input file anymore. */ + /* Read the file in pieces. */ + if (process_fd (cd, fd, output) != 0) + { + /* Something went wrong. */ + status = EXIT_FAILURE; + + /* We don't need the input file anymore. */ + close (fd); + + /* We cannot go on with producing output since it might + lead to problem because the last output might leave + the output stream in an undefined state. */ + break; + } + + /* Now close the file. */ close (fd); - - /* We cannot go on with producing output since it might - lead to problem because the last output might leave - the output stream in an undefined state. */ - break; } - - /* Now close the file. */ - close (fd); } - } - while (++remaining < argc); + while (++remaining < argc); + } /* Close the output file now. */ if (fclose (output)) @@ -402,7 +436,7 @@ conversion stopped due to problem in writing the output")); character sets we have to flush the state now. */ outptr = outbuf; outlen = OUTBUF_SIZE; - n = iconv (cd, NULL, NULL, &outptr, &outlen); + (void) iconv (cd, NULL, NULL, &outptr, &outlen); if (outptr != outbuf) { diff --git a/iconv/iconv_prog.h b/iconv/iconv_prog.h new file mode 100644 index 0000000..dbb4a0b --- /dev/null +++ b/iconv/iconv_prog.h @@ -0,0 +1,42 @@ +/* Copyright (C) 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@redhat.com>, 2001. + + 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 + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _ICONV_PROG_H +#define _ICONV_PROG_H 1 + +#include <stdio.h> +#include <charmap.h> + + +/* Nonzero if verbose ouput is wanted. */ +extern int verbose; + +/* If nonzero omit invalid character from output. */ +extern int omit_invalid; + +/* Perform the conversion using a charmap or two. */ +extern int charmap_conversion (const char *from_code, + struct charmap_t *from_charmap, + const char *to_code, + struct charmap_t *to_charmap, + int argc, int remaining, char *argv[], + FILE *output); + + +#endif /* iconv_prog.h */ diff --git a/iconvdata/run-iconv-test.sh b/iconvdata/run-iconv-test.sh index e20d196..3388e80 100755 --- a/iconvdata/run-iconv-test.sh +++ b/iconvdata/run-iconv-test.sh @@ -59,13 +59,10 @@ while read from to subset targets; do if test -n "$targets"; then for t in $targets; do if test -f testdata/$from; then - echo $ac_n "test data: $from -> $t $ac_c" + echo $ac_n " test data: $from -> $t $ac_c" $PROG -f $from -t $t testdata/$from > $temp1 || { if test $? -gt 128; then exit 1; fi - echo "FAILED" - failed=1 - continue - } + echo "FAILED"; failed=1; continue; } echo $ac_n "OK$ac_c" if test -s testdata/$from..$t; then cmp $temp1 testdata/$from..$t > /dev/null 2>&1 || @@ -75,10 +72,7 @@ while read from to subset targets; do echo $ac_n " -> $from $ac_c" $PROG -f $t -t $to -o $temp2 $temp1 || { if test $? -gt 128; then exit 1; fi - echo "FAILED" - failed=1 - continue - } + echo "FAILED"; failed=1; continue; } echo $ac_n "OK$ac_c" test -s $temp1 && cmp testdata/$from $temp2 > /dev/null 2>&1 || { echo "/FAILED"; failed=1; continue; } @@ -90,21 +84,45 @@ while read from to subset targets; do # of the coded character set we convert the text to this coded character # set. Otherwise we convert to all the TARGETS. if test $subset = Y; then - echo $ac_n " suntzu: $from -> $t -> $to $ac_c" + echo $ac_n " suntzu: $from -> $t -> $to $ac_c" $PROG -f $from -t $t testdata/suntzus | $PROG -f $t -t $to > $temp1 || { if test $? -gt 128; then exit 1; fi - echo "FAILED" - failed=1 - continue - } + echo "FAILED"; failed=1; continue; } echo $ac_n "OK$ac_c" cmp testdata/suntzus $temp1 || - { echo "/FAILED"; - failed=1; continue; } + { echo "/FAILED"; failed=1; continue; } echo "/OK" fi rm -f $temp1 + + # And tests where iconv(1) has to handle charmaps. + if test "$t" = UTF8; then tc=UTF-8; else tc="$t"; fi + if test -f ../localedata/charmaps/$from && + test -f ../localedata/charmaps/$tc && + test -f testdata/$from; then + echo $ac_n "test charmap: $from -> $t $ac_c" + $PROG -f ../localedata/charmaps/$from -t ../localedata/charmaps/$tc \ + testdata/$from > $temp1 || + { if test $? -gt 128; then exit 1; fi + echo "FAILED"; failed=1; continue; } + echo $ac_n "OK$ac_c" + if test -s testdata/$from..$t; then + cmp $temp1 testdata/$from..$t > /dev/null 2>&1 || + { echo "/FAILED"; failed=1; continue; } + echo $ac_n "/OK$ac_c" + fi + echo $ac_n " -> $from $ac_c" + $PROG -t ../localedata/charmaps/$from -f ../localedata/charmaps/$tc \ + -o $temp2 $temp1 || + { if test $? -gt 128; then exit 1; fi + echo "FAILED"; failed=1; continue; } + echo $ac_n "OK$ac_c" + test -s $temp1 && cmp testdata/$from $temp2 > /dev/null 2>&1 || + { echo "/FAILED"; failed=1; continue; } + echo "/OK" + rm -f $temp1 $temp2 + fi done fi @@ -113,14 +131,10 @@ while read from to subset targets; do $PROG -f ASCII -t $to testdata/suntzus | $PROG -f $to -t ASCII > $temp1 || { if test $? -gt 128; then exit 1; fi - echo "FAILED" - failed=1 - continue - } + echo "FAILED"; failed=1; continue; } echo $ac_n "OK$ac_c" cmp testdata/suntzus $temp1 || - { echo "/FAILED"; - failed=1; continue; } + { echo "/FAILED"; failed=1; continue; } echo "/OK" fi done < TESTS diff --git a/locale/programs/charmap.c b/locale/programs/charmap.c index 59f317a..14cb4f4 100644 --- a/locale/programs/charmap.c +++ b/locale/programs/charmap.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1996,1998,1999,2000,2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. @@ -34,7 +34,6 @@ #include "linereader.h" #include "charmap.h" #include "charmap-dir.h" -#include "locfile.h" #include "repertoire.h" #include <assert.h> @@ -47,7 +46,8 @@ extern void *xmalloc (size_t __n); /* Prototypes for local functions. */ -static struct charmap_t *parse_charmap (struct linereader *cmfile); +static struct charmap_t *parse_charmap (struct linereader *cmfile, + int verbose, int be_quiet); static void new_width (struct linereader *cmfile, struct charmap_t *result, const char *from, const char *to, unsigned long int width); @@ -55,6 +55,9 @@ static void charmap_new_char (struct linereader *lr, struct charmap_t *cm, int nbytes, char *bytes, const char *from, const char *to, int decimal_ellipsis, int step); + +static const char *null_pointer; + static struct linereader * cmlr_open (const char *directory, const char *name, kw_hash_fct_t hf) { @@ -82,7 +85,7 @@ cmlr_open (const char *directory, const char *name, kw_hash_fct_t hf) } struct charmap_t * -charmap_read (const char *filename) +charmap_read (const char *filename, int verbose, int be_quiet, int use_default) { struct charmap_t *result = NULL; @@ -129,14 +132,14 @@ charmap_read (const char *filename) if (cmfile != NULL) { - result = parse_charmap (cmfile); + result = parse_charmap (cmfile, verbose, be_quiet); if (result == NULL && !be_quiet) error (0, errno, _("character map file `%s' not found"), filename); } } - if (result == NULL && filename != NULL) + if (result == NULL && filename != NULL && strchr (filename, '/') == NULL) { /* OK, one more try. We also accept the names given to the character sets in the files. Sometimes they differ from the @@ -170,7 +173,7 @@ charmap_read (const char *filename) cmfile = cmlr_open (CHARMAP_PATH, dirent, charmap_hash); if (cmfile != NULL) - result = parse_charmap (cmfile); + result = parse_charmap (cmfile, verbose, be_quiet); break; } @@ -180,13 +183,13 @@ charmap_read (const char *filename) } } - if (result == NULL) + if (result == NULL && DEFAULT_CHARMAP != NULL) { struct linereader *cmfile; cmfile = cmlr_open (CHARMAP_PATH, DEFAULT_CHARMAP, charmap_hash); if (cmfile != NULL) - result = parse_charmap (cmfile); + result = parse_charmap (cmfile, verbose, be_quiet); if (result == NULL) error (4, errno, _("default character map file `%s' not found"), @@ -220,7 +223,7 @@ charmap_read (const char *filename) must have the same value as the 'wchar_t' code, which in glibc is the same as the Unicode code, which for all of the enumerated characters is identical to the ASCII code. */ - if (result != NULL) + if (result != NULL && use_default) { static const char basic_charset[] = { @@ -256,7 +259,7 @@ character map `%s' is not ASCII compatible, locale not ISO C compliant\n"), static struct charmap_t * -parse_charmap (struct linereader *cmfile) +parse_charmap (struct linereader *cmfile, int verbose, int be_quiet) { struct charmap_t *result; int state; @@ -293,7 +296,7 @@ parse_charmap (struct linereader *cmfile) while (1) { /* What's on? */ - struct token *now = lr_token (cmfile, NULL, NULL); + struct token *now = lr_token (cmfile, NULL, NULL, verbose); enum token_t nowtok = now->tok; struct token *arg; @@ -351,7 +354,7 @@ parse_charmap (struct linereader *cmfile) } /* We know that we need an argument. */ - arg = lr_token (cmfile, NULL, NULL); + arg = lr_token (cmfile, NULL, NULL, verbose); switch (nowtok) { diff --git a/locale/programs/charmap.h b/locale/programs/charmap.h index 88fd078..7b82c52 100644 --- a/locale/programs/charmap.h +++ b/locale/programs/charmap.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 1998, 1999, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. @@ -65,7 +65,8 @@ struct charseq /* Prototypes for charmap handling functions. */ -extern struct charmap_t *charmap_read (const char *filename); +extern struct charmap_t *charmap_read (const char *filename, int verbose, + int be_quiet, int use_default); /* Return the value stored under the given key in the hashing table. */ extern struct charseq *charmap_find_value (const struct charmap_t *charmap, diff --git a/locale/programs/ld-address.c b/locale/programs/ld-address.c index e35305d..a2b17bb 100644 --- a/locale/programs/ld-address.c +++ b/locale/programs/ld-address.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -434,7 +434,7 @@ address_read (struct linereader *ldfile, struct localedef_t *result, do { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } while (nowtok == tok_eol); @@ -460,7 +460,7 @@ address_read (struct linereader *ldfile, struct localedef_t *result, /* Ignore empty lines. */ if (nowtok == tok_eol) { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; continue; } @@ -477,7 +477,7 @@ address_read (struct linereader *ldfile, struct localedef_t *result, break; \ } \ \ - arg = lr_token (ldfile, charmap, NULL); \ + arg = lr_token (ldfile, charmap, NULL, verbose); \ if (arg->tok != tok_string) \ goto err_label; \ if (address->cat != NULL) \ @@ -514,7 +514,7 @@ address_read (struct linereader *ldfile, struct localedef_t *result, break; \ } \ \ - arg = lr_token (ldfile, charmap, NULL); \ + arg = lr_token (ldfile, charmap, NULL, verbose); \ if (arg->tok != tok_string && arg->tok != tok_number) \ goto err_label; \ if (address->cat != NULL) \ @@ -552,7 +552,7 @@ address_read (struct linereader *ldfile, struct localedef_t *result, break; \ } \ \ - arg = lr_token (ldfile, charmap, NULL); \ + arg = lr_token (ldfile, charmap, NULL, verbose); \ if (arg->tok != tok_number) \ goto err_label; \ else if (address->cat != 0) \ @@ -566,7 +566,7 @@ address_read (struct linereader *ldfile, struct localedef_t *result, case tok_end: /* Next we assume `LC_ADDRESS'. */ - arg = lr_token (ldfile, charmap, NULL); + arg = lr_token (ldfile, charmap, NULL, verbose); if (arg->tok == tok_eof) break; if (arg->tok == tok_eol) @@ -584,7 +584,7 @@ address_read (struct linereader *ldfile, struct localedef_t *result, } /* Prepare for the next round. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c index b228834..2ce4d46 100644 --- a/locale/programs/ld-collate.c +++ b/locale/programs/ld-collate.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. @@ -508,7 +508,7 @@ read_directions (struct linereader *ldfile, struct token *arg, } if (valid) - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); if (arg->tok == tok_eof || arg->tok == tok_eol || arg->tok == tok_comma || arg->tok == tok_semicolon) @@ -572,7 +572,7 @@ read_directions (struct linereader *ldfile, struct token *arg, } } - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); } if (nrules == 0) @@ -697,7 +697,7 @@ insert_weights (struct linereader *ldfile, struct element_t *elem, weight_cnt = 0; - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); do { if (arg->tok == tok_eof || arg->tok == tok_eol) @@ -867,11 +867,11 @@ insert_weights (struct linereader *ldfile, struct element_t *elem, break; } - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); /* This better should be the end of the line or a semicolon. */ if (arg->tok == tok_semicolon) /* OK, ignore this and read the next token. */ - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); else if (arg->tok != tok_eof && arg->tok != tok_eol) { /* It's a syntax error. */ @@ -2567,7 +2567,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, do { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } while (nowtok == tok_eol); @@ -2575,18 +2575,19 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, if (nowtok == tok_copy) { state = 2; - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_string) { SYNTAX_ERROR (_("%s: syntax error"), "LC_COLLATE"); skip_category: do - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); while (now->tok != tok_eof && now->tok != tok_end); if (now->tok != tok_eof - || (now = lr_token (ldfile, charmap, NULL), now->tok == tok_eof)) + || (now = lr_token (ldfile, charmap, NULL, verbose), + now->tok == tok_eof)) lr_error (ldfile, _("%s: premature end of file"), "LC_COLLATE"); else if (now->tok != tok_lc_collate) { @@ -2615,7 +2616,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, lr_ignore_rest (ldfile, 1); - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } @@ -2636,7 +2637,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, /* Ingore empty lines. */ if (nowtok == tok_eol) { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; continue; } @@ -2645,7 +2646,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, { case tok_copy: /* Allow copying other locales. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_string) goto err_label; @@ -2668,7 +2669,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, if (state != 0) goto err_label; - arg = lr_token (ldfile, charmap, NULL); + arg = lr_token (ldfile, charmap, NULL, verbose); if (arg->tok != tok_number) goto err_label; if (collate->col_weight_max != -1) @@ -2691,7 +2692,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, if (state != 0) goto err_label; - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); if (arg->tok != tok_bsymbol) goto err_label; else if (!ignore_content) @@ -2738,7 +2739,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, if (state != 0) goto err_label; - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); if (arg->tok != tok_bsymbol) goto err_label; else @@ -2747,7 +2748,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, size_t symbol_len = arg->val.str.lenmb; /* Next the `from' keyword. */ - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); if (arg->tok != tok_from) { free ((char *) symbol); @@ -2758,7 +2759,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, ldfile->translate_strings = 1; /* Finally the string with the replacement. */ - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); ldfile->return_widestr = 0; ldfile->translate_strings = 0; @@ -2807,7 +2808,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, if (state != 0 && state != 2) goto err_label; - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); if (arg->tok != tok_bsymbol) goto err_label; else @@ -2818,12 +2819,12 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, size_t endsymbol_len = 0; enum token_t ellipsis = tok_none; - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); if (arg->tok == tok_ellipsis2 || arg->tok == tok_ellipsis4) { ellipsis = arg->tok; - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); if (arg->tok != tok_bsymbol) { free (symbol); @@ -2954,7 +2955,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, if (state != 0) goto err_label; - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); if (arg->tok != tok_bsymbol) goto err_label; else @@ -2965,7 +2966,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result, size_t symname_len; struct symbol_t *symval; - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); if (arg->tok != tok_bsymbol) { if (newname != NULL) @@ -3022,7 +3023,7 @@ error while adding equivalent collating symbol")); case tok_script: /* We get told about the scripts we know. */ - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); if (arg->tok != tok_bsymbol) goto err_label; else @@ -3074,7 +3075,7 @@ error while adding equivalent collating symbol")); /* The 14652 draft does not specify whether all `order_start' lines must contain the same number of sort-rules, but 14651 does. So we require this here as well. */ - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); if (arg->tok == tok_bsymbol) { /* This better should be a section name. */ @@ -3133,7 +3134,7 @@ error while adding equivalent collating symbol")); } /* Next should come the end of the line or a semicolon. */ - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); if (arg->tok == tok_eol) { uint32_t cnt; @@ -3156,7 +3157,7 @@ error while adding equivalent collating symbol")); } /* Get the next token. */ - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); } } else @@ -3237,7 +3238,7 @@ error while adding equivalent collating symbol")); goto err_label; state = 3; - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); if (arg->tok == tok_bsymbol || arg->tok == tok_ucs4) { /* Find this symbol in the sequence table. */ @@ -3366,7 +3367,7 @@ error while adding equivalent collating symbol")); state = 5; /* Get the name of the sections we are adding after. */ - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); if (arg->tok == tok_bsymbol) { /* Now find a section with this name. */ @@ -3399,7 +3400,7 @@ error while adding equivalent collating symbol")); { lr_ignore_rest (ldfile, 0); - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); } while (now->tok == tok_reorder_sections_after || now->tok == tok_reorder_sections_end @@ -3596,7 +3597,7 @@ error while adding equivalent collating symbol")); /* Process the rest of the line which might change the collation rules. */ - arg = lr_token (ldfile, charmap, repertoire); + arg = lr_token (ldfile, charmap, repertoire, verbose); if (arg->tok != tok_eof && arg->tok != tok_eol) read_directions (ldfile, arg, charmap, repertoire, collate); @@ -3710,7 +3711,7 @@ error while adding equivalent collating symbol")); error (0, 0, _("%s: missing `reorder-sections-end' keyword"), "LC_COLLATE"); } - arg = lr_token (ldfile, charmap, NULL); + arg = lr_token (ldfile, charmap, NULL, verbose); if (arg->tok == tok_eof) break; if (arg->tok == tok_eol) @@ -3727,7 +3728,7 @@ error while adding equivalent collating symbol")); } /* Prepare for the next round. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c index fd427f1..24a5391 100644 --- a/locale/programs/ld-ctype.c +++ b/locale/programs/ld-ctype.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. @@ -1878,7 +1878,7 @@ read_translit_entry (struct linereader *ldfile, struct locale_ctype_t *ctype, /* Next we have one or more transliterations. They are separated by semicolons. */ - now = lr_token (ldfile, charmap, repertoire); + now = lr_token (ldfile, charmap, repertoire, verbose); if (!first && (now->tok == tok_semicolon || now->tok == tok_eol)) { @@ -1939,7 +1939,7 @@ read_translit_ignore_entry (struct linereader *ldfile, single characters, possibly defining a range when an ellipsis is used. */ while (1) { - struct token *now = lr_token (ldfile, charmap, repertoire); + struct token *now = lr_token (ldfile, charmap, repertoire, verbose); struct translit_ignore_t *newp; uint32_t from; @@ -1983,7 +1983,7 @@ read_translit_ignore_entry (struct linereader *ldfile, /* Now we expect either a semicolon, an ellipsis, or the end of the line. */ - now = lr_token (ldfile, charmap, repertoire); + now = lr_token (ldfile, charmap, repertoire, verbose); if (now->tok == tok_ellipsis2 || now->tok == tok_ellipsis2_2) { @@ -1992,7 +1992,7 @@ read_translit_ignore_entry (struct linereader *ldfile, uint32_t to; int step = now->tok == tok_ellipsis2_2 ? 2 : 1; - now = lr_token (ldfile, charmap, repertoire); + now = lr_token (ldfile, charmap, repertoire, verbose); if (now->tok == tok_eol || now->tok == tok_eof) { @@ -2033,7 +2033,7 @@ to-value <U%0*X> of range is smaller than from-value <U%0*X>"), } /* And the next token. */ - now = lr_token (ldfile, charmap, repertoire); + now = lr_token (ldfile, charmap, repertoire, verbose); } if (now->tok == tok_eol || now->tok == tok_eof) @@ -2084,7 +2084,7 @@ ctype_read (struct linereader *ldfile, struct localedef_t *result, do { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } while (nowtok == tok_eol); @@ -2092,18 +2092,19 @@ ctype_read (struct linereader *ldfile, struct localedef_t *result, /* If we see `copy' now we are almost done. */ if (nowtok == tok_copy) { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_string) { SYNTAX_ERROR (_("%s: syntax error"), "LC_CTYPE"); skip_category: do - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); while (now->tok != tok_eof && now->tok != tok_end); if (now->tok != tok_eof - || (now = lr_token (ldfile, charmap, NULL), now->tok == tok_eof)) + || (now = lr_token (ldfile, charmap, NULL, verbose), + now->tok == tok_eof)) lr_error (ldfile, _("%s: premature end of file"), "LC_CTYPE"); else if (now->tok != tok_lc_ctype) { @@ -2132,7 +2133,7 @@ ctype_read (struct linereader *ldfile, struct localedef_t *result, lr_ignore_rest (ldfile, 1); - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } @@ -2157,7 +2158,7 @@ ctype_read (struct linereader *ldfile, struct localedef_t *result, /* Ingore empty lines. */ if (nowtok == tok_eol) { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; continue; } @@ -2165,14 +2166,14 @@ ctype_read (struct linereader *ldfile, struct localedef_t *result, switch (nowtok) { case tok_charclass: - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); while (now->tok == tok_ident || now->tok == tok_string) { ctype_class_new (ldfile, ctype, now->val.str.startmb); - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_semicolon) break; - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); } if (now->tok != tok_eol) SYNTAX_ERROR (_("\ @@ -2180,14 +2181,14 @@ ctype_read (struct linereader *ldfile, struct localedef_t *result, break; case tok_charconv: - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); while (now->tok == tok_ident || now->tok == tok_string) { ctype_map_new (ldfile, ctype, now->val.str.startmb, charmap); - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_semicolon) break; - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); } if (now->tok != tok_eol) SYNTAX_ERROR (_("\ @@ -2205,7 +2206,7 @@ ctype_read (struct linereader *ldfile, struct localedef_t *result, /* We simply forget the `class' keyword and use the following operand to determine the bit. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok == tok_ident || now->tok == tok_string) { /* Must can be one of the predefined class names. */ @@ -2251,7 +2252,7 @@ ctype_read (struct linereader *ldfile, struct localedef_t *result, } /* The next character must be a semicolon. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_semicolon) goto err_label; goto read_charclass; @@ -2283,7 +2284,7 @@ ctype_read (struct linereader *ldfile, struct localedef_t *result, last_token = tok_none; ellipsis_token = tok_none; step = 1; - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); while (now->tok != tok_eol && now->tok != tok_eof) { uint32_t wch; @@ -2420,7 +2421,7 @@ with character code range values one must use the absolute ellipsis `...'")); } /* Next we expect a semicolon or the end of the line. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok == tok_eol || now->tok == tok_eof) break; @@ -2440,7 +2441,7 @@ with character code range values one must use the absolute ellipsis `...'")); ellipsis_token = now->tok; - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); continue; } @@ -2448,7 +2449,7 @@ with character code range values one must use the absolute ellipsis `...'")); goto err_label; /* And get the next character. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); ellipsis_token = tok_none; step = 1; @@ -2523,7 +2524,7 @@ with character code range values one must use the absolute ellipsis `...'")); /* We simply forget the `map' keyword and use the following operand to determine the mapping. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok == tok_ident || now->tok == tok_string) { size_t cnt; @@ -2545,7 +2546,7 @@ with character code range values one must use the absolute ellipsis `...'")); else mapidx = now->tok - tok_toupper; - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); /* This better should be a semicolon. */ if (now->tok != tok_semicolon) goto err_label; @@ -2561,7 +2562,7 @@ with character code range values one must use the absolute ellipsis `...'")); } ctype->tomap_done[mapidx] = 1; - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); while (now->tok != tok_eol && now->tok != tok_eof) { struct charseq *from_seq; @@ -2574,24 +2575,24 @@ with character code range values one must use the absolute ellipsis `...'")); goto err_label; /* Next comes the from-value. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (get_character (now, charmap, repertoire, &from_seq, &from_wch) != 0) goto err_label; /* The next is a comma. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_comma) goto err_label; /* And the other value. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (get_character (now, charmap, repertoire, &to_seq, &to_wch) != 0) goto err_label; /* And the last thing is the closing brace. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_close_brace) goto err_label; @@ -2613,9 +2614,9 @@ with character code range values one must use the absolute ellipsis `...'")); } /* Now comes a semicolon or the end of the line/file. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok == tok_semicolon) - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); } break; @@ -2627,7 +2628,7 @@ with character code range values one must use the absolute ellipsis `...'")); do { lr_ignore_rest (ldfile, 0); - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); } while (now->tok != tok_translit_end && now->tok != tok_eof); @@ -2650,7 +2651,7 @@ with character code range values one must use the absolute ellipsis `...'")); ldfile->return_widestr = 1; /* We proceed until we see the `translit_end' token. */ - while (now = lr_token (ldfile, charmap, repertoire), + while (now = lr_token (ldfile, charmap, repertoire, verbose), now->tok != tok_translit_end && now->tok != tok_eof) { if (now->tok == tok_eol) @@ -2664,7 +2665,7 @@ with character code range values one must use the absolute ellipsis `...'")); const char *repertoire_name; struct translit_include_t *include_stmt, **include_ptr; - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); /* This should be a string or an identifier. In any case something to name a locale. */ if (now->tok != tok_string && now->tok != tok_ident) @@ -2677,12 +2678,12 @@ with character code range values one must use the absolute ellipsis `...'")); locale_name = now->val.str.startmb; /* Next should be a semicolon. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_semicolon) goto translit_syntax; /* Now the repertoire name. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if ((now->tok != tok_string && now->tok != tok_ident) || now->val.str.startmb == NULL) goto translit_syntax; @@ -2716,7 +2717,7 @@ with character code range values one must use the absolute ellipsis `...'")); { /* We expect a single character or string as the argument. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); wstr = read_widestring (ldfile, now, charmap, repertoire); @@ -2746,7 +2747,7 @@ previous definition was here")); break; /* Maybe there is another replacement we can use. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok == tok_eol || now->tok == tok_eof) { /* Nothing found. We tell the user. */ @@ -2837,7 +2838,7 @@ previous definition was here")); case tok_end: /* Next we assume `LC_CTYPE'. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok == tok_eof) break; if (now->tok == tok_eol) @@ -2856,7 +2857,7 @@ previous definition was here")); } /* Prepare for the next round. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } diff --git a/locale/programs/ld-identification.c b/locale/programs/ld-identification.c index bc252a0..12e32f8 100644 --- a/locale/programs/ld-identification.c +++ b/locale/programs/ld-identification.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -301,7 +301,7 @@ identification_read (struct linereader *ldfile, struct localedef_t *result, do { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } while (nowtok == tok_eol); @@ -328,7 +328,7 @@ identification_read (struct linereader *ldfile, struct localedef_t *result, /* Ignore empty lines. */ if (nowtok == tok_eol) { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; continue; } @@ -345,7 +345,7 @@ identification_read (struct linereader *ldfile, struct localedef_t *result, break; \ } \ \ - arg = lr_token (ldfile, charmap, NULL); \ + arg = lr_token (ldfile, charmap, NULL, verbose); \ if (arg->tok != tok_string) \ goto err_label; \ if (identification->cat != NULL) \ @@ -386,15 +386,15 @@ identification_read (struct linereader *ldfile, struct localedef_t *result, } /* We expect two operands. */ - arg = lr_token (ldfile, charmap, NULL); + arg = lr_token (ldfile, charmap, NULL, verbose); if (arg->tok != tok_string && arg->tok != tok_ident) goto err_label; /* Next is a semicolon. */ - cattok = lr_token (ldfile, charmap, NULL); + cattok = lr_token (ldfile, charmap, NULL, verbose); if (cattok->tok != tok_semicolon) goto err_label; /* Now a LC_xxx identifier. */ - cattok = lr_token (ldfile, charmap, NULL); + cattok = lr_token (ldfile, charmap, NULL, verbose); switch (cattok->tok) { #define CATEGORY(lname, uname) \ @@ -430,7 +430,7 @@ identification_read (struct linereader *ldfile, struct localedef_t *result, case tok_end: /* Next we assume `LC_IDENTIFICATION'. */ - arg = lr_token (ldfile, charmap, NULL); + arg = lr_token (ldfile, charmap, NULL, verbose); if (arg->tok == tok_eof) break; if (arg->tok == tok_eol) @@ -448,7 +448,7 @@ identification_read (struct linereader *ldfile, struct localedef_t *result, } /* Prepare for the next round. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } diff --git a/locale/programs/ld-measurement.c b/locale/programs/ld-measurement.c index f628026..07eb3cb 100644 --- a/locale/programs/ld-measurement.c +++ b/locale/programs/ld-measurement.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -164,7 +164,7 @@ measurement_read (struct linereader *ldfile, struct localedef_t *result, do { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } while (nowtok == tok_eol); @@ -191,7 +191,7 @@ measurement_read (struct linereader *ldfile, struct localedef_t *result, /* Ingore empty lines. */ if (nowtok == tok_eol) { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; continue; } @@ -208,7 +208,7 @@ measurement_read (struct linereader *ldfile, struct localedef_t *result, break; \ } \ \ - arg = lr_token (ldfile, charmap, NULL); \ + arg = lr_token (ldfile, charmap, NULL, verbose); \ if (arg->tok != tok_number) \ goto err_label; \ else if (measurement->cat != 0) \ @@ -222,7 +222,7 @@ measurement_read (struct linereader *ldfile, struct localedef_t *result, case tok_end: /* Next we assume `LC_MEASUREMENT'. */ - arg = lr_token (ldfile, charmap, NULL); + arg = lr_token (ldfile, charmap, NULL, verbose); if (arg->tok == tok_eof) break; if (arg->tok == tok_eol) @@ -240,7 +240,7 @@ measurement_read (struct linereader *ldfile, struct localedef_t *result, } /* Prepare for the next round. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } diff --git a/locale/programs/ld-messages.c b/locale/programs/ld-messages.c index 6ca2d8a..cbf240e 100644 --- a/locale/programs/ld-messages.c +++ b/locale/programs/ld-messages.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. @@ -245,7 +245,7 @@ messages_read (struct linereader *ldfile, struct localedef_t *result, do { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } while (nowtok == tok_eol); @@ -273,7 +273,7 @@ messages_read (struct linereader *ldfile, struct localedef_t *result, /* Ignore empty lines. */ if (nowtok == tok_eol) { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; continue; } @@ -297,7 +297,7 @@ messages_read (struct linereader *ldfile, struct localedef_t *result, lr_ignore_rest (ldfile, 0); \ break; \ } \ - now = lr_token (ldfile, charmap, repertoire); \ + now = lr_token (ldfile, charmap, repertoire, verbose); \ if (now->tok != tok_string) \ goto syntax_error; \ else if (!ignore_content && now->val.str.startmb == NULL) \ @@ -317,7 +317,7 @@ messages_read (struct linereader *ldfile, struct localedef_t *result, case tok_end: /* Next we assume `LC_MESSAGES'. */ - arg = lr_token (ldfile, charmap, NULL); + arg = lr_token (ldfile, charmap, NULL, verbose); if (arg->tok == tok_eof) break; if (arg->tok == tok_eol) @@ -334,7 +334,7 @@ messages_read (struct linereader *ldfile, struct localedef_t *result, } /* Prepare for the next round. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } diff --git a/locale/programs/ld-monetary.c b/locale/programs/ld-monetary.c index c64daf2..7779e87 100644 --- a/locale/programs/ld-monetary.c +++ b/locale/programs/ld-monetary.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. @@ -642,7 +642,7 @@ monetary_read (struct linereader *ldfile, struct localedef_t *result, do { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } while (nowtok == tok_eol); @@ -668,7 +668,7 @@ monetary_read (struct linereader *ldfile, struct localedef_t *result, /* Ignore empty lines. */ if (nowtok == tok_eol) { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; continue; } @@ -685,7 +685,7 @@ monetary_read (struct linereader *ldfile, struct localedef_t *result, break; \ } \ \ - now = lr_token (ldfile, charmap, NULL); \ + now = lr_token (ldfile, charmap, NULL, verbose); \ if (now->tok != tok_string) \ goto err_label; \ else if (monetary->cat != NULL) \ @@ -720,7 +720,7 @@ monetary_read (struct linereader *ldfile, struct localedef_t *result, } \ \ ldfile->return_widestr = 1; \ - now = lr_token (ldfile, charmap, repertoire); \ + now = lr_token (ldfile, charmap, repertoire, verbose); \ if (now->tok != tok_string) \ goto err_label; \ if (monetary->cat != NULL) \ @@ -761,7 +761,7 @@ monetary_read (struct linereader *ldfile, struct localedef_t *result, break; \ } \ \ - now = lr_token (ldfile, charmap, NULL); \ + now = lr_token (ldfile, charmap, NULL, verbose); \ if (now->tok != tok_minus1 && now->tok != tok_number) \ goto err_label; \ else if (monetary->cat != -2) \ @@ -813,7 +813,7 @@ monetary_read (struct linereader *ldfile, struct localedef_t *result, break; } - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_minus1 && now->tok != tok_number) goto err_label; else @@ -861,11 +861,11 @@ monetary_read (struct linereader *ldfile, struct localedef_t *result, grouping[act++] = now->val.num; /* Next must be semicolon. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_semicolon) break; - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); } while (now->tok == tok_minus1 || now->tok == tok_number); @@ -891,7 +891,7 @@ monetary_read (struct linereader *ldfile, struct localedef_t *result, break; } - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_number) goto err_label; if (now->val.num == 0) @@ -908,11 +908,11 @@ monetary_read (struct linereader *ldfile, struct localedef_t *result, if (!ignore_content) monetary->conversion_rate[0] = now->val.num; /* Next must be a semicolon. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_semicolon) goto err_label; /* And another number. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_number) goto err_label; if (now->val.num == 0) @@ -925,7 +925,7 @@ monetary_read (struct linereader *ldfile, struct localedef_t *result, case tok_end: /* Next we assume `LC_MONETARY'. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok == tok_eof) break; if (now->tok == tok_eol) @@ -942,7 +942,7 @@ monetary_read (struct linereader *ldfile, struct localedef_t *result, } /* Prepare for the next round. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } diff --git a/locale/programs/ld-name.c b/locale/programs/ld-name.c index 135e9bc..7940c03 100644 --- a/locale/programs/ld-name.c +++ b/locale/programs/ld-name.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -223,7 +223,7 @@ name_read (struct linereader *ldfile, struct localedef_t *result, do { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } while (nowtok == tok_eol); @@ -249,7 +249,7 @@ name_read (struct linereader *ldfile, struct localedef_t *result, /* Ignore empty lines. */ if (nowtok == tok_eol) { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; continue; } @@ -266,7 +266,7 @@ name_read (struct linereader *ldfile, struct localedef_t *result, break; \ } \ \ - arg = lr_token (ldfile, charmap, NULL); \ + arg = lr_token (ldfile, charmap, NULL, verbose); \ if (arg->tok != tok_string) \ goto err_label; \ if (name->cat != NULL) \ @@ -291,7 +291,7 @@ name_read (struct linereader *ldfile, struct localedef_t *result, case tok_end: /* Next we assume `LC_NAME'. */ - arg = lr_token (ldfile, charmap, NULL); + arg = lr_token (ldfile, charmap, NULL, verbose); if (arg->tok == tok_eof) break; if (arg->tok == tok_eol) @@ -308,7 +308,7 @@ name_read (struct linereader *ldfile, struct localedef_t *result, } /* Prepare for the next round. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } diff --git a/locale/programs/ld-numeric.c b/locale/programs/ld-numeric.c index 80a557c..77633ef 100644 --- a/locale/programs/ld-numeric.c +++ b/locale/programs/ld-numeric.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. @@ -207,7 +207,7 @@ numeric_read (struct linereader *ldfile, struct localedef_t *result, do { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } while (nowtok == tok_eol); @@ -233,7 +233,7 @@ numeric_read (struct linereader *ldfile, struct localedef_t *result, /* Ingore empty lines. */ if (nowtok == tok_eol) { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; continue; } @@ -251,7 +251,7 @@ numeric_read (struct linereader *ldfile, struct localedef_t *result, } \ \ ldfile->return_widestr = 1; \ - now = lr_token (ldfile, charmap, repertoire); \ + now = lr_token (ldfile, charmap, repertoire, verbose); \ if (now->tok != tok_string) \ goto err_label; \ if (numeric->cat != NULL) \ @@ -291,7 +291,7 @@ numeric_read (struct linereader *ldfile, struct localedef_t *result, break; } - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_minus1 && now->tok != tok_number) goto err_label; else @@ -338,11 +338,11 @@ numeric_read (struct linereader *ldfile, struct localedef_t *result, grouping[act++] = now->val.num; /* Next must be semicolon. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_semicolon) break; - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); } while (now->tok == tok_minus1 || now->tok == tok_number); @@ -361,7 +361,7 @@ numeric_read (struct linereader *ldfile, struct localedef_t *result, case tok_end: /* Next we assume `LC_NUMERIC'. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok == tok_eof) break; if (now->tok == tok_eol) @@ -378,7 +378,7 @@ numeric_read (struct linereader *ldfile, struct localedef_t *result, } /* Prepare for the next round. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } diff --git a/locale/programs/ld-paper.c b/locale/programs/ld-paper.c index 2b7c6f4..776c780 100644 --- a/locale/programs/ld-paper.c +++ b/locale/programs/ld-paper.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -166,7 +166,7 @@ paper_read (struct linereader *ldfile, struct localedef_t *result, do { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } while (nowtok == tok_eol); @@ -192,7 +192,7 @@ paper_read (struct linereader *ldfile, struct localedef_t *result, /* Ingore empty lines. */ if (nowtok == tok_eol) { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; continue; } @@ -209,7 +209,7 @@ paper_read (struct linereader *ldfile, struct localedef_t *result, break; \ } \ \ - arg = lr_token (ldfile, charmap, NULL); \ + arg = lr_token (ldfile, charmap, NULL, verbose); \ if (arg->tok != tok_number) \ goto err_label; \ else if (paper->cat != 0) \ @@ -224,7 +224,7 @@ paper_read (struct linereader *ldfile, struct localedef_t *result, case tok_end: /* Next we assume `LC_PAPER'. */ - arg = lr_token (ldfile, charmap, NULL); + arg = lr_token (ldfile, charmap, NULL, verbose); if (arg->tok == tok_eof) break; if (arg->tok == tok_eol) @@ -241,7 +241,7 @@ paper_read (struct linereader *ldfile, struct localedef_t *result, } /* Prepare for the next round. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } diff --git a/locale/programs/ld-telephone.c b/locale/programs/ld-telephone.c index 19ba12d..2d59079 100644 --- a/locale/programs/ld-telephone.c +++ b/locale/programs/ld-telephone.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -233,7 +233,7 @@ telephone_read (struct linereader *ldfile, struct localedef_t *result, do { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } while (nowtok == tok_eol); @@ -259,7 +259,7 @@ telephone_read (struct linereader *ldfile, struct localedef_t *result, /* Ingore empty lines. */ if (nowtok == tok_eol) { - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; continue; } @@ -276,7 +276,7 @@ telephone_read (struct linereader *ldfile, struct localedef_t *result, break; \ } \ \ - arg = lr_token (ldfile, charmap, NULL); \ + arg = lr_token (ldfile, charmap, NULL, verbose); \ if (arg->tok != tok_string) \ goto err_label; \ if (telephone->cat != NULL) \ @@ -299,7 +299,7 @@ telephone_read (struct linereader *ldfile, struct localedef_t *result, case tok_end: /* Next we assume `LC_TELEPHONE'. */ - arg = lr_token (ldfile, charmap, NULL); + arg = lr_token (ldfile, charmap, NULL, verbose); if (arg->tok == tok_eof) break; if (arg->tok == tok_eol) @@ -316,7 +316,7 @@ telephone_read (struct linereader *ldfile, struct localedef_t *result, } /* Prepare for the next round. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); nowtok = now->tok; } diff --git a/locale/programs/ld-time.c b/locale/programs/ld-time.c index ad4914a..1475953 100644 --- a/locale/programs/ld-time.c +++ b/locale/programs/ld-time.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. @@ -904,7 +904,7 @@ time_read (struct linereader *ldfile, struct localedef_t *result, do { - now = lr_token (ldfile, charmap, repertoire); + now = lr_token (ldfile, charmap, repertoire, verbose); nowtok = now->tok; } while (nowtok == tok_eol); @@ -930,7 +930,7 @@ time_read (struct linereader *ldfile, struct localedef_t *result, /* Ingore empty lines. */ if (nowtok == tok_eol) { - now = lr_token (ldfile, charmap, repertoire); + now = lr_token (ldfile, charmap, repertoire, verbose); nowtok = now->tok; continue; } @@ -949,7 +949,7 @@ time_read (struct linereader *ldfile, struct localedef_t *result, \ for (cnt = 0; cnt < max; ++cnt) \ { \ - now = lr_token (ldfile, charmap, repertoire); \ + now = lr_token (ldfile, charmap, repertoire, verbose); \ if (now->tok == tok_eol) \ { \ if (cnt < min) \ @@ -981,7 +981,7 @@ time_read (struct linereader *ldfile, struct localedef_t *result, } \ \ /* Match the semicolon. */ \ - now = lr_token (ldfile, charmap, repertoire); \ + now = lr_token (ldfile, charmap, repertoire, verbose); \ if (now->tok != tok_semicolon && now->tok != tok_eol) \ break; \ } \ @@ -995,7 +995,7 @@ time_read (struct linereader *ldfile, struct localedef_t *result, \ if (now->tok == tok_semicolon) \ { \ - now = lr_token (ldfile, charmap, repertoire); \ + now = lr_token (ldfile, charmap, repertoire, verbose); \ if (now->tok == tok_eol) \ lr_error (ldfile, _("extra trailing semicolon")); \ else if (now->tok == tok_string) \ @@ -1031,7 +1031,7 @@ time_read (struct linereader *ldfile, struct localedef_t *result, } do { - now = lr_token (ldfile, charmap, repertoire); + now = lr_token (ldfile, charmap, repertoire, verbose); if (now->tok != tok_string) goto err_label; if (!ignore_content && (now->val.str.startmb == NULL @@ -1053,7 +1053,7 @@ time_read (struct linereader *ldfile, struct localedef_t *result, * sizeof (char *)); time->wera[time->num_era++] = now->val.str.startwc; } - now = lr_token (ldfile, charmap, repertoire); + now = lr_token (ldfile, charmap, repertoire, verbose); if (now->tok != tok_eol && now->tok != tok_semicolon) goto err_label; } @@ -1070,7 +1070,7 @@ time_read (struct linereader *ldfile, struct localedef_t *result, break; \ } \ \ - now = lr_token (ldfile, charmap, repertoire); \ + now = lr_token (ldfile, charmap, repertoire, verbose); \ if (now->tok != tok_string) \ goto err_label; \ else if (time->cat != NULL) \ @@ -1112,7 +1112,7 @@ time_read (struct linereader *ldfile, struct localedef_t *result, break; \ } \ \ - now = lr_token (ldfile, charmap, repertoire); \ + now = lr_token (ldfile, charmap, repertoire, verbose); \ if (now->tok != tok_number) \ goto err_label; \ else if (time->cat != 0) \ @@ -1135,25 +1135,25 @@ time_read (struct linereader *ldfile, struct localedef_t *result, break; } - now = lr_token (ldfile, charmap, repertoire); + now = lr_token (ldfile, charmap, repertoire, verbose); if (now->tok != tok_number) goto err_label; time->week_ndays = now->val.num; - now = lr_token (ldfile, charmap, repertoire); + now = lr_token (ldfile, charmap, repertoire, verbose); if (now->tok != tok_semicolon) goto err_label; - now = lr_token (ldfile, charmap, repertoire); + now = lr_token (ldfile, charmap, repertoire, verbose); if (now->tok != tok_number) goto err_label; time->week_1stday = now->val.num; - now = lr_token (ldfile, charmap, repertoire); + now = lr_token (ldfile, charmap, repertoire, verbose); if (now->tok != tok_semicolon) goto err_label; - now = lr_token (ldfile, charmap, repertoire); + now = lr_token (ldfile, charmap, repertoire, verbose); if (now->tok != tok_number) goto err_label; time->week_1stweek = now->val.num; @@ -1163,7 +1163,7 @@ time_read (struct linereader *ldfile, struct localedef_t *result, case tok_end: /* Next we assume `LC_TIME'. */ - now = lr_token (ldfile, charmap, repertoire); + now = lr_token (ldfile, charmap, repertoire, verbose); if (now->tok == tok_eof) break; if (now->tok == tok_eol) @@ -1180,7 +1180,7 @@ time_read (struct linereader *ldfile, struct localedef_t *result, } /* Prepare for the next round. */ - now = lr_token (ldfile, charmap, repertoire); + now = lr_token (ldfile, charmap, repertoire, verbose); nowtok = now->tok; } diff --git a/locale/programs/linereader.c b/locale/programs/linereader.c index 01f5c9d..5dba62f 100644 --- a/locale/programs/linereader.c +++ b/locale/programs/linereader.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. @@ -31,7 +31,11 @@ #include "charmap.h" #include "error.h" #include "linereader.h" -#include "localedef.h" + +/* Prototypes for a few program-wide used functions. */ +extern void *xmalloc (size_t __n); +extern void *xrealloc (void *__p, size_t __n); +extern char *xstrdup (const char *__str); /* Prototypes for local functions. */ @@ -40,7 +44,8 @@ static struct token *get_symname (struct linereader *lr); static struct token *get_ident (struct linereader *lr); static struct token *get_string (struct linereader *lr, const struct charmap_t *charmap, - const struct repertoire_t *repertoire); + const struct repertoire_t *repertoire, + int verbose); struct linereader * @@ -158,7 +163,7 @@ extern char *program_name; struct token * lr_token (struct linereader *lr, const struct charmap_t *charmap, - const struct repertoire_t *repertoire) + const struct repertoire_t *repertoire, int verbose) { int ch; @@ -290,7 +295,7 @@ lr_token (struct linereader *lr, const struct charmap_t *charmap, return &lr->token; case '"': - return get_string (lr, charmap, repertoire); + return get_string (lr, charmap, repertoire, verbose); case '-': ch = lr_getc (lr); @@ -563,7 +568,7 @@ get_ident (struct linereader *lr) static struct token * get_string (struct linereader *lr, const struct charmap_t *charmap, - const struct repertoire_t *repertoire) + const struct repertoire_t *repertoire, int verbose) { int return_widestr = lr->return_widestr; char *buf; diff --git a/locale/programs/linereader.h b/locale/programs/linereader.h index 77fa61a..94802fc 100644 --- a/locale/programs/linereader.h +++ b/locale/programs/linereader.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper, <drepper@gnu.org>. @@ -91,7 +91,8 @@ extern void lr_close (struct linereader *lr); extern int lr_next (struct linereader *lr); extern struct token *lr_token (struct linereader *lr, const struct charmap_t *charmap, - const struct repertoire_t *repertoire); + const struct repertoire_t *repertoire, + int verbose); #define lr_error(lr, fmt, args...) \ diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c index 197e61e..f57c467 100644 --- a/locale/programs/localedef.c +++ b/locale/programs/localedef.c @@ -190,7 +190,7 @@ main (int argc, char *argv[]) error (3, 0, _("FATAL: system does not define `_POSIX2_LOCALEDEF'")); /* Process charmap file. */ - charmap = charmap_read (charmap_file); + charmap = charmap_read (charmap_file, verbose, be_quiet, 1); /* Add the first entry in the locale list. */ memset (&global, '\0', sizeof (struct localedef_t)); diff --git a/locale/programs/locfile.c b/locale/programs/locfile.c index 0825248..4dafaef 100644 --- a/locale/programs/locfile.c +++ b/locale/programs/locfile.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. @@ -95,7 +95,7 @@ locfile_read (struct localedef_t *result, struct charmap_t *charmap) /* Parse locale definition file and store result in RESULT. */ while (1) { - struct token *now = lr_token (ldfile, charmap, NULL); + struct token *now = lr_token (ldfile, charmap, NULL, verbose); enum token_t nowtok = now->tok; struct token *arg; @@ -111,7 +111,7 @@ locfile_read (struct localedef_t *result, struct charmap_t *charmap) case tok_escape_char: case tok_comment_char: /* We need an argument. */ - arg = lr_token (ldfile, charmap, NULL); + arg = lr_token (ldfile, charmap, NULL, verbose); if (arg->tok != tok_ident) { @@ -138,7 +138,7 @@ argument to `%s' must be a single character"), case tok_repertoiremap: /* We need an argument. */ - arg = lr_token (ldfile, charmap, NULL); + arg = lr_token (ldfile, charmap, NULL, verbose); if (arg->tok != tok_ident) { diff --git a/locale/programs/locfile.h b/locale/programs/locfile.h index 96e2a11..a259e52 100644 --- a/locale/programs/locfile.h +++ b/locale/programs/locfile.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. @@ -54,7 +54,7 @@ handle_copy (struct linereader *ldfile, struct charmap_t *charmap, struct token *now; int warned = 0; - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != tok_string) lr_error (ldfile, _("expect string argument for `copy'")); else if (!ignore_content) @@ -74,7 +74,7 @@ locale name should consist only of portable characters")); /* The rest of the line must be empty and the next keyword must be `END xxx'. */ - while ((now = lr_token (ldfile, charmap, NULL))->tok != tok_end + while ((now = lr_token (ldfile, charmap, NULL, verbose))->tok != tok_end && now->tok != tok_eof) { if (warned == 0) @@ -90,7 +90,7 @@ no other keyword shall be specified when `copy' is used")); if (now->tok != tok_eof) { /* Handle `END xxx'. */ - now = lr_token (ldfile, charmap, NULL); + now = lr_token (ldfile, charmap, NULL, verbose); if (now->tok != token) lr_error (ldfile, _("\ diff --git a/locale/programs/repertoire.c b/locale/programs/repertoire.c index a33ecc7..66bcf74 100644 --- a/locale/programs/repertoire.c +++ b/locale/programs/repertoire.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -149,7 +149,7 @@ repertoire_read (const char *filename) while (1) { /* What's on? */ - struct token *now = lr_token (repfile, NULL, NULL); + struct token *now = lr_token (repfile, NULL, NULL, verbose); enum token_t nowtok = now->tok; struct token *arg; @@ -168,7 +168,7 @@ repertoire_read (const char *filename) if (nowtok == tok_escape_char || nowtok == tok_comment_char) { /* We know that we need an argument. */ - arg = lr_token (repfile, NULL, NULL); + arg = lr_token (repfile, NULL, NULL, verbose); if (arg->tok != tok_ident) { |