1
0
mirror of https://git.savannah.gnu.org/git/gperf.git synced 2025-12-02 13:09:22 +00:00

Improve option --pic. New options --string-pool-name, --null-strings.

This commit is contained in:
Bruno Haible
2003-04-16 10:07:23 +00:00
parent fa9b5b99bf
commit b49d12d984
12 changed files with 709 additions and 143 deletions

View File

@@ -1,5 +1,48 @@
2003-01-01 Bruno Haible <bruno@clisp.org> 2003-01-01 Bruno Haible <bruno@clisp.org>
* src/options.h (NULLSTRINGS): New enum value.
(Options::get_stringpool_name, Options::set_stringpool_name): New
method declarations.
(Options::_stringpool_name): New field.
* src/options.icc (Options::get_stringpool_name): New method.
* src/options.cc (DEFAULT_STRINGPOOL_NAME): New variable.
(Options::long_usage): Document -Q and --null-strings.
(Options::Options): Initialize _stringpool_name.
(Options::~Options): Output _stringpool_name, NULLSTRINGS values too.
(Options::set_stringpool_name): New method.
(long_options): Add options --string-pool-name, --null-strings.
(Options::parse_options): Implement options -P, -Q and --null-strings.
* src/input.cc (Input::read_input): Recognize declarations %pic,
%define string-pool-name, %null-strings.
* src/output.h (Output::output_string_pool,
Output::output_lookup_pools): New method declarations.
(Output::_wordlist_eltype): New field.
* src/output.cc (Output::output_keylength_table): Trivial
simplification.
(Output::output_string_pool): New method.
(output_keyword_entry): Add stringpool_index argument. For SHAREDLIB,
use struct offsets.
(output_keyword_blank_entries): For SHAREDLIB, use -1 instead of "".
(Output::output_keyword_table): Use _wordlist_eltype instead of
_struct_tag. Compute stringpool_index for output_keyword_entry.
(Output::output_lookup_pools): New method.
(Output::output_lookup_function_body): Use _wordlist_eltype instead of
_struct_tag. For SHAREDLIB, use "+ stringpool" to convert offsets to
strings. Use "o >= 0" to test for nonempty table entry.
(Output::output_lookup_function): Call output_lookup_pools.
(Output::output): Initialize _wordlist_eltype. Call
output_lookup_pools.
* tests/jstest4.gperf: New file.
* tests/test-6.exp: Update.
* tests/Makefile.in (check-lang-syntax): Drop test of -p. Add tests of
-P and -Q.
* doc/gperf.texi (User-supplied Struct): Mention that first field has
to be of type 'int' if -P is given.
(Gperf Declarations): Document %pic, %define string-pool-name,
%null-strings.
(Output Details): Update description of option -P. Document options -Q
and --null-strings.
* tests/Makefile.in (check-link-c, check-ada, check-pascal, * tests/Makefile.in (check-link-c, check-ada, check-pascal,
check-test): Omit option -p. check-test): Omit option -p.
* tests/c-parse.exp: Regenerated. * tests/c-parse.exp: Regenerated.

10
NEWS
View File

@@ -23,6 +23,9 @@ New in 2.97:
%enum %enum
%includes %includes
%global-table %global-table
%pic
%define string-pool-name NAME
%null-strings
%define word-array-name NAME %define word-array-name NAME
%switch=COUNT %switch=COUNT
%omit-struct-type %omit-struct-type
@@ -41,8 +44,11 @@ New in 2.97:
the table's size will grow as needed. Earlier versions of gperf bailed the table's size will grow as needed. Earlier versions of gperf bailed
out with an "Internal error, duplicate hash code value". out with an "Internal error, duplicate hash code value".
* The options -f/--fast and -o/--occurrence-sort have no effect any more. * The options -f/--fast and -o/--occurrence-sort have no effect any more.
* Added option -P/--pic that optimizes the generated code for use in shared * Added options -P/--pic and --null-strings that optimize the generated code
libraries. for use in shared libraries. -P/--pic does a perfect optimization but may
require some small code changes (see the documentation for details), whereas
--null-strings does only a half-hearted optimization but works without
needing any change to surrounding code.
* Added option --ignore-case that produces a case independent lookup function. * Added option --ignore-case that produces a case independent lookup function.
* Bug fixes. * Bug fixes.

View File

@@ -7,7 +7,7 @@
@c some day we should @include version.texi instead of defining @c some day we should @include version.texi instead of defining
@c these values at hand. @c these values at hand.
@set UPDATED 8 December 2002 @set UPDATED 1 January 2003
@set EDITION 2.7.2 @set EDITION 2.7.2
@set VERSION 2.7.2 @set VERSION 2.7.2
@c --------------------- @c ---------------------
@@ -28,7 +28,7 @@
This file documents the features of the GNU Perfect Hash Function This file documents the features of the GNU Perfect Hash Function
Generator @value{VERSION}. Generator @value{VERSION}.
Copyright @copyright{} 1989-2002 Free Software Foundation, Inc. Copyright @copyright{} 1989-2003 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of this Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are manual provided the copyright notice and this permission notice are
@@ -65,7 +65,7 @@ Software Foundation instead of in the original English.
@page @page
@vskip 0pt plus 1filll @vskip 0pt plus 1filll
Copyright @copyright{} 1989-2002 Free Software Foundation, Inc. Copyright @copyright{} 1989-2003 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of Permission is granted to make and distribute verbatim copies of
@@ -365,10 +365,12 @@ act like command-line options, as well as for providing a user-supplied
If the @samp{-t} option (or, equivalently, the @samp{%struct-type} declaration) If the @samp{-t} option (or, equivalently, the @samp{%struct-type} declaration)
@emph{is} enabled, you @emph{must} provide a C @code{struct} as the last @emph{is} enabled, you @emph{must} provide a C @code{struct} as the last
component in the declaration section from the input file. The first component in the declaration section from the input file. The first
field in this struct must be a @code{char *} or @code{const char *} field in this struct must be of type @code{char *} or @code{const char *}
identifier called @samp{name}, although it is possible to modify this if the @samp{-P} option is not given, or of type @code{int} if the option
field's name with the @samp{-K} option (or, equivalently, the @samp{-P} (or, equivalently, the @samp{%pic} declaration) is enabled.
@samp{%define slot-name}) described below. This first field must be called @samp{name}, although it is possible to modify
its name with the @samp{-K} option (or, equivalently, the
@samp{%define slot-name} declaration) described below.
Here is a simple example, using months of the year and their attributes as Here is a simple example, using months of the year and their attributes as
input: input:
@@ -544,6 +546,34 @@ Generate the static table of keywords as a static global variable,
rather than hiding it inside of the lookup function (which is the rather than hiding it inside of the lookup function (which is the
default behavior). default behavior).
@item %pic
@cindex @samp{%pic}
Optimize the generated table for inclusion in shared libraries. This
reduces the startup time of programs using a shared library containing
the generated code. If the @samp{%struct-type} declaration (or,
equivalently, the option @samp{-t}) is also given, the first field of the
user-defined struct must be of type @samp{int}, not @samp{char *}, because
it will contain offsets into the string pool instead of actual strings.
To convert such an offset to a string, you can use the expression
@samp{stringpool + @var{o}}, where @var{o} is the offset. The string pool
name can be changed through the @samp{%define string-pool-name} declaration.
@item %define string-pool-name @var{name}
@cindex @samp{%define string-pool-name}
Allows you to specify the name of the generated string pool created by
the declaration @samp{%pic} (or, equivalently, the option @samp{-P}).
The default name is @samp{stringpool}. This declaration permits the use of
two hash tables in the same file, with @samp{%pic} and even when the
@samp{%global-table} declaration (or, equivalently, the option @samp{-G})
is given.
@item %null-strings
@cindex @samp{%null-strings}
Use NULL strings instead of empty strings for empty keyword table entries.
This reduces the startup time of programs using a shared library containing
the generated code (but not as much as the declaration @samp{%pic}), at the
expense of one more test-and-branch instruction at run time.
@item %define word-array-name @var{name} @item %define word-array-name @var{name}
@cindex @samp{%define word-array-name} @cindex @samp{%define word-array-name}
Allows you to specify the name for the generated array containing the Allows you to specify the name for the generated array containing the
@@ -952,8 +982,27 @@ default behavior).
@itemx --pic @itemx --pic
Optimize the generated table for inclusion in shared libraries. This Optimize the generated table for inclusion in shared libraries. This
reduces the startup time of programs using a shared library containing reduces the startup time of programs using a shared library containing
the generated code, at the expense of one more test-and-branch instruction the generated code. If the option @samp{-t} (or, equivalently, the
at run time. @samp{%struct-type} declaration) is also given, the first field of the
user-defined struct must be of type @samp{int}, not @samp{char *}, because
it will contain offsets into the string pool instead of actual strings.
To convert such an offset to a string, you can use the expression
@samp{stringpool + @var{o}}, where @var{o} is the offset. The string pool
name can be changed through the option @samp{--string-pool-name}.
@item -Q @var{string-pool-name}
@itemx --string-pool-name=@var{string-pool-name}
Allows you to specify the name of the generated string pool created by
option @samp{-P}. The default name is @samp{stringpool}. This option
permits the use of two hash tables in the same file, with @samp{-P} and
even when the option @samp{-G} (or, equivalently, the @samp{%global-table}
declaration) is given.
@item --null-strings
Use NULL strings instead of empty strings for empty keyword table entries.
This reduces the startup time of programs using a shared library containing
the generated code (but not as much as option @samp{-P}), at the expense
of one more test-and-branch instruction at run time.
@item -W @var{hash-table-array-name} @item -W @var{hash-table-array-name}
@itemx --word-array-name=@var{hash-table-array-name} @itemx --word-array-name=@var{hash-table-array-name}

View File

@@ -1,5 +1,5 @@
/* Input routines. /* Input routines.
Copyright (C) 1989-1998, 2002 Free Software Foundation, Inc. Copyright (C) 1989-1998, 2002-2003 Free Software Foundation, Inc.
Written by Douglas C. Schmidt <schmidt@ics.uci.edu> Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
and Bruno Haible <bruno@clisp.org>. and Bruno Haible <bruno@clisp.org>.
@@ -529,6 +529,19 @@ Input::read_input ()
option.set (GLOBAL); option.set (GLOBAL);
else else
if (is_declaration (line, line_end, lineno, "pic"))
option.set (SHAREDLIB);
else
if (is_define_declaration (line, line_end, lineno,
"string-pool-name", &arg))
option.set_stringpool_name (arg);
else
if (is_declaration (line, line_end, lineno, "null-strings"))
option.set (NULLSTRINGS);
else
if (is_define_declaration (line, line_end, lineno, if (is_define_declaration (line, line_end, lineno,
"word-array-name", &arg)) "word-array-name", &arg))
option.set_wordlist_name (arg); option.set_wordlist_name (arg);

View File

@@ -1,5 +1,5 @@
/* Handles parsing the Options provided to the user. /* Handles parsing the Options provided to the user.
Copyright (C) 1989-1998, 2000, 2002 Free Software Foundation, Inc. Copyright (C) 1989-1998, 2000, 2002-2003 Free Software Foundation, Inc.
Written by Douglas C. Schmidt <schmidt@ics.uci.edu> Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
and Bruno Haible <bruno@clisp.org>. and Bruno Haible <bruno@clisp.org>.
@@ -58,6 +58,9 @@ static const char *const DEFAULT_HASH_NAME = "hash";
/* Default name for generated hash table array. */ /* Default name for generated hash table array. */
static const char *const DEFAULT_WORDLIST_NAME = "wordlist"; static const char *const DEFAULT_WORDLIST_NAME = "wordlist";
/* Default name for string pool. */
static const char *const DEFAULT_STRINGPOOL_NAME = "stringpool";
/* Default delimiters that separate keywords from their attributes. */ /* Default delimiters that separate keywords from their attributes. */
static const char *const DEFAULT_DELIMITERS = ","; static const char *const DEFAULT_DELIMITERS = ",";
@@ -165,6 +168,13 @@ Options::long_usage (FILE * stream)
" -P, --pic Optimize the generated table for inclusion in shared\n" " -P, --pic Optimize the generated table for inclusion in shared\n"
" libraries. This reduces the startup time of programs\n" " libraries. This reduces the startup time of programs\n"
" using a shared library containing the generated code.\n"); " using a shared library containing the generated code.\n");
fprintf (stream,
" -Q, --string-pool-name=NAME\n"
" Specify name of string pool generated by option --pic.\n"
" Default name is 'stringpool'.\n");
fprintf (stream,
" --null-strings Use NULL strings instead of empty strings for empty\n"
" keyword table entries.\n");
fprintf (stream, fprintf (stream,
" -W, --word-array-name=NAME\n" " -W, --word-array-name=NAME\n"
" Specify name of word list array. Default name is\n" " Specify name of word list array. Default name is\n"
@@ -448,6 +458,7 @@ Options::Options ()
_class_name (DEFAULT_CLASS_NAME), _class_name (DEFAULT_CLASS_NAME),
_hash_name (DEFAULT_HASH_NAME), _hash_name (DEFAULT_HASH_NAME),
_wordlist_name (DEFAULT_WORDLIST_NAME), _wordlist_name (DEFAULT_WORDLIST_NAME),
_stringpool_name (DEFAULT_STRINGPOOL_NAME),
_delimiters (DEFAULT_DELIMITERS), _delimiters (DEFAULT_DELIMITERS),
_key_positions () _key_positions ()
{ {
@@ -473,6 +484,7 @@ Options::~Options ()
"\nENUM is........: %s" "\nENUM is........: %s"
"\nINCLUDE is.....: %s" "\nINCLUDE is.....: %s"
"\nGLOBAL is......: %s" "\nGLOBAL is......: %s"
"\nNULLSTRINGS is.: %s"
"\nSHAREDLIB is...: %s" "\nSHAREDLIB is...: %s"
"\nSWITCH is......: %s" "\nSWITCH is......: %s"
"\nNOTYPE is......: %s" "\nNOTYPE is......: %s"
@@ -483,6 +495,7 @@ Options::~Options ()
"\nlookup function name = %s" "\nlookup function name = %s"
"\nhash function name = %s" "\nhash function name = %s"
"\nword list name = %s" "\nword list name = %s"
"\nstring pool name = %s"
"\nslot name = %s" "\nslot name = %s"
"\ninitializer suffix = %s" "\ninitializer suffix = %s"
"\nasso_values iterations = %d" "\nasso_values iterations = %d"
@@ -504,6 +517,7 @@ Options::~Options ()
_option_word & ENUM ? "enabled" : "disabled", _option_word & ENUM ? "enabled" : "disabled",
_option_word & INCLUDE ? "enabled" : "disabled", _option_word & INCLUDE ? "enabled" : "disabled",
_option_word & GLOBAL ? "enabled" : "disabled", _option_word & GLOBAL ? "enabled" : "disabled",
_option_word & NULLSTRINGS ? "enabled" : "disabled",
_option_word & SHAREDLIB ? "enabled" : "disabled", _option_word & SHAREDLIB ? "enabled" : "disabled",
_option_word & SWITCH ? "enabled" : "disabled", _option_word & SWITCH ? "enabled" : "disabled",
_option_word & NOTYPE ? "enabled" : "disabled", _option_word & NOTYPE ? "enabled" : "disabled",
@@ -511,9 +525,10 @@ Options::~Options ()
_option_word & NOLENGTH ? "enabled" : "disabled", _option_word & NOLENGTH ? "enabled" : "disabled",
_option_word & RANDOM ? "enabled" : "disabled", _option_word & RANDOM ? "enabled" : "disabled",
_option_word & DEBUG ? "enabled" : "disabled", _option_word & DEBUG ? "enabled" : "disabled",
_function_name, _hash_name, _wordlist_name, _slot_name, _function_name, _hash_name, _wordlist_name, _stringpool_name,
_initializer_suffix, _asso_iterations, _jump, _size_multiple, _slot_name, _initializer_suffix, _asso_iterations, _jump,
_initial_asso_value, _delimiters, _total_switches); _size_multiple, _initial_asso_value, _delimiters,
_total_switches);
if (_key_positions.is_useall()) if (_key_positions.is_useall())
fprintf (stderr, "all characters are used in the hash function\n"); fprintf (stderr, "all characters are used in the hash function\n");
else else
@@ -610,6 +625,14 @@ Options::set_wordlist_name (const char *name)
_wordlist_name = name; _wordlist_name = name;
} }
/* Sets the string pool name, if not already set. */
void
Options::set_stringpool_name (const char *name)
{
if (_stringpool_name == DEFAULT_STRINGPOOL_NAME)
_stringpool_name = name;
}
/* Sets the delimiters string, if not already set. */ /* Sets the delimiters string, if not already set. */
void void
Options::set_delimiters (const char *delimiters) Options::set_delimiters (const char *delimiters)
@@ -656,6 +679,8 @@ static const struct option long_options[] =
{ "occurrence-sort", no_argument, NULL, 'o' }, { "occurrence-sort", no_argument, NULL, 'o' },
{ "optimized-collision-resolution", no_argument, NULL, 'O' }, { "optimized-collision-resolution", no_argument, NULL, 'O' },
{ "pic", no_argument, NULL, 'P' }, { "pic", no_argument, NULL, 'P' },
{ "string-pool-name", required_argument, NULL, 'Q' },
{ "null-strings", no_argument, NULL, CHAR_MAX + 3 },
{ "random", no_argument, NULL, 'r' }, { "random", no_argument, NULL, 'r' },
{ "size-multiple", required_argument, NULL, 's' }, { "size-multiple", required_argument, NULL, 's' },
{ "help", no_argument, NULL, 'h' }, { "help", no_argument, NULL, 'h' },
@@ -675,7 +700,7 @@ Options::parse_options (int argc, char *argv[])
while ((option_char = while ((option_char =
getopt_long (_argument_count, _argument_vector, getopt_long (_argument_count, _argument_vector,
"acCdDe:Ef:F:gGhH:i:Ij:k:K:lL:m:nN:oOpPrs:S:tTvW:Z:7", "acCdDe:Ef:F:gGhH:i:Ij:k:K:lL:m:nN:oOpPQ:rs:S:tTvW:Z:7",
long_options, NULL)) long_options, NULL))
!= -1) != -1)
{ {
@@ -872,6 +897,11 @@ Options::parse_options (int argc, char *argv[])
_option_word |= SHAREDLIB; _option_word |= SHAREDLIB;
break; break;
} }
case 'Q': /* Sets the name for the string pool. */
{
_stringpool_name = /*getopt*/optarg;
break;
}
case 'r': /* Utilize randomness to initialize the associated values table. */ case 'r': /* Utilize randomness to initialize the associated values table. */
{ {
_option_word |= RANDOM; _option_word |= RANDOM;
@@ -978,6 +1008,11 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
_option_word |= UPPERLOWER; _option_word |= UPPERLOWER;
break; break;
} }
case CHAR_MAX + 3: /* Use NULL instead of "". */
{
_option_word |= NULLSTRINGS;
break;
}
default: default:
short_usage (stderr); short_usage (stderr);
exit (1); exit (1);

View File

@@ -2,7 +2,7 @@
/* Handles parsing the Options provided to the user. /* Handles parsing the Options provided to the user.
Copyright (C) 1989-1998, 2000, 2002 Free Software Foundation, Inc. Copyright (C) 1989-1998, 2000, 2002-2003 Free Software Foundation, Inc.
Written by Douglas C. Schmidt <schmidt@ics.uci.edu> Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
and Bruno Haible <bruno@clisp.org>. and Bruno Haible <bruno@clisp.org>.
@@ -81,34 +81,37 @@ enum Option_Type
/* Make the keyword table a global variable. */ /* Make the keyword table a global variable. */
GLOBAL = 1 << 12, GLOBAL = 1 << 12,
/* Use NULL strings instead of empty strings for empty table entries. */
NULLSTRINGS = 1 << 13,
/* Optimize for position-independent code. */ /* Optimize for position-independent code. */
SHAREDLIB = 1 << 13, SHAREDLIB = 1 << 14,
/* Generate switch output to save space. */ /* Generate switch output to save space. */
SWITCH = 1 << 14, SWITCH = 1 << 15,
/* Don't include user-defined type definition in output -- it's already /* Don't include user-defined type definition in output -- it's already
defined elsewhere. */ defined elsewhere. */
NOTYPE = 1 << 15, NOTYPE = 1 << 16,
/* --- Algorithm employed by gperf --- */ /* --- Algorithm employed by gperf --- */
/* Use the given key positions. */ /* Use the given key positions. */
POSITIONS = 1 << 16, POSITIONS = 1 << 17,
/* Handle duplicate hash values for keywords. */ /* Handle duplicate hash values for keywords. */
DUP = 1 << 17, DUP = 1 << 18,
/* Don't include keyword length in hash computations. */ /* Don't include keyword length in hash computations. */
NOLENGTH = 1 << 18, NOLENGTH = 1 << 19,
/* Randomly initialize the associated values table. */ /* Randomly initialize the associated values table. */
RANDOM = 1 << 19, RANDOM = 1 << 20,
/* --- Informative output --- */ /* --- Informative output --- */
/* Enable debugging (prints diagnostics to stderr). */ /* Enable debugging (prints diagnostics to stderr). */
DEBUG = 1 << 20 DEBUG = 1 << 21
}; };
/* Class manager for gperf program Options. */ /* Class manager for gperf program Options. */
@@ -189,6 +192,11 @@ public:
/* Sets the hash table array name, if not already set. */ /* Sets the hash table array name, if not already set. */
void set_wordlist_name (const char *name); void set_wordlist_name (const char *name);
/* Returns the string pool name. */
const char * get_stringpool_name () const;
/* Sets the string pool name, if not already set. */
void set_stringpool_name (const char *name);
/* Returns the string used to delimit keywords from other attributes. */ /* Returns the string used to delimit keywords from other attributes. */
const char * get_delimiters () const; const char * get_delimiters () const;
/* Sets the delimiters string, if not already set. */ /* Sets the delimiters string, if not already set. */
@@ -255,6 +263,9 @@ private:
/* Name used for hash table array. */ /* Name used for hash table array. */
const char * _wordlist_name; const char * _wordlist_name;
/* Name used for the string pool. */
const char * _stringpool_name;
/* Separates keywords from other attributes. */ /* Separates keywords from other attributes. */
const char * _delimiters; const char * _delimiters;

View File

@@ -1,6 +1,6 @@
/* Inline Functions for options.{h,cc}. /* Inline Functions for options.{h,cc}.
Copyright (C) 1989-1998, 2000, 2002 Free Software Foundation, Inc. Copyright (C) 1989-1998, 2000, 2002-2003 Free Software Foundation, Inc.
Written by Douglas C. Schmidt <schmidt@ics.uci.edu> Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
and Bruno Haible <bruno@clisp.org>. and Bruno Haible <bruno@clisp.org>.
@@ -128,6 +128,13 @@ Options::get_wordlist_name () const
return _wordlist_name; return _wordlist_name;
} }
/* Returns the string pool name. */
INLINE const char *
Options::get_stringpool_name () const
{
return _stringpool_name;
}
/* Returns the string used to delimit keywords from other attributes. */ /* Returns the string used to delimit keywords from other attributes. */
INLINE const char * INLINE const char *
Options::get_delimiters () const Options::get_delimiters () const

View File

@@ -832,16 +832,18 @@ Output::output_keylength_table () const
column = 0; column = 0;
for (temp = _head, index = 0; temp; temp = temp->rest()) for (temp = _head, index = 0; temp; temp = temp->rest())
{ {
KeywordExt *keyword = temp->first();
/* If generating a switch statement, and there is no user defined type, /* If generating a switch statement, and there is no user defined type,
we generate non-duplicates directly in the code. Only duplicates go we generate non-duplicates directly in the code. Only duplicates go
into the table. */ into the table. */
if (option[SWITCH] && !option[TYPE] && !temp->first()->_duplicate_link) if (option[SWITCH] && !option[TYPE] && !keyword->_duplicate_link)
continue; continue;
if (index < temp->first()->_hash_value && !option[SWITCH] && !option[DUP]) if (index < keyword->_hash_value && !option[SWITCH] && !option[DUP])
{ {
/* Some blank entries. */ /* Some blank entries. */
for ( ; index < temp->first()->_hash_value; index++) for ( ; index < keyword->_hash_value; index++)
{ {
if (index > 0) if (index > 0)
printf (","); printf (",");
@@ -855,12 +857,12 @@ Output::output_keylength_table () const
printf (","); printf (",");
if ((column++ % columns) == 0) if ((column++ % columns) == 0)
printf("\n%s ", indent); printf("\n%s ", indent);
printf ("%3d", temp->first()->_allchars_length); printf ("%3d", keyword->_allchars_length);
index++; index++;
/* Deal with duplicates specially. */ /* Deal with duplicates specially. */
if (temp->first()->_duplicate_link) // implies option[DUP] if (keyword->_duplicate_link) // implies option[DUP]
for (KeywordExt *links = temp->first()->_duplicate_link; links; links = links->_duplicate_link) for (KeywordExt *links = keyword->_duplicate_link; links; links = links->_duplicate_link)
{ {
printf (","); printf (",");
if ((column++ % columns) == 0) if ((column++ % columns) == 0)
@@ -877,8 +879,111 @@ Output::output_keylength_table () const
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
/* Prints out the string pool, containing the strings of the keyword table.
Only called if option[SHAREDLIB]. */
void
Output::output_string_pool () const
{
const char * const indent = option[TYPE] || option[GLOBAL] ? "" : " ";
int index;
KeywordExt_List *temp;
printf ("%sstruct %s_t\n"
"%s {\n",
indent, option.get_stringpool_name (), indent);
for (temp = _head, index = 0; temp; temp = temp->rest())
{
KeywordExt *keyword = temp->first();
/* If generating a switch statement, and there is no user defined type,
we generate non-duplicates directly in the code. Only duplicates go
into the table. */
if (option[SWITCH] && !option[TYPE] && !keyword->_duplicate_link)
continue;
if (!option[SWITCH] && !option[DUP])
index = keyword->_hash_value;
printf ("%s char %s_str%d[sizeof(",
indent, option.get_stringpool_name (), index);
output_string (keyword->_allchars, keyword->_allchars_length);
printf (")];\n");
/* Deal with duplicates specially. */
if (keyword->_duplicate_link) // implies option[DUP]
for (KeywordExt *links = keyword->_duplicate_link; links; links = links->_duplicate_link)
if (!(links->_allchars_length == keyword->_allchars_length
&& memcmp (links->_allchars, keyword->_allchars,
keyword->_allchars_length) == 0))
{
index++;
printf ("%s char %s_str%d[sizeof(",
indent, option.get_stringpool_name (), index);
output_string (links->_allchars, links->_allchars_length);
printf (")];\n");
}
index++;
}
printf ("%s };\n",
indent);
printf ("%sstatic %sstruct %s_t %s_contents =\n"
"%s {\n",
indent, const_readonly_array, option.get_stringpool_name (),
option.get_stringpool_name (), indent);
for (temp = _head, index = 0; temp; temp = temp->rest())
{
KeywordExt *keyword = temp->first();
/* If generating a switch statement, and there is no user defined type,
we generate non-duplicates directly in the code. Only duplicates go
into the table. */
if (option[SWITCH] && !option[TYPE] && !keyword->_duplicate_link)
continue;
if (index > 0)
printf (",\n");
if (!option[SWITCH] && !option[DUP])
index = keyword->_hash_value;
printf ("%s ",
indent);
output_string (keyword->_allchars, keyword->_allchars_length);
/* Deal with duplicates specially. */
if (keyword->_duplicate_link) // implies option[DUP]
for (KeywordExt *links = keyword->_duplicate_link; links; links = links->_duplicate_link)
if (!(links->_allchars_length == keyword->_allchars_length
&& memcmp (links->_allchars, keyword->_allchars,
keyword->_allchars_length) == 0))
{
index++;
printf (",\n");
printf ("%s ",
indent);
output_string (links->_allchars, links->_allchars_length);
}
index++;
}
if (index > 0)
printf ("\n");
printf ("%s };\n",
indent);
printf ("%s#define %s ((%schar *) &%s_contents)\n",
indent, option.get_stringpool_name (), const_always,
option.get_stringpool_name ());
if (option[GLOBAL])
printf ("\n");
}
/* ------------------------------------------------------------------------- */
static void static void
output_keyword_entry (KeywordExt *temp, const char *indent) output_keyword_entry (KeywordExt *temp, int stringpool_index, const char *indent)
{ {
if (option[TYPE] && option.get_input_file_name ()) if (option[TYPE] && option.get_input_file_name ())
printf ("#line %u \"%s\"\n", printf ("#line %u \"%s\"\n",
@@ -886,7 +991,12 @@ output_keyword_entry (KeywordExt *temp, const char *indent)
printf ("%s ", indent); printf ("%s ", indent);
if (option[TYPE]) if (option[TYPE])
printf ("{"); printf ("{");
output_string (temp->_allchars, temp->_allchars_length); if (option[SHAREDLIB])
printf ("(int)(long)&((struct %s_t *)0)->%s_str%d",
option.get_stringpool_name (), option.get_stringpool_name (),
stringpool_index);
else
output_string (temp->_allchars, temp->_allchars_length);
if (option[TYPE]) if (option[TYPE])
{ {
if (strlen (temp->_rest) > 0) if (strlen (temp->_rest) > 0)
@@ -904,14 +1014,14 @@ output_keyword_blank_entries (int count, const char *indent)
int columns; int columns;
if (option[TYPE]) if (option[TYPE])
{ {
columns = 58 / (4 + (option[SHAREDLIB] ? 8 : 2) columns = 58 / (4 + (option[SHAREDLIB] ? 2 : option[NULLSTRINGS] ? 8 : 2)
+ strlen (option.get_initializer_suffix())); + strlen (option.get_initializer_suffix()));
if (columns == 0) if (columns == 0)
columns = 1; columns = 1;
} }
else else
{ {
columns = (option[SHAREDLIB] ? 4 : 9); columns = (option[SHAREDLIB] ? 9 : option[NULLSTRINGS] ? 4 : 9);
} }
int column = 0; int column = 0;
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
@@ -930,9 +1040,14 @@ output_keyword_blank_entries (int count, const char *indent)
if (option[TYPE]) if (option[TYPE])
printf ("{"); printf ("{");
if (option[SHAREDLIB]) if (option[SHAREDLIB])
printf ("(char*)0"); printf ("-1");
else else
printf ("\"\""); {
if (option[NULLSTRINGS])
printf ("(char*)0");
else
printf ("\"\"");
}
if (option[TYPE]) if (option[TYPE])
printf ("%s}", option.get_initializer_suffix()); printf ("%s}", option.get_initializer_suffix());
column++; column++;
@@ -945,12 +1060,12 @@ void
Output::output_keyword_table () const Output::output_keyword_table () const
{ {
const char *indent = option[GLOBAL] ? "" : " "; const char *indent = option[GLOBAL] ? "" : " ";
int index; int index;
KeywordExt_List *temp; KeywordExt_List *temp;
printf ("%sstatic ", printf ("%sstatic ",
indent); indent);
output_const_type (const_readonly_array, _struct_tag); output_const_type (const_readonly_array, _wordlist_eltype);
printf ("%s[] =\n" printf ("%s[] =\n"
"%s {\n", "%s {\n",
option.get_wordlist_name (), option.get_wordlist_name (),
@@ -960,31 +1075,42 @@ Output::output_keyword_table () const
for (temp = _head, index = 0; temp; temp = temp->rest()) for (temp = _head, index = 0; temp; temp = temp->rest())
{ {
if (option[SWITCH] && !option[TYPE] && !temp->first()->_duplicate_link) KeywordExt *keyword = temp->first();
/* If generating a switch statement, and there is no user defined type,
we generate non-duplicates directly in the code. Only duplicates go
into the table. */
if (option[SWITCH] && !option[TYPE] && !keyword->_duplicate_link)
continue; continue;
if (index > 0) if (index > 0)
printf (",\n"); printf (",\n");
if (index < temp->first()->_hash_value && !option[SWITCH] && !option[DUP]) if (index < keyword->_hash_value && !option[SWITCH] && !option[DUP])
{ {
/* Some blank entries. */ /* Some blank entries. */
output_keyword_blank_entries (temp->first()->_hash_value - index, indent); output_keyword_blank_entries (keyword->_hash_value - index, indent);
printf (",\n"); printf (",\n");
index = temp->first()->_hash_value; index = keyword->_hash_value;
} }
temp->first()->_final_index = index; keyword->_final_index = index;
output_keyword_entry (temp->first(), indent); output_keyword_entry (keyword, index, indent);
/* Deal with duplicates specially. */ /* Deal with duplicates specially. */
if (temp->first()->_duplicate_link) // implies option[DUP] if (keyword->_duplicate_link) // implies option[DUP]
for (KeywordExt *links = temp->first()->_duplicate_link; links; links = links->_duplicate_link) for (KeywordExt *links = keyword->_duplicate_link; links; links = links->_duplicate_link)
{ {
links->_final_index = ++index; links->_final_index = ++index;
printf (",\n"); printf (",\n");
output_keyword_entry (links, indent); int stringpool_index =
(links->_allchars_length == keyword->_allchars_length
&& memcmp (links->_allchars, keyword->_allchars,
keyword->_allchars_length) == 0
? keyword->_final_index
: links->_final_index);
output_keyword_entry (links, stringpool_index, indent);
} }
index++; index++;
@@ -1147,6 +1273,22 @@ Output::output_lookup_array () const
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
/* Generate all pools needed for the lookup function. */
void
Output::output_lookup_pools () const
{
if (option[SWITCH])
{
if (option[TYPE] || (option[DUP] && _total_duplicates > 0))
output_string_pool ();
}
else
{
output_string_pool ();
}
}
/* Generate all the tables needed for the lookup function. */ /* Generate all the tables needed for the lookup function. */
void void
@@ -1340,10 +1482,10 @@ Output::output_lookup_function_body (const Output_Compare& comparison) const
printf (" register %s%s *lengthptr;\n", printf (" register %s%s *lengthptr;\n",
const_always, smallest_integral_type (_max_key_len)); const_always, smallest_integral_type (_max_key_len));
printf (" register "); printf (" register ");
output_const_type (const_readonly_array, _struct_tag); output_const_type (const_readonly_array, _wordlist_eltype);
printf ("*wordptr;\n"); printf ("*wordptr;\n");
printf (" register "); printf (" register ");
output_const_type (const_readonly_array, _struct_tag); output_const_type (const_readonly_array, _wordlist_eltype);
printf ("*wordendptr;\n"); printf ("*wordendptr;\n");
} }
if (option[TYPE]) if (option[TYPE])
@@ -1358,14 +1500,14 @@ Output::output_lookup_function_body (const Output_Compare& comparison) const
output_switches (_head, num_switches, switch_size, _min_hash_value, _max_hash_value, 10); output_switches (_head, num_switches, switch_size, _min_hash_value, _max_hash_value, 10);
printf (" return 0;\n");
if (option[DUP] && _total_duplicates > 0) if (option[DUP] && _total_duplicates > 0)
{ {
int indent = 8; int indent = 8;
printf ("%*s return 0;\n" printf ("%*smulticompare:\n"
"%*smulticompare:\n"
"%*s while (wordptr < wordendptr)\n" "%*s while (wordptr < wordendptr)\n"
"%*s {\n", "%*s {\n",
indent, "", indent, "", indent, "", indent, ""); indent, "", indent, "", indent, "");
if (option[LENTABLE]) if (option[LENTABLE])
{ {
printf ("%*s if (len == *lengthptr)\n" printf ("%*s if (len == *lengthptr)\n"
@@ -1379,6 +1521,9 @@ Output::output_lookup_function_body (const Output_Compare& comparison) const
printf ("wordptr->%s", option.get_slot_name ()); printf ("wordptr->%s", option.get_slot_name ());
else else
printf ("*wordptr"); printf ("*wordptr");
if (option[SHAREDLIB])
printf (" + %s",
option.get_stringpool_name ());
printf (";\n\n" printf (";\n\n"
"%*s if (", "%*s if (",
indent, ""); indent, "");
@@ -1397,17 +1542,21 @@ Output::output_lookup_function_body (const Output_Compare& comparison) const
printf ("%*s lengthptr++;\n", printf ("%*s lengthptr++;\n",
indent, ""); indent, "");
printf ("%*s wordptr++;\n" printf ("%*s wordptr++;\n"
"%*s }\n", "%*s }\n"
indent, "", indent, ""); "%*s return 0;\n",
indent, "", indent, "", indent, "");
} }
printf (" return 0;\n" printf (" compare:\n");
" compare:\n");
if (option[TYPE]) if (option[TYPE])
{ {
printf (" {\n" printf (" {\n"
" register %schar *s = resword->%s;\n\n" " register %schar *s = resword->%s",
" if (",
const_always, option.get_slot_name ()); const_always, option.get_slot_name ());
if (option[SHAREDLIB])
printf (" + %s",
option.get_stringpool_name ());
printf (";\n\n"
" if (");
comparison.output_comparison (Output_Expr1 ("str"), Output_Expr1 ("s")); comparison.output_comparison (Output_Expr1 ("str"), Output_Expr1 ("s"));
printf (")\n" printf (")\n"
" return resword;\n" " return resword;\n"
@@ -1446,6 +1595,9 @@ Output::output_lookup_function_body (const Output_Compare& comparison) const
indent, "", const_always, option.get_wordlist_name ()); indent, "", const_always, option.get_wordlist_name ());
if (option[TYPE]) if (option[TYPE])
printf (".%s", option.get_slot_name ()); printf (".%s", option.get_slot_name ());
if (option[SHAREDLIB])
printf (" + %s",
option.get_stringpool_name ());
printf (";\n\n" printf (";\n\n"
"%*s if (", "%*s if (",
indent, ""); indent, "");
@@ -1476,12 +1628,12 @@ Output::output_lookup_function_body (const Output_Compare& comparison) const
indent, "", const_always, smallest_integral_type (_max_key_len)); indent, "", const_always, smallest_integral_type (_max_key_len));
printf ("%*s register ", printf ("%*s register ",
indent, ""); indent, "");
output_const_type (const_readonly_array, _struct_tag); output_const_type (const_readonly_array, _wordlist_eltype);
printf ("*wordptr = &%s[TOTAL_KEYWORDS + lookup[offset]];\n", printf ("*wordptr = &%s[TOTAL_KEYWORDS + lookup[offset]];\n",
option.get_wordlist_name ()); option.get_wordlist_name ());
printf ("%*s register ", printf ("%*s register ",
indent, ""); indent, "");
output_const_type (const_readonly_array, _struct_tag); output_const_type (const_readonly_array, _wordlist_eltype);
printf ("*wordendptr = wordptr + -lookup[offset + 1];\n\n"); printf ("*wordendptr = wordptr + -lookup[offset + 1];\n\n");
printf ("%*s while (wordptr < wordendptr)\n" printf ("%*s while (wordptr < wordendptr)\n"
"%*s {\n", "%*s {\n",
@@ -1499,6 +1651,9 @@ Output::output_lookup_function_body (const Output_Compare& comparison) const
printf ("wordptr->%s", option.get_slot_name ()); printf ("wordptr->%s", option.get_slot_name ());
else else
printf ("*wordptr"); printf ("*wordptr");
if (option[SHAREDLIB])
printf (" + %s",
option.get_stringpool_name ());
printf (";\n\n" printf (";\n\n"
"%*s if (", "%*s if (",
indent, ""); indent, "");
@@ -1534,18 +1689,55 @@ Output::output_lookup_function_body (const Output_Compare& comparison) const
indent += 2; indent += 2;
} }
printf ("%*s{\n" if (option[SHAREDLIB])
"%*s register %schar *s = %s[key]", {
indent, "", if (!option[LENTABLE])
indent, "", const_always, option.get_wordlist_name ()); {
printf ("%*s{\n"
if (option[TYPE]) "%*s register int o = %s[key]",
printf (".%s", option.get_slot_name ()); indent, "",
indent, "", option.get_wordlist_name ());
if (option[TYPE])
printf (".%s", option.get_slot_name ());
printf (";\n"
"%*s if (o >= 0)\n"
"%*s {\n",
indent, "",
indent, "");
indent += 4;
printf ("%*s register %schar *s = o",
indent, "", const_always);
}
else
{
/* No need for the (o >= 0) test, because the
(len == lengthtable[key]) test already guarantees that
key points to nonempty table entry. */
printf ("%*s{\n"
"%*s register %schar *s = %s[key]",
indent, "",
indent, "", const_always,
option.get_wordlist_name ());
if (option[TYPE])
printf (".%s", option.get_slot_name ());
}
printf (" + %s",
option.get_stringpool_name ());
}
else
{
printf ("%*s{\n"
"%*s register %schar *s = %s[key]",
indent, "",
indent, "", const_always, option.get_wordlist_name ());
if (option[TYPE])
printf (".%s", option.get_slot_name ());
}
printf (";\n\n" printf (";\n\n"
"%*s if (", "%*s if (",
indent, ""); indent, "");
if (option[SHAREDLIB]) if (!option[SHAREDLIB] && option[NULLSTRINGS])
printf ("s && "); printf ("s && ");
comparison.output_comparison (Output_Expr1 ("str"), Output_Expr1 ("s")); comparison.output_comparison (Output_Expr1 ("str"), Output_Expr1 ("s"));
printf (")\n" printf (")\n"
@@ -1555,8 +1747,14 @@ Output::output_lookup_function_body (const Output_Compare& comparison) const
printf ("&%s[key]", option.get_wordlist_name ()); printf ("&%s[key]", option.get_wordlist_name ());
else else
printf ("s"); printf ("s");
printf (";\n" printf (";\n");
"%*s}\n", if (option[SHAREDLIB] && !option[LENTABLE])
{
indent -= 4;
printf ("%*s }\n",
indent, "");
}
printf ("%*s}\n",
indent, ""); indent, "");
} }
} }
@@ -1601,6 +1799,8 @@ Output::output_lookup_function () const
output_constants (style); output_constants (style);
} }
if (option[SHAREDLIB] && !(option[GLOBAL] || option[TYPE]))
output_lookup_pools ();
if (!option[GLOBAL]) if (!option[GLOBAL])
output_lookup_tables (); output_lookup_tables ();
@@ -1646,6 +1846,8 @@ Output::output ()
_struct_tag = (const_always[0] ? "const char *" : "char *"); _struct_tag = (const_always[0] ? "const char *" : "char *");
} }
_wordlist_eltype = (option[SHAREDLIB] && !option[TYPE] ? "int" : _struct_tag);
printf ("/* "); printf ("/* ");
if (option[KRC]) if (option[KRC])
printf ("KR-C"); printf ("KR-C");
@@ -1726,6 +1928,8 @@ Output::output ()
output_hash_function (); output_hash_function ();
if (option[SHAREDLIB] && (option[GLOBAL] || option[TYPE]))
output_lookup_pools ();
if (option[GLOBAL]) if (option[GLOBAL])
output_lookup_tables (); output_lookup_tables ();

View File

@@ -2,7 +2,7 @@
/* Output routines. /* Output routines.
Copyright (C) 1989-1998, 2000, 2002 Free Software Foundation, Inc. Copyright (C) 1989-1998, 2000, 2002-2003 Free Software Foundation, Inc.
Written by Douglas C. Schmidt <schmidt@ics.uci.edu> Written by Douglas C. Schmidt <schmidt@ics.uci.edu>
and Bruno Haible <bruno@clisp.org>. and Bruno Haible <bruno@clisp.org>.
@@ -82,6 +82,10 @@ private:
comparison code in generated function 'in_word_set'. */ comparison code in generated function 'in_word_set'. */
void output_keylength_table () const; void output_keylength_table () const;
/* Prints out the string pool, containing the strings of the keyword table.
*/
void output_string_pool () const;
/* Prints out the array containing the keywords for the hash function. */ /* Prints out the array containing the keywords for the hash function. */
void output_keyword_table () const; void output_keyword_table () const;
@@ -89,6 +93,9 @@ private:
the smaller, contiguous range of the keyword table. */ the smaller, contiguous range of the keyword table. */
void output_lookup_array () const; void output_lookup_array () const;
/* Generate all pools needed for the lookup function. */
void output_lookup_pools () const;
/* Generate all the tables needed for the lookup function. */ /* Generate all the tables needed for the lookup function. */
void output_lookup_tables () const; void output_lookup_tables () const;
@@ -108,6 +115,8 @@ private:
const char * _return_type; const char * _return_type;
/* Shorthand for user-defined struct tag type. */ /* Shorthand for user-defined struct tag type. */
const char * _struct_tag; const char * _struct_tag;
/* Element type of keyword array. */
const char * _wordlist_eltype;
/* The C code from the declarations section. */ /* The C code from the declarations section. */
const char * const _verbatim_declarations; const char * const _verbatim_declarations;
const char * const _verbatim_declarations_end; const char * const _verbatim_declarations_end;

View File

@@ -200,21 +200,31 @@ check-lang-syntax : force
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 -D -l
$(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -S 10 -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -S 10 -D -l
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 1000 $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 1000
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -p $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -p -C $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -c
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -p -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -C
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -p -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -E
$(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -p -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -G
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -p -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -G -C
$(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -p -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -G -E
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -p -S 10 $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -l
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -p -S 10 -C $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -D
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -p -S 10 -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -P -D
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -p -S 10 -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -D -l
$(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -p -S 10 -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -P -D -l
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -p -S 10 -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10
$(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -p -S 10 -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -c
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -p -S 1000 $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -C
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -E
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -G
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -l
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -D
$(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -P -S 10 -D
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -D -l
$(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -P -S 10 -D -l
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 1000
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -Q auxstrings
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -Q auxstrings -S 10
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -K key_name $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -K key_name
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -H hash_function_name $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -H hash_function_name
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -W word_list_name $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -W word_list_name
@@ -222,66 +232,93 @@ check-lang-syntax : force
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest1.gperf -N lookup_function_name $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest1.gperf -N lookup_function_name
sed -e 's,Perfect_Hash,class_name,g' < $(srcdir)/jstest1.gperf > tmp-jstest1.gperf && \ sed -e 's,Perfect_Hash,class_name,g' < $(srcdir)/jstest1.gperf > tmp-jstest1.gperf && \
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest1.gperf -Z class_name $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest1.gperf -Z class_name
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -c $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -c
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -C $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -C
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -E $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -E
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -G $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -G
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -G -C $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -G -C
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -G -E $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -G -E
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -l
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -D
$(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest2.gperf -t -p -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest2.gperf -t -D
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -D -l
$(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest2.gperf -t -p -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest2.gperf -t -D -l
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -S 10 $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -S 10 -c $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -c
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -S 10 -C $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -C
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -S 10 -E $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -E
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -S 10 -G $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -G
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -S 10 -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -l
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -S 10 -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -D
$(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest2.gperf -t -p -S 10 -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest2.gperf -t -S 10 -D
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -S 10 -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -D -l
$(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest2.gperf -t -p -S 10 -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest2.gperf -t -S 10 -D -l
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -S 1000 $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 1000
sed -e 's,name,key_name,g' < $(srcdir)/jstest2.gperf > tmp-jstest2.gperf && \ sed -e 's,name,key_name,g' < $(srcdir)/jstest2.gperf > tmp-jstest2.gperf && \
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest2.gperf -t -p -K key_name $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest2.gperf -t -K key_name
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -p -H hash_function_name $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -H hash_function_name
sed -e 's,in_word_set,lookup_function_name,g' < $(srcdir)/jstest2.gperf > tmp-jstest2.gperf && \ sed -e 's,in_word_set,lookup_function_name,g' < $(srcdir)/jstest2.gperf > tmp-jstest2.gperf && \
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest2.gperf -t -p -N lookup_function_name $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest2.gperf -t -N lookup_function_name
sed -e 's,Perfect_Hash,class_name,g' < $(srcdir)/jstest2.gperf > tmp-jstest2.gperf && \ sed -e 's,Perfect_Hash,class_name,g' < $(srcdir)/jstest2.gperf > tmp-jstest2.gperf && \
$(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest2.gperf -t -p -Z class_name $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest2.gperf -t -Z class_name
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -c $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -c
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -C $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -C
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -E $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -E
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -G $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -G
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -G -C $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -G -C
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -G -E $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -G -E
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -l $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -l
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -D $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -D
$(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest3.gperf -t -p -D $(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest3.gperf -t -D
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -D -l $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -D -l
$(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest3.gperf -t -p -D -l $(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest3.gperf -t -D -l
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -S 10 $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -S 10 -c $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -c
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -S 10 -C $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -C
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -S 10 -E $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -E
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -S 10 -G $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -G
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -S 10 -l $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -l
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -S 10 -D $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -D
$(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest3.gperf -t -p -S 10 -D $(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest3.gperf -t -S 10 -D
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -S 10 -D -l $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -D -l
$(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest3.gperf -t -p -S 10 -D -l $(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest3.gperf -t -S 10 -D -l
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -S 1000 $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 1000
sed -e 's,name,key_name,g' < $(srcdir)/jstest3.gperf > tmp-jstest3.gperf && \ sed -e 's,name,key_name,g' < $(srcdir)/jstest3.gperf > tmp-jstest3.gperf && \
$(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest3.gperf -t -p -K key_name $(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest3.gperf -t -K key_name
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -p -H hash_function_name $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -H hash_function_name
sed -e 's,in_word_set,lookup_function_name,g' < $(srcdir)/jstest3.gperf > tmp-jstest3.gperf && \ sed -e 's,in_word_set,lookup_function_name,g' < $(srcdir)/jstest3.gperf > tmp-jstest3.gperf && \
$(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest3.gperf -t -p -N lookup_function_name $(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest3.gperf -t -N lookup_function_name
sed -e 's,Perfect_Hash,class_name,g' < $(srcdir)/jstest3.gperf > tmp-jstest3.gperf && \ sed -e 's,Perfect_Hash,class_name,g' < $(srcdir)/jstest3.gperf > tmp-jstest3.gperf && \
$(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest3.gperf -t -p -Z class_name $(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest3.gperf -t -Z class_name
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -c
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -C
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -E
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -G
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -G -C
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -G -E
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -l
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -D
$(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest4.gperf -t -P -D
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -D -l
$(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest4.gperf -t -P -D -l
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -c
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -C
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -E
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -G
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -l
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -D
$(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest4.gperf -t -P -S 10 -D
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -D -l
$(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest4.gperf -t -P -S 10 -D -l
$(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 1000
sed -e 's,stringpool,auxstrings,g' < $(srcdir)/jstest4.gperf > tmp-jstest4.gperf && \
$(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest4.gperf -t -P -Q auxstrings
sed -e 's,stringpool,auxstrings,g' < $(srcdir)/jstest4.gperf > tmp-jstest4.gperf && \
$(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest4.gperf -t -P -Q auxstrings -S 10
mostlyclean : clean mostlyclean : clean

147
tests/jstest4.gperf Normal file
View File

@@ -0,0 +1,147 @@
struct js_keyword {
int name;
int token;
}
%%
abstract, 1
boolean, 2
break, 3
byte, 4
case, 5
catch, 6
char, 7
class, 8
const, 9
continue, 10
default, 11
do, 12
double, 13
else, 14
extends, 15
false, 16
final, 17
finally, 18
float, 19
for, 20
function, 21
goto, 22
if, 23
implements, 24
import, 25
in, 26
instanceof, 27
int, 28
interface, 29
long, 30
native, 31
new, 32
null, 33
package, 34
private, 35
protected, 36
public, 37
return, 38
short, 39
static, 40
super, 41
switch, 42
synchronized, 43
this, 44
throw, 45
throws, 46
transient, 47
true, 48
try, 49
var, 50
void, 51
while, 52
with, 53
%%
#include <stdlib.h>
#include <string.h>
#if defined(__STDC__) || defined(__cplusplus)
#define CONST const
#else
#define CONST
#endif
static CONST char* testdata[] = {
"bogus",
"abstract",
"boolean",
"break",
"byte",
"case",
"catch",
"char",
"class",
"const",
"continue",
"default",
"do",
"double",
"else",
"extends",
"false",
"final",
"finally",
"float",
"for",
"function",
"goto",
"if",
"implements",
"import",
"in",
"instanceof",
"int",
"interface",
"long",
"native",
"new",
"null",
"package",
"private",
"protected",
"public",
"return",
"short",
"static",
"super",
"switch",
"synchronized",
"this",
"throw",
"throws",
"transient",
"true",
"try",
"var",
"void",
"while",
"with"
};
int main ()
{
int i;
for (i = 0; i < sizeof(testdata)/sizeof(testdata[0]); i++)
{
#ifdef CPLUSPLUS_TEST
CONST struct js_keyword * resword = Perfect_Hash::in_word_set(testdata[i],strlen(testdata[i]));
#else
CONST struct js_keyword * resword = in_word_set(testdata[i],strlen(testdata[i]));
#endif
if (i > 0)
{
if (!resword)
exit (1);
if (strcmp(testdata[i],stringpool+resword->name))
exit (1);
}
else
{
if (resword)
exit (1);
}
}
return 0;
}

View File

@@ -63,6 +63,11 @@ Details in the output code:
-P, --pic Optimize the generated table for inclusion in shared -P, --pic Optimize the generated table for inclusion in shared
libraries. This reduces the startup time of programs libraries. This reduces the startup time of programs
using a shared library containing the generated code. using a shared library containing the generated code.
-Q, --string-pool-name=NAME
Specify name of string pool generated by option --pic.
Default name is 'stringpool'.
--null-strings Use NULL strings instead of empty strings for empty
keyword table entries.
-W, --word-array-name=NAME -W, --word-array-name=NAME
Specify name of word list array. Default name is Specify name of word list array. Default name is
'wordlist'. 'wordlist'.