%{/* nlmheader.y - parse NLM header specification keywords.
- Copyright (C) 1993 Free Software Foundation, Inc.
+ Copyright 1993, 1994, 1995, 1997, 1998, 2001, 2002
+ Free Software Foundation, Inc.
This file is part of GNU Binutils.
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. */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* Written by Ian Lance Taylor <ian@cygnus.com>.
This implementation is based on the description in the NetWare Tool
Maker Specification manual, edition 1.0. */
-#include <ansidecl.h>
+#include "ansidecl.h"
#include <stdio.h>
-#include <ctype.h>
-#include <bfd.h>
-#include "sysdep.h"
+#include "safe-ctype.h"
+#include "bfd.h"
#include "bucomm.h"
#include "nlm/common.h"
#include "nlm/internal.h"
/* 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). */
struct string_list *export_symbols;
+/* List of files from INPUT. */
+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). */
char *message_file;
/* Autoload module list (MODULE). */
struct string_list *modules;
+/* File named by OUTPUT. */
+char *output_file;
/* File named by SHARELIB. */
char *sharelib_file;
/* Start procedure name (START). */
char *start_procedure;
/* VERBOSE. */
-boolean verbose;
+bfd_boolean verbose;
/* RPC description file (XDCDATA). */
char *rpc_file;
/* Local functions. */
static int yylex PARAMS ((void));
static void nlmlex_file_push PARAMS ((const char *));
-static boolean nlmlex_file_open PARAMS ((const char *));
+static bfd_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 *));
%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. */
%token <string> QUOTED_STRING
/* Typed non-terminals. */
-%type <list> symbol_list_opt symbol_list module_list
+%type <list> symbol_list_opt symbol_list string_list
%type <string> symbol
%%
/* The entire file is just a list of commands. */
-file:
+file:
commands
;
}
| CODESTART STRING
{
- nlmheader_warn ("CODESTART is not implemented; sorry", -1);
+ nlmheader_warn (_("CODESTART is not implemented; sorry"), -1);
free ($2);
}
| COPYRIGHT QUOTED_STRING
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;
}
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
{
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;
}
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
{
{
import_symbols = string_list_append (import_symbols, $3);
}
- | INPUT STRING
+ | INPUT string_list
{
- nlmheader_warn ("INPUT not supported", -1);
- free ($2);
+ input_files = string_list_append (input_files, $2);
+ }
+ | MAP
+ {
+ map_file = "";
}
| MAP STRING
{
{
message_file = $2;
}
- | MODULE module_list
+ | MODULE string_list
{
modules = string_list_append (modules, $2);
}
}
| OUTPUT STRING
{
- nlmheader_warn ("OUTPUT not supported", -1);
- free ($2);
+ if (output_file == NULL)
+ output_file = $2;
+ else
+ nlmheader_warn (_("ignoring duplicate OUTPUT statement"), -1);
}
| PSEUDOPREEMPTION
{
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;
}
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;
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
}
| VERBOSE
{
- verbose = true;
+ verbose = TRUE;
}
- | VERSION STRING STRING STRING
+ | VERSIONK STRING STRING STRING
{
long val;
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;
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;
}
;
-/* A list of modules. */
+/* A list of strings. */
-module_list:
+string_list:
/* May be empty. */
{
$$ = NULL;
}
- | STRING module_list
+ | STRING string_list
{
$$ = string_list_cons ($1, $2);
}
/* 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
\f
/* Start the lexer going on the main input file. */
-boolean
+bfd_boolean
nlmlex_file (name)
const char *name;
{
/* Start lexing from a file. */
-static boolean
+static bfd_boolean
nlmlex_file_open (name)
const char *name;
{
{
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. */
{ "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 }
};
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')
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);
BUF_FINISH ();
ungetc (c, current.file);
-
+
nlmlex_file_push (lex_buf);
goto 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++)
{
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);
}
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;
}
/* Gather a generic argument. */
BUF_INIT ();
- while (! isspace (c)
+ while (! ISSPACE (c)
&& c != ','
&& c != COMMENT_CHAR
&& c != '('
ret = strtol (s, &send, 10);
if (*send != '\0')
- nlmheader_warn ("bad number", -1);
+ nlmheader_warn (_("bad number"), -1);
return ret;
}
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;
}