summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDirk Meyer <dinoex@FreeBSD.org>2014-10-19 11:23:47 +0000
committerDirk Meyer <dinoex@FreeBSD.org>2014-10-19 11:23:47 +0000
commitbdccbf872ef7a2fad91ef12ee4e82e0b49fb7d98 (patch)
tree00aeaf2db6d3125e7458885f9984f5679d072118
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/Makefile1
-rw-r--r--devel/gperf/files/patch-offsetof26
-rw-r--r--devel/gperf/files/patch-size_type300
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