summaryrefslogtreecommitdiff
path: root/ACE/apps/gperf/src/Options.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/apps/gperf/src/Options.cpp')
-rw-r--r--ACE/apps/gperf/src/Options.cpp870
1 files changed, 870 insertions, 0 deletions
diff --git a/ACE/apps/gperf/src/Options.cpp b/ACE/apps/gperf/src/Options.cpp
new file mode 100644
index 00000000000..4251d7c7c39
--- /dev/null
+++ b/ACE/apps/gperf/src/Options.cpp
@@ -0,0 +1,870 @@
+// -*- C++ -*-
+
+// $Id$
+
+// Handles parsing the Options provided to the user.
+
+// Copyright (C) 1989 Free Software Foundation, Inc.
+// written by Douglas C. Schmidt (schmidt@cs.wustl.edu)
+
+// This file is part of GNU GPERF.
+
+// 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+#include "Options.h"
+
+ACE_RCSID(src, Options, "$Id$")
+
+#if defined (ACE_HAS_GPERF)
+
+#include "ace/Get_Opt.h"
+#include "Iterator.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_string.h"
+#include "ace/OS_NS_stdlib.h"
+
+// Global option coordinator for the entire program.
+Options option;
+
+// Current program version.
+extern const char *version_string;
+
+// Size to jump on a collision.
+static const int DEFAULT_JUMP_VALUE = 5;
+
+// Default name for generated lookup function.
+static const char *const DEFAULT_NAME = "in_word_set";
+
+// Default filler for keyword table.
+static const char *const DEFAULT_FILL = "";
+
+// Default name for the key component.
+static const char *const DEFAULT_KEY = "name";
+
+// Default name for the generated class.
+static const char *const DEFAULT_CLASS_NAME = "Perfect_Hash";
+
+// Default name for generated hash function.
+static const char *const DEFAULT_HASH_NAME = "hash";
+
+// Default delimiters that separate keywords from their attributes.
+static const char *const DEFAULT_DELIMITERS = ",\n";
+
+int Options::option_word_;
+int Options::total_switches_;
+u_int Options::total_keysig_size_;
+int Options::size_;
+int Options::key_pos_;
+int Options::jump_;
+int Options::initial_asso_value_;
+int Options::argc_;
+char **Options::argv_;
+int Options::iterations_;
+const char *Options::function_name_;
+const char *Options::fill_default_;
+const char *Options::key_name_;
+const char *Options::class_name_;
+const char *Options::hash_name_;
+const char *Options::delimiters_;
+char Options::key_positions_[MAX_KEY_POS];
+
+// Prints program usage to standard error stream.
+
+void
+Options::usage (void)
+{
+ ACE_ERROR ((LM_ERROR,
+ "Usage: %n [-abBcCdDef[num]gGhH<hashname>i<init>IjJ"
+ "k<keys>K<keyname>lL<language>mMnN<function name>o"
+ "Oprs<size>S<switches>tTvVZ<class name>].\n"
+ "(type %n -h for help)\n"));
+}
+
+// Output command-line Options.
+
+void
+Options::print_options (void)
+{
+ int i;
+
+ ACE_OS::printf ("/* Command-line: ");
+
+ for (i = 0; i < argc_; i++)
+ ACE_OS::printf ("%s ",
+ argv_[i]);
+
+ ACE_OS::printf (" */");
+}
+
+// Sorts the key positions *IN REVERSE ORDER!!* This makes further
+// routines more efficient. Especially when generating code. Uses a
+// simple Insertion Sort since the set is probably ordered. Returns 1
+// if there are no duplicates, 0 otherwise.
+
+int
+Options::key_sort (char *base, int len)
+{
+ int i, j;
+
+ for (i = 0, j = len - 1; i < j; i++)
+ {
+ int curr, tmp;
+
+ for (curr = i + 1, tmp = base[curr];
+ curr > 0 && tmp >= base[curr - 1];
+ curr--)
+ if ((base[curr] = base[curr - 1]) == tmp)
+ // Oh no, a duplicate!!!
+ return 0;
+
+ base[curr] = static_cast<char> (tmp);
+ }
+
+ return 1;
+}
+
+// Sets the default Options.
+
+Options::Options (void)
+{
+ key_positions_[0] = WORD_START;
+ key_positions_[1] = WORD_END;
+ key_positions_[2] = EOS;
+ total_keysig_size_ = 2;
+ delimiters_ = DEFAULT_DELIMITERS;
+ jump_ = DEFAULT_JUMP_VALUE;
+ option_word_ = DEFAULTCHARS | C;
+ function_name_ = DEFAULT_NAME;
+ fill_default_ = DEFAULT_FILL;
+ key_name_ = DEFAULT_KEY;
+ hash_name_ = DEFAULT_HASH_NAME;
+ class_name_ = DEFAULT_CLASS_NAME;
+ total_switches_ = size_ = 1;
+ initial_asso_value_ = iterations_ = 0;
+}
+
+// Dumps option status when debug is set.
+
+Options::~Options (void)
+{
+ if (ACE_BIT_ENABLED (option_word_, DEBUGGING))
+ {
+ char *ptr;
+
+ ACE_OS::fprintf (stderr,
+ "\ndumping Options:"
+ "\nDEBUGGING is...: %s"
+ "\nORDER is.......: %s"
+ "\nANSI is........: %s"
+ "\nTYPE is........: %s"
+ "\nINLINE is......: %s"
+ "\nRANDOM is......: %s"
+ "\nDEFAULTCHARS is: %s"
+ "\nSWITCH is......: %s"
+ "\nPOINTER is.....: %s"
+ "\nNOLENGTH is....: %s"
+ "\nLENTABLE is....: %s"
+ "\nDUP is.........: %s"
+ "\nFAST is........: %s"
+ "\nCOMP is........: %s"
+ "\nNOTYPE is......: %s"
+ "\nGLOBAL is......: %s"
+ "\nCONSTANT is....: %s"
+ "\nCPLUSPLUS is...: %s"
+ "\nC is...........: %s"
+ "\nENUM is........: %s"
+ "\nSTRCASECMP is..: %s"
+ "\nOPTIMIZE is....: %s"
+ "\nLINEARSEARCH is: %s"
+ "\nBINARYSEARCH is: %s"
+ "\niterations = %d"
+ "\nlookup function name = %s"
+ "\nfill default = %s"
+ "\nhash function name = %s"
+ "\nkey name = %s"
+ "\njump value = %d"
+ "\nmax associcated value = %d"
+ "\ninitial associated value = %d"
+ "\ndelimiters = %s"
+ "\nnumber of switch statements = %d"
+ "\n",
+ ACE_BIT_ENABLED (option_word_, DEBUGGING) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, ORDER) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, ANSI) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, TYPE) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, INLINE) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, RANDOM) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, DEFAULTCHARS) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, SWITCH) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, POINTER) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, NOLENGTH) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, LENTABLE) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, DUP) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, FAST) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, COMP) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, NOTYPE) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, GLOBAL) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, CONSTANT) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, CPLUSPLUS) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, C) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, ENUM) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, STRCASECMP) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, OPTIMIZE) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, LINEARSEARCH) ? "enabled" : "disabled",
+ ACE_BIT_ENABLED (option_word_, BINARYSEARCH) ? "enabled" : "disabled",
+ iterations_,
+ function_name_,
+ fill_default_,
+ hash_name_,
+ key_name_,
+ jump_,
+ size_ - 1,
+ initial_asso_value_,
+ delimiters_,
+ total_switches_);
+ if (ACE_BIT_ENABLED (option_word_, ALLCHARS))
+ ACE_OS::fprintf (stderr,
+ "all characters are used in the hash function\n");
+
+ ACE_OS::fprintf (stderr,
+ "maximum keysig size = %d\nkey positions are: \n",
+ total_keysig_size_);
+
+ for (ptr = key_positions_; *ptr != EOS; ptr++)
+ if (*ptr == WORD_END)
+ ACE_OS::fprintf (stderr, "$\n");
+ else
+ ACE_OS::fprintf (stderr, "%d\n", *ptr);
+
+ ACE_OS::fprintf (stderr, "finished dumping Options\n");
+ }
+}
+
+// Parses the command line Options and sets appropriate flags in
+// option_word_.
+
+int
+Options::parse_args (int argc, char *argv[])
+{
+ if (ACE_LOG_MSG->open (argv[0]) == -1)
+ return -1;
+
+ ACE_Get_Opt getopt (argc, argv, "abBcCdDe:Ef:F:gGhH:i:IJj:k:K:lL:mMnN:oOprs:S:tTvVZ:");
+ int option_char;
+
+ argc_ = argc;
+ argv_ = argv;
+
+ while ((option_char = getopt ()) != -1)
+ {
+ switch (option_char)
+ {
+ // Generated coded uses the ANSI prototype format.
+ case 'a':
+ {
+ ACE_SET_BITS (option_word_, ANSI);
+ break;
+ }
+ // Generate code for Linear Search.
+ case 'b':
+ {
+ ACE_SET_BITS (option_word_, LINEARSEARCH);
+ break;
+ }
+ // Generate code for Binary Search.
+ case 'B':
+ {
+ ACE_SET_BITS (option_word_, BINARYSEARCH);
+ break;
+ }
+ // Generate strncmp rather than strcmp.
+ case 'c':
+ {
+ ACE_SET_BITS (option_word_, COMP);
+ break;
+ }
+ // Make the generated tables readonly (const).
+ case 'C':
+ {
+ ACE_SET_BITS (option_word_, CONSTANT);
+ break;
+ }
+ // Enable debugging option.
+ case 'd':
+ {
+ ACE_SET_BITS (option_word_, DEBUGGING);
+ ACE_ERROR ((LM_ERROR,
+ "Starting program %n, version %s, with debugging on.\n",
+ version_string));
+ break;
+ }
+ // Enable duplicate option.
+ case 'D':
+ {
+ ACE_SET_BITS (option_word_, DUP);
+ break;
+ }
+ // Allows user to provide keyword/attribute separator
+ case 'e':
+ {
+ delimiters_ = getopt.opt_arg ();
+ break;
+ }
+ case 'E':
+ {
+ ACE_SET_BITS (option_word_, ENUM);
+ break;
+ }
+ // Generate the hash table ``fast.''
+ case 'f':
+ {
+ ACE_SET_BITS (option_word_, FAST);
+ iterations_ = ACE_OS::atoi (getopt.opt_arg ());
+ if (iterations_ < 0)
+ {
+ ACE_ERROR ((LM_ERROR, "iterations value must not be negative, assuming 0\n"));
+ iterations_ = 0;
+ }
+ break;
+ }
+ // Use the ``inline'' keyword for generated sub-routines.
+ case 'g':
+ {
+ ACE_SET_BITS (option_word_, INLINE);
+ break;
+ }
+ // Make the keyword table a global variable.
+ case 'G':
+ {
+ ACE_SET_BITS (option_word_, GLOBAL);
+ break;
+ }
+ // Displays a list of helpful Options to the user.
+ case 'h':
+ {
+ ACE_OS::fprintf (stderr,
+ "-a\tGenerate ANSI standard C output code, i.e., function prototypes.\n"
+ "-b\tGenerate code for Linear Search.\n"
+ "-B\tGenerate code for Binary Search.\n"
+ "-c\tGenerate comparison code using strncmp rather than strcmp.\n"
+ "-C\tMake the contents of generated lookup tables constant, i.e., readonly.\n"
+ "-d\tEnables the debugging option (produces verbose output to the standard\n"
+ "\terror).\n"
+ "-D\tHandle keywords that hash to duplicate values. This is useful\n"
+ "\tfor certain highly redundant keyword sets.\n"
+ "-e\tAllow user to provide a string containing delimiters used to separate\n"
+ "\tkeywords from their attributes. Default is \",\\n\"\n"
+ "-E\tDefine constant values using an enum local to the lookup function\n"
+ "\trather than with defines\n"
+ "-f\tGenerate the gen-perf.hash function ``fast.'' This decreases GPERF's\n"
+ "\trunning time at the cost of minimizing generated table-size.\n"
+ "\tThe numeric argument represents the number of times to iterate when\n"
+ "\tresolving a collision. `0' means ``iterate by the number of keywords.''\n"
+ "-F\tProvided expression will be used to assign default values in keyword\n"
+ "\ttable, i.e., the fill value. Default is \"\".\n"
+ "-g\tMake generated routines use ``inline'' to remove function overhead.\n"
+ "-G\tGenerate the static table of keywords as a static global variable,\n"
+ "\trather than hiding it inside of the lookup function (which is the\n"
+ "\tdefault behavior).\n"
+ "-h\tPrints this message.\n"
+ "-H\tAllow user to specify name of generated hash function. Default\n"
+ "\tis `hash'.\n"
+ "-i\tProvide an initial value for the associate values array. Default is 0.\n"
+ "-I\tGenerate comparison code using case insensitive string comparison, e.g.,\n"
+ "\tstrncasecmp or strcasecmp.\n"
+ "\tSetting this value larger helps inflate the size of the final table.\n"
+ "-j\tAffects the ``jump value,'' i.e., how far to advance the associated\n"
+ "\tcharacter value upon collisions. Must be an odd number, default is %d.\n"
+ "-J\tSkips '#include <string.h>' part in the output.\n"
+ "-k\tAllows selection of the key positions used in the hash function.\n"
+ "\tThe allowable choices range between 1-%d, inclusive. The positions\n"
+ "\tare separated by commas, ranges may be used, and key positions may\n"
+ "\toccur in any order. Also, the meta-character '*' causes the generated\n"
+ "\thash function to consider ALL key positions, and $ indicates the\n"
+ "\t``final character'' of a key, e.g., $,1,2,4,6-10.\n"
+ "-K\tAllow use to select name of the keyword component in the keyword\n"
+ "\tstructure.\n"
+ "-l\tCompare key lengths before trying a string comparison. This helps\n"
+ "\tcut down on the number of string comparisons made during the lookup.\n"
+ "-L\tGenerates code in the language specified by the option's argument.\n"
+ "\tLanguages handled are currently C++ and C. The default is C.\n"
+ "-m\tAvoids the warning about identical hash values. This is valid\n"
+ "\tonly if the -D option is enabled.\n"
+ "-M\tSkips class definition in the output. This is valid only in C++ mode.\n"
+ "-n\tDo not include the length of the keyword when computing the hash\n"
+ "\tfunction.\n"
+ "-N\tAllow user to specify name of generated lookup function. Default\n"
+ "\tname is `in_word_set.'\n"
+ "-o\tReorders input keys by frequency of occurrence of the key sets.\n"
+ "\tThis should decrease the search time dramatically.\n"
+ "-O\tOptimize the generated lookup function by assuming that all input\n"
+ "\tkeywords are members of the keyset from the keyfile.\n"
+ "-p\tChanges the return value of the generated function ``in_word_set''\n"
+ "\tfrom its default boolean value (i.e., 0 or 1), to type ``pointer\n"
+ "\tto wordlist array'' This is most useful when the -t option, allowing\n"
+ "\tuser-defined structs, is used.\n"
+ "-r\tUtilizes randomness to initialize the associated values table.\n"
+ "-s\tAffects the size of the generated hash table. The numeric argument\n"
+ "\tfor this option indicates ``how many times larger or smaller'' the\n"
+ "\tassociated value range should be, in relationship to the number of\n"
+ "\tkeys, e.g. a value of 3 means ``allow the maximum associated value\n"
+ "\tto be about 3 times larger than the number of input keys.''\n"
+ "\tConversely, a value of -3 means ``make the maximum associated\n"
+ "\tvalue about 3 times smaller than the number of input keys. A\n"
+ "\tlarger table should decrease the time required for an unsuccessful\n"
+ "\tsearch, at the expense of extra table space. Default value is 1.\n"
+ "-S\tCauses the generated C code to use a switch statement scheme, rather\n"
+ "\tthan an array lookup table. This can lead to a reduction in both\n"
+ "\ttime and space requirements for some keyfiles. The argument to\n"
+ "\tthis option determines how many switch statements are generated.\n"
+ "\tA value of 1 generates 1 switch containing all the elements, a value\n"
+ "\tof 2 generates 2 tables with 1/2 the elements in each table, etc.\n"
+ "\tThis is useful since many C compilers cannot correctly generate code\n"
+ "\tfor large switch statements.\n"
+ "-t\tAllows the user to include a structured type declaration for \n"
+ "\tgenerated code. Any text before %%%% is consider part of the type\n"
+ "\tdeclaration. Key words and additional fields may follow this, one\n"
+ "\tgroup of fields per line.\n"
+ "-T\tPrevents the transfer of the type declaration to the output file.\n"
+ "\tUse this option if the type is already defined elsewhere.\n"
+ "-v\tPrints out the current version number and exits with a value of 0\n"
+ "-V\tExits silently with a value of 0.\n"
+ "-Z\tAllow user to specify name of generated C++ class. Default\n"
+ "\tname is `Perfect_Hash.'\n",
+ DEFAULT_JUMP_VALUE,
+ MAX_KEY_POS - 1);
+ Options::usage ();
+ return -1;
+ }
+ // Sets the name for the hash function.
+ case 'H':
+ {
+ hash_name_ = getopt.opt_arg ();
+ break;
+ }
+ // Sets the initial value for the associated values array.
+ case 'i':
+ {
+ initial_asso_value_ = ACE_OS::atoi (getopt.opt_arg ());
+ if (initial_asso_value_ < 0)
+ ACE_ERROR ((LM_ERROR,
+ "Initial value %d should be non-zero, ignoring and continuing.\n",
+ initial_asso_value_));
+ if (option[RANDOM])
+ ACE_ERROR ((LM_ERROR,
+ "warning, -r option superceeds -i, ignoring -i option and continuing\n"));
+ break;
+ }
+ case 'I':
+ {
+ ACE_SET_BITS (option_word_, STRCASECMP);
+ break;
+ }
+ // Sets the jump value, must be odd for later algorithms.
+ case 'j':
+ {
+ jump_ = ACE_OS::atoi (getopt.opt_arg ());
+ if (jump_ < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Jump value %d must be a positive number.\n%r",
+ jump_,
+ &Options::usage),
+ -1);
+ else if (jump_ && ACE_EVEN (jump_))
+ ACE_ERROR ((LM_ERROR,
+ "Jump value %d should be odd, adding 1 and continuing...\n",
+ jump_++));
+ break;
+ }
+ // Skip including the header file string.h.
+ case 'J':
+ {
+ ACE_SET_BITS (option_word_, SKIPSTRINGH);
+ break;
+ }
+ // Sets key positions used for hash function.
+ case 'k':
+ {
+ const int BAD_VALUE = -1;
+ int value;
+ Iterator expand (getopt.opt_arg (),
+ 1,
+ MAX_KEY_POS - 1,
+ WORD_END,
+ BAD_VALUE,
+ EOS);
+
+ // Use all the characters for hashing!!!!
+ if (*getopt.opt_arg () == '*')
+ option_word_ = (option_word_ & ~DEFAULTCHARS) | ALLCHARS;
+ else
+ {
+ char *l_key_pos;
+
+ for (l_key_pos = key_positions_;
+ (value = expand ()) != EOS;
+ l_key_pos++)
+ if (value == BAD_VALUE)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Illegal key value or range, use 1,2,3-%d,'$' or '*'.\n%r",
+ MAX_KEY_POS - 1,
+ usage),
+ -1);
+ else
+ *l_key_pos = static_cast<char> (value);
+
+ *l_key_pos = EOS;
+
+ total_keysig_size_ = (l_key_pos - key_positions_);
+ if (total_keysig_size_ == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "No keys selected.\n%r",
+ &Options::usage),
+ -1);
+ else if (key_sort (key_positions_, total_keysig_size_) == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Duplicate keys selected\n%r",
+ &Options::usage),
+ -1);
+ if (total_keysig_size_ != 2
+ || (key_positions_[0] != 1
+ || key_positions_[1] != WORD_END))
+ ACE_CLR_BITS (option_word_, DEFAULTCHARS);
+ }
+ break;
+ }
+ // Make this the keyname for the keyword component field.
+ case 'K':
+ {
+ key_name_ = getopt.opt_arg ();
+ break;
+ }
+ // Create length table to avoid extra string compares.
+ case 'l':
+ {
+ ACE_SET_BITS (option_word_, LENTABLE);
+ break;
+ }
+ // Deal with different generated languages.
+ case 'L':
+ {
+ option_word_ &= ~C;
+ if (!ACE_OS::strcmp (getopt.opt_arg (), "C++"))
+ ACE_SET_BITS (option_word_, (CPLUSPLUS | ANSI));
+ else if (!ACE_OS::strcmp (getopt.opt_arg (), "C"))
+ ACE_SET_BITS (option_word_, C);
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ "unsupported language option %s, defaulting to C\n",
+ getopt.opt_arg ()));
+ ACE_SET_BITS (option_word_, C);
+ }
+ break;
+ }
+ // Don't print the warnings.
+ case 'm':
+ {
+ ACE_SET_BITS (option_word_, MUTE);
+ break;
+ }
+ // Skip the class definition while in C++ mode.
+ case 'M':
+ {
+ ACE_SET_BITS (option_word_, SKIPCLASS);
+ break;
+ }
+ // Don't include the length when computing hash function.
+ case 'n':
+ {
+ ACE_SET_BITS (option_word_, NOLENGTH);
+ break;
+ }
+ // Make generated lookup function name be.opt_arg ()
+ case 'N':
+ {
+ function_name_ = getopt.opt_arg ();
+ break;
+ }
+ // Make fill_default be.opt_arg ()
+ case 'F':
+ {
+ fill_default_ = getopt.opt_arg ();
+ break;
+ }
+ // Order input by frequency of key set occurrence.
+ case 'o':
+ {
+ ACE_SET_BITS (option_word_, ORDER);
+ break;
+ }
+ case 'O':
+ {
+ ACE_SET_BITS (option_word_, OPTIMIZE);
+ break;
+ }
+ // Generated lookup function now a pointer instead of int.
+ case 'p':
+ {
+ ACE_SET_BITS (option_word_, POINTER);
+ break;
+ }
+ // Utilize randomness to initialize the associated values
+ // table.
+ case 'r':
+ {
+ ACE_SET_BITS (option_word_, RANDOM);
+ if (initial_asso_value_ != 0)
+ ACE_ERROR ((LM_ERROR,
+ "warning, -r option superceeds -i, disabling -i option and continuing\n"));
+ break;
+ }
+ // Range of associated values, determines size of final table.
+ case 's':
+ {
+ size_ = ACE_OS::atoi (getopt.opt_arg ());
+ if (abs (size_) > 50)
+ ACE_ERROR ((LM_ERROR,
+ "%d is excessive, did you really mean this?! (type %n -h for help)\n",
+ size_));
+ break;
+ }
+ // Generate switch statement output, rather than lookup table.
+ case 'S':
+ {
+ ACE_SET_BITS (option_word_, SWITCH);
+ total_switches_ = ACE_OS::atoi (getopt.opt_arg ());
+ if (total_switches_ <= 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "number of switches %s must be a positive number\n%r",
+ getopt.opt_arg (),
+ &Options::usage),
+ -1);
+ break;
+ }
+ // Enable the TYPE mode, allowing arbitrary user structures.
+ case 't':
+ {
+ ACE_SET_BITS (option_word_, TYPE);
+ break;
+ }
+ // Don't print structure definition.
+ case 'T':
+ {
+ ACE_SET_BITS (option_word_, NOTYPE);
+ break;
+ }
+ // Print out the version and quit.
+ case 'v':
+ ACE_ERROR ((LM_ERROR,
+ "%n: version %s\n%r\n",
+ version_string,
+ &Options::usage));
+ ACE_OS::exit (0);
+ /* NOTREACHED */
+ break;
+ // Exit with value of 0 (this is useful to check if gperf exists)
+ case 'V':
+ ACE_OS::exit (0);
+ /* NOTREACHED */
+ break;
+ // Set the class name.
+ case 'Z':
+ {
+ class_name_ = getopt.opt_arg ();
+ break;
+ }
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "%r",
+ &Options::usage),
+ -1);
+ }
+
+ }
+
+ if (argv[getopt.opt_ind ()] &&
+ freopen (argv[getopt.opt_ind ()],
+ "r",
+ stdin) == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Cannot open keyword file %p\n%r",
+ argv[getopt.opt_ind ()],
+ &Options::usage),
+ -1);
+ if (getopt.opt_ind () + 1 < argc)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Extra trailing arguments to %n.\n%r",
+ usage),
+ -1);
+ return 0;
+}
+
+// True if option enable, else false.
+
+int
+Options::operator[] (Option_Type option)
+{
+ return ACE_BIT_ENABLED (option_word_, option);
+}
+
+// Enables option OPT.
+
+void
+Options::operator = (enum Option_Type opt)
+{
+ ACE_SET_BITS (option_word_, opt);
+}
+
+// Disables option OPT.
+
+bool
+Options::operator != (enum Option_Type opt)
+{
+ // @@ Why is this inequality comparison operator clearing bits?
+ ACE_CLR_BITS (option_word_, opt);
+
+ return true;
+}
+
+// Initializes the key Iterator.
+
+void
+Options::reset (void)
+{
+ key_pos_ = 0;
+}
+
+// Returns current key_position and advanced index.
+
+int
+Options::get (void)
+{
+ return key_positions_[key_pos_++];
+}
+
+// Sets the size of the table size.
+
+void
+Options::asso_max (int r)
+{
+ size_ = r;
+}
+
+// Returns the size of the table size.
+
+int
+Options::asso_max (void)
+{
+ return size_;
+}
+
+// Returns total distinct key positions.
+
+u_int
+Options::max_keysig_size (void)
+{
+ return total_keysig_size_;
+}
+
+// Sets total distinct key positions.
+
+void
+Options::keysig_size (u_int a_size)
+{
+ total_keysig_size_ = a_size;
+}
+
+// Returns the jump value.
+
+int
+Options::jump (void)
+{
+ return jump_;
+}
+
+// Returns the generated function name.
+
+const char *
+Options::function_name (void)
+{
+ return function_name_;
+}
+
+// Returns the fill default
+
+const char *
+Options::fill_default (void)
+{
+ return fill_default_;
+}
+
+// Returns the keyword key name.
+
+const char *
+Options::key_name (void)
+{
+ return key_name_;
+}
+
+// Returns the hash function name.
+
+const char *
+Options::hash_name (void)
+{
+ return hash_name_;
+}
+
+// Returns the generated class name.
+
+const char *
+Options::class_name (void)
+{
+ return class_name_;
+}
+
+// Returns the initial associated character value.
+
+int
+Options::initial_value (void)
+{
+ return initial_asso_value_;
+}
+
+// Returns the iterations value.
+
+int
+Options::iterations (void)
+{
+ return iterations_;
+}
+
+// Returns the string used to delimit keywords from other attributes.
+
+const char *
+Options::delimiter (void)
+{
+ return delimiters_;
+}
+
+// Gets the total number of switch statements to generate.
+
+int
+Options::total_switches (void)
+{
+ return total_switches_;
+}
+
+#endif /* ACE_HAS_GPERF */