diff options
Diffstat (limited to 'contrib/gperf')
-rw-r--r-- | contrib/gperf/doc/gperf.1 | 8 | ||||
-rw-r--r-- | contrib/gperf/src/options.cc | 21 | ||||
-rw-r--r-- | contrib/gperf/src/options.h | 5 | ||||
-rw-r--r-- | contrib/gperf/src/options.icc | 6 | ||||
-rw-r--r-- | contrib/gperf/src/output.cc | 36 |
5 files changed, 56 insertions, 20 deletions
diff --git a/contrib/gperf/doc/gperf.1 b/contrib/gperf/doc/gperf.1 index 786604e..217969f 100644 --- a/contrib/gperf/doc/gperf.1 +++ b/contrib/gperf/doc/gperf.1 @@ -1,7 +1,7 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.23. -.TH GPERF "1" "May 2007" "GNU gperf 3.0.3" FSF +.TH GPERF "1" "October 2011" "GNU gperf 3.0.3" FSF .SH NAME -gperf \- generate a perfect hash function from a key set +gperf \- manual page for gperf 3.0.3 .SH SYNOPSIS .B gperf [\fIOPTION\fR]... [\fIINPUT-FILE\fR] @@ -129,6 +129,10 @@ binary search. Prevents the transfer of the type declaration to the output file. Use this option if the type is already defined elsewhere. +.TP +\fB\-\-size\-type\fR=\fITYPE\fR +Specify the type for length parameters. Default type is +\&'unsigned int'. .SS "Algorithm employed by gperf:" .TP \fB\-k\fR, \fB\-\-key\-positions\fR=\fIKEYS\fR diff --git a/contrib/gperf/src/options.cc b/contrib/gperf/src/options.cc index a799b5a..e413427 100644 --- a/contrib/gperf/src/options.cc +++ b/contrib/gperf/src/options.cc @@ -67,6 +67,8 @@ static const char *const DEFAULT_STRINGPOOL_NAME = "stringpool"; /* Default delimiters that separate keywords from their attributes. */ static const char *const DEFAULT_DELIMITERS = ","; +static const char *const DEFAULT_SIZE_TYPE = "unsigned int"; + /* Prints program usage to given stream. */ void @@ -202,6 +204,9 @@ Options::long_usage (FILE * stream) " Prevents the transfer of the type declaration to the\n" " output file. Use this option if the type is already\n" " defined elsewhere.\n"); + fprintf (stream, + " --size-type=TYPE Specify the type for length parameters. Default type is\n" + " 'unsigned int'.\n"); fprintf (stream, "\n"); fprintf (stream, "Algorithm employed by gperf:\n"); @@ -470,6 +475,7 @@ Options::Options () _lengthtable_name (DEFAULT_LENGTHTABLE_NAME), _stringpool_name (DEFAULT_STRINGPOOL_NAME), _delimiters (DEFAULT_DELIMITERS), + _size_type (DEFAULT_SIZE_TYPE), _key_positions () { } @@ -514,6 +520,7 @@ Options::~Options () "\nhash table size multiplier = %g" "\ninitial associated value = %d" "\ndelimiters = %s" + "\nsize type = %s" "\nnumber of switch statements = %d\n", _option_word & TYPE ? "enabled" : "disabled", _option_word & UPPERLOWER ? "enabled" : "disabled", @@ -539,7 +546,7 @@ Options::~Options () _function_name, _hash_name, _wordlist_name, _lengthtable_name, _stringpool_name, _slot_name, _initializer_suffix, _asso_iterations, _jump, _size_multiple, _initial_asso_value, - _delimiters, _total_switches); + _delimiters, _size_type, _total_switches); if (_key_positions.is_useall()) fprintf (stderr, "all characters are used in the hash function\n"); else @@ -668,6 +675,12 @@ Options::set_delimiters (const char *delimiters) _delimiters = delimiters; } +void +Options::set_size_type (const char *size_type) +{ + if (_size_type == DEFAULT_SIZE_TYPE) + _size_type = size_type; +} /* Parses the command line Options and sets appropriate flags in option_word. */ @@ -693,6 +706,7 @@ static const struct option long_options[] = { "global-table", no_argument, NULL, 'G' }, { "word-array-name", required_argument, NULL, 'W' }, { "length-table-name", required_argument, NULL, CHAR_MAX + 4 }, + { "size-type", required_argument, NULL, CHAR_MAX + 5 }, { "switch", required_argument, NULL, 'S' }, { "omit-struct-type", no_argument, NULL, 'T' }, { "key-positions", required_argument, NULL, 'k' }, @@ -1046,6 +1060,11 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ _lengthtable_name = /*getopt*/optarg; break; } + case CHAR_MAX + 5: /* Sets the name for the length table array. */ + { + _size_type = /*getopt*/optarg; + break; + } default: short_usage (stderr); exit (1); diff --git a/contrib/gperf/src/options.h b/contrib/gperf/src/options.h index bda7f0c..2ca2b3b 100644 --- a/contrib/gperf/src/options.h +++ b/contrib/gperf/src/options.h @@ -209,6 +209,9 @@ public: /* Sets the delimiters string, if not already set. */ void set_delimiters (const char *delimiters); + const char * get_size_type() const; + void set_size_type(const char*); + /* Returns key positions. */ const Positions& get_key_positions () const; @@ -279,6 +282,8 @@ private: /* Separates keywords from other attributes. */ const char * _delimiters; + const char * _size_type; + /* Contains user-specified key choices. */ Positions _key_positions; }; diff --git a/contrib/gperf/src/options.icc b/contrib/gperf/src/options.icc index 4188ddc..8931e36 100644 --- a/contrib/gperf/src/options.icc +++ b/contrib/gperf/src/options.icc @@ -155,3 +155,9 @@ Options::get_key_positions () const { return _key_positions; } + +INLINE const char * +Options::get_size_type() const +{ + return _size_type; +} diff --git a/contrib/gperf/src/output.cc b/contrib/gperf/src/output.cc index 2732057..f329130 100644 --- a/contrib/gperf/src/output.cc +++ b/contrib/gperf/src/output.cc @@ -772,14 +772,14 @@ Output::output_hash_function () const printf (option[KRC] ? "(str, len)\n" " register char *str;\n" - " register unsigned int len;\n" : + " register %s len;\n" : option[C] ? "(str, len)\n" " register const char *str;\n" - " register unsigned int len;\n" : + " register %s len;\n" : option[ANSIC] | option[CPLUSPLUS] ? - "(register const char *str, register unsigned int len)\n" : - ""); + "(register const char *str, register %s len)\n" : + "", option.get_size_type()); /* Note that when the hash function is called, it has already been verified that min_key_len <= len <= max_key_len. */ @@ -875,7 +875,7 @@ Output::output_hash_function () const " switch (%s)\n" " {\n" " default:\n", - option[NOLENGTH] ? "0" : "len", + option[NOLENGTH] ? "0" : "(int)len", option[NOLENGTH] ? "len" : "hval"); while (key_pos != Positions::LASTCHAR && key_pos >= _max_key_len) @@ -1106,9 +1106,7 @@ output_keyword_entry (KeywordExt *temp, int stringpool_index, const char *indent if (option[TYPE]) printf ("{"); if (option[SHAREDLIB]) - printf ("(int)(long)&((struct %s_t *)0)->%s_str%d", - option.get_stringpool_name (), option.get_stringpool_name (), - stringpool_index); + printf("offsetof(struct %s_t, %s_str%d)", option.get_stringpool_name (), option.get_stringpool_name (), stringpool_index); else output_string (temp->_allchars, temp->_allchars_length); if (option[TYPE]) @@ -1902,14 +1900,14 @@ Output::output_lookup_function () const printf (option[KRC] ? "(str, len)\n" " register char *str;\n" - " register unsigned int len;\n" : + " register %s len;\n" : option[C] ? "(str, len)\n" " register const char *str;\n" - " register unsigned int len;\n" : + " register %s len;\n" : option[ANSIC] | option[CPLUSPLUS] ? - "(register const char *str, register unsigned int len)\n" : - ""); + "(register const char *str, register %s len)\n" : + "", option.get_size_type()); /* Output the function's body. */ printf ("{\n"); @@ -2035,8 +2033,11 @@ Output::output () printf ("%s\n", _struct_decl); } - if (option[INCLUDE]) + if (option[INCLUDE]) { printf ("#include <string.h>\n"); /* Declare strlen(), strcmp(), strncmp(). */ + if (option[SHAREDLIB]) + printf("#include <stddef.h>\n"); /* Declare offsetof() */ + } if (!option[ENUM]) { @@ -2073,13 +2074,14 @@ Output::output () printf ("class %s\n" "{\n" "private:\n" - " static inline unsigned int %s (const char *str, unsigned int len);\n" + " static inline unsigned int %s (const char *str, %s len);\n" "public:\n" - " static %s%s%s (const char *str, unsigned int len);\n" + " static %s%s%s (const char *str, %s len);\n" "};\n" "\n", - option.get_class_name (), option.get_hash_name (), - const_for_struct, _return_type, option.get_function_name ()); + option.get_class_name (), option.get_hash_name (), option.get_size_type(), + const_for_struct, _return_type, option.get_function_name (), + option.get_size_type()); output_hash_function (); |