Author: pfg Date: Thu Nov 14 00:57:20 2013 New Revision: 258115 URL: http://svnweb.freebsd.org/changeset/base/258115
Log: gperf: bring small update from Apple Developers tools 4.4 From [1] offset.patch Makes use the C offsetof() macro. size_type.patch Lets you specify the type for length parameters. [1] http://opensource.apple.com/source/gperf/gperf-9/patches/ MFC after: 3 weeks Modified: head/contrib/gperf/doc/gperf.1 head/contrib/gperf/src/options.cc head/contrib/gperf/src/options.h head/contrib/gperf/src/options.icc head/contrib/gperf/src/output.cc Modified: head/contrib/gperf/doc/gperf.1 ============================================================================== --- head/contrib/gperf/doc/gperf.1 Thu Nov 14 00:29:48 2013 (r258114) +++ head/contrib/gperf/doc/gperf.1 Thu Nov 14 00:57:20 2013 (r258115) @@ -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 Modified: head/contrib/gperf/src/options.cc ============================================================================== --- head/contrib/gperf/src/options.cc Thu Nov 14 00:29:48 2013 (r258114) +++ head/contrib/gperf/src/options.cc Thu Nov 14 00:57:20 2013 (r258115) @@ -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"); @@ -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 *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. */ @@ -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 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); Modified: head/contrib/gperf/src/options.h ============================================================================== --- head/contrib/gperf/src/options.h Thu Nov 14 00:29:48 2013 (r258114) +++ head/contrib/gperf/src/options.h Thu Nov 14 00:57:20 2013 (r258115) @@ -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; }; Modified: head/contrib/gperf/src/options.icc ============================================================================== --- head/contrib/gperf/src/options.icc Thu Nov 14 00:29:48 2013 (r258114) +++ head/contrib/gperf/src/options.icc Thu Nov 14 00:57:20 2013 (r258115) @@ -155,3 +155,9 @@ Options::get_key_positions () const { return _key_positions; } + +INLINE const char * +Options::get_size_type() const +{ + return _size_type; +} Modified: head/contrib/gperf/src/output.cc ============================================================================== --- head/contrib/gperf/src/output.cc Thu Nov 14 00:29:48 2013 (r258114) +++ head/contrib/gperf/src/output.cc Thu Nov 14 00:57:20 2013 (r258115) @@ -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, 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 (); _______________________________________________ svn-src-head@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"