* src/options.h (struct option_table_struct): set_flags is void*.

* src/options.c (longopts): Support `--output' and `%output'.
(usage): Adjust.
* src/lex.h (tok_setopt): Remove, replaced with...
(tok_intopt, tok_stropt): these new guys.
* src/lex.c (getopt.h): Not needed.
(token_buffer, unlexed_token_buffer): Not const.
(percent_table): Promote `-' over `_' in directive names.
Active `%name-prefix', `file-prefix', and `output'.
(parse_percent_token): Accept possible arguments to directives.
Promote `-' over `_' in directive names.
This commit is contained in:
Akim Demaille
2001-11-05 09:09:19 +00:00
parent 9f4503d6e9
commit 951366c145
8 changed files with 126 additions and 50 deletions

View File

@@ -21,7 +21,6 @@
#include "system.h"
#include "getargs.h"
#include "files.h"
#include "getopt.h" /* for optarg */
#include "symtab.h"
#include "options.h"
#include "lex.h"
@@ -31,7 +30,7 @@
/* Buffer for storing the current token. */
static struct obstack token_obstack;
const char *token_buffer = NULL;
char *token_buffer = NULL;
bucket *symval;
int numval;
@@ -39,7 +38,7 @@ int numval;
/* A token to be reread, see unlex and lex. */
static token_t unlexed = tok_undef;
static bucket *unlexed_symval = NULL;
static const char *unlexed_token_buffer = NULL;
static char *unlexed_token_buffer = NULL;
void
lex_init (void)
@@ -428,7 +427,7 @@ lex (void)
/* parse the literal token and compute character code in code */
{
int code, discode;
int code;
obstack_1grow (&token_obstack, '\'');
literalchar (&token_obstack, &code, '\'');
@@ -436,6 +435,7 @@ lex (void)
c = getc (finput);
if (c != '\'')
{
int discode;
complain (_("use \"...\" for multi-character literal tokens"));
while (1)
if (!literalchar (0, &discode, '\''))
@@ -553,7 +553,10 @@ option_strcmp (const char *left, const char *right)
token_t
parse_percent_token (void)
{
const struct option_table_struct *tx;
const struct option_table_struct *tx = NULL;
/* Where `=' was found in token_buffer. */
size_t equal_offset = 0;
char *arg = NULL;
int c = getc (finput);
@@ -565,6 +568,8 @@ parse_percent_token (void)
case '{':
return tok_percent_left_curly;
/* FIXME: Who the heck are those 5 guys!?! `%<' = `%left'!!!
Let's ask for there removal. */
case '<':
return tok_left;
@@ -593,9 +598,33 @@ parse_percent_token (void)
c = getc (finput);
}
ungetc (c, finput);
if (c == '=')
{
equal_offset = obstack_object_size (&token_obstack);
obstack_1grow (&token_obstack, c);
c = getc (finput);
if (c = '"')
{
int code; /* ignored here */
obstack_1grow (&token_obstack, '"');
/* Read up to and including ". */
while (literalchar (&token_obstack, &code, '"'))
/* nothing */;
}
}
else
ungetc (c, finput);
obstack_1grow (&token_obstack, '\0');
token_buffer = obstack_finish (&token_obstack);
if (equal_offset)
{
/* %token_buffer="arg" */
arg = token_buffer + equal_offset + 2;
arg[strlen (arg) - 1] = '\0';
token_buffer[equal_offset] = '\0';
}
/* table lookup % directive */
for (tx = option_table; tx->name; tx++)
@@ -603,27 +632,42 @@ parse_percent_token (void)
&& option_strcmp (token_buffer + 1, tx->name) == 0)
break;
if (tx->set_flag)
{
*((int *) (tx->set_flag)) = 1;
return tok_noop;
}
if (arg && !tx->ret_val == tok_stropt)
fatal (_("`%s' supports no argument: %s"), token_buffer, quotearg (arg));
switch (tx->ret_val)
{
case tok_setopt:
*((char **) (tx->set_flag)) = optarg;
case tok_stropt:
assert (tx->set_flag);
if (arg)
{
/* Keep only the first assignment: command line options have
already been processed, and we want them to have
precedence. Side effect: if this %-option is used
several times, only the first is honored. Bah. */
if (!*((char **) (tx->set_flag)))
*((char **) (tx->set_flag)) = arg;
}
else
fatal (_("`%s' requires an argument"), token_buffer);
return tok_noop;
break;
case tok_intopt:
assert (tx->set_flag);
*((int *) (tx->set_flag)) = 1;
return tok_noop;
break;
case tok_obsolete:
fatal (_("`%s' is no longer supported"), token_buffer);
return tok_noop;
break;
default:
/* Other cases do not apply here. */
return tx->ret_val;
break;
}
return tx->ret_val;
abort ();
}