1/* This may look like C code, but it is really -*- C++ -*- */ 2 3/* Handles parsing the Options provided to the user. 4 5 Copyright (C) 1989-1998, 2000, 2002-2004 Free Software Foundation, Inc. 6 Written by Douglas C. Schmidt <schmidt@ics.uci.edu> 7 and Bruno Haible <bruno@clisp.org>. 8 9 This file is part of GNU GPERF. 10 11 GNU GPERF is free software; you can redistribute it and/or modify 12 it under the terms of the GNU General Public License as published by 13 the Free Software Foundation; either version 2, or (at your option) 14 any later version. 15 16 GNU GPERF is distributed in the hope that it will be useful, 17 but WITHOUT ANY WARRANTY; without even the implied warranty of 18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 GNU General Public License for more details. 20 21 You should have received a copy of the GNU General Public License 22 along with this program; see the file COPYING. 23 If not, write to the Free Software Foundation, Inc., 24 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 25 26/* This module provides a uniform interface to the various options available 27 to a user of the gperf hash function generator. */ 28 29#ifndef options_h 30#define options_h 1 31 32#include <stdio.h> 33#include "positions.h" 34 35/* Enumeration of the possible boolean options. */ 36 37enum Option_Type 38{ 39 /* --- Input file interpretation --- */ 40 41 /* Handle user-defined type structured keyword input. */ 42 TYPE = 1 << 0, 43 44 /* Ignore case of ASCII characters. */ 45 UPPERLOWER = 1 << 1, 46 47 /* --- Language for the output code --- */ 48 49 /* Generate K&R C code: no prototypes, no const. */ 50 KRC = 1 << 2, 51 52 /* Generate C code: no prototypes, but const (user can #define it away). */ 53 C = 1 << 3, 54 55 /* Generate ISO/ANSI C code: prototypes and const, but no class. */ 56 ANSIC = 1 << 4, 57 58 /* Generate C++ code: prototypes, const, class, inline, enum. */ 59 CPLUSPLUS = 1 << 5, 60 61 /* --- Details in the output code --- */ 62 63 /* Assume 7-bit, not 8-bit, characters. */ 64 SEVENBIT = 1 << 6, 65 66 /* Generate a length table for string comparison. */ 67 LENTABLE = 1 << 7, 68 69 /* Generate strncmp rather than strcmp. */ 70 COMP = 1 << 8, 71 72 /* Make the generated tables readonly (const). */ 73 CONST = 1 << 9, 74 75 /* Use enum for constants. */ 76 ENUM = 1 << 10, 77 78 /* Generate #include statements. */ 79 INCLUDE = 1 << 11, 80 81 /* Make the keyword table a global variable. */ 82 GLOBAL = 1 << 12, 83 84 /* Use NULL strings instead of empty strings for empty table entries. */ 85 NULLSTRINGS = 1 << 13, 86 87 /* Optimize for position-independent code. */ 88 SHAREDLIB = 1 << 14, 89 90 /* Generate switch output to save space. */ 91 SWITCH = 1 << 15, 92 93 /* Don't include user-defined type definition in output -- it's already 94 defined elsewhere. */ 95 NOTYPE = 1 << 16, 96 97 /* --- Algorithm employed by gperf --- */ 98 99 /* Use the given key positions. */ 100 POSITIONS = 1 << 17, 101 102 /* Handle duplicate hash values for keywords. */ 103 DUP = 1 << 18, 104 105 /* Don't include keyword length in hash computations. */ 106 NOLENGTH = 1 << 19, 107 108 /* Randomly initialize the associated values table. */ 109 RANDOM = 1 << 20, 110 111 /* --- Informative output --- */ 112 113 /* Enable debugging (prints diagnostics to stderr). */ 114 DEBUG = 1 << 21 115}; 116 117/* Class manager for gperf program Options. */ 118 119class Options 120{ 121public: 122 /* Constructor. */ 123 Options (); 124 125 /* Destructor. */ 126 ~Options (); 127 128 /* Parses the options given in the command-line arguments. */ 129 void parse_options (int argc, char *argv[]); 130 131 /* Prints the given options. */ 132 void print_options () const; 133 134 /* Accessors. */ 135 136 /* Tests a given boolean option. Returns true if set, false otherwise. */ 137 bool operator[] (Option_Type option) const; 138 /* Sets a given boolean option. */ 139 void set (Option_Type option); 140 141 /* Returns the input file name. */ 142 const char * get_input_file_name () const; 143 144 /* Returns the output file name. */ 145 const char * get_output_file_name () const; 146 147 /* Sets the output language, if not already set. */ 148 void set_language (const char *language); 149 150 /* Returns the jump value. */ 151 int get_jump () const; 152 153 /* Returns the initial associated character value. */ 154 int get_initial_asso_value () const; 155 156 /* Returns the number of iterations for finding good asso_values. */ 157 int get_asso_iterations () const; 158 159 /* Returns the total number of switch statements to generate. */ 160 int get_total_switches () const; 161 /* Sets the total number of switch statements, if not already set. */ 162 void set_total_switches (int total_switches); 163 164 /* Returns the factor by which to multiply the generated table's size. */ 165 float get_size_multiple () const; 166 167 /* Returns the generated function name. */ 168 const char * get_function_name () const; 169 /* Sets the generated function name, if not already set. */ 170 void set_function_name (const char *name); 171 172 /* Returns the keyword key name. */ 173 const char * get_slot_name () const; 174 /* Sets the keyword key name, if not already set. */ 175 void set_slot_name (const char *name); 176 177 /* Returns the struct initializer suffix. */ 178 const char * get_initializer_suffix () const; 179 /* Sets the struct initializer suffix, if not already set. */ 180 void set_initializer_suffix (const char *initializers); 181 182 /* Returns the generated class name. */ 183 const char * get_class_name () const; 184 /* Sets the generated class name, if not already set. */ 185 void set_class_name (const char *name); 186 187 /* Returns the hash function name. */ 188 const char * get_hash_name () const; 189 /* Sets the hash function name, if not already set. */ 190 void set_hash_name (const char *name); 191 192 /* Returns the hash table array name. */ 193 const char * get_wordlist_name () const; 194 /* Sets the hash table array name, if not already set. */ 195 void set_wordlist_name (const char *name); 196 197 /* Returns the length table array name. */ 198 const char * get_lengthtable_name () const; 199 /* Sets the length table array name, if not already set. */ 200 void set_lengthtable_name (const char *name); 201 202 /* Returns the string pool name. */ 203 const char * get_stringpool_name () const; 204 /* Sets the string pool name, if not already set. */ 205 void set_stringpool_name (const char *name); 206 207 /* Returns the string used to delimit keywords from other attributes. */ 208 const char * get_delimiters () const; 209 /* Sets the delimiters string, if not already set. */ 210 void set_delimiters (const char *delimiters); 211 212 /* Returns key positions. */ 213 const Positions& get_key_positions () const; 214 215private: 216 /* Prints program usage to given stream. */ 217 static void short_usage (FILE * stream); 218 219 /* Prints program usage to given stream. */ 220 static void long_usage (FILE * stream); 221 222 /* Records count of command-line arguments. */ 223 int _argument_count; 224 225 /* Stores a pointer to command-line argument vector. */ 226 char ** _argument_vector; 227 228 /* Holds the boolean options. */ 229 int _option_word; 230 231 /* Name of input file. */ 232 char * _input_file_name; 233 234 /* Name of output file. */ 235 char * _output_file_name; 236 237 /* The output language. */ 238 const char * _language; 239 240 /* Jump length when trying alternative values. */ 241 int _jump; 242 243 /* Initial value for asso_values table. */ 244 int _initial_asso_value; 245 246 /* Number of attempts at finding good asso_values. */ 247 int _asso_iterations; 248 249 /* Number of switch statements to generate. */ 250 int _total_switches; 251 252 /* Factor by which to multiply the generated table's size. */ 253 float _size_multiple; 254 255 /* Names used for generated lookup function. */ 256 const char * _function_name; 257 258 /* Name used for keyword key. */ 259 const char * _slot_name; 260 261 /* Suffix for empty struct initializers. */ 262 const char * _initializer_suffix; 263 264 /* Name used for generated C++ class. */ 265 const char * _class_name; 266 267 /* Name used for generated hash function. */ 268 const char * _hash_name; 269 270 /* Name used for hash table array. */ 271 const char * _wordlist_name; 272 273 /* Name used for length table array. */ 274 const char * _lengthtable_name; 275 276 /* Name used for the string pool. */ 277 const char * _stringpool_name; 278 279 /* Separates keywords from other attributes. */ 280 const char * _delimiters; 281 282 /* Contains user-specified key choices. */ 283 Positions _key_positions; 284}; 285 286/* Global option coordinator for the entire program. */ 287extern Options option; 288 289#ifdef __OPTIMIZE__ 290 291#define INLINE inline 292#include "options.icc" 293#undef INLINE 294 295#endif 296 297#endif 298