]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/gperf/src/options.h
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / gperf / src / options.h
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
37 enum 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
119 class Options
120 {
121 public:
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
215 private:
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.  */
287 extern Options option;
288
289 #ifdef __OPTIMIZE__
290
291 #define INLINE inline
292 #include "options.icc"
293 #undef INLINE
294
295 #endif
296
297 #endif