merge from gcc
[external/binutils.git] / binutils / nlmheader.y
index caa8f43..f42ae90 100644 (file)
@@ -1,21 +1,23 @@
 %{/* nlmheader.y - parse NLM header specification keywords.
-     Copyright (C) 1993 Free Software Foundation, Inc.
+     Copyright 1993, 1994, 1995, 1997, 1998, 2001, 2002, 2003, 2005, 2007
+     Free Software Foundation, Inc.
 
-This file is part of GNU Binutils.
+     This file is part of GNU Binutils.
 
-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 of the License, or
-(at your option) any later version.
+     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 3 of the License, 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.
+     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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+     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., 51 Franklin Street - Fifth Floor, Boston,
+     MA 02110-1301, USA.  */
 
 /* Written by Ian Lance Taylor <ian@cygnus.com>.
 
@@ -26,14 +28,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
    This implementation is based on the description in the NetWare Tool
    Maker Specification manual, edition 1.0.  */
 
-#include <ansidecl.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <bfd.h>
 #include "sysdep.h"
-#include "bucomm.h"
+#include "safe-ctype.h"
+#include "bfd.h"
 #include "nlm/common.h"
 #include "nlm/internal.h"
+#include "bucomm.h"
 #include "nlmconv.h"
 
 /* Information is stored in the structures pointed to by these
@@ -50,7 +50,7 @@ char *check_procedure;
 /* File named by CUSTOM.  */
 char *custom_file;
 /* Whether to generate debugging information (DEBUG).  */
-boolean debug_info;
+bfd_boolean debug_info;
 /* Procedure named by EXIT.  */
 char *exit_procedure;
 /* Exported symbols (EXPORT).  */
@@ -60,7 +60,7 @@ struct string_list *input_files;
 /* Map file name (MAP, FULLMAP).  */
 char *map_file;
 /* Whether a full map has been requested (FULLMAP).  */
-boolean full_map;
+bfd_boolean full_map;
 /* File named by HELP.  */
 char *help_file;
 /* Imported symbols (IMPORT).  */
@@ -76,7 +76,7 @@ char *sharelib_file;
 /* Start procedure name (START).  */
 char *start_procedure;
 /* VERBOSE.  */
-boolean verbose;
+bfd_boolean verbose;
 /* RPC description file (XDCDATA).  */
 char *rpc_file;
 
@@ -91,22 +91,21 @@ static char *symbol_prefix;
 #define yyerror(msg) nlmheader_error (msg);
 
 /* Local functions.  */
-static int yylex PARAMS ((void));
-static void nlmlex_file_push PARAMS ((const char *));
-static boolean nlmlex_file_open PARAMS ((const char *));
-static int nlmlex_buf_init PARAMS ((void));
-static char nlmlex_buf_add PARAMS ((int));
-static long nlmlex_get_number PARAMS ((const char *));
-static void nlmheader_identify PARAMS ((void));
-static void nlmheader_warn PARAMS ((const char *, int));
-static void nlmheader_error PARAMS ((const char *));
-static struct string_list * string_list_cons PARAMS ((char *,
-                                                     struct string_list *));
-static struct string_list * string_list_append PARAMS ((struct string_list *,
-                                                       struct string_list *));
-static struct string_list * string_list_append1 PARAMS ((struct string_list *,
-                                                        char *));
-static char *xstrdup PARAMS ((const char *));
+static int yylex (void);
+static void nlmlex_file_push (const char *);
+static bfd_boolean nlmlex_file_open (const char *);
+static int nlmlex_buf_init (void);
+static char nlmlex_buf_add (int);
+static long nlmlex_get_number (const char *);
+static void nlmheader_identify (void);
+static void nlmheader_warn (const char *, int);
+static void nlmheader_error (const char *);
+static struct string_list * string_list_cons (char *, struct string_list *);
+static struct string_list * string_list_append (struct string_list *,
+                                               struct string_list *);
+static struct string_list * string_list_append1 (struct string_list *,
+                                                char *);
+static char *xstrdup (const char *);
 
 %}
 
@@ -121,8 +120,8 @@ static char *xstrdup PARAMS ((const char *));
 %token CHECK CODESTART COPYRIGHT CUSTOM DATE DEBUG DESCRIPTION EXIT
 %token EXPORT FLAG_ON FLAG_OFF FULLMAP HELP IMPORT INPUT MAP MESSAGES
 %token MODULE MULTIPLE OS_DOMAIN OUTPUT PSEUDOPREEMPTION REENTRANT
-%token SCREENNAME SHARELIB STACK STACKSIZE START SYNCHRONIZE
-%token THREADNAME TYPE VERBOSE VERSION XDCDATA
+%token SCREENNAME SHARELIB STACK START SYNCHRONIZE
+%token THREADNAME TYPE VERBOSE VERSIONK XDCDATA
 
 /* Arguments.  */
 
@@ -141,7 +140,7 @@ static char *xstrdup PARAMS ((const char *));
 
 /* The entire file is just a list of commands.  */
 
-file:  
+file:
          commands
        ;
 
@@ -161,7 +160,7 @@ command:
          }
        | CODESTART STRING
          {
-           nlmheader_warn ("CODESTART is not implemented; sorry", -1);
+           nlmheader_warn (_("CODESTART is not implemented; sorry"), -1);
            free ($2);
          }
        | COPYRIGHT QUOTED_STRING
@@ -172,7 +171,7 @@ command:
            len = strlen ($2);
            if (len >= NLM_MAX_COPYRIGHT_MESSAGE_LENGTH)
              {
-               nlmheader_warn ("copyright string is too long",
+               nlmheader_warn (_("copyright string is too long"),
                                NLM_MAX_COPYRIGHT_MESSAGE_LENGTH - 1);
                len = NLM_MAX_COPYRIGHT_MESSAGE_LENGTH - 1;
              }
@@ -196,10 +195,16 @@ command:
            free ($2);
            free ($3);
            free ($4);
+           if (version_hdr->month < 1 || version_hdr->month > 12)
+             nlmheader_warn (_("illegal month"), -1);
+           if (version_hdr->day < 1 || version_hdr->day > 31)
+             nlmheader_warn (_("illegal day"), -1);
+           if (version_hdr->year < 1900 || version_hdr->year > 3000)
+             nlmheader_warn (_("illegal year"), -1);
          }
        | DEBUG
          {
-           debug_info = true;
+           debug_info = TRUE;
          }
        | DESCRIPTION QUOTED_STRING
          {
@@ -208,7 +213,7 @@ command:
            len = strlen ($2);
            if (len > NLM_MAX_DESCRIPTION_LENGTH)
              {
-               nlmheader_warn ("description string is too long",
+               nlmheader_warn (_("description string is too long"),
                                NLM_MAX_DESCRIPTION_LENGTH);
                len = NLM_MAX_DESCRIPTION_LENGTH;
              }
@@ -239,10 +244,15 @@ command:
            fixed_hdr->flags &=~ nlmlex_get_number ($2);
            free ($2);
          }
+       | FULLMAP
+         {
+           map_file = "";
+           full_map = TRUE;
+         }
        | FULLMAP STRING
          {
            map_file = $2;
-           full_map = true;
+           full_map = TRUE;
          }
        | HELP STRING
          {
@@ -260,6 +270,10 @@ command:
          {
            input_files = string_list_append (input_files, $2);
          }
+       | MAP
+         {
+           map_file = "";
+         }
        | MAP STRING
          {
            map_file = $2;
@@ -285,7 +299,7 @@ command:
            if (output_file == NULL)
              output_file = $2;
            else
-             nlmheader_warn ("ignoring duplicate OUTPUT statement", -1);
+             nlmheader_warn (_("ignoring duplicate OUTPUT statement"), -1);
          }
        | PSEUDOPREEMPTION
          {
@@ -302,7 +316,7 @@ command:
            len = strlen ($2);
            if (len >= NLM_MAX_SCREEN_NAME_LENGTH)
              {
-               nlmheader_warn ("screen name is too long",
+               nlmheader_warn (_("screen name is too long"),
                                NLM_MAX_SCREEN_NAME_LENGTH);
                len = NLM_MAX_SCREEN_NAME_LENGTH;
              }
@@ -320,11 +334,6 @@ command:
            var_hdr->stackSize = nlmlex_get_number ($2);
            free ($2);
          }
-       | STACKSIZE STRING
-         {
-           var_hdr->stackSize = nlmlex_get_number ($2);
-           free ($2);
-         }
        | START STRING
          {
            start_procedure = $2;
@@ -340,13 +349,13 @@ command:
            len = strlen ($2);
            if (len >= NLM_MAX_THREAD_NAME_LENGTH)
              {
-               nlmheader_warn ("thread name is too long",
+               nlmheader_warn (_("thread name is too long"),
                                NLM_MAX_THREAD_NAME_LENGTH);
                len = NLM_MAX_THREAD_NAME_LENGTH;
              }
            var_hdr->threadNameLength = len;
            strncpy (var_hdr->threadName, $2, len);
-           var_hdr->screenName[NLM_MAX_THREAD_NAME_LENGTH] = '\0';
+           var_hdr->threadName[len] = '\0';
            free ($2);
          }
        | TYPE STRING
@@ -356,9 +365,9 @@ command:
          }
        | VERBOSE
          {
-           verbose = true;
+           verbose = TRUE;
          }
-       | VERSION STRING STRING STRING
+       | VERSIONK STRING STRING STRING
          {
            long val;
 
@@ -366,21 +375,23 @@ command:
            version_hdr->majorVersion = nlmlex_get_number ($2);
            val = nlmlex_get_number ($3);
            if (val < 0 || val > 99)
-             nlmheader_warn ("illegal minor version number (must be between 0 and 99)",
+             nlmheader_warn (_("illegal minor version number (must be between 0 and 99)"),
                              -1);
            else
              version_hdr->minorVersion = val;
            val = nlmlex_get_number ($4);
-           if (val < 1 || val > 26)
-             nlmheader_warn ("illegal revision number (must be between 1 and 26)",
+           if (val < 0)
+             nlmheader_warn (_("illegal revision number (must be between 0 and 26)"),
                              -1);
+           else if (val > 26)
+             version_hdr->revision = 0;
            else
              version_hdr->revision = val;
            free ($2);
            free ($3);
            free ($4);
          }
-       | VERSION STRING STRING
+       | VERSIONK STRING STRING
          {
            long val;
 
@@ -388,7 +399,7 @@ command:
            version_hdr->majorVersion = nlmlex_get_number ($2);
            val = nlmlex_get_number ($3);
            if (val < 0 || val > 99)
-             nlmheader_warn ("illegal minor version number (must be between 0 and 99)",
+             nlmheader_warn (_("illegal minor version number (must be between 0 and 99)"),
                              -1);
            else
              version_hdr->minorVersion = val;
@@ -483,7 +494,7 @@ string_list:
 /* If strerror is just a macro, we want to use the one from libiberty
    since it will handle undefined values.  */
 #undef strerror
-extern char *strerror ();
+extern char *strerror PARAMS ((int));
 
 /* The lexer is simple, too simple for flex.  Keywords are only
    recognized at the start of lines.  Everything else must be an
@@ -524,9 +535,8 @@ static struct input current;
 \f
 /* Start the lexer going on the main input file.  */
 
-boolean
-nlmlex_file (name)
-     const char *name;
+bfd_boolean
+nlmlex_file (const char *name)
 {
   current.next = NULL;
   return nlmlex_file_open (name);
@@ -535,8 +545,7 @@ nlmlex_file (name)
 /* Start the lexer going on a subsidiary input file.  */
 
 static void
-nlmlex_file_push (name)
-     const char *name;
+nlmlex_file_push (const char *name)
 {
   struct input *push;
 
@@ -553,21 +562,20 @@ nlmlex_file_push (name)
 
 /* Start lexing from a file.  */
 
-static boolean
-nlmlex_file_open (name)
-     const char *name;
+static bfd_boolean
+nlmlex_file_open (const char *name)
 {
   current.file = fopen (name, "r");
   if (current.file == NULL)
     {
       fprintf (stderr, "%s:%s: %s\n", program_name, name, strerror (errno));
       ++parse_errors;
-      return false;
+      return FALSE;
     }
   current.name = xstrdup (name);
   current.lineno = 1;
   current.state = BEGINNING_OF_LINE;
-  return true;
+  return TRUE;
 }
 \f
 /* Table used to turn keywords into tokens.  */
@@ -578,7 +586,7 @@ struct keyword_tokens_struct
   int token;
 };
 
-struct keyword_tokens_struct keyword_tokens[] =
+static struct keyword_tokens_struct keyword_tokens[] =
 {
   { "CHECK", CHECK },
   { "CODESTART", CODESTART },
@@ -606,13 +614,13 @@ struct keyword_tokens_struct keyword_tokens[] =
   { "SCREENNAME", SCREENNAME },
   { "SHARELIB", SHARELIB },
   { "STACK", STACK },
-  { "STACKSIZE", STACKSIZE },
+  { "STACKSIZE", STACK },
   { "START", START },
   { "SYNCHRONIZE", SYNCHRONIZE },
   { "THREADNAME", THREADNAME },
   { "TYPE", TYPE },
   { "VERBOSE", VERBOSE },
-  { "VERSION", VERSION },
+  { "VERSION", VERSIONK },
   { "XDCDATA", XDCDATA }
 };
 
@@ -628,7 +636,7 @@ static int lex_pos;
   ((void) (lex_buf != NULL ? lex_pos = 0 : nlmlex_buf_init ()))
 
 static int
-nlmlex_buf_init ()
+nlmlex_buf_init (void)
 {
   lex_size = 10;
   lex_buf = xmalloc (lex_size + 1);
@@ -646,8 +654,7 @@ nlmlex_buf_init ()
           : nlmlex_buf_add (c)))
 
 static char
-nlmlex_buf_add (c)
-     int c;
+nlmlex_buf_add (int c)
 {
   if (lex_pos >= lex_size)
     {
@@ -662,7 +669,7 @@ nlmlex_buf_add (c)
    code.  */
 
 static int
-yylex ()
+yylex (void)
 {
   int c;
 
@@ -671,7 +678,7 @@ tail_recurse:
   c = getc (current.file);
 
   /* Commas are treated as whitespace characters.  */
-  while (isspace ((unsigned char) c) || c == ',')
+  while (ISSPACE (c) || c == ',')
     {
       current.state = IN_LINE;
       if (c == '\n')
@@ -724,9 +731,9 @@ tail_recurse:
          if (c == '\n')
            ++current.lineno;
        }
-      while (isspace ((unsigned char) c));
+      while (ISSPACE (c));
       BUF_INIT ();
-      while (! isspace ((unsigned char) c) && c != EOF)
+      while (! ISSPACE (c) && c != EOF)
        {
          BUF_ADD (c);
          c = getc (current.file);
@@ -734,7 +741,7 @@ tail_recurse:
       BUF_FINISH ();
 
       ungetc (c, current.file);
-      
+
       nlmlex_file_push (lex_buf);
       goto tail_recurse;
     }
@@ -744,25 +751,22 @@ tail_recurse:
   if (current.state == BEGINNING_OF_LINE)
     {
       BUF_INIT ();
-      while (isalnum ((unsigned char) c) || c == '_')
+      while (ISALNUM (c) || c == '_')
        {
-         if (islower ((unsigned char) c))
-           BUF_ADD (toupper ((unsigned char) c));
-         else
-           BUF_ADD (c);
+         BUF_ADD (TOUPPER (c));
          c = getc (current.file);
        }
       BUF_FINISH ();
 
-      if (c != EOF && ! isspace ((unsigned char) c) && c != ',')
+      if (c != EOF && ! ISSPACE (c) && c != ',')
        {
          nlmheader_identify ();
-         fprintf (stderr, "%s:%d: illegal character in keyword: %c\n",
+         fprintf (stderr, _("%s:%d: illegal character in keyword: %c\n"),
                   current.name, current.lineno, c);
        }
       else
        {
-         int i;
+         unsigned int i;
 
          for (i = 0; i < KEYWORD_COUNT; i++)
            {
@@ -776,9 +780,9 @@ tail_recurse:
                  return keyword_tokens[i].token;
                }
            }
-         
+
          nlmheader_identify ();
-         fprintf (stderr, "%s:%d: unrecognized keyword: %s\n",
+         fprintf (stderr, _("%s:%d: unrecognized keyword: %s\n"),
                   current.name, current.lineno, lex_buf);
        }
 
@@ -815,7 +819,7 @@ tail_recurse:
       if (c == EOF)
        {
          nlmheader_identify ();
-         fprintf (stderr, "%s:%d: end of file in quoted string\n",
+         fprintf (stderr, _("%s:%d: end of file in quoted string\n"),
                   current.name, start_lineno);
          ++parse_errors;
        }
@@ -827,7 +831,7 @@ tail_recurse:
 
   /* Gather a generic argument.  */
   BUF_INIT ();
-  while (! isspace (c)
+  while (! ISSPACE (c)
         && c != ','
         && c != COMMENT_CHAR
         && c != '('
@@ -848,15 +852,14 @@ tail_recurse:
 /* Get a number from a string.  */
 
 static long
-nlmlex_get_number (s)
-     const char *s;
+nlmlex_get_number (const char *s)
 {
   long ret;
   char *send;
 
   ret = strtol (s, &send, 10);
   if (*send != '\0')
-    nlmheader_warn ("bad number", -1);
+    nlmheader_warn (_("bad number"), -1);
   return ret;
 }
 
@@ -866,13 +869,13 @@ nlmlex_get_number (s)
    number.  */
 
 static void
-nlmheader_identify ()
+nlmheader_identify (void)
 {
   static int done;
 
   if (! done)
     {
-      fprintf (stderr, "%s: problems in NLM command language input:\n",
+      fprintf (stderr, _("%s: problems in NLM command language input:\n"),
               program_name);
       done = 1;
     }
@@ -881,9 +884,7 @@ nlmheader_identify ()
 /* Issue a warning.  */
 
 static void
-nlmheader_warn (s, imax)
-     const char *s;
-     int imax;
+nlmheader_warn (const char *s, int imax)
 {
   nlmheader_identify ();
   fprintf (stderr, "%s:%d: %s", current.name, current.lineno, s);
@@ -895,8 +896,7 @@ nlmheader_warn (s, imax)
 /* Report an error.  */
 
 static void
-nlmheader_error (s)
-     const char *s;
+nlmheader_error (const char *s)
 {
   nlmheader_warn (s, -1);
   ++parse_errors;
@@ -905,9 +905,7 @@ nlmheader_error (s)
 /* Add a string to a string list.  */
 
 static struct string_list *
-string_list_cons (s, l)
-     char *s;
-     struct string_list *l;
+string_list_cons (char *s, struct string_list *l)
 {
   struct string_list *ret;
 
@@ -920,9 +918,7 @@ string_list_cons (s, l)
 /* Append a string list to another string list.  */
 
 static struct string_list *
-string_list_append (l1, l2)
-     struct string_list *l1;
-     struct string_list *l2;
+string_list_append (struct string_list *l1, struct string_list *l2)
 {
   register struct string_list **pp;
 
@@ -935,9 +931,7 @@ string_list_append (l1, l2)
 /* Append a string to a string list.  */
 
 static struct string_list *
-string_list_append1 (l, s)
-     struct string_list *l;
-     char *s;
+string_list_append1 (struct string_list *l, char *s)
 {
   struct string_list *n;
   register struct string_list **pp;
@@ -954,8 +948,7 @@ string_list_append1 (l, s)
 /* Duplicate a string in memory.  */
 
 static char *
-xstrdup (s)
-     const char *s;
+xstrdup (const char *s)
 {
   unsigned long len;
   char *ret;