diff options
author | Dirk Meyer <dinoex@FreeBSD.org> | 2014-10-19 11:23:47 +0000 |
---|---|---|
committer | Dirk Meyer <dinoex@FreeBSD.org> | 2014-10-19 11:23:47 +0000 |
commit | bdccbf872ef7a2fad91ef12ee4e82e0b49fb7d98 (patch) | |
tree | 00aeaf2db6d3125e7458885f9984f5679d072118 | |
parent | - Un-break build for non-standard OPTION VCHKPW (diff) |
- Add Apple's gperf enhancements (GPLv2)
PR: 193964
Submitted by: Pedro F. Giffuni
Obtained from: http://opensource.apple.com/source/gperf/gperf-9/patches/
Notes
Notes:
svn path=/head/; revision=371177
-rw-r--r-- | devel/gperf/Makefile | 1 | ||||
-rw-r--r-- | devel/gperf/files/patch-offsetof | 26 | ||||
-rw-r--r-- | devel/gperf/files/patch-size_type | 300 |
3 files changed, 327 insertions, 0 deletions
diff --git a/devel/gperf/Makefile b/devel/gperf/Makefile index 34024dfceeac..b85b6a9ed47e 100644 --- a/devel/gperf/Makefile +++ b/devel/gperf/Makefile @@ -2,6 +2,7 @@ PORTNAME= gperf PORTVERSION= 3.0.3 +PORTREVISION= 1 CATEGORIES= devel MASTER_SITES= ${MASTER_SITE_GNU} MASTER_SITE_SUBDIR= gperf diff --git a/devel/gperf/files/patch-offsetof b/devel/gperf/files/patch-offsetof new file mode 100644 index 000000000000..3d3535b640ea --- /dev/null +++ b/devel/gperf/files/patch-offsetof @@ -0,0 +1,26 @@ +--- src/output.cc 2007-03-31 08:16:05.000000000 -0700 ++++ src/output.cc 2008-05-27 16:07:01.000000000 -0700 +@@ -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]) +@@ -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]) + { diff --git a/devel/gperf/files/patch-size_type b/devel/gperf/files/patch-size_type new file mode 100644 index 000000000000..7782ec460224 --- /dev/null +++ b/devel/gperf/files/patch-size_type @@ -0,0 +1,300 @@ +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,5 +1,5 @@ + .\" 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 + .SH SYNOPSIS +@@ -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); +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; + }; +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; ++} +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 (); + +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 |