[Gtranslator-devel] Re: Expanding gettext-po.h



On Wed, 2004-01-28 at 11:44 +0700, Ross Golder wrote:
> Hi GNU gettext people,
> 
> I'm interested in expanding the public API for GNU gettext to include
> the ability for applications to re-use gettext's PO file parsing code,
> and record structures.
> 
> I'm a maintainer of gtranslator, a GNOME front-end for translators to
> edit PO files. I'd like to rewrite the parser code and message structure
> use to use gettext's 'official' structures and code, as it will
> hopefully make the application smaller, more reliable and easier to
> maintain. I'd also eventually like to port this application to my iPAQ,
> where preventing code duplication between applications is far more
> important in order to conserve memory. I can also see it being useful
> for other applications that manipulate PO files.
> 
> I'm not expecting to change or break any API-compatibility, simply add
> the necessary structures and functions so that they're available via the
> gettext-po.h header and libgettext-po.so library files.
> 
> Does anyone have any issues with this? Should I just submit patches
> against the most recent tarball, or should I work from CVS somewhere?
> Who should I send patches to?
> 

Hi,

I've got something a bit more concrete to propose now. Please see the
attached patch. Unfortunately, this approach breaks API compatibility
slightly (for the better, I hope).

Basically, it adds a '**errptr' argument to the read_po and read_po_file
functions. If the 'read_po' or 'read_po_file' functions return with
errptr not NULL, the calling application should handle the error and
free the memory at errptr.

The point is to move the error handling back up the stack to the calling
program, and not have calls to the 'error' function (which calls 'exit')
within the parser itself. This way, applications are responsible for
handling the errors. In the case of command-line programs, like the msg*
programs, they simply call 'error' further up the stack. In my
development branch of gtranslator, it will pop up a GNOME dialog
explaining the problem.

I'd like to submit this patch first for evaluation, discussion,
refinement or whatever is required to get it back into the mainstream
gettext releases.

After this, I'd like to work out some kind of callback mechanism whereby
the parser can feed errors back to the calling program (rather than just
dumping to stderr, as it does now). The msg* programs could have a
simple handler for dumping to stderr as before, and GUI programs could
display them in a dialog, as required.

And finally, I will need to examine the 'write-po' stuff, and do a
similar exercise making sure there are no 'exit' calls lurking in there,
and that errors writing the po file are passed back up the stack to the
calling application.

Also, applications will need to be able to find and include various
gettext headers. For this, I've got patches that install a handful of
headers in '$(includedir)/gettext-0.0'. This seems to be sufficient for
gtranslator to find them by doing '#include <gettext-0.0/messages.h>'
etc. Is this a good approach, or could this be done better?

I've also created a gettext-tools/test/read-write.c which simply parses
a po file into memory using the parser (read-po.c), and writes it out
using the writer (write-po.c). Would this be considered a useful test?

Comments please! :)

Regards,

--
Ross
Only in gettext-0.14.1/autoconf-lib-link: autom4te.cache
Only in gettext-0.14.1/autoconf-lib-link: config
Only in gettext-0.14.1/autoconf-lib-link: config-dir
Only in gettext-0.14.1/autoconf-lib-link: config.log
Only in gettext-0.14.1/autoconf-lib-link: config.status
Only in gettext-0.14.1/autoconf-lib-link: libtool
Only in gettext-0.14.1/autoconf-lib-link/m4: Makefile
Only in gettext-0.14.1/autoconf-lib-link: Makefile
Only in gettext-0.14.1/autoconf-lib-link/tests: Makefile
Only in gettext-0.14.1: autom4te.cache
Only in gettext-0.14.1: config.log
Only in gettext-0.14.1: config.status
Only in gettext-0.14.1/gettext-runtime: autom4te.cache
Only in gettext-0.14.1/gettext-runtime: config.h
Only in gettext-0.14.1/gettext-runtime: config.log
Only in gettext-0.14.1/gettext-runtime: config.status
Only in gettext-0.14.1/gettext-runtime/doc: Makefile
Only in gettext-0.14.1/gettext-runtime/intl: Makefile
Only in gettext-0.14.1/gettext-runtime/intl-csharp: Makefile
Only in gettext-0.14.1/gettext-runtime/intl-java: Makefile
Only in gettext-0.14.1/gettext-runtime/lib: csharpcomp.sh
Only in gettext-0.14.1/gettext-runtime/lib: javacomp.sh
Only in gettext-0.14.1/gettext-runtime/lib: Makefile
Only in gettext-0.14.1/gettext-runtime/libasprintf: config.h
Only in gettext-0.14.1/gettext-runtime/libasprintf: config.log
Only in gettext-0.14.1/gettext-runtime/libasprintf: config.status
Only in gettext-0.14.1/gettext-runtime/libasprintf: libtool
Only in gettext-0.14.1/gettext-runtime/libasprintf: Makefile
Only in gettext-0.14.1/gettext-runtime/libasprintf: stamp-h1
Only in gettext-0.14.1/gettext-runtime: libtool
Only in gettext-0.14.1/gettext-runtime/m4: Makefile
Only in gettext-0.14.1/gettext-runtime: Makefile
Only in gettext-0.14.1/gettext-runtime/man: Makefile
Only in gettext-0.14.1/gettext-runtime/man: x-to-1
Only in gettext-0.14.1/gettext-runtime/po: Makefile
Only in gettext-0.14.1/gettext-runtime/po: POTFILES
Only in gettext-0.14.1/gettext-runtime/src: Makefile
Only in gettext-0.14.1/gettext-runtime: stamp-h1
Only in gettext-0.14.1/gettext-tools: autom4te.cache
Only in gettext-0.14.1/gettext-tools: config.h
Only in gettext-0.14.1/gettext-tools: config.log
Only in gettext-0.14.1/gettext-tools: config.status
Only in gettext-0.14.1/gettext-tools/doc: Makefile
Only in gettext-0.14.1/gettext-tools: error-progname.c
Only in gettext-0.14.1/gettext-tools/examples: installpaths
Only in gettext-0.14.1/gettext-tools/examples: Makefile
Only in gettext-0.14.1/gettext-tools/examples/po: Makefile
Only in gettext-0.14.1/gettext-tools/intl: ChangeLog.inst
Only in gettext-0.14.1/gettext-tools/intl: Makefile
Only in gettext-0.14.1/gettext-tools/intl: VERSION
Only in gettext-0.14.1/gettext-tools/lib: csharpcomp.sh
Only in gettext-0.14.1/gettext-tools/lib: csharpexec.sh
Only in gettext-0.14.1/gettext-tools/lib: error.c~
Only in gettext-0.14.1/gettext-tools/lib: javacomp.sh
Only in gettext-0.14.1/gettext-tools/lib: javaexec.sh
Only in gettext-0.14.1/gettext-tools/lib: Makefile
Only in gettext-0.14.1/gettext-tools: libtool
Only in gettext-0.14.1/gettext-tools/libuniname: Makefile
Only in gettext-0.14.1/gettext-tools/m4: Makefile
Only in gettext-0.14.1/gettext-tools: Makefile
Only in gettext-0.14.1/gettext-tools/man: Makefile
Only in gettext-0.14.1/gettext-tools/man: x-to-1
Only in gettext-0.14.1/gettext-tools/misc: autopoint
Only in gettext-0.14.1/gettext-tools/misc: gettextize
Only in gettext-0.14.1/gettext-tools/misc: Makefile
Only in gettext-0.14.1/gettext-tools/po: Makefile
Only in gettext-0.14.1/gettext-tools/po: POTFILES
Only in gettext-0.14.1/gettext-tools/projects: Makefile
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/gettext-po.c gettext-0.14.1/gettext-tools/src/gettext-po.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/gettext-po.c	2003-10-17 11:28:07.000000000 +0100
+++ gettext-0.14.1/gettext-tools/src/gettext-po.c	2004-08-07 20:14:33.000000000 +0100
@@ -56,6 +56,7 @@
 {
   FILE *fp;
   po_file_t file;
+  char *errptr;
 
   fp = fopen (filename, "r");
   if (fp == NULL)
@@ -63,9 +64,14 @@
   file = (struct po_file *) xmalloc (sizeof (struct po_file));
   file->real_filename = filename;
   file->logical_filename = filename;
-  file->mdlp = read_po (fp, file->real_filename, file->logical_filename);
+  file->mdlp = read_po (fp, file->real_filename, file->logical_filename, &errptr);
   file->domains = NULL;
   fclose (fp);
+  if(errptr != NULL) {
+        error (EXIT_FAILURE, 0, "parser error in '%s': %s",
+	       filename, errptr);
+	free(errptr);
+  }
   return file;
 }
 
Only in gettext-0.14.1/gettext-tools/src: gettext-po.c~
Only in gettext-0.14.1/gettext-tools/src: Makefile
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/msgattrib.c gettext-0.14.1/gettext-tools/src/msgattrib.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/msgattrib.c	2004-01-14 12:01:04.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/msgattrib.c	2004-08-07 20:14:47.000000000 +0100
@@ -134,6 +134,7 @@
   msgdomain_list_ty *result;
   bool sort_by_msgid = false;
   bool sort_by_filepos = false;
+  char *errptr = NULL;
 
   /* Set program name for messages.  */
   set_program_name (argv[0]);
@@ -342,11 +343,26 @@
 	   "--sort-output", "--sort-by-file");
 
   /* Read input file.  */
-  result = read_po_file (input_file);
+  result = read_po_file (input_file, &errptr);
+  if(errptr != NULL) {
+    error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	   input_file, errptr);
+    free(errptr);
+  }
 
   /* Read optional files that limit the extent of the attribute changes.  */
-  only_mdlp = (only_file != NULL ? read_po_file (only_file) : NULL);
-  ignore_mdlp = (ignore_file != NULL ? read_po_file (ignore_file) : NULL);
+  only_mdlp = (only_file != NULL ? read_po_file (only_file, &errptr) : NULL);
+  if(errptr != NULL) {
+    error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	   only_file, errptr);
+    free(errptr);
+  }
+  ignore_mdlp = (ignore_file != NULL ? read_po_file (ignore_file, &errptr) : NULL);
+  if(errptr != NULL) {
+    error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	   ignore_file, errptr);
+    free(errptr);
+  }
 
   /* Filter the messages and manipulate the attributes.  */
   result = process_msgdomain_list (result, only_mdlp, ignore_mdlp);
Only in gettext-0.14.1/gettext-tools/src: msgattrib.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/msgcmp.c gettext-0.14.1/gettext-tools/src/msgcmp.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/msgcmp.c	2004-01-14 12:01:04.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/msgcmp.c	2004-08-07 20:14:49.000000000 +0100
@@ -304,13 +304,24 @@
   int nerrors;
   size_t j, k;
   message_list_ty *empty_list;
+  char *errptr = NULL;
 
   /* This is the master file, created by a human.  */
-  def = remove_obsoletes (read_po_file (fn1));
+  def = remove_obsoletes (read_po_file (fn1, &errptr));
+  if(errptr != NULL) {
+        error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	       fn1, errptr);
+	free(errptr);
+  }
 
   /* This is the generated file, created by groping the sources with
      the xgettext program.  */
-  ref = remove_obsoletes (read_po_file (fn2));
+  ref = remove_obsoletes (read_po_file (fn2, &errptr));
+  if(errptr != NULL) {
+        error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	       fn2, errptr);
+	free(errptr);
+  }
 
   /* The references file can be either in ASCII or in UTF-8.  If it is
      in UTF-8, we have to convert the definitions to UTF-8 as well.  */
Only in gettext-0.14.1/gettext-tools/src: msgcmp.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/msgconv.c gettext-0.14.1/gettext-tools/src/msgconv.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/msgconv.c	2004-01-14 12:01:04.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/msgconv.c	2004-08-07 20:14:50.000000000 +0100
@@ -98,6 +98,7 @@
   input_syntax_ty output_syntax = syntax_po;
   bool sort_by_filepos = false;
   bool sort_by_msgid = false;
+  char *errptr = NULL;
 
   /* Set program name for messages.  */
   set_program_name (argv[0]);
@@ -252,7 +253,12 @@
     to_code = locale_charset ();
 
   /* Read input file.  */
-  result = read_po_file (input_file);
+  result = read_po_file (input_file, &errptr);
+  if(errptr != NULL) {
+    error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	   input_file, errptr);
+    free(errptr);
+  }
 
   /* Convert if and only if the output syntax supports different encodings.  */
   if (output_syntax != syntax_properties
Only in gettext-0.14.1/gettext-tools/src: msgconv.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/msgen.c gettext-0.14.1/gettext-tools/src/msgen.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/msgen.c	2004-01-14 12:01:04.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/msgen.c	2004-08-07 20:14:50.000000000 +0100
@@ -91,6 +91,7 @@
   msgdomain_list_ty *result;
   bool sort_by_filepos = false;
   bool sort_by_msgid = false;
+  char *errptr = NULL;
 
   /* Set program name for messages.  */
   set_program_name (argv[0]);
@@ -235,7 +236,12 @@
 	   "--sort-output", "--sort-by-file");
 
   /* Read input file and add English translations.  */
-  result = msgdomain_list_english (read_po_file (argv[optind]));
+  result = msgdomain_list_english (read_po_file (argv[optind], &errptr));
+  if(errptr != NULL) {
+    error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	   argv[optind], errptr);
+    free(errptr);
+  }
 
   /* Sort the results.  */
   if (sort_by_filepos)
Only in gettext-0.14.1/gettext-tools/src: msgen.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/msgexec.c gettext-0.14.1/gettext-tools/src/msgexec.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/msgexec.c	2004-01-14 12:01:04.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/msgexec.c	2004-08-07 20:14:51.000000000 +0100
@@ -104,6 +104,7 @@
   const char *input_file;
   msgdomain_list_ty *result;
   size_t i;
+  char *errptr = NULL;
 
   /* Set program name for messages.  */
   set_program_name (argv[0]);
@@ -204,7 +205,12 @@
     input_file = "-";
 
   /* Read input file.  */
-  result = read_po_file (input_file);
+  result = read_po_file (input_file, &errptr);
+  if(errptr != NULL) {
+    error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	   input_file, errptr);
+    free(errptr);
+  }
 
   if (strcmp (sub_name, "0") != 0)
     {
Only in gettext-0.14.1/gettext-tools/src: msgexec.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/msgfilter.c gettext-0.14.1/gettext-tools/src/msgfilter.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/msgfilter.c	2004-01-14 12:01:04.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/msgfilter.c	2004-08-07 20:14:52.000000000 +0100
@@ -145,6 +145,7 @@
   bool sort_by_filepos = false;
   bool sort_by_msgid = false;
   size_t i;
+  char *errptr = NULL;
 
   /* Set program name for messages.  */
   set_program_name (argv[0]);
@@ -330,7 +331,12 @@
     input_file = "-";
 
   /* Read input file.  */
-  result = read_po_file (input_file);
+  result = read_po_file (input_file, &errptr);
+  if(errptr != NULL) {
+    error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	   input_file, errptr);
+    free(errptr);
+  }
 
   /* Warn if the current locale is not suitable for this PO file.  */
   compare_po_locale_charsets (result);
Only in gettext-0.14.1/gettext-tools/src: msgfilter.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/msgfmt.c gettext-0.14.1/gettext-tools/src/msgfmt.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/msgfmt.c	2004-01-15 11:30:11.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/msgfmt.c	2004-08-07 20:35:45.000000000 +0100
@@ -1691,6 +1691,7 @@
   char *real_filename;
   FILE *fp = open_po_file (filename, &real_filename, true);
   default_po_reader_ty *pop;
+  char *errptr = NULL;
 
   pop = default_po_reader_alloc (&msgfmt_methods);
   pop->handle_comments = false;
@@ -1708,9 +1709,15 @@
     }
   po_lex_pass_obsolete_entries (true);
   po_scan ((abstract_po_reader_ty *) pop, fp, real_filename, filename,
-	   input_syntax);
+	   input_syntax, &errptr);
   po_reader_free ((abstract_po_reader_ty *) pop);
 
   if (fp != stdin)
     fclose (fp);
+
+  if(errptr != NULL) {
+      error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+		filename, errptr);
+      free(errptr);
+  }
 }
Only in gettext-0.14.1/gettext-tools/src: msgfmt.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/msggrep.c gettext-0.14.1/gettext-tools/src/msggrep.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/msggrep.c	2004-01-14 12:01:04.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/msggrep.c	2004-08-07 20:14:53.000000000 +0100
@@ -142,6 +142,7 @@
   msgdomain_list_ty *result;
   bool sort_by_filepos = false;
   bool sort_by_msgid = false;
+  char *errptr;
 
   /* Set program name for messages.  */
   set_program_name (argv[0]);
@@ -345,7 +346,12 @@
 	   "--sort-output", "--sort-by-file");
 
   /* Read input file.  */
-  result = read_po_file (input_file);
+  result = read_po_file (input_file, &errptr);
+  if(errptr != NULL) {
+    error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	   input_file, errptr);
+    free(errptr);
+  }
 
   if (grep_args[0]->nitems > 0
       || grep_args[1]->nitems > 0
Only in gettext-0.14.1/gettext-tools/src: msggrep.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/msginit.c gettext-0.14.1/gettext-tools/src/msginit.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/msginit.c	2004-01-18 14:43:14.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/msginit.c	2004-08-07 20:14:53.000000000 +0100
@@ -163,6 +163,7 @@
   char *output_file;
   const char *input_file;
   msgdomain_list_ty *result;
+  char *errptr = NULL;
 
   /* Set program name for messages.  */
   set_program_name (argv[0]);
@@ -329,7 +330,12 @@
     }
 
   /* Read input file.  */
-  result = read_po_file (input_file);
+  result = read_po_file (input_file, &errptr);
+  if(errptr != NULL) {
+    error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	   input_file, errptr);
+    free(errptr);
+  }
 
   /* Fill the header entry.  */
   result = fill_header (result);
Only in gettext-0.14.1/gettext-tools/src: msginit.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/msgl-cat.c gettext-0.14.1/gettext-tools/src/msgl-cat.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/msgl-cat.c	2003-12-19 11:17:28.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/msgl-cat.c	2004-08-07 14:07:02.000000000 +0100
@@ -113,12 +113,18 @@
   msgdomain_list_ty *total_mdlp;
   const char *canon_to_code;
   size_t n, j, k;
+  char *errptr = NULL;
 
   /* Read input files.  */
   mdlps =
     (msgdomain_list_ty **) xmalloc (nfiles * sizeof (msgdomain_list_ty *));
-  for (n = 0; n < nfiles; n++)
-    mdlps[n] = read_po_file (files[n]);
+  for (n = 0; n < nfiles; n++) {
+    mdlps[n] = read_po_file (files[n], &errptr);
+    if(error != NULL) {
+        error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	       files[n], errptr);
+    }
+  }
 
   /* Determine the canonical name of each input file's encoding.  */
   canon_charsets = (const char ***) xmalloc (nfiles * sizeof (const char **));
Only in gettext-0.14.1/gettext-tools/src: msgl-cat.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/msgmerge.c gettext-0.14.1/gettext-tools/src/msgmerge.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/msgmerge.c	2004-01-15 11:30:11.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/msgmerge.c	2004-08-07 20:15:28.000000000 +0100
@@ -557,8 +557,14 @@
 {
   msgdomain_list_ty *mdlp;
   size_t k;
+  char *errptr = NULL;
 
-  mdlp = read_po_file (filename);
+  mdlp = read_po_file (filename, &errptr);
+  if(errptr != NULL) {
+	fprintf(stderr, _("parser error in '%s': %s\n"), filename, errptr);
+	free(errptr);
+	exit(1);
+  }
   if (!compendiums)
     compendiums = message_list_list_alloc ();
   for (k = 0; k < mdlp->nitems; k++)
@@ -1082,11 +1088,17 @@
   msgdomain_list_ty *result;
   message_list_list_ty *definitions;
   message_list_ty *empty_list;
+  char *errptr = NULL;
 
   stats.merged = stats.fuzzied = stats.missing = stats.obsolete = 0;
 
   /* This is the definitions file, created by a human.  */
-  def = read_po_file (fn1);
+  def = read_po_file (fn1, &errptr);
+  if(errptr != NULL) {
+        error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	       fn1, errptr);
+	free(errptr);
+  }
 
   /* Create the set of places to look for message definitions: a list
      whose first element will be definitions for the current domain, and
@@ -1099,7 +1111,13 @@
 
   /* This is the references file, created by groping the sources with
      the xgettext program.  */
-  ref = read_po_file (fn2);
+  ref = read_po_file (fn2, &errptr);
+  if(errptr != NULL) {
+        error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	       fn2, errptr);
+	free(errptr);
+  }
+
   /* Add a dummy header entry, if the references file contains none.  */
   for (k = 0; k < ref->nitems; k++)
     if (message_list_search (ref->item[k]->messages, "") == NULL)
Only in gettext-0.14.1/gettext-tools/src: msgmerge.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/po-gram-gen2.h gettext-0.14.1/gettext-tools/src/po-gram-gen2.h
--- /usr/src/gettext-0.14.1/gettext-tools/src/po-gram-gen2.h	2003-10-29 20:21:27.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/po-gram-gen2.h	2004-08-07 13:10:43.000000000 +0100
@@ -1,29 +1,75 @@
-#ifndef BISON_Y_TAB_H
-# define BISON_Y_TAB_H
+/* A Bison parser, made by GNU Bison 1.875a.  */
 
-#ifndef YYSTYPE
-typedef union
-{
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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 General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum po_gram_tokentype {
+     COMMENT = 258,
+     DOMAIN = 259,
+     JUNK = 260,
+     MSGID = 261,
+     MSGID_PLURAL = 262,
+     MSGSTR = 263,
+     NAME = 264,
+     NUMBER = 265,
+     STRING = 266
+   };
+#endif
+#define COMMENT 258
+#define DOMAIN 259
+#define JUNK 260
+#define MSGID 261
+#define MSGID_PLURAL 262
+#define MSGSTR 263
+#define NAME 264
+#define NUMBER 265
+#define STRING 266
+
+
+
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 124 "po-gram-gen.y"
+typedef union YYSTYPE {
   struct { char *string; lex_pos_ty pos; bool obsolete; } string;
   struct { string_list_ty stringlist; lex_pos_ty pos; bool obsolete; } stringlist;
   struct { long number; lex_pos_ty pos; bool obsolete; } number;
   struct { lex_pos_ty pos; bool obsolete; } pos;
   struct { struct msgstr_def rhs; lex_pos_ty pos; bool obsolete; } rhs;
-} po_gram_stype;
-# define YYSTYPE po_gram_stype
+} YYSTYPE;
+/* Line 1240 of yacc.c.  */
+#line 67 "y.tab.h"
+# define po_gram_stype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
 #endif
-# define	COMMENT	257
-# define	DOMAIN	258
-# define	JUNK	259
-# define	MSGID	260
-# define	MSGID_PLURAL	261
-# define	MSGSTR	262
-# define	NAME	263
-# define	NUMBER	264
-# define	STRING	265
-
 
 extern DLL_VARIABLE YYSTYPE po_gram_lval;
 
-#endif /* not BISON_Y_TAB_H */
+
+
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/po-gram-gen.c gettext-0.14.1/gettext-tools/src/po-gram-gen.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/po-gram-gen.c	2003-11-16 15:59:13.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/po-gram-gen.c	2004-08-07 13:10:43.000000000 +0100
@@ -1,18 +1,83 @@
-/* A Bison parser, made from po-gram-gen.y
-   by GNU bison 1.35.  */
+/* A Bison parser, made by GNU Bison 1.875a.  */
 
-#define YYBISON 1  /* Identify Bison output.  */
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
 
-# define	COMMENT	257
-# define	DOMAIN	258
-# define	JUNK	259
-# define	MSGID	260
-# define	MSGID_PLURAL	261
-# define	MSGSTR	262
-# define	NAME	263
-# define	NUMBER	264
-# define	STRING	265
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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 General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* Written by Richard Stallman by simplifying the original so called
+   ``semantic'' parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON 1
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
 
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     COMMENT = 258,
+     DOMAIN = 259,
+     JUNK = 260,
+     MSGID = 261,
+     MSGID_PLURAL = 262,
+     MSGSTR = 263,
+     NAME = 264,
+     NUMBER = 265,
+     STRING = 266
+   };
+#endif
+#define COMMENT 258
+#define DOMAIN 259
+#define JUNK 260
+#define MSGID 261
+#define MSGID_PLURAL 262
+#define MSGSTR 263
+#define NAME 264
+#define NUMBER 265
+#define STRING 266
+
+
+
+
+/* Copy the first part of user declarations.  */
 #line 20 "po-gram-gen.y"
 
 #ifdef HAVE_CONFIG_H
@@ -105,203 +170,45 @@
 }
 
 
-#line 123 "po-gram-gen.y"
-#ifndef YYSTYPE
-typedef union
-{
-  struct { char *string; lex_pos_ty pos; bool obsolete; } string;
-  struct { string_list_ty stringlist; lex_pos_ty pos; bool obsolete; } stringlist;
-  struct { long number; lex_pos_ty pos; bool obsolete; } number;
-  struct { lex_pos_ty pos; bool obsolete; } pos;
-  struct { struct msgstr_def rhs; lex_pos_ty pos; bool obsolete; } rhs;
-} yystype;
-# define YYSTYPE yystype
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
+
+/* Enabling traces.  */
 #ifndef YYDEBUG
 # define YYDEBUG 0
 #endif
 
-
-
-#define	YYFINAL		28
-#define	YYFLAG		-32768
-#define	YYNTBASE	14
-
-/* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */
-#define YYTRANSLATE(x) ((unsigned)(x) <= 265 ? yytranslate[x] : 22)
-
-/* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */
-static const char yytranslate[] =
-{
-       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,    10,     2,    11,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     1,     3,     4,     5,
-       6,     7,     8,     9,    12,    13
-};
-
-#if YYDEBUG
-static const short yyprhs[] =
-{
-       0,     0,     1,     4,     7,    10,    13,    16,    21,    26,
-      30,    34,    37,    40,    42,    45,    51,    53,    56
-};
-static const short yyrhs[] =
-{
-      -1,    14,    21,     0,    14,    15,     0,    14,    16,     0,
-      14,     1,     0,     4,    13,     0,     6,    20,     8,    20,
-       0,     6,    20,    17,    18,     0,     6,    20,    17,     0,
-       6,    20,    18,     0,     6,    20,     0,     7,    20,     0,
-      19,     0,    18,    19,     0,     8,    10,    12,    11,    20,
-       0,    13,     0,    20,    13,     0,     3,     0
-};
-
-#endif
-
-#if YYDEBUG
-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
-static const short yyrline[] =
-{
-       0,   143,   144,   145,   146,   147,   151,   158,   176,   194,
-     202,   210,   219,   230,   234,   249,   271,   278,   289
-};
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
 #endif
 
-
-#if (YYDEBUG) || defined YYERROR_VERBOSE
-
-/* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */
-static const char *const yytname[] =
-{
-  "$", "error", "$undefined.", "COMMENT", "DOMAIN", "JUNK", "MSGID", 
-  "MSGID_PLURAL", "MSGSTR", "NAME", "'['", "']'", "NUMBER", "STRING", 
-  "msgfmt", "domain", "message", "msgid_pluralform", "pluralform_list", 
-  "pluralform", "string_list", "comment", 0
-};
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 124 "po-gram-gen.y"
+typedef union YYSTYPE {
+  struct { char *string; lex_pos_ty pos; bool obsolete; } string;
+  struct { string_list_ty stringlist; lex_pos_ty pos; bool obsolete; } stringlist;
+  struct { long number; lex_pos_ty pos; bool obsolete; } number;
+  struct { lex_pos_ty pos; bool obsolete; } pos;
+  struct { struct msgstr_def rhs; lex_pos_ty pos; bool obsolete; } rhs;
+} YYSTYPE;
+/* Line 191 of yacc.c.  */
+#line 198 "y.tab.c"
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
 #endif
 
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
-static const short yyr1[] =
-{
-       0,    14,    14,    14,    14,    14,    15,    16,    16,    16,
-      16,    16,    17,    18,    18,    19,    20,    20,    21
-};
-
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
-static const short yyr2[] =
-{
-       0,     0,     2,     2,     2,     2,     2,     4,     4,     3,
-       3,     2,     2,     1,     2,     5,     1,     2,     1
-};
-
-/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
-   doesn't specify something else to do.  Zero means the default is an
-   error. */
-static const short yydefact[] =
-{
-       1,     0,     5,    18,     0,     0,     3,     4,     2,     6,
-      16,    11,     0,     0,    17,     9,    10,    13,    12,     0,
-       7,     0,     8,    14,     0,     0,    15,     0,     0
-};
-
-static const short yydefgoto[] =
-{
-       1,     6,     7,    15,    16,    17,    11,     8
-};
-
-static const short yypact[] =
-{
-  -32768,     2,-32768,-32768,    -1,     1,-32768,-32768,-32768,-32768,
-  -32768,     3,     1,    -6,-32768,     9,     9,-32768,     5,     7,
-       5,    10,     9,-32768,    11,     1,     5,    21,-32768
-};
-
-static const short yypgoto[] =
-{
-  -32768,-32768,-32768,-32768,     8,    -7,   -12,-32768
-};
-
-
-#define	YYLAST		23
-
-
-static const short yytable[] =
-{
-      18,    20,    27,     2,    19,     3,     4,    10,     5,    23,
-      12,    13,     9,    26,    10,    23,    14,    21,    14,    24,
-      19,    28,    25,    22
-};
 
-static const short yycheck[] =
-{
-      12,    13,     0,     1,    10,     3,     4,    13,     6,    16,
-       7,     8,    13,    25,    13,    22,    13,     8,    13,    12,
-      10,     0,    11,    15
-};
-/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
-#line 3 "/usr/local/share/bison/bison.simple"
 
-/* Skeleton output parser for bison,
+/* Copy the second part of user declarations.  */
 
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software
-   Foundation, Inc.
 
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
+/* Line 214 of yacc.c.  */
+#line 210 "y.tab.c"
 
-   This program 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
-/* As a special exception, when this file is copied by Bison into a
-   Bison output file, you may use that output file without restriction.
-   This special exception was added by the Free Software Foundation
-   in version 1.24 of Bison.  */
-
-/* This is the parser code that is written into each bison parser when
-   the %semantic_parser declaration is not specified in the grammar.
-   It was written by Richard Stallman by simplifying the hairy parser
-   used when %semantic_parser is specified.  */
-
-/* All symbols defined below should begin with yy or YY, to avoid
-   infringing on user name space.  This should be done even for local
-   variables, as they might otherwise be expanded by user macros.
-   There are some unavoidable exceptions within include files to
-   define necessary library symbols; they are noted "INFRINGES ON
-   USER NAME SPACE" below.  */
-
-#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)
+#if ! defined (yyoverflow) || YYERROR_VERBOSE
 
 /* The parser invokes alloca or malloc; define the necessary symbols.  */
 
@@ -330,37 +237,28 @@
 #  define YYSTACK_ALLOC malloc
 #  define YYSTACK_FREE free
 # endif
-#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
 
 
 #if (! defined (yyoverflow) \
      && (! defined (__cplusplus) \
-	 || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+	 || (YYSTYPE_IS_TRIVIAL)))
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
 {
   short yyss;
   YYSTYPE yyvs;
-# if YYLSP_NEEDED
-  YYLTYPE yyls;
-# endif
-};
+  };
 
 /* The size of the maximum gap between one aligned stack and the next.  */
-# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
 
 /* The size of an array large to enough to hold all stacks, each with
    N elements.  */
-# if YYLSP_NEEDED
-#  define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE))	\
-      + 2 * YYSTACK_GAP_MAX)
-# else
 #  define YYSTACK_BYTES(N) \
      ((N) * (sizeof (short) + sizeof (YYSTYPE))				\
-      + YYSTACK_GAP_MAX)
-# endif
+      + YYSTACK_GAP_MAXIMUM)
 
 /* Copy COUNT objects from FROM to TO.  The source and destination do
    not overlap.  */
@@ -391,13 +289,196 @@
 	YYSIZE_T yynewbytes;						\
 	YYCOPY (&yyptr->Stack, Stack, yysize);				\
 	Stack = &yyptr->Stack;						\
-	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;	\
+	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
 	yyptr += yynewbytes / sizeof (*yyptr);				\
       }									\
     while (0)
 
 #endif
 
+#if defined (__STDC__) || defined (__cplusplus)
+   typedef signed char yysigned_char;
+#else
+   typedef short yysigned_char;
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL  2
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   24
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS  14
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS  9
+/* YYNRULES -- Number of rules. */
+#define YYNRULES  19
+/* YYNRULES -- Number of states. */
+#define YYNSTATES  28
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   266
+
+#define YYTRANSLATE(YYX) 						\
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const unsigned char yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,    10,     2,    11,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    12,    13
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const unsigned char yyprhs[] =
+{
+       0,     0,     3,     4,     7,    10,    13,    16,    19,    24,
+      29,    33,    37,    40,    43,    45,    48,    54,    56,    59
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yysigned_char yyrhs[] =
+{
+      15,     0,    -1,    -1,    15,    22,    -1,    15,    16,    -1,
+      15,    17,    -1,    15,     1,    -1,     4,    13,    -1,     6,
+      21,     8,    21,    -1,     6,    21,    18,    19,    -1,     6,
+      21,    18,    -1,     6,    21,    19,    -1,     6,    21,    -1,
+       7,    21,    -1,    20,    -1,    19,    20,    -1,     8,    10,
+      12,    11,    21,    -1,    13,    -1,    21,    13,    -1,     3,
+      -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const unsigned short yyrline[] =
+{
+       0,   142,   142,   144,   145,   146,   147,   151,   158,   176,
+     194,   202,   210,   219,   230,   234,   249,   271,   278,   289
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE
+/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "COMMENT", "DOMAIN", "JUNK", "MSGID", 
+  "MSGID_PLURAL", "MSGSTR", "NAME", "'['", "']'", "NUMBER", "STRING", 
+  "$accept", "msgfmt", "domain", "message", "msgid_pluralform", 
+  "pluralform_list", "pluralform", "string_list", "comment", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const unsigned short yytoknum[] =
+{
+       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+      91,    93,   265,   266
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const unsigned char yyr1[] =
+{
+       0,    14,    15,    15,    15,    15,    15,    16,    17,    17,
+      17,    17,    17,    18,    19,    19,    20,    21,    21,    22
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const unsigned char yyr2[] =
+{
+       0,     2,     0,     2,     2,     2,     2,     2,     4,     4,
+       3,     3,     2,     2,     1,     2,     5,     1,     2,     1
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const unsigned char yydefact[] =
+{
+       2,     0,     1,     6,    19,     0,     0,     4,     5,     3,
+       7,    17,    12,     0,     0,    18,    10,    11,    14,    13,
+       0,     8,     0,     9,    15,     0,     0,    16
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yysigned_char yydefgoto[] =
+{
+      -1,     1,     7,     8,    16,    17,    18,    12,     9
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -14
+static const yysigned_char yypact[] =
+{
+     -14,     2,   -14,   -14,   -14,    -1,     1,   -14,   -14,   -14,
+     -14,   -14,     3,     1,    -6,   -14,     9,     9,   -14,     5,
+       7,     5,    10,     9,   -14,    11,     1,     5
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const yysigned_char yypgoto[] =
+{
+     -14,   -14,   -14,   -14,   -14,     8,    -8,   -13,   -14
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -1
+static const unsigned char yytable[] =
+{
+      19,    21,     2,     3,    20,     4,     5,    11,     6,    24,
+      13,    14,    10,    27,    11,    24,    15,    22,    15,    25,
+      20,     0,    26,     0,    23
+};
+
+static const yysigned_char yycheck[] =
+{
+      13,    14,     0,     1,    10,     3,     4,    13,     6,    17,
+       7,     8,    13,    26,    13,    23,    13,     8,    13,    12,
+      10,    -1,    11,    -1,    16
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const unsigned char yystos[] =
+{
+       0,    15,     0,     1,     3,     4,     6,    16,    17,    22,
+      13,    13,    21,     7,     8,    13,    18,    19,    20,    21,
+      10,    21,     8,    19,    20,    12,    11,    21
+};
 
 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
 # define YYSIZE_T __SIZE_TYPE__
@@ -417,29 +498,35 @@
 
 #define yyerrok		(yyerrstatus = 0)
 #define yyclearin	(yychar = YYEMPTY)
-#define YYEMPTY		-2
+#define YYEMPTY		(-2)
 #define YYEOF		0
+
 #define YYACCEPT	goto yyacceptlab
 #define YYABORT 	goto yyabortlab
 #define YYERROR		goto yyerrlab1
+
+
 /* Like YYERROR except do call yyerror.  This remains here temporarily
    to ease the transition to the new meaning of YYERROR, for GCC.
    Once GCC version 2 has supplanted version 1, this can go.  */
+
 #define YYFAIL		goto yyerrlab
+
 #define YYRECOVERING()  (!!yyerrstatus)
+
 #define YYBACKUP(Token, Value)					\
 do								\
   if (yychar == YYEMPTY && yylen == 1)				\
     {								\
       yychar = (Token);						\
       yylval = (Value);						\
-      yychar1 = YYTRANSLATE (yychar);				\
+      yytoken = YYTRANSLATE (yychar);				\
       YYPOPSTACK;						\
       goto yybackup;						\
     }								\
   else								\
     { 								\
-      yyerror ("syntax error: cannot back up");			\
+      yyerror ("syntax error: cannot back up");\
       YYERROR;							\
     }								\
 while (0)
@@ -447,41 +534,24 @@
 #define YYTERROR	1
 #define YYERRCODE	256
 
-
 /* YYLLOC_DEFAULT -- Compute the default location (before the actions
-   are run).
-
-   When YYLLOC_DEFAULT is run, CURRENT is set the location of the
-   first token.  By default, to implement support for ranges, extend
-   its range to the last symbol.  */
+   are run).  */
 
 #ifndef YYLLOC_DEFAULT
 # define YYLLOC_DEFAULT(Current, Rhs, N)       	\
+  Current.first_line   = Rhs[1].first_line;      \
+  Current.first_column = Rhs[1].first_column;    \
    Current.last_line   = Rhs[N].last_line;	\
    Current.last_column = Rhs[N].last_column;
 #endif
 
-
 /* YYLEX -- calling `yylex' with the right arguments.  */
 
-#if YYPURE
-# if YYLSP_NEEDED
-#  ifdef YYLEX_PARAM
-#   define YYLEX		yylex (&yylval, &yylloc, YYLEX_PARAM)
-#  else
-#   define YYLEX		yylex (&yylval, &yylloc)
-#  endif
-# else /* !YYLSP_NEEDED */
-#  ifdef YYLEX_PARAM
-#   define YYLEX		yylex (&yylval, YYLEX_PARAM)
-#  else
-#   define YYLEX		yylex (&yylval)
-#  endif
-# endif /* !YYLSP_NEEDED */
-#else /* !YYPURE */
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
 # define YYLEX			yylex ()
-#endif /* !YYPURE */
-
+#endif
 
 /* Enable debugging if requested.  */
 #if YYDEBUG
@@ -496,13 +566,93 @@
   if (yydebug)					\
     YYFPRINTF Args;				\
 } while (0)
+
+# define YYDSYMPRINT(Args)			\
+do {						\
+  if (yydebug)					\
+    yysymprint Args;				\
+} while (0)
+
+# define YYDSYMPRINTF(Title, Token, Value, Location)		\
+do {								\
+  if (yydebug)							\
+    {								\
+      YYFPRINTF (stderr, "%s ", Title);				\
+      yysymprint (stderr, 					\
+                  Token, Value);	\
+      YYFPRINTF (stderr, "\n");					\
+    }								\
+} while (0)
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (cinluded).                                                   |
+`------------------------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_stack_print (short *bottom, short *top)
+#else
+static void
+yy_stack_print (bottom, top)
+    short *bottom;
+    short *top;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (/* Nothing. */; bottom <= top; ++bottom)
+    YYFPRINTF (stderr, " %d", *bottom);
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)				\
+do {								\
+  if (yydebug)							\
+    yy_stack_print ((Bottom), (Top));				\
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_reduce_print (int yyrule)
+#else
+static void
+yy_reduce_print (yyrule)
+    int yyrule;
+#endif
+{
+  int yyi;
+  unsigned int yylineno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
+             yyrule - 1, yylineno);
+  /* Print the symbols being reduced, and their result.  */
+  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+    YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
+  YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
+}
+
+# define YY_REDUCE_PRINT(Rule)		\
+do {					\
+  if (yydebug)				\
+    yy_reduce_print (Rule);		\
+} while (0)
+
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
 int yydebug;
 #else /* !YYDEBUG */
 # define YYDPRINTF(Args)
+# define YYDSYMPRINT(Args)
+# define YYDSYMPRINTF(Title, Token, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
 #endif /* !YYDEBUG */
 
+
 /* YYINITDEPTH -- initial size of the parser's stacks.  */
 #ifndef	YYINITDEPTH
 # define YYINITDEPTH 200
@@ -523,7 +673,9 @@
 # define YYMAXDEPTH 10000
 #endif
 
-#ifdef YYERROR_VERBOSE
+
+
+#if YYERROR_VERBOSE
 
 # ifndef yystrlen
 #  if defined (__GLIBC__) && defined (_STRING_H)
@@ -573,78 +725,126 @@
 }
 #  endif
 # endif
+
+#endif /* !YYERROR_VERBOSE */
+
+
+
+#if YYDEBUG
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yysymprint (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvaluep;
+
+  if (yytype < YYNTOKENS)
+    {
+      YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+# ifdef YYPRINT
+      YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# endif
+    }
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+  YYFPRINTF (yyoutput, ")");
+}
+
+#endif /* ! YYDEBUG */
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yydestruct (int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yytype, yyvaluep)
+    int yytype;
+    YYSTYPE *yyvaluep;
 #endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvaluep;
 
-#line 315 "/usr/local/share/bison/bison.simple"
+  switch (yytype)
+    {
 
+      default:
+        break;
+    }
+}
 
-/* The user can define YYPARSE_PARAM as the name of an argument to be passed
-   into yyparse.  The argument should have type void *.
-   It should actually point to an object.
-   Grammar actions can access the variable by casting it
-   to the proper pointer type.  */
+
+/* Prevent warnings from -Wmissing-prototypes.  */
 
 #ifdef YYPARSE_PARAM
 # if defined (__STDC__) || defined (__cplusplus)
-#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
-#  define YYPARSE_PARAM_DECL
+int yyparse (void *YYPARSE_PARAM);
 # else
-#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
-#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+int yyparse ();
 # endif
-#else /* !YYPARSE_PARAM */
-# define YYPARSE_PARAM_ARG
-# define YYPARSE_PARAM_DECL
-#endif /* !YYPARSE_PARAM */
-
-/* Prevent warning if -Wstrict-prototypes.  */
-#ifdef __GNUC__
-# ifdef YYPARSE_PARAM
-int yyparse (void *);
-# else
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
 int yyparse (void);
-# endif
+#else
+int yyparse ();
 #endif
+#endif /* ! YYPARSE_PARAM */
 
-/* YY_DECL_VARIABLES -- depending whether we use a pure parser,
-   variables are global, or local to YYPARSE.  */
 
-#define YY_DECL_NON_LSP_VARIABLES			\
-/* The lookahead symbol.  */				\
-int yychar;						\
-							\
-/* The semantic value of the lookahead symbol. */	\
-YYSTYPE yylval;						\
-							\
-/* Number of parse errors so far.  */			\
-int yynerrs;
 
-#if YYLSP_NEEDED
-# define YY_DECL_VARIABLES			\
-YY_DECL_NON_LSP_VARIABLES			\
-						\
-/* Location data for the lookahead symbol.  */	\
-YYLTYPE yylloc;
-#else
-# define YY_DECL_VARIABLES			\
-YY_DECL_NON_LSP_VARIABLES
-#endif
+/* The lookahead symbol.  */
+int yychar;
 
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
 
-/* If nonreentrant, generate the variables here. */
+/* Number of syntax errors so far.  */
+int yynerrs;
 
-#if !YYPURE
-YY_DECL_VARIABLES
-#endif  /* !YYPURE */
 
+
+/*----------.
+| yyparse.  |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM)
+# else
+int yyparse (YYPARSE_PARAM)
+  void *YYPARSE_PARAM;
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
 int
-yyparse (YYPARSE_PARAM_ARG)
-     YYPARSE_PARAM_DECL
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
 {
-  /* If reentrant, generate the variables here. */
-#if YYPURE
-  YY_DECL_VARIABLES
-#endif  /* !YYPURE */
 
   register int yystate;
   register int yyn;
@@ -652,7 +852,7 @@
   /* Number of tokens to shift before error messages enabled.  */
   int yyerrstatus;
   /* Lookahead token as an internal (translated) token number.  */
-  int yychar1 = 0;
+  int yytoken = 0;
 
   /* Three stacks and their tools:
      `yyss': related to states,
@@ -672,28 +872,16 @@
   YYSTYPE *yyvs = yyvsa;
   register YYSTYPE *yyvsp;
 
-#if YYLSP_NEEDED
-  /* The location stack.  */
-  YYLTYPE yylsa[YYINITDEPTH];
-  YYLTYPE *yyls = yylsa;
-  YYLTYPE *yylsp;
-#endif
 
-#if YYLSP_NEEDED
-# define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
-#else
-# define YYPOPSTACK   (yyvsp--, yyssp--)
-#endif
 
-  YYSIZE_T yystacksize = YYINITDEPTH;
+#define YYPOPSTACK   (yyvsp--, yyssp--)
 
+  YYSIZE_T yystacksize = YYINITDEPTH;
 
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;
-#if YYLSP_NEEDED
-  YYLTYPE yyloc;
-#endif
+
 
   /* When reducing, the number of symbols on the RHS of the reduced
      rule. */
@@ -713,9 +901,7 @@
 
   yyssp = yyss;
   yyvsp = yyvs;
-#if YYLSP_NEEDED
-  yylsp = yyls;
-#endif
+
   goto yysetstate;
 
 /*------------------------------------------------------------.
@@ -730,7 +916,7 @@
  yysetstate:
   *yyssp = yystate;
 
-  if (yyssp >= yyss + yystacksize - 1)
+  if (yyss + yystacksize - 1 <= yyssp)
     {
       /* Get the current used size of the three stacks, in elements.  */
       YYSIZE_T yysize = yyssp - yyss + 1;
@@ -743,24 +929,17 @@
 	YYSTYPE *yyvs1 = yyvs;
 	short *yyss1 = yyss;
 
+
 	/* Each stack pointer address is followed by the size of the
-	   data in use in that stack, in bytes.  */
-# if YYLSP_NEEDED
-	YYLTYPE *yyls1 = yyls;
-	/* This used to be a conditional around just the two extra args,
-	   but that might be undefined if yyoverflow is a macro.  */
-	yyoverflow ("parser stack overflow",
-		    &yyss1, yysize * sizeof (*yyssp),
-		    &yyvs1, yysize * sizeof (*yyvsp),
-		    &yyls1, yysize * sizeof (*yylsp),
-		    &yystacksize);
-	yyls = yyls1;
-# else
+	   data in use in that stack, in bytes.  This used to be a
+	   conditional around just the two extra args, but that might
+	   be undefined if yyoverflow is a macro.  */
 	yyoverflow ("parser stack overflow",
 		    &yyss1, yysize * sizeof (*yyssp),
 		    &yyvs1, yysize * sizeof (*yyvsp),
+
 		    &yystacksize);
-# endif
+
 	yyss = yyss1;
 	yyvs = yyvs1;
       }
@@ -769,10 +948,10 @@
       goto yyoverflowlab;
 # else
       /* Extend the stack our own way.  */
-      if (yystacksize >= YYMAXDEPTH)
+      if (YYMAXDEPTH <= yystacksize)
 	goto yyoverflowlab;
       yystacksize *= 2;
-      if (yystacksize > YYMAXDEPTH)
+      if (YYMAXDEPTH < yystacksize)
 	yystacksize = YYMAXDEPTH;
 
       {
@@ -783,9 +962,7 @@
 	  goto yyoverflowlab;
 	YYSTACK_RELOCATE (yyss);
 	YYSTACK_RELOCATE (yyvs);
-# if YYLSP_NEEDED
-	YYSTACK_RELOCATE (yyls);
-# endif
+
 # undef YYSTACK_RELOCATE
 	if (yyss1 != yyssa)
 	  YYSTACK_FREE (yyss1);
@@ -795,14 +972,12 @@
 
       yyssp = yyss + yysize - 1;
       yyvsp = yyvs + yysize - 1;
-#if YYLSP_NEEDED
-      yylsp = yyls + yysize - 1;
-#endif
+
 
       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
 		  (unsigned long int) yystacksize));
 
-      if (yyssp >= yyss + yystacksize - 1)
+      if (yyss + yystacksize - 1 <= yyssp)
 	YYABORT;
     }
 
@@ -810,7 +985,6 @@
 
   goto yybackup;
 
-
 /*-----------.
 | yybackup.  |
 `-----------*/
@@ -823,88 +997,55 @@
   /* First try to decide what to do without reference to lookahead token.  */
 
   yyn = yypact[yystate];
-  if (yyn == YYFLAG)
+  if (yyn == YYPACT_NINF)
     goto yydefault;
 
   /* Not known => get a lookahead token if don't already have one.  */
 
-  /* yychar is either YYEMPTY or YYEOF
-     or a valid token in external form.  */
-
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
   if (yychar == YYEMPTY)
     {
       YYDPRINTF ((stderr, "Reading a token: "));
       yychar = YYLEX;
     }
 
-  /* Convert token to internal form (in yychar1) for indexing tables with */
-
-  if (yychar <= 0)		/* This means end of input. */
+  if (yychar <= YYEOF)
     {
-      yychar1 = 0;
-      yychar = YYEOF;		/* Don't call YYLEX any more */
-
+      yychar = yytoken = YYEOF;
       YYDPRINTF ((stderr, "Now at end of input.\n"));
     }
   else
     {
-      yychar1 = YYTRANSLATE (yychar);
-
-#if YYDEBUG
-     /* We have to keep this `#if YYDEBUG', since we use variables
-	which are defined only if `YYDEBUG' is set.  */
-      if (yydebug)
-	{
-	  YYFPRINTF (stderr, "Next token is %d (%s",
-		     yychar, yytname[yychar1]);
-	  /* Give the individual parser a way to print the precise
-	     meaning of a token, for further debugging info.  */
-# ifdef YYPRINT
-	  YYPRINT (stderr, yychar, yylval);
-# endif
-	  YYFPRINTF (stderr, ")\n");
-	}
-#endif
+      yytoken = YYTRANSLATE (yychar);
+      YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
     }
 
-  yyn += yychar1;
-  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
     goto yydefault;
-
   yyn = yytable[yyn];
-
-  /* yyn is what to do for this token type in this state.
-     Negative => reduce, -yyn is rule number.
-     Positive => shift, yyn is new state.
-       New state is final state => don't bother to shift,
-       just return success.
-     0, or most negative number => error.  */
-
-  if (yyn < 0)
+  if (yyn <= 0)
     {
-      if (yyn == YYFLAG)
+      if (yyn == 0 || yyn == YYTABLE_NINF)
 	goto yyerrlab;
       yyn = -yyn;
       goto yyreduce;
     }
-  else if (yyn == 0)
-    goto yyerrlab;
 
   if (yyn == YYFINAL)
     YYACCEPT;
 
   /* Shift the lookahead token.  */
-  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
-	      yychar, yytname[yychar1]));
+  YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
 
   /* Discard the token being shifted unless it is eof.  */
   if (yychar != YYEOF)
     yychar = YYEMPTY;
 
   *++yyvsp = yylval;
-#if YYLSP_NEEDED
-  *++yylsp = yylloc;
-#endif
+
 
   /* Count tokens shifted since error; after three, turn off error
      status.  */
@@ -935,48 +1076,27 @@
   /* If YYLEN is nonzero, implement the default value of the action:
      `$$ = $1'.
 
-     Otherwise, the following line sets YYVAL to the semantic value of
-     the lookahead token.  This behavior is undocumented and Bison
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
      users should not rely upon it.  Assigning to YYVAL
      unconditionally makes the parser a bit smaller, and it avoids a
      GCC warning that YYVAL may be used uninitialized.  */
   yyval = yyvsp[1-yylen];
 
-#if YYLSP_NEEDED
-  /* Similarly for the default location.  Let the user run additional
-     commands if for instance locations are ranges.  */
-  yyloc = yylsp[1-yylen];
-  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
-#endif
 
-#if YYDEBUG
-  /* We have to keep this `#if YYDEBUG', since we use variables which
-     are defined only if `YYDEBUG' is set.  */
-  if (yydebug)
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
     {
-      int yyi;
-
-      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
-		 yyn, yyrline[yyn]);
-
-      /* Print the symbols being reduced, and their result.  */
-      for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)
-	YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
-      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
-    }
-#endif
-
-  switch (yyn) {
-
-case 6:
+        case 7:
 #line 152 "po-gram-gen.y"
-{
+    {
 		   po_callback_domain (yyvsp[0].string.string);
 		}
     break;
-case 7:
+
+  case 8:
 #line 159 "po-gram-gen.y"
-{
+    {
 		  char *string2 = string_list_concat_destroy (&yyvsp[-2].stringlist.stringlist);
 		  char *string4 = string_list_concat_destroy (&yyvsp[0].stringlist.stringlist);
 
@@ -994,9 +1114,10 @@
 		    }
 		}
     break;
-case 8:
+
+  case 9:
 #line 177 "po-gram-gen.y"
-{
+    {
 		  char *string2 = string_list_concat_destroy (&yyvsp[-2].stringlist.stringlist);
 
 		  check_obsolete (yyvsp[-3].pos, yyvsp[-2].stringlist);
@@ -1014,9 +1135,10 @@
 		    }
 		}
     break;
-case 9:
+
+  case 10:
 #line 195 "po-gram-gen.y"
-{
+    {
 		  check_obsolete (yyvsp[-2].pos, yyvsp[-1].stringlist);
 		  check_obsolete (yyvsp[-2].pos, yyvsp[0].string);
 		  po_gram_error_at_line (&yyvsp[-2].pos.pos, _("missing `msgstr[]' section"));
@@ -1024,9 +1146,10 @@
 		  free (yyvsp[0].string.string);
 		}
     break;
-case 10:
+
+  case 11:
 #line 203 "po-gram-gen.y"
-{
+    {
 		  check_obsolete (yyvsp[-2].pos, yyvsp[-1].stringlist);
 		  check_obsolete (yyvsp[-2].pos, yyvsp[0].rhs);
 		  po_gram_error_at_line (&yyvsp[-2].pos.pos, _("missing `msgid_plural' section"));
@@ -1034,17 +1157,19 @@
 		  free (yyvsp[0].rhs.rhs.msgstr);
 		}
     break;
-case 11:
+
+  case 12:
 #line 211 "po-gram-gen.y"
-{
+    {
 		  check_obsolete (yyvsp[-1].pos, yyvsp[0].stringlist);
 		  po_gram_error_at_line (&yyvsp[-1].pos.pos, _("missing `msgstr' section"));
 		  string_list_destroy (&yyvsp[0].stringlist.stringlist);
 		}
     break;
-case 12:
+
+  case 13:
 #line 220 "po-gram-gen.y"
-{
+    {
 		  check_obsolete (yyvsp[-1].pos, yyvsp[0].stringlist);
 		  plural_counter = 0;
 		  yyval.string.string = string_list_concat_destroy (&yyvsp[0].stringlist.stringlist);
@@ -1052,15 +1177,17 @@
 		  yyval.string.obsolete = yyvsp[-1].pos.obsolete;
 		}
     break;
-case 13:
+
+  case 14:
 #line 231 "po-gram-gen.y"
-{
+    {
 		  yyval.rhs = yyvsp[0].rhs;
 		}
     break;
-case 14:
+
+  case 15:
 #line 235 "po-gram-gen.y"
-{
+    {
 		  check_obsolete (yyvsp[-1].rhs, yyvsp[0].rhs);
 		  yyval.rhs.rhs.msgstr = (char *) xmalloc (yyvsp[-1].rhs.rhs.msgstr_len + yyvsp[0].rhs.rhs.msgstr_len);
 		  memcpy (yyval.rhs.rhs.msgstr, yyvsp[-1].rhs.rhs.msgstr, yyvsp[-1].rhs.rhs.msgstr_len);
@@ -1072,9 +1199,10 @@
 		  yyval.rhs.obsolete = yyvsp[-1].rhs.obsolete;
 		}
     break;
-case 15:
+
+  case 16:
 #line 250 "po-gram-gen.y"
-{
+    {
 		  check_obsolete (yyvsp[-4].pos, yyvsp[-3].pos);
 		  check_obsolete (yyvsp[-4].pos, yyvsp[-2].number);
 		  check_obsolete (yyvsp[-4].pos, yyvsp[-1].pos);
@@ -1093,18 +1221,20 @@
 		  yyval.rhs.obsolete = yyvsp[-4].pos.obsolete;
 		}
     break;
-case 16:
+
+  case 17:
 #line 272 "po-gram-gen.y"
-{
+    {
 		  string_list_init (&yyval.stringlist.stringlist);
 		  string_list_append (&yyval.stringlist.stringlist, yyvsp[0].string.string);
 		  yyval.stringlist.pos = yyvsp[0].string.pos;
 		  yyval.stringlist.obsolete = yyvsp[0].string.obsolete;
 		}
     break;
-case 17:
+
+  case 18:
 #line 279 "po-gram-gen.y"
-{
+    {
 		  check_obsolete (yyvsp[-1].stringlist, yyvsp[0].string);
 		  yyval.stringlist.stringlist = yyvsp[-1].stringlist.stringlist;
 		  string_list_append (&yyval.stringlist.stringlist, yyvsp[0].string.string);
@@ -1112,38 +1242,28 @@
 		  yyval.stringlist.obsolete = yyvsp[-1].stringlist.obsolete;
 		}
     break;
-case 18:
+
+  case 19:
 #line 290 "po-gram-gen.y"
-{
+    {
 		  po_callback_comment_dispatcher (yyvsp[0].string.string);
 		}
     break;
-}
 
-#line 705 "/usr/local/share/bison/bison.simple"
 
+    }
+
+/* Line 999 of yacc.c.  */
+#line 1258 "y.tab.c"
 
   yyvsp -= yylen;
   yyssp -= yylen;
-#if YYLSP_NEEDED
-  yylsp -= yylen;
-#endif
 
-#if YYDEBUG
-  if (yydebug)
-    {
-      short *yyssp1 = yyss - 1;
-      YYFPRINTF (stderr, "state stack now");
-      while (yyssp1 != yyssp)
-	YYFPRINTF (stderr, " %d", *++yyssp1);
-      YYFPRINTF (stderr, "\n");
-    }
-#endif
+
+  YY_STACK_PRINT (yyss, yyssp);
 
   *++yyvsp = yyval;
-#if YYLSP_NEEDED
-  *++yylsp = yyloc;
-#endif
+
 
   /* Now `shift' the result of the reduction.  Determine what state
      that goes to, based on the state we popped back to and the rule
@@ -1151,11 +1271,11 @@
 
   yyn = yyr1[yyn];
 
-  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
-  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
     yystate = yytable[yystate];
   else
-    yystate = yydefgoto[yyn - YYNTBASE];
+    yystate = yydefgoto[yyn - YYNTOKENS];
 
   goto yynewstate;
 
@@ -1168,13 +1288,13 @@
   if (!yyerrstatus)
     {
       ++yynerrs;
-
-#ifdef YYERROR_VERBOSE
+#if YYERROR_VERBOSE
       yyn = yypact[yystate];
 
-      if (yyn > YYFLAG && yyn < YYLAST)
+      if (YYPACT_NINF < yyn && yyn < YYLAST)
 	{
 	  YYSIZE_T yysize = 0;
+	  int yytype = YYTRANSLATE (yychar);
 	  char *yymsg;
 	  int yyx, yycount;
 
@@ -1183,15 +1303,15 @@
 	     YYCHECK.  */
 	  for (yyx = yyn < 0 ? -yyn : 0;
 	       yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
-	    if (yycheck[yyx + yyn] == yyx)
+	    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
 	      yysize += yystrlen (yytname[yyx]) + 15, yycount++;
-	  yysize += yystrlen ("parse error, unexpected ") + 1;
-	  yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);
+	  yysize += yystrlen ("syntax error, unexpected ") + 1;
+	  yysize += yystrlen (yytname[yytype]);
 	  yymsg = (char *) YYSTACK_ALLOC (yysize);
 	  if (yymsg != 0)
 	    {
-	      char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
-	      yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);
+	      char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
+	      yyp = yystpcpy (yyp, yytname[yytype]);
 
 	      if (yycount < 5)
 		{
@@ -1199,7 +1319,7 @@
 		  for (yyx = yyn < 0 ? -yyn : 0;
 		       yyx < (int) (sizeof (yytname) / sizeof (char *));
 		       yyx++)
-		    if (yycheck[yyx + yyn] == yyx)
+		    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
 		      {
 			const char *yyq = ! yycount ? ", expecting " : " or ";
 			yyp = yystpcpy (yyp, yyq);
@@ -1211,102 +1331,77 @@
 	      YYSTACK_FREE (yymsg);
 	    }
 	  else
-	    yyerror ("parse error; also virtual memory exhausted");
+	    yyerror ("syntax error; also virtual memory exhausted");
 	}
       else
-#endif /* defined (YYERROR_VERBOSE) */
-	yyerror ("parse error");
+#endif /* YYERROR_VERBOSE */
+	yyerror ("syntax error");
     }
-  goto yyerrlab1;
 
 
-/*--------------------------------------------------.
-| yyerrlab1 -- error raised explicitly by an action |
-`--------------------------------------------------*/
-yyerrlab1:
+
   if (yyerrstatus == 3)
     {
       /* If just tried and failed to reuse lookahead token after an
 	 error, discard it.  */
 
-      /* return failure if at end of input */
+      /* Return failure if at end of input.  */
       if (yychar == YYEOF)
+        {
+	  /* Pop the error token.  */
+          YYPOPSTACK;
+	  /* Pop the rest of the stack.  */
+	  while (yyss < yyssp)
+	    {
+	      YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+	      yydestruct (yystos[*yyssp], yyvsp);
+	      YYPOPSTACK;
+	    }
 	YYABORT;
-      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
-		  yychar, yytname[yychar1]));
+        }
+
+      YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
+      yydestruct (yytoken, &yylval);
       yychar = YYEMPTY;
+
     }
 
   /* Else will try to reuse lookahead token after shifting the error
      token.  */
+  goto yyerrlab1;
 
-  yyerrstatus = 3;		/* Each real token shifted decrements this */
-
-  goto yyerrhandle;
-
-
-/*-------------------------------------------------------------------.
-| yyerrdefault -- current state does not do anything special for the |
-| error token.                                                       |
-`-------------------------------------------------------------------*/
-yyerrdefault:
-#if 0
-  /* This is wrong; only states that explicitly want error tokens
-     should shift them.  */
 
-  /* If its default is to accept any token, ok.  Otherwise pop it.  */
-  yyn = yydefact[yystate];
-  if (yyn)
-    goto yydefault;
-#endif
+/*----------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action.  |
+`----------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
 
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+	{
+	  yyn += YYTERROR;
+	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+	    {
+	      yyn = yytable[yyn];
+	      if (0 < yyn)
+		break;
+	    }
+	}
 
-/*---------------------------------------------------------------.
-| yyerrpop -- pop the current state because it cannot handle the |
-| error token                                                    |
-`---------------------------------------------------------------*/
-yyerrpop:
+      /* Pop the current state because it cannot handle the error token.  */
   if (yyssp == yyss)
     YYABORT;
+
+      YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+      yydestruct (yystos[yystate], yyvsp);
   yyvsp--;
   yystate = *--yyssp;
-#if YYLSP_NEEDED
-  yylsp--;
-#endif
-
-#if YYDEBUG
-  if (yydebug)
-    {
-      short *yyssp1 = yyss - 1;
-      YYFPRINTF (stderr, "Error: state stack now");
-      while (yyssp1 != yyssp)
-	YYFPRINTF (stderr, " %d", *++yyssp1);
-      YYFPRINTF (stderr, "\n");
-    }
-#endif
 
-/*--------------.
-| yyerrhandle.  |
-`--------------*/
-yyerrhandle:
-  yyn = yypact[yystate];
-  if (yyn == YYFLAG)
-    goto yyerrdefault;
-
-  yyn += YYTERROR;
-  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
-    goto yyerrdefault;
-
-  yyn = yytable[yyn];
-  if (yyn < 0)
-    {
-      if (yyn == YYFLAG)
-	goto yyerrpop;
-      yyn = -yyn;
-      goto yyreduce;
+      YY_STACK_PRINT (yyss, yyssp);
     }
-  else if (yyn == 0)
-    goto yyerrpop;
 
   if (yyn == YYFINAL)
     YYACCEPT;
@@ -1314,9 +1409,7 @@
   YYDPRINTF ((stderr, "Shifting error token, "));
 
   *++yyvsp = yylval;
-#if YYLSP_NEEDED
-  *++yylsp = yylloc;
-#endif
+
 
   yystate = yyn;
   goto yynewstate;
@@ -1336,13 +1429,15 @@
   yyresult = 1;
   goto yyreturn;
 
-/*---------------------------------------------.
-| yyoverflowab -- parser overflow comes here.  |
-`---------------------------------------------*/
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here.  |
+`----------------------------------------------*/
 yyoverflowlab:
   yyerror ("parser stack overflow");
   yyresult = 2;
   /* Fall through.  */
+#endif
 
 yyreturn:
 #ifndef yyoverflow
@@ -1351,4 +1446,6 @@
 #endif
   return yyresult;
 }
-#line 294 "po-gram-gen.y"
+
+
+
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/po-gram-gen.h gettext-0.14.1/gettext-tools/src/po-gram-gen.h
--- /usr/src/gettext-0.14.1/gettext-tools/src/po-gram-gen.h	2003-10-29 20:21:27.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/po-gram-gen.h	2004-08-07 13:10:43.000000000 +0100
@@ -1,29 +1,75 @@
-#ifndef BISON_Y_TAB_H
-# define BISON_Y_TAB_H
+/* A Bison parser, made by GNU Bison 1.875a.  */
 
-#ifndef YYSTYPE
-typedef union
-{
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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 General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     COMMENT = 258,
+     DOMAIN = 259,
+     JUNK = 260,
+     MSGID = 261,
+     MSGID_PLURAL = 262,
+     MSGSTR = 263,
+     NAME = 264,
+     NUMBER = 265,
+     STRING = 266
+   };
+#endif
+#define COMMENT 258
+#define DOMAIN 259
+#define JUNK 260
+#define MSGID 261
+#define MSGID_PLURAL 262
+#define MSGSTR 263
+#define NAME 264
+#define NUMBER 265
+#define STRING 266
+
+
+
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 124 "po-gram-gen.y"
+typedef union YYSTYPE {
   struct { char *string; lex_pos_ty pos; bool obsolete; } string;
   struct { string_list_ty stringlist; lex_pos_ty pos; bool obsolete; } stringlist;
   struct { long number; lex_pos_ty pos; bool obsolete; } number;
   struct { lex_pos_ty pos; bool obsolete; } pos;
   struct { struct msgstr_def rhs; lex_pos_ty pos; bool obsolete; } rhs;
-} yystype;
-# define YYSTYPE yystype
+} YYSTYPE;
+/* Line 1240 of yacc.c.  */
+#line 67 "y.tab.h"
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
 #endif
-# define	COMMENT	257
-# define	DOMAIN	258
-# define	JUNK	259
-# define	MSGID	260
-# define	MSGID_PLURAL	261
-# define	MSGSTR	262
-# define	NAME	263
-# define	NUMBER	264
-# define	STRING	265
-
 
 extern YYSTYPE yylval;
 
-#endif /* not BISON_Y_TAB_H */
+
+
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/po-hash-gen.c gettext-0.14.1/gettext-tools/src/po-hash-gen.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/po-hash-gen.c	2003-11-16 15:59:09.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/po-hash-gen.c	2004-08-07 13:10:44.000000000 +0100
@@ -1,16 +1,79 @@
-/* A Bison parser, made from po-hash-gen.y
-   by GNU bison 1.35.  */
+/* A Bison parser, made by GNU Bison 1.875a.  */
 
-#define YYBISON 1  /* Identify Bison output.  */
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
 
-# define	STRING	257
-# define	NUMBER	258
-# define	COLON	259
-# define	COMMA	260
-# define	FILE_KEYWORD	261
-# define	LINE_KEYWORD	262
-# define	NUMBER_KEYWORD	263
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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 General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* Written by Richard Stallman by simplifying the original so called
+   ``semantic'' parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON 1
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
 
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     STRING = 258,
+     NUMBER = 259,
+     COLON = 260,
+     COMMA = 261,
+     FILE_KEYWORD = 262,
+     LINE_KEYWORD = 263,
+     NUMBER_KEYWORD = 264
+   };
+#endif
+#define STRING 258
+#define NUMBER 259
+#define COLON 260
+#define COMMA 261
+#define FILE_KEYWORD 262
+#define LINE_KEYWORD 263
+#define NUMBER_KEYWORD 264
+
+
+
+
+/* Copy the first part of user declarations.  */
 #line 20 "po-hash-gen.y"
 
 
@@ -85,16 +148,36 @@
 #define yycheck  po_hash_yycheck
 
 
-#line 102 "po-hash-gen.y"
-#ifndef YYSTYPE
-typedef union
-{
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 103 "po-hash-gen.y"
+typedef union YYSTYPE {
   char *string;
   size_t number;
-} yystype;
-# define YYSTYPE yystype
+} YYSTYPE;
+/* Line 191 of yacc.c.  */
+#line 173 "y.tab.c"
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
 #endif
+
+
+
+/* Copy the second part of user declarations.  */
 #line 111 "po-hash-gen.y"
 
 
@@ -108,179 +191,12 @@
 {
   /* Do nothing, the grammar is used as a recogniser.  */
 }
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
 
 
+/* Line 214 of yacc.c.  */
+#line 198 "y.tab.c"
 
-#define	YYFINAL		18
-#define	YYFLAG		-32768
-#define	YYNTBASE	10
-
-/* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */
-#define YYTRANSLATE(x) ((unsigned)(x) <= 263 ? yytranslate[x] : 12)
-
-/* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */
-static const char yytranslate[] =
-{
-       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     1,     3,     4,     5,
-       6,     7,     8,     9
-};
-
-#if YYDEBUG
-static const short yyprhs[] =
-{
-       0,     0,     1,     4,     8,    10,    18,    27
-};
-static const short yyrhs[] =
-{
-      -1,    10,    11,     0,     3,     5,     4,     0,     3,     0,
-       7,     5,     3,     6,     8,     5,     4,     0,     7,     5,
-       3,     6,     8,     9,     5,     4,     0,     7,     5,     4,
-       0
-};
-
-#endif
-
-#if YYDEBUG
-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
-static const short yyrline[] =
-{
-       0,   128,   129,   133,   139,   145,   151,   157
-};
-#endif
-
-
-#if (YYDEBUG) || defined YYERROR_VERBOSE
-
-/* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */
-static const char *const yytname[] =
-{
-  "$", "error", "$undefined.", "STRING", "NUMBER", "COLON", "COMMA", 
-  "FILE_KEYWORD", "LINE_KEYWORD", "NUMBER_KEYWORD", "filepos_line", 
-  "filepos", 0
-};
-#endif
-
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
-static const short yyr1[] =
-{
-       0,    10,    10,    11,    11,    11,    11,    11
-};
-
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
-static const short yyr2[] =
-{
-       0,     0,     2,     3,     1,     7,     8,     3
-};
-
-/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
-   doesn't specify something else to do.  Zero means the default is an
-   error. */
-static const short yydefact[] =
-{
-       1,     0,     4,     0,     2,     0,     0,     3,     0,     7,
-       0,     0,     0,     0,     5,     0,     6,     0,     0
-};
-
-static const short yydefgoto[] =
-{
-       1,     4
-};
-
-static const short yypact[] =
-{
-  -32768,     0,    -3,    -1,-32768,     2,     5,-32768,     4,-32768,
-       3,    -4,     8,     9,-32768,    11,-32768,    13,-32768
-};
-
-static const short yypgoto[] =
-{
-  -32768,-32768
-};
-
-
-#define	YYLAST		15
-
-
-static const short yytable[] =
-{
-      17,    12,     5,     2,     6,    13,     7,     3,     8,     9,
-      10,    11,    14,    18,    15,    16
-};
-
-static const short yycheck[] =
-{
-       0,     5,     5,     3,     5,     9,     4,     7,     3,     4,
-       6,     8,     4,     0,     5,     4
-};
-/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
-#line 3 "/usr/local/share/bison/bison.simple"
-
-/* Skeleton output parser for bison,
-
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software
-   Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
-/* As a special exception, when this file is copied by Bison into a
-   Bison output file, you may use that output file without restriction.
-   This special exception was added by the Free Software Foundation
-   in version 1.24 of Bison.  */
-
-/* This is the parser code that is written into each bison parser when
-   the %semantic_parser declaration is not specified in the grammar.
-   It was written by Richard Stallman by simplifying the hairy parser
-   used when %semantic_parser is specified.  */
-
-/* All symbols defined below should begin with yy or YY, to avoid
-   infringing on user name space.  This should be done even for local
-   variables, as they might otherwise be expanded by user macros.
-   There are some unavoidable exceptions within include files to
-   define necessary library symbols; they are noted "INFRINGES ON
-   USER NAME SPACE" below.  */
-
-#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)
+#if ! defined (yyoverflow) || YYERROR_VERBOSE
 
 /* The parser invokes alloca or malloc; define the necessary symbols.  */
 
@@ -309,37 +225,28 @@
 #  define YYSTACK_ALLOC malloc
 #  define YYSTACK_FREE free
 # endif
-#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
 
 
 #if (! defined (yyoverflow) \
      && (! defined (__cplusplus) \
-	 || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+	 || (YYSTYPE_IS_TRIVIAL)))
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
 {
   short yyss;
   YYSTYPE yyvs;
-# if YYLSP_NEEDED
-  YYLTYPE yyls;
-# endif
-};
+  };
 
 /* The size of the maximum gap between one aligned stack and the next.  */
-# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
 
 /* The size of an array large to enough to hold all stacks, each with
    N elements.  */
-# if YYLSP_NEEDED
-#  define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE))	\
-      + 2 * YYSTACK_GAP_MAX)
-# else
 #  define YYSTACK_BYTES(N) \
      ((N) * (sizeof (short) + sizeof (YYSTYPE))				\
-      + YYSTACK_GAP_MAX)
-# endif
+      + YYSTACK_GAP_MAXIMUM)
 
 /* Copy COUNT objects from FROM to TO.  The source and destination do
    not overlap.  */
@@ -370,13 +277,182 @@
 	YYSIZE_T yynewbytes;						\
 	YYCOPY (&yyptr->Stack, Stack, yysize);				\
 	Stack = &yyptr->Stack;						\
-	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;	\
+	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
 	yyptr += yynewbytes / sizeof (*yyptr);				\
       }									\
     while (0)
 
 #endif
 
+#if defined (__STDC__) || defined (__cplusplus)
+   typedef signed char yysigned_char;
+#else
+   typedef short yysigned_char;
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL  2
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   15
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS  10
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS  3
+/* YYNRULES -- Number of rules. */
+#define YYNRULES  8
+/* YYNRULES -- Number of states. */
+#define YYNSTATES  18
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   264
+
+#define YYTRANSLATE(YYX) 						\
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const unsigned char yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const unsigned char yyprhs[] =
+{
+       0,     0,     3,     4,     7,    11,    13,    21,    30
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yysigned_char yyrhs[] =
+{
+      11,     0,    -1,    -1,    11,    12,    -1,     3,     5,     4,
+      -1,     3,    -1,     7,     5,     3,     6,     8,     5,     4,
+      -1,     7,     5,     3,     6,     8,     9,     5,     4,    -1,
+       7,     5,     4,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const unsigned char yyrline[] =
+{
+       0,   127,   127,   129,   133,   139,   145,   151,   157
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE
+/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "STRING", "NUMBER", "COLON", "COMMA", 
+  "FILE_KEYWORD", "LINE_KEYWORD", "NUMBER_KEYWORD", "$accept", 
+  "filepos_line", "filepos", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const unsigned short yytoknum[] =
+{
+       0,   256,   257,   258,   259,   260,   261,   262,   263,   264
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const unsigned char yyr1[] =
+{
+       0,    10,    11,    11,    12,    12,    12,    12,    12
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const unsigned char yyr2[] =
+{
+       0,     2,     0,     2,     3,     1,     7,     8,     3
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const unsigned char yydefact[] =
+{
+       2,     0,     1,     5,     0,     3,     0,     0,     4,     0,
+       8,     0,     0,     0,     0,     6,     0,     7
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yysigned_char yydefgoto[] =
+{
+      -1,     1,     5
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -5
+static const yysigned_char yypact[] =
+{
+      -5,     0,    -5,    -3,    -1,    -5,     2,     5,    -5,     4,
+      -5,     3,    -4,     8,     9,    -5,    11,    -5
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const yysigned_char yypgoto[] =
+{
+      -5,    -5,    -5
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -1
+static const unsigned char yytable[] =
+{
+       2,    13,     6,     3,     7,    14,     8,     4,     9,    10,
+      11,    12,    15,     0,    16,    17
+};
+
+static const yysigned_char yycheck[] =
+{
+       0,     5,     5,     3,     5,     9,     4,     7,     3,     4,
+       6,     8,     4,    -1,     5,     4
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const unsigned char yystos[] =
+{
+       0,    11,     0,     3,     7,    12,     5,     5,     4,     3,
+       4,     6,     8,     5,     9,     4,     5,     4
+};
 
 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
 # define YYSIZE_T __SIZE_TYPE__
@@ -396,29 +472,35 @@
 
 #define yyerrok		(yyerrstatus = 0)
 #define yyclearin	(yychar = YYEMPTY)
-#define YYEMPTY		-2
+#define YYEMPTY		(-2)
 #define YYEOF		0
+
 #define YYACCEPT	goto yyacceptlab
 #define YYABORT 	goto yyabortlab
 #define YYERROR		goto yyerrlab1
+
+
 /* Like YYERROR except do call yyerror.  This remains here temporarily
    to ease the transition to the new meaning of YYERROR, for GCC.
    Once GCC version 2 has supplanted version 1, this can go.  */
+
 #define YYFAIL		goto yyerrlab
+
 #define YYRECOVERING()  (!!yyerrstatus)
+
 #define YYBACKUP(Token, Value)					\
 do								\
   if (yychar == YYEMPTY && yylen == 1)				\
     {								\
       yychar = (Token);						\
       yylval = (Value);						\
-      yychar1 = YYTRANSLATE (yychar);				\
+      yytoken = YYTRANSLATE (yychar);				\
       YYPOPSTACK;						\
       goto yybackup;						\
     }								\
   else								\
     { 								\
-      yyerror ("syntax error: cannot back up");			\
+      yyerror ("syntax error: cannot back up");\
       YYERROR;							\
     }								\
 while (0)
@@ -426,41 +508,24 @@
 #define YYTERROR	1
 #define YYERRCODE	256
 
-
 /* YYLLOC_DEFAULT -- Compute the default location (before the actions
-   are run).
-
-   When YYLLOC_DEFAULT is run, CURRENT is set the location of the
-   first token.  By default, to implement support for ranges, extend
-   its range to the last symbol.  */
+   are run).  */
 
 #ifndef YYLLOC_DEFAULT
 # define YYLLOC_DEFAULT(Current, Rhs, N)       	\
+  Current.first_line   = Rhs[1].first_line;      \
+  Current.first_column = Rhs[1].first_column;    \
    Current.last_line   = Rhs[N].last_line;	\
    Current.last_column = Rhs[N].last_column;
 #endif
 
-
 /* YYLEX -- calling `yylex' with the right arguments.  */
 
-#if YYPURE
-# if YYLSP_NEEDED
-#  ifdef YYLEX_PARAM
-#   define YYLEX		yylex (&yylval, &yylloc, YYLEX_PARAM)
-#  else
-#   define YYLEX		yylex (&yylval, &yylloc)
-#  endif
-# else /* !YYLSP_NEEDED */
-#  ifdef YYLEX_PARAM
-#   define YYLEX		yylex (&yylval, YYLEX_PARAM)
-#  else
-#   define YYLEX		yylex (&yylval)
-#  endif
-# endif /* !YYLSP_NEEDED */
-#else /* !YYPURE */
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
 # define YYLEX			yylex ()
-#endif /* !YYPURE */
-
+#endif
 
 /* Enable debugging if requested.  */
 #if YYDEBUG
@@ -475,13 +540,93 @@
   if (yydebug)					\
     YYFPRINTF Args;				\
 } while (0)
+
+# define YYDSYMPRINT(Args)			\
+do {						\
+  if (yydebug)					\
+    yysymprint Args;				\
+} while (0)
+
+# define YYDSYMPRINTF(Title, Token, Value, Location)		\
+do {								\
+  if (yydebug)							\
+    {								\
+      YYFPRINTF (stderr, "%s ", Title);				\
+      yysymprint (stderr, 					\
+                  Token, Value);	\
+      YYFPRINTF (stderr, "\n");					\
+    }								\
+} while (0)
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (cinluded).                                                   |
+`------------------------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_stack_print (short *bottom, short *top)
+#else
+static void
+yy_stack_print (bottom, top)
+    short *bottom;
+    short *top;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (/* Nothing. */; bottom <= top; ++bottom)
+    YYFPRINTF (stderr, " %d", *bottom);
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)				\
+do {								\
+  if (yydebug)							\
+    yy_stack_print ((Bottom), (Top));				\
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_reduce_print (int yyrule)
+#else
+static void
+yy_reduce_print (yyrule)
+    int yyrule;
+#endif
+{
+  int yyi;
+  unsigned int yylineno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
+             yyrule - 1, yylineno);
+  /* Print the symbols being reduced, and their result.  */
+  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+    YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
+  YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
+}
+
+# define YY_REDUCE_PRINT(Rule)		\
+do {					\
+  if (yydebug)				\
+    yy_reduce_print (Rule);		\
+} while (0)
+
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
 int yydebug;
 #else /* !YYDEBUG */
 # define YYDPRINTF(Args)
+# define YYDSYMPRINT(Args)
+# define YYDSYMPRINTF(Title, Token, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
 #endif /* !YYDEBUG */
 
+
 /* YYINITDEPTH -- initial size of the parser's stacks.  */
 #ifndef	YYINITDEPTH
 # define YYINITDEPTH 200
@@ -502,7 +647,9 @@
 # define YYMAXDEPTH 10000
 #endif
 
-#ifdef YYERROR_VERBOSE
+
+
+#if YYERROR_VERBOSE
 
 # ifndef yystrlen
 #  if defined (__GLIBC__) && defined (_STRING_H)
@@ -552,78 +699,126 @@
 }
 #  endif
 # endif
+
+#endif /* !YYERROR_VERBOSE */
+
+
+
+#if YYDEBUG
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yysymprint (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvaluep;
+
+  if (yytype < YYNTOKENS)
+    {
+      YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+# ifdef YYPRINT
+      YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# endif
+    }
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+  YYFPRINTF (yyoutput, ")");
+}
+
+#endif /* ! YYDEBUG */
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yydestruct (int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yytype, yyvaluep)
+    int yytype;
+    YYSTYPE *yyvaluep;
 #endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvaluep;
+
+  switch (yytype)
+    {
 
-#line 315 "/usr/local/share/bison/bison.simple"
+      default:
+        break;
+    }
+}
 
 
-/* The user can define YYPARSE_PARAM as the name of an argument to be passed
-   into yyparse.  The argument should have type void *.
-   It should actually point to an object.
-   Grammar actions can access the variable by casting it
-   to the proper pointer type.  */
+/* Prevent warnings from -Wmissing-prototypes.  */
 
 #ifdef YYPARSE_PARAM
 # if defined (__STDC__) || defined (__cplusplus)
-#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
-#  define YYPARSE_PARAM_DECL
+int yyparse (void *YYPARSE_PARAM);
 # else
-#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
-#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+int yyparse ();
 # endif
-#else /* !YYPARSE_PARAM */
-# define YYPARSE_PARAM_ARG
-# define YYPARSE_PARAM_DECL
-#endif /* !YYPARSE_PARAM */
-
-/* Prevent warning if -Wstrict-prototypes.  */
-#ifdef __GNUC__
-# ifdef YYPARSE_PARAM
-int yyparse (void *);
-# else
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
 int yyparse (void);
-# endif
+#else
+int yyparse ();
 #endif
+#endif /* ! YYPARSE_PARAM */
 
-/* YY_DECL_VARIABLES -- depending whether we use a pure parser,
-   variables are global, or local to YYPARSE.  */
 
-#define YY_DECL_NON_LSP_VARIABLES			\
-/* The lookahead symbol.  */				\
-int yychar;						\
-							\
-/* The semantic value of the lookahead symbol. */	\
-YYSTYPE yylval;						\
-							\
-/* Number of parse errors so far.  */			\
-int yynerrs;
 
-#if YYLSP_NEEDED
-# define YY_DECL_VARIABLES			\
-YY_DECL_NON_LSP_VARIABLES			\
-						\
-/* Location data for the lookahead symbol.  */	\
-YYLTYPE yylloc;
-#else
-# define YY_DECL_VARIABLES			\
-YY_DECL_NON_LSP_VARIABLES
-#endif
+/* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far.  */
+int yynerrs;
 
 
-/* If nonreentrant, generate the variables here. */
 
-#if !YYPURE
-YY_DECL_VARIABLES
-#endif  /* !YYPURE */
+/*----------.
+| yyparse.  |
+`----------*/
 
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM)
+# else
+int yyparse (YYPARSE_PARAM)
+  void *YYPARSE_PARAM;
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int
+yyparse (void)
+#else
 int
-yyparse (YYPARSE_PARAM_ARG)
-     YYPARSE_PARAM_DECL
+yyparse ()
+
+#endif
+#endif
 {
-  /* If reentrant, generate the variables here. */
-#if YYPURE
-  YY_DECL_VARIABLES
-#endif  /* !YYPURE */
 
   register int yystate;
   register int yyn;
@@ -631,7 +826,7 @@
   /* Number of tokens to shift before error messages enabled.  */
   int yyerrstatus;
   /* Lookahead token as an internal (translated) token number.  */
-  int yychar1 = 0;
+  int yytoken = 0;
 
   /* Three stacks and their tools:
      `yyss': related to states,
@@ -651,28 +846,16 @@
   YYSTYPE *yyvs = yyvsa;
   register YYSTYPE *yyvsp;
 
-#if YYLSP_NEEDED
-  /* The location stack.  */
-  YYLTYPE yylsa[YYINITDEPTH];
-  YYLTYPE *yyls = yylsa;
-  YYLTYPE *yylsp;
-#endif
 
-#if YYLSP_NEEDED
-# define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
-#else
-# define YYPOPSTACK   (yyvsp--, yyssp--)
-#endif
 
-  YYSIZE_T yystacksize = YYINITDEPTH;
+#define YYPOPSTACK   (yyvsp--, yyssp--)
 
+  YYSIZE_T yystacksize = YYINITDEPTH;
 
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;
-#if YYLSP_NEEDED
-  YYLTYPE yyloc;
-#endif
+
 
   /* When reducing, the number of symbols on the RHS of the reduced
      rule. */
@@ -692,9 +875,7 @@
 
   yyssp = yyss;
   yyvsp = yyvs;
-#if YYLSP_NEEDED
-  yylsp = yyls;
-#endif
+
   goto yysetstate;
 
 /*------------------------------------------------------------.
@@ -709,7 +890,7 @@
  yysetstate:
   *yyssp = yystate;
 
-  if (yyssp >= yyss + yystacksize - 1)
+  if (yyss + yystacksize - 1 <= yyssp)
     {
       /* Get the current used size of the three stacks, in elements.  */
       YYSIZE_T yysize = yyssp - yyss + 1;
@@ -722,24 +903,17 @@
 	YYSTYPE *yyvs1 = yyvs;
 	short *yyss1 = yyss;
 
+
 	/* Each stack pointer address is followed by the size of the
-	   data in use in that stack, in bytes.  */
-# if YYLSP_NEEDED
-	YYLTYPE *yyls1 = yyls;
-	/* This used to be a conditional around just the two extra args,
-	   but that might be undefined if yyoverflow is a macro.  */
-	yyoverflow ("parser stack overflow",
-		    &yyss1, yysize * sizeof (*yyssp),
-		    &yyvs1, yysize * sizeof (*yyvsp),
-		    &yyls1, yysize * sizeof (*yylsp),
-		    &yystacksize);
-	yyls = yyls1;
-# else
+	   data in use in that stack, in bytes.  This used to be a
+	   conditional around just the two extra args, but that might
+	   be undefined if yyoverflow is a macro.  */
 	yyoverflow ("parser stack overflow",
 		    &yyss1, yysize * sizeof (*yyssp),
 		    &yyvs1, yysize * sizeof (*yyvsp),
+
 		    &yystacksize);
-# endif
+
 	yyss = yyss1;
 	yyvs = yyvs1;
       }
@@ -748,10 +922,10 @@
       goto yyoverflowlab;
 # else
       /* Extend the stack our own way.  */
-      if (yystacksize >= YYMAXDEPTH)
+      if (YYMAXDEPTH <= yystacksize)
 	goto yyoverflowlab;
       yystacksize *= 2;
-      if (yystacksize > YYMAXDEPTH)
+      if (YYMAXDEPTH < yystacksize)
 	yystacksize = YYMAXDEPTH;
 
       {
@@ -762,9 +936,7 @@
 	  goto yyoverflowlab;
 	YYSTACK_RELOCATE (yyss);
 	YYSTACK_RELOCATE (yyvs);
-# if YYLSP_NEEDED
-	YYSTACK_RELOCATE (yyls);
-# endif
+
 # undef YYSTACK_RELOCATE
 	if (yyss1 != yyssa)
 	  YYSTACK_FREE (yyss1);
@@ -774,14 +946,12 @@
 
       yyssp = yyss + yysize - 1;
       yyvsp = yyvs + yysize - 1;
-#if YYLSP_NEEDED
-      yylsp = yyls + yysize - 1;
-#endif
+
 
       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
 		  (unsigned long int) yystacksize));
 
-      if (yyssp >= yyss + yystacksize - 1)
+      if (yyss + yystacksize - 1 <= yyssp)
 	YYABORT;
     }
 
@@ -789,7 +959,6 @@
 
   goto yybackup;
 
-
 /*-----------.
 | yybackup.  |
 `-----------*/
@@ -802,88 +971,55 @@
   /* First try to decide what to do without reference to lookahead token.  */
 
   yyn = yypact[yystate];
-  if (yyn == YYFLAG)
+  if (yyn == YYPACT_NINF)
     goto yydefault;
 
   /* Not known => get a lookahead token if don't already have one.  */
 
-  /* yychar is either YYEMPTY or YYEOF
-     or a valid token in external form.  */
-
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
   if (yychar == YYEMPTY)
     {
       YYDPRINTF ((stderr, "Reading a token: "));
       yychar = YYLEX;
     }
 
-  /* Convert token to internal form (in yychar1) for indexing tables with */
-
-  if (yychar <= 0)		/* This means end of input. */
+  if (yychar <= YYEOF)
     {
-      yychar1 = 0;
-      yychar = YYEOF;		/* Don't call YYLEX any more */
-
+      yychar = yytoken = YYEOF;
       YYDPRINTF ((stderr, "Now at end of input.\n"));
     }
   else
     {
-      yychar1 = YYTRANSLATE (yychar);
-
-#if YYDEBUG
-     /* We have to keep this `#if YYDEBUG', since we use variables
-	which are defined only if `YYDEBUG' is set.  */
-      if (yydebug)
-	{
-	  YYFPRINTF (stderr, "Next token is %d (%s",
-		     yychar, yytname[yychar1]);
-	  /* Give the individual parser a way to print the precise
-	     meaning of a token, for further debugging info.  */
-# ifdef YYPRINT
-	  YYPRINT (stderr, yychar, yylval);
-# endif
-	  YYFPRINTF (stderr, ")\n");
-	}
-#endif
+      yytoken = YYTRANSLATE (yychar);
+      YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
     }
 
-  yyn += yychar1;
-  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
     goto yydefault;
-
   yyn = yytable[yyn];
-
-  /* yyn is what to do for this token type in this state.
-     Negative => reduce, -yyn is rule number.
-     Positive => shift, yyn is new state.
-       New state is final state => don't bother to shift,
-       just return success.
-     0, or most negative number => error.  */
-
-  if (yyn < 0)
+  if (yyn <= 0)
     {
-      if (yyn == YYFLAG)
+      if (yyn == 0 || yyn == YYTABLE_NINF)
 	goto yyerrlab;
       yyn = -yyn;
       goto yyreduce;
     }
-  else if (yyn == 0)
-    goto yyerrlab;
 
   if (yyn == YYFINAL)
     YYACCEPT;
 
   /* Shift the lookahead token.  */
-  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
-	      yychar, yytname[yychar1]));
+  YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
 
   /* Discard the token being shifted unless it is eof.  */
   if (yychar != YYEOF)
     yychar = YYEMPTY;
 
   *++yyvsp = yylval;
-#if YYLSP_NEEDED
-  *++yylsp = yylloc;
-#endif
+
 
   /* Count tokens shifted since error; after three, turn off error
      status.  */
@@ -914,105 +1050,76 @@
   /* If YYLEN is nonzero, implement the default value of the action:
      `$$ = $1'.
 
-     Otherwise, the following line sets YYVAL to the semantic value of
-     the lookahead token.  This behavior is undocumented and Bison
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
      users should not rely upon it.  Assigning to YYVAL
      unconditionally makes the parser a bit smaller, and it avoids a
      GCC warning that YYVAL may be used uninitialized.  */
   yyval = yyvsp[1-yylen];
 
-#if YYLSP_NEEDED
-  /* Similarly for the default location.  Let the user run additional
-     commands if for instance locations are ranges.  */
-  yyloc = yylsp[1-yylen];
-  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
-#endif
 
-#if YYDEBUG
-  /* We have to keep this `#if YYDEBUG', since we use variables which
-     are defined only if `YYDEBUG' is set.  */
-  if (yydebug)
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
     {
-      int yyi;
-
-      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
-		 yyn, yyrline[yyn]);
-
-      /* Print the symbols being reduced, and their result.  */
-      for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)
-	YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
-      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
-    }
-#endif
-
-  switch (yyn) {
-
-case 3:
+        case 4:
 #line 134 "po-hash-gen.y"
-{
+    {
 		  /* GNU style */
 		  po_callback_comment_filepos (yyvsp[-2].string, yyvsp[0].number);
 		  free (yyvsp[-2].string);
 		}
     break;
-case 4:
+
+  case 5:
 #line 140 "po-hash-gen.y"
-{
+    {
 		  /* GNU style, without line number (e.g. from Pascal .rst) */
 		  po_callback_comment_filepos (yyvsp[0].string, (size_t)(-1));
 		  free (yyvsp[0].string);
 		}
     break;
-case 5:
+
+  case 6:
 #line 146 "po-hash-gen.y"
-{
+    {
 		  /* SunOS style */
 		  po_callback_comment_filepos (yyvsp[-4].string, yyvsp[0].number);
 		  free (yyvsp[-4].string);
 		}
     break;
-case 6:
+
+  case 7:
 #line 152 "po-hash-gen.y"
-{
+    {
 		  /* Solaris style */
 		  po_callback_comment_filepos (yyvsp[-5].string, yyvsp[0].number);
 		  free (yyvsp[-5].string);
 		}
     break;
-case 7:
+
+  case 8:
 #line 158 "po-hash-gen.y"
-{
+    {
 		  /* GNU style, but STRING is `file'.  Esoteric, but it
 		     happened.  */
 		  po_callback_comment_filepos ("file", yyvsp[0].number);
 		}
     break;
-}
 
-#line 705 "/usr/local/share/bison/bison.simple"
 
+    }
+
+/* Line 999 of yacc.c.  */
+#line 1114 "y.tab.c"
 
   yyvsp -= yylen;
   yyssp -= yylen;
-#if YYLSP_NEEDED
-  yylsp -= yylen;
-#endif
 
-#if YYDEBUG
-  if (yydebug)
-    {
-      short *yyssp1 = yyss - 1;
-      YYFPRINTF (stderr, "state stack now");
-      while (yyssp1 != yyssp)
-	YYFPRINTF (stderr, " %d", *++yyssp1);
-      YYFPRINTF (stderr, "\n");
-    }
-#endif
+
+  YY_STACK_PRINT (yyss, yyssp);
 
   *++yyvsp = yyval;
-#if YYLSP_NEEDED
-  *++yylsp = yyloc;
-#endif
+
 
   /* Now `shift' the result of the reduction.  Determine what state
      that goes to, based on the state we popped back to and the rule
@@ -1020,11 +1127,11 @@
 
   yyn = yyr1[yyn];
 
-  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
-  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
     yystate = yytable[yystate];
   else
-    yystate = yydefgoto[yyn - YYNTBASE];
+    yystate = yydefgoto[yyn - YYNTOKENS];
 
   goto yynewstate;
 
@@ -1037,13 +1144,13 @@
   if (!yyerrstatus)
     {
       ++yynerrs;
-
-#ifdef YYERROR_VERBOSE
+#if YYERROR_VERBOSE
       yyn = yypact[yystate];
 
-      if (yyn > YYFLAG && yyn < YYLAST)
+      if (YYPACT_NINF < yyn && yyn < YYLAST)
 	{
 	  YYSIZE_T yysize = 0;
+	  int yytype = YYTRANSLATE (yychar);
 	  char *yymsg;
 	  int yyx, yycount;
 
@@ -1052,15 +1159,15 @@
 	     YYCHECK.  */
 	  for (yyx = yyn < 0 ? -yyn : 0;
 	       yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
-	    if (yycheck[yyx + yyn] == yyx)
+	    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
 	      yysize += yystrlen (yytname[yyx]) + 15, yycount++;
-	  yysize += yystrlen ("parse error, unexpected ") + 1;
-	  yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);
+	  yysize += yystrlen ("syntax error, unexpected ") + 1;
+	  yysize += yystrlen (yytname[yytype]);
 	  yymsg = (char *) YYSTACK_ALLOC (yysize);
 	  if (yymsg != 0)
 	    {
-	      char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
-	      yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);
+	      char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
+	      yyp = yystpcpy (yyp, yytname[yytype]);
 
 	      if (yycount < 5)
 		{
@@ -1068,7 +1175,7 @@
 		  for (yyx = yyn < 0 ? -yyn : 0;
 		       yyx < (int) (sizeof (yytname) / sizeof (char *));
 		       yyx++)
-		    if (yycheck[yyx + yyn] == yyx)
+		    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
 		      {
 			const char *yyq = ! yycount ? ", expecting " : " or ";
 			yyp = yystpcpy (yyp, yyq);
@@ -1080,102 +1187,77 @@
 	      YYSTACK_FREE (yymsg);
 	    }
 	  else
-	    yyerror ("parse error; also virtual memory exhausted");
+	    yyerror ("syntax error; also virtual memory exhausted");
 	}
       else
-#endif /* defined (YYERROR_VERBOSE) */
-	yyerror ("parse error");
+#endif /* YYERROR_VERBOSE */
+	yyerror ("syntax error");
     }
-  goto yyerrlab1;
 
 
-/*--------------------------------------------------.
-| yyerrlab1 -- error raised explicitly by an action |
-`--------------------------------------------------*/
-yyerrlab1:
+
   if (yyerrstatus == 3)
     {
       /* If just tried and failed to reuse lookahead token after an
 	 error, discard it.  */
 
-      /* return failure if at end of input */
+      /* Return failure if at end of input.  */
       if (yychar == YYEOF)
+        {
+	  /* Pop the error token.  */
+          YYPOPSTACK;
+	  /* Pop the rest of the stack.  */
+	  while (yyss < yyssp)
+	    {
+	      YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+	      yydestruct (yystos[*yyssp], yyvsp);
+	      YYPOPSTACK;
+	    }
 	YYABORT;
-      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
-		  yychar, yytname[yychar1]));
+        }
+
+      YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
+      yydestruct (yytoken, &yylval);
       yychar = YYEMPTY;
+
     }
 
   /* Else will try to reuse lookahead token after shifting the error
      token.  */
+  goto yyerrlab1;
 
-  yyerrstatus = 3;		/* Each real token shifted decrements this */
-
-  goto yyerrhandle;
-
-
-/*-------------------------------------------------------------------.
-| yyerrdefault -- current state does not do anything special for the |
-| error token.                                                       |
-`-------------------------------------------------------------------*/
-yyerrdefault:
-#if 0
-  /* This is wrong; only states that explicitly want error tokens
-     should shift them.  */
 
-  /* If its default is to accept any token, ok.  Otherwise pop it.  */
-  yyn = yydefact[yystate];
-  if (yyn)
-    goto yydefault;
-#endif
+/*----------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action.  |
+`----------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
 
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+	{
+	  yyn += YYTERROR;
+	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+	    {
+	      yyn = yytable[yyn];
+	      if (0 < yyn)
+		break;
+	    }
+	}
 
-/*---------------------------------------------------------------.
-| yyerrpop -- pop the current state because it cannot handle the |
-| error token                                                    |
-`---------------------------------------------------------------*/
-yyerrpop:
+      /* Pop the current state because it cannot handle the error token.  */
   if (yyssp == yyss)
     YYABORT;
+
+      YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+      yydestruct (yystos[yystate], yyvsp);
   yyvsp--;
   yystate = *--yyssp;
-#if YYLSP_NEEDED
-  yylsp--;
-#endif
-
-#if YYDEBUG
-  if (yydebug)
-    {
-      short *yyssp1 = yyss - 1;
-      YYFPRINTF (stderr, "Error: state stack now");
-      while (yyssp1 != yyssp)
-	YYFPRINTF (stderr, " %d", *++yyssp1);
-      YYFPRINTF (stderr, "\n");
-    }
-#endif
 
-/*--------------.
-| yyerrhandle.  |
-`--------------*/
-yyerrhandle:
-  yyn = yypact[yystate];
-  if (yyn == YYFLAG)
-    goto yyerrdefault;
-
-  yyn += YYTERROR;
-  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
-    goto yyerrdefault;
-
-  yyn = yytable[yyn];
-  if (yyn < 0)
-    {
-      if (yyn == YYFLAG)
-	goto yyerrpop;
-      yyn = -yyn;
-      goto yyreduce;
+      YY_STACK_PRINT (yyss, yyssp);
     }
-  else if (yyn == 0)
-    goto yyerrpop;
 
   if (yyn == YYFINAL)
     YYACCEPT;
@@ -1183,9 +1265,7 @@
   YYDPRINTF ((stderr, "Shifting error token, "));
 
   *++yyvsp = yylval;
-#if YYLSP_NEEDED
-  *++yylsp = yylloc;
-#endif
+
 
   yystate = yyn;
   goto yynewstate;
@@ -1205,13 +1285,15 @@
   yyresult = 1;
   goto yyreturn;
 
-/*---------------------------------------------.
-| yyoverflowab -- parser overflow comes here.  |
-`---------------------------------------------*/
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here.  |
+`----------------------------------------------*/
 yyoverflowlab:
   yyerror ("parser stack overflow");
   yyresult = 2;
   /* Fall through.  */
+#endif
 
 yyreturn:
 #ifndef yyoverflow
@@ -1220,6 +1302,8 @@
 #endif
   return yyresult;
 }
+
+
 #line 165 "po-hash-gen.y"
 
 
@@ -1368,3 +1452,4 @@
   last_was_colon = false;
   return yyparse ();
 }
+
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/po-hash-gen.h gettext-0.14.1/gettext-tools/src/po-hash-gen.h
--- /usr/src/gettext-0.14.1/gettext-tools/src/po-hash-gen.h	2003-10-20 20:16:49.000000000 +0100
+++ gettext-0.14.1/gettext-tools/src/po-hash-gen.h	2004-08-07 13:10:44.000000000 +0100
@@ -1,24 +1,68 @@
-#ifndef BISON_Y_TAB_H
-# define BISON_Y_TAB_H
+/* A Bison parser, made by GNU Bison 1.875a.  */
 
-#ifndef YYSTYPE
-typedef union
-{
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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 General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     STRING = 258,
+     NUMBER = 259,
+     COLON = 260,
+     COMMA = 261,
+     FILE_KEYWORD = 262,
+     LINE_KEYWORD = 263,
+     NUMBER_KEYWORD = 264
+   };
+#endif
+#define STRING 258
+#define NUMBER 259
+#define COLON 260
+#define COMMA 261
+#define FILE_KEYWORD 262
+#define LINE_KEYWORD 263
+#define NUMBER_KEYWORD 264
+
+
+
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 103 "po-hash-gen.y"
+typedef union YYSTYPE {
   char *string;
   size_t number;
-} yystype;
-# define YYSTYPE yystype
+} YYSTYPE;
+/* Line 1240 of yacc.c.  */
+#line 60 "y.tab.h"
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
 #endif
-# define	STRING	257
-# define	NUMBER	258
-# define	COLON	259
-# define	COMMA	260
-# define	FILE_KEYWORD	261
-# define	LINE_KEYWORD	262
-# define	NUMBER_KEYWORD	263
-
 
 extern YYSTYPE yylval;
 
-#endif /* not BISON_Y_TAB_H */
+
+
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/read-csharp.c gettext-0.14.1/gettext-tools/src/read-csharp.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/read-csharp.c	2004-01-08 11:31:16.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/read-csharp.c	2004-08-07 20:15:37.000000000 +0100
@@ -63,6 +63,7 @@
   int fd[1];
   FILE *fp;
   int exitstatus;
+  char *errptr = NULL;
 
   /* Open a pipe to the C# execution engine.  */
   child = create_pipe_in (progname, prog_path, prog_argv, DEV_NULL, false,
@@ -73,9 +74,13 @@
     error (EXIT_FAILURE, errno, _("fdopen() failed"));
 
   /* Read the message list.  */
-  l->mdlp = read_po (fp, "(pipe)", "(pipe)");
-
+  l->mdlp = read_po (fp, "(pipe)", "(pipe)", &errptr);
   fclose (fp);
+  if(errptr != NULL) {
+    error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	   "(pipe)", errptr);
+    free(errptr);
+  }
 
   /* Remove zombie process from process list, and retrieve exit status.  */
   exitstatus = wait_subprocess (child, progname, false, false, true, true);
Only in gettext-0.14.1/gettext-tools/src: read-csharp.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/read-java.c gettext-0.14.1/gettext-tools/src/read-java.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/read-java.c	2004-01-07 10:34:36.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/read-java.c	2004-08-07 20:15:36.000000000 +0100
@@ -61,6 +61,7 @@
   int fd[1];
   FILE *fp;
   int exitstatus;
+  char *errptr;
 
   /* Open a pipe to the JVM.  */
   child = create_pipe_in (progname, prog_path, prog_argv, DEV_NULL, false,
@@ -71,9 +72,13 @@
     error (EXIT_FAILURE, errno, _("fdopen() failed"));
 
   /* Read the message list.  */
-  l->mdlp = read_po (fp, "(pipe)", "(pipe)");
-
+  l->mdlp = read_po (fp, "(pipe)", "(pipe)", &errptr);
   fclose (fp);
+  if(errptr != NULL) {
+    error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	   "(pipe)", errptr);
+    free(errptr);
+  }
 
   /* Remove zombie process from process list, and retrieve exit status.  */
   exitstatus = wait_subprocess (child, progname, false, false, true, true);
Only in gettext-0.14.1/gettext-tools/src: read-java.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/read-po-abstract.c gettext-0.14.1/gettext-tools/src/read-po-abstract.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/read-po-abstract.c	2003-10-22 11:40:39.000000000 +0100
+++ gettext-0.14.1/gettext-tools/src/read-po-abstract.c	2004-08-07 20:25:54.000000000 +0100
@@ -161,8 +161,9 @@
 void
 po_scan (abstract_po_reader_ty *pop, FILE *fp,
 	 const char *real_filename, const char *logical_filename,
-	 input_syntax_ty syntax)
+	 input_syntax_ty syntax, char **errptr)
 {
+#define BUFSIZE 4096
   /* Parse the stream's content.  */
   switch (syntax)
     {
@@ -187,11 +188,14 @@
       abort ();
     }
 
-  if (error_message_count > 0)
-    error (EXIT_FAILURE, 0,
+  if (error_message_count > 0) {
+      *errptr = realloc(errptr, BUFSIZE);
+      snprintf(*errptr, BUFSIZE,
 	   ngettext ("found %d fatal error", "found %d fatal errors",
 		     error_message_count),
 	   error_message_count);
+  }
+
   error_message_count = 0;
 }
 
Only in gettext-0.14.1/gettext-tools/src: read-po-abstract.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/read-po-abstract.h gettext-0.14.1/gettext-tools/src/read-po-abstract.h
--- /usr/src/gettext-0.14.1/gettext-tools/src/read-po-abstract.h	2003-10-22 11:40:39.000000000 +0100
+++ gettext-0.14.1/gettext-tools/src/read-po-abstract.h	2004-08-07 20:04:42.000000000 +0100
@@ -143,7 +143,7 @@
 extern void
        po_scan (abstract_po_reader_ty *pop, FILE *fp,
 		const char *real_filename, const char *logical_filename,
-		input_syntax_ty syntax);
+		input_syntax_ty syntax, char **errptr);
 
 /* Call the destructor and deallocate a abstract_po_reader_ty (or derived
    class) instance.  */
Only in gettext-0.14.1/gettext-tools/src: read-po-abstract.h~
Only in /usr/src/gettext-0.14.1/gettext-tools/src: #read-po.c#
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/read-po.c gettext-0.14.1/gettext-tools/src/read-po.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/read-po.c	2003-10-22 11:40:39.000000000 +0100
+++ gettext-0.14.1/gettext-tools/src/read-po.c	2004-08-07 20:27:03.000000000 +0100
@@ -437,7 +437,7 @@
 
 
 msgdomain_list_ty *
-read_po (FILE *fp, const char *real_filename, const char *logical_filename)
+read_po (FILE *fp, const char *real_filename, const char *logical_filename, char **errptr)
 {
   default_po_reader_ty *pop;
   msgdomain_list_ty *mdlp;
@@ -456,7 +456,7 @@
     pop->mdlp->encoding = po_charset_utf8;
   po_lex_pass_obsolete_entries (true);
   po_scan ((abstract_po_reader_ty *) pop, fp, real_filename, logical_filename,
-	   input_syntax);
+	   input_syntax, errptr);
   mdlp = pop->mdlp;
   po_reader_free ((abstract_po_reader_ty *) pop);
   return mdlp;
@@ -464,13 +464,13 @@
 
 
 msgdomain_list_ty *
-read_po_file (const char *filename)
+read_po_file (const char *filename, char **errptr)
 {
   char *real_filename;
   FILE *fp = open_po_file (filename, &real_filename, true);
   msgdomain_list_ty *result;
 
-  result = read_po (fp, real_filename, filename);
+  result = read_po (fp, real_filename, filename, errptr);
 
   if (fp != stdin)
     fclose (fp);
Only in gettext-0.14.1/gettext-tools/src: read-po.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/read-po.h gettext-0.14.1/gettext-tools/src/read-po.h
--- /usr/src/gettext-0.14.1/gettext-tools/src/read-po.h	2003-08-24 18:50:57.000000000 +0100
+++ gettext-0.14.1/gettext-tools/src/read-po.h	2004-08-07 14:56:24.000000000 +0100
@@ -109,6 +109,10 @@
   bool is_fuzzy;							\
   enum is_format is_format[NFORMATS];					\
   enum is_wrap do_wrap;							\
+									\
+  /* Storage for an error message.  */					\
+  char *errptr;								\
+
 
 typedef struct default_po_reader_ty default_po_reader_ty;
 struct default_po_reader_ty
@@ -161,15 +165,17 @@
 /* Expected syntax of the input files.  */
 extern DLL_VARIABLE input_syntax_ty input_syntax;
 
-/* Read the input file from a stream.  Returns a list of messages.  */
+/* Read the input file from a stream.  Returns a list of messages.
+   Sets error to an error message on error.  */
 extern msgdomain_list_ty *read_po (FILE *fp, const char *real_filename,
-				   const char *logical_filename);
+				   const char *logical_filename,
+				   char **errptr);
 
 /* Read the input file with the name INPUT_NAME.  The ending .po is added
    if necessary.  If INPUT_NAME is not an absolute file name and the file is
    not found, the list of directories in "dir-list.h" is searched.  Returns
    a list of messages.  */
-extern msgdomain_list_ty *read_po_file (const char *input_name);
+extern msgdomain_list_ty *read_po_file (const char *input_name, char **errptr);
 
 
 #ifdef __cplusplus
Only in gettext-0.14.1/gettext-tools/src: read-po.h~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/read-resources.c gettext-0.14.1/gettext-tools/src/read-resources.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/read-resources.c	2003-12-28 20:15:27.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/read-resources.c	2004-08-07 20:15:38.000000000 +0100
@@ -64,6 +64,7 @@
   int fd[1];
   FILE *fp;
   int exitstatus;
+  char *errptr = NULL;
 
   /* Open a pipe to the C# execution engine.  */
   child = create_pipe_in (progname, prog_path, prog_argv, NULL, false,
@@ -74,9 +75,13 @@
     error (EXIT_FAILURE, errno, _("fdopen() failed"));
 
   /* Read the message list.  */
-  l->mdlp = read_po (fp, "(pipe)", "(pipe)");
-
+  l->mdlp = read_po (fp, "(pipe)", "(pipe)", &errptr);
   fclose (fp);
+  if(errptr != NULL) {
+    error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	   "(pipe)", errptr);
+    free(errptr);
+  }
 
   /* Remove zombie process from process list, and retrieve exit status.  */
   exitstatus = wait_subprocess (child, progname, false, false, true, true);
Only in gettext-0.14.1/gettext-tools/src: read-resources.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/read-tcl.c gettext-0.14.1/gettext-tools/src/read-tcl.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/read-tcl.c	2004-01-05 10:48:31.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/read-tcl.c	2004-08-07 20:15:38.000000000 +0100
@@ -63,6 +63,7 @@
   msgdomain_list_ty *mdlp;
   int exitstatus;
   size_t k;
+  char *errptr = NULL;
 
   /* Make it possible to override the msgunfmt.tcl location.  This is
      necessary for running the testsuite before "make install".  */
@@ -111,9 +112,13 @@
     error (EXIT_FAILURE, errno, _("fdopen() failed"));
 
   /* Read the message list.  */
-  mdlp = read_po (fp, "(pipe)", "(pipe)");
-
+  mdlp = read_po (fp, "(pipe)", "(pipe)", &errptr);
   fclose (fp);
+  if(errptr != NULL) {
+    error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+	   "(pipe)", errptr);
+    free(errptr);
+  }
 
   /* Remove zombie process from process list, and retrieve exit status.  */
   exitstatus = wait_subprocess (child, "tclsh", false, false, true, true);
Only in gettext-0.14.1/gettext-tools/src: read-tcl.c~
Only in gettext-0.14.1/gettext-tools/src: user-email
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/xgettext.c gettext-0.14.1/gettext-tools/src/xgettext.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/xgettext.c	2004-01-15 11:30:11.000000000 +0000
+++ gettext-0.14.1/gettext-tools/src/xgettext.c	2004-08-07 20:33:52.000000000 +0100
@@ -934,13 +934,20 @@
   char *real_filename;
   FILE *fp = open_po_file (filename, &real_filename, true);
   abstract_po_reader_ty *pop;
+  char *errptr = NULL;
 
   pop = po_reader_alloc (&exclude_methods);
-  po_scan (pop, fp, real_filename, filename, input_syntax);
+  po_scan (pop, fp, real_filename, filename, input_syntax, &errptr);
   po_reader_free (pop);
 
   if (fp != stdin)
     fclose (fp);
+
+  if(errptr != NULL) {
+      error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+		filename, errptr);
+      free(errptr);
+  }
 }
 
 
Only in gettext-0.14.1/gettext-tools/src: xgettext.c~
diff -urb -x configure -x aclocal.m4 -x '*.html' -x '*.info' -x '*.in' -x '*.[0-9]' -x '*.am' /usr/src/gettext-0.14.1/gettext-tools/src/x-po.c gettext-0.14.1/gettext-tools/src/x-po.c
--- /usr/src/gettext-0.14.1/gettext-tools/src/x-po.c	2003-10-22 11:40:39.000000000 +0100
+++ gettext-0.14.1/gettext-tools/src/x-po.c	2004-08-07 20:36:12.000000000 +0100
@@ -107,6 +107,7 @@
 	 msgdomain_list_ty *mdlp)
 {
   default_po_reader_ty *pop;
+  char *errptr = NULL;
 
   pop = default_po_reader_alloc (&extract_methods);
   pop->handle_comments = true;
@@ -117,8 +118,14 @@
   pop->mdlp = NULL;
   pop->mlp = mdlp->item[0]->messages;
   po_scan ((abstract_po_reader_ty *) pop, fp, real_filename, logical_filename,
-	   syntax);
+	   syntax, &errptr);
   po_reader_free ((abstract_po_reader_ty *) pop);
+
+  if(errptr != NULL) {
+      error (EXIT_FAILURE, 0, _("parser error in '%s': %s"),
+		real_filename, errptr);
+      free(errptr);
+  }
 }
 
 
Only in gettext-0.14.1/gettext-tools/src: x-po.c~
Only in gettext-0.14.1/gettext-tools: stamp-h1
Only in gettext-0.14.1/gettext-tools/tests: Makefile
Only in gettext-0.14.1/gettext-tools/tests: read-write.c
Only in gettext-0.14.1/gettext-tools/tests: read-write.c~
Only in gettext-0.14.1/gettext-tools: th.po
Only in gettext-0.14.1: Makefile
Only in gettext-0.14.1: test.po


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]