summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2000-08-19 08:47:58 +0000
committerBruno Haible <bruno@clisp.org>2000-08-19 08:47:58 +0000
commit891da43ca2137e918e93c09d9bfa1ab16f5015d2 (patch)
treea991573aaf901fe75cfdb3f0676fbbdf29967211
parent018913610b93959da99e6dbea06c2d29310d556a (diff)
downloadgperf-891da43ca2137e918e93c09d9bfa1ab16f5015d2.tar.gz
Add option "-F", initializer suffix, to avoid warnings in gcc.
-rw-r--r--ChangeLog16
-rw-r--r--doc/gperf.texi9
-rw-r--r--src/key-list.cc16
-rw-r--r--src/options.cc24
-rw-r--r--src/options.h4
-rw-r--r--src/options.icc10
6 files changed, 69 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 9b8c6b3..4fd5deb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,21 @@
2000-08-19 Bruno Haible <bruno@linuix.math.u-bordeaux.fr>
+ Make the structure initializers customizable. Based on a patch by
+ Kaveh R. Ghazi <ghazi@caip.rutgers.edu>.
+ * src/options.h (Options::get_initializer_suffix,
+ Options::initializer_suffix): New declarations.
+ * src/options.icc (Options::get_initializer_suffix): New function.
+ * src/options.cc (DEFAULT_INITIALIZER_SUFFIX): New constant.
+ (Options::initializer_suffix): New variable.
+ (Options::long_usage): Document option "-F".
+ (Options constructor): Initialize initializer_suffix.
+ (Options destructor): Dump initializer_suffix.
+ (long_options): Add option "-F".
+ (Options::operator()): Accept option "-F". Sets initializer_suffix.
+ * src/key-list.cc (output_keyword_blank_entries): Output
+ initializer_suffix.
+ * doc/gperf.texi: Document option "-F".
+
* COPYING: Replace with GPL version 2 (with new FSF address and Y2K safe
year format).
diff --git a/doc/gperf.texi b/doc/gperf.texi
index c9a9549..ac129b2 100644
--- a/doc/gperf.texi
+++ b/doc/gperf.texi
@@ -517,7 +517,7 @@ the literal tab character.
@item -t
Allows you to include a @code{struct} type declaration for generated
-code. Any text before a pair of consecutive %% is consider part of the
+code. Any text before a pair of consecutive %% is considered part of the
type declaration. Key words and additional fields may follow this, one
group of fields per line. A set of examples for generating perfect hash
tables and functions for Ada, C, and G++, Pascal, and Modula 2 and 3
@@ -578,6 +578,13 @@ the keyword is @samp{name}. This option allows an arbitrary choice of
identifier for this component, although it still must occur as the first
field in your supplied @code{struct}.
+@item -F @var{initializers}
+This option is only useful when option @samp{-t} has been given.
+It permits to specify initializers for the structure members following
+@var{key name} in empty hash table entries. The list of initializers
+should start with a comma. By default, the emitted code will
+zero-initialize structure members following @var{key name}.
+
@item -H @var{hash function name}
Allows you to specify the name for the generated hash function. Default
name is @samp{hash}. This option permits the use of two hash tables in the
diff --git a/src/key-list.cc b/src/key-list.cc
index 38341f3..8867dcd 100644
--- a/src/key-list.cc
+++ b/src/key-list.cc
@@ -1,5 +1,5 @@
/* Routines for building, ordering, and printing the keyword list.
- Copyright (C) 1989-1998 Free Software Foundation, Inc.
+ Copyright (C) 1989-1998, 2000 Free Software Foundation, Inc.
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
This file is part of GNU GPERF.
@@ -1053,7 +1053,17 @@ output_keyword_entry (List_Node *temp, const char *indent)
static void
output_keyword_blank_entries (int count, const char *indent)
{
- const int columns = 9;
+ int columns;
+ if (option[TYPE])
+ {
+ columns = 58 / (6 + strlen (option.get_initializer_suffix()));
+ if (columns == 0)
+ columns = 1;
+ }
+ else
+ {
+ columns = 9;
+ }
int column = 0;
for (int i = 0; i < count; i++)
{
@@ -1069,7 +1079,7 @@ output_keyword_blank_entries (int count, const char *indent)
printf (", ");
}
if (option[TYPE])
- printf ("{\"\"}");
+ printf ("{\"\"%s}", option.get_initializer_suffix());
else
printf ("\"\"");
column++;
diff --git a/src/options.cc b/src/options.cc
index 7be9746..85fe275 100644
--- a/src/options.cc
+++ b/src/options.cc
@@ -1,5 +1,5 @@
/* Handles parsing the Options provided to the user.
- Copyright (C) 1989-1998 Free Software Foundation, Inc.
+ Copyright (C) 1989-1998, 2000 Free Software Foundation, Inc.
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
This file is part of GNU GPERF.
@@ -43,6 +43,9 @@ static const char *const DEFAULT_NAME = "in_word_set";
/* Default name for the key component. */
static const char *const DEFAULT_KEY = "name";
+/* Default struct initializer suffix. */
+static const char *const DEFAULT_INITIALIZER_SUFFIX = "";
+
/* Default name for the generated class. */
static const char *const DEFAULT_CLASS_NAME = "Perfect_Hash";
@@ -67,6 +70,7 @@ int Options::iterations;
char **Options::argument_vector;
const char *Options::function_name;
const char *Options::key_name;
+const char *Options::initializer_suffix;
const char *Options::class_name;
const char *Options::hash_name;
const char *Options::wordlist_name;
@@ -116,6 +120,9 @@ Options::long_usage (FILE * strm)
"Details in the output code:\n"
" -K, --slot-name=NAME Select name of the keyword component in the keyword\n"
" structure.\n"
+ " -F, --initializer-suffix=INITIALIZERS\n"
+ " Initializers for additional components in the keyword\n"
+ " structure.\n"
" -H, --hash-fn-name=NAME\n"
" Specify name of generated hash function. Default is\n"
" `hash'.\n"
@@ -266,6 +273,7 @@ Options::Options (void)
option_word = DEFAULTCHARS | C;
function_name = DEFAULT_NAME;
key_name = DEFAULT_KEY;
+ initializer_suffix = DEFAULT_INITIALIZER_SUFFIX;
hash_name = DEFAULT_HASH_NAME;
wordlist_name = DEFAULT_WORDLIST_NAME;
class_name = DEFAULT_CLASS_NAME;
@@ -309,6 +317,7 @@ Options::~Options (void)
"\nhash function name = %s"
"\nword list name = %s"
"\nkey name = %s"
+ "\ninitializer suffix = %s"
"\njump value = %d"
"\nmax associated value = %d"
"\ninitial associated value = %d"
@@ -337,7 +346,8 @@ Options::~Options (void)
option_word & SEVENBIT ? "enabled" : "disabled",
iterations,
function_name, hash_name, wordlist_name, key_name,
- jump, size - 1, initial_asso_value, delimiters, total_switches);
+ initializer_suffix, jump, size - 1, initial_asso_value,
+ delimiters, total_switches);
if (option_word & ALLCHARS)
fprintf (stderr, "all characters are used in the hash function\n");
@@ -363,6 +373,7 @@ static const struct option long_options[] =
{ "struct-type", no_argument, 0, 't' },
{ "language", required_argument, 0, 'L' },
{ "slot-name", required_argument, 0, 'K' },
+ { "initializer-suffix", required_argument, 0, 'F' },
{ "hash-fn-name", required_argument, 0, 'H' },
{ "lookup-fn-name", required_argument, 0, 'N' },
{ "class-name", required_argument, 0, 'Z' },
@@ -403,7 +414,7 @@ Options::operator() (int argc, char *argv[])
while ((option_char =
getopt_long (argument_count, argument_vector,
- "adcCDe:Ef:gGhH:i:Ij:k:K:lL:nN:oprs:S:tTvW:Z:7",
+ "adcCDe:Ef:F:gGhH:i:Ij:k:K:lL:nN:oprs:S:tTvW:Z:7",
long_options, (int *)0))
!= -1)
{
@@ -453,11 +464,16 @@ Options::operator() (int argc, char *argv[])
}
break;
}
+ case 'F':
+ {
+ initializer_suffix = /*getopt*/optarg;
+ break;
+ }
case 'g': /* Use the ``inline'' keyword for generated sub-routines, ifdef __GNUC__. */
break; /* This is now the default. */
case 'G': /* Make the keyword table a global variable. */
{
- option_word |= GLOBAL;
+ option_word |= GLOBAL;
break;
}
case 'h': /* Displays a list of helpful Options to the user. */
diff --git a/src/options.h b/src/options.h
index a81afe6..9025c86 100644
--- a/src/options.h
+++ b/src/options.h
@@ -2,7 +2,7 @@
/* Handles parsing the Options provided to the user.
- Copyright (C) 1989-1998 Free Software Foundation, Inc.
+ Copyright (C) 1989-1998, 2000 Free Software Foundation, Inc.
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
This file is part of GNU GPERF.
@@ -98,6 +98,7 @@ public:
static int get_total_switches (void);
static const char *get_function_name (void);
static const char *get_key_name (void);
+ static const char *get_initializer_suffix (void);
static const char *get_class_name (void);
static const char *get_hash_name (void);
static const char *get_wordlist_name (void);
@@ -116,6 +117,7 @@ private:
static char **argument_vector; /* Stores a pointer to command-line vector. */
static const char *function_name; /* Names used for generated lookup function. */
static const char *key_name; /* Name used for keyword key. */
+ static const char *initializer_suffix; /* Suffix for empty struct initializers. */
static const char *class_name; /* Name used for generated C++ class. */
static const char *hash_name; /* Name used for generated hash function. */
static const char *wordlist_name; /* Name used for hash table array. */
diff --git a/src/options.icc b/src/options.icc
index 0d9668f..82fe537 100644
--- a/src/options.icc
+++ b/src/options.icc
@@ -1,6 +1,6 @@
/* Inline Functions for options.{h,cc}.
- Copyright (C) 1989-1998 Free Software Foundation, Inc.
+ Copyright (C) 1989-1998, 2000 Free Software Foundation, Inc.
written by Douglas C. Schmidt (schmidt@ics.uci.edu)
This file is part of GNU GPERF.
@@ -118,6 +118,14 @@ Options::get_key_name (void)
return key_name;
}
+/* Returns the struct initializer suffix. */
+INLINE const char *
+Options::get_initializer_suffix (void)
+{
+ T (Trace t ("Options::get_initializer_suffix");)
+ return initializer_suffix;
+}
+
/* Returns the hash function name. */
INLINE const char *
Options::get_hash_name (void)