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"

Reply via email to