diff -up -r ./doc/gperf.1 ./doc/gperf.1 --- ./doc/gperf.1 2007-05-02 09:01:25.000000000 -0700 +++ ./doc/gperf.1 2011-10-06 14:21:41.000000000 -0700 @@ -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 -up -r ./src/options.cc ./src/options.cc --- ./src/options.cc 2007-03-31 08:22:16.000000000 -0700 +++ ./src/options.cc 2011-10-06 14:13:41.000000000 -0700 @@ -67,6 +67,8 @@ static const char *const DEFAULT_STRINGP /* 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"); @@ -468,6 +473,7 @@ Options::Options () _lengthtable_name (DEFAULT_LENGTHTABLE_NAME), _stringpool_name (DEFAULT_STRINGPOOL_NAME), _delimiters (DEFAULT_DELIMITERS), + _size_type (DEFAULT_SIZE_TYPE), _key_positions () { } @@ -512,6 +518,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", @@ -537,7 +544,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 @@ -666,6 +673,12 @@ Options::set_delimiters (const char *del _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. */ @@ -691,6 +704,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' }, @@ -1044,6 +1058,11 @@ warranty; not even for MERCHANTABILITY o _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); Only in ./src: options.cc~ diff -up -r ./src/options.h ./src/options.h --- ./src/options.h 2005-05-14 07:22:36.000000000 -0700 +++ ./src/options.h 2011-10-06 13:29:28.000000000 -0700 @@ -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; }; Only in ./src: options.h~ diff -up -r ./src/options.icc ./src/options.icc --- ./src/options.icc 2005-05-14 07:22:36.000000000 -0700 +++ ./src/options.icc 2011-10-06 13:42:59.000000000 -0700 @@ -155,3 +155,9 @@ Options::get_key_positions () const { return _key_positions; } + +INLINE const char * +Options::get_size_type() const +{ + return _size_type; +} Only in ./src: options.icc~ diff -up -r ./src/output.cc ./src/output.cc --- ./src/output.cc 2011-10-06 14:23:05.000000000 -0700 +++ ./src/output.cc 2011-10-06 13:41:53.000000000 -0700 @@ -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) @@ -1900,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"); @@ -2074,13 +2073,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 (); Only in ./src: output.cc~ diff -up -r ./tests/c-parse.exp ./tests/c-parse.exp --- ./tests/c-parse.exp 2007-04-06 08:38:50.000000000 -0700 +++ ./tests/c-parse.exp 2011-10-06 13:45:57.000000000 -0700 @@ -80,7 +80,7 @@ hash (str, len) 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126 }; - register int hval = len; + register int hval = (int)len; switch (hval) { diff -up -r ./tests/charsets.exp ./tests/charsets.exp --- ./tests/charsets.exp 2007-04-19 04:13:42.000000000 -0700 +++ ./tests/charsets.exp 2011-10-06 13:47:31.000000000 -0700 @@ -89,7 +90,7 @@ hash (str, len) 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046 }; - register int hval = len; + register int hval = (int)len; switch (hval) { diff -up -r ./tests/chill.exp ./tests/chill.exp --- ./tests/chill.exp 2007-04-19 04:13:42.000000000 -0700 +++ ./tests/chill.exp 2011-10-06 13:46:47.000000000 -0700 @@ -78,7 +78,7 @@ hash (str, len) 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050 }; - register int hval = len; + register int hval = (int)len; switch (hval) { diff -up -r ./tests/cplusplus.exp ./tests/cplusplus.exp --- ./tests/cplusplus.exp 2007-04-19 03:16:41.000000000 -0700 +++ ./tests/cplusplus.exp 2011-10-06 13:47:03.000000000 -0700 @@ -80,7 +80,7 @@ hash (str, len) 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164 }; - register int hval = len; + register int hval = (int)len; switch (hval) { diff -up -r ./tests/java.exp ./tests/java.exp --- ./tests/java.exp 2007-04-19 03:16:41.000000000 -0700 +++ ./tests/java.exp 2011-10-06 13:47:19.000000000 -0700 @@ -104,7 +104,7 @@ hash (str, len) 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77 }; - register int hval = len; + register int hval = (int)len; switch (hval) { diff -up -r ./tests/languages.exp ./tests/languages.exp --- ./tests/languages.exp 2007-04-19 03:16:41.000000000 -0700 +++ ./tests/languages.exp 2011-10-06 13:47:47.000000000 -0700 @@ -93,7 +94,7 @@ hash (str, len) 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861 }; - register int hval = len; + register int hval = (int)len; switch (hval) { diff -up -r ./tests/objc.exp ./tests/objc.exp --- ./tests/objc.exp 2007-04-19 03:16:41.000000000 -0700 +++ ./tests/objc.exp 2011-10-06 13:46:34.000000000 -0700 @@ -80,7 +80,7 @@ hash (str, len) 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96 }; - register int hval = len; + register int hval = (int)len; switch (hval) { --- tests/test-6.exp 2004-08-22 09:04:17.000000000 -0700 +++ tests/test-6.out 2011-10-06 14:31:09.000000000 -0700 @@ -88,6 +88,8 @@ Details in the output code: Prevents the transfer of the type declaration to the output file. Use this option if the type is already defined elsewhere. + --size-type=TYPE Specify the type for length parameters. Default type is + 'unsigned int'. Algorithm employed by gperf: -k, --key-positions=KEYS