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
This commit is contained in:
Pedro F. Giffuni 2013-11-14 00:57:20 +00:00
parent bc49bb2062
commit 0c8565a099
5 changed files with 56 additions and 20 deletions

View File

@ -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

View File

@ -67,6 +67,8 @@ static const char *const DEFAULT_STRINGPOOL_NAME = "stringpool";
/* 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 *delimiters)
_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 or FITNESS FOR A PARTICULAR PURPOSE.\n\
_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);

View File

@ -209,6 +209,9 @@ class Options
/* 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 @@ class Options
/* Separates keywords from other attributes. */
const char * _delimiters;
const char * _size_type;
/* Contains user-specified key choices. */
Positions _key_positions;
};

View File

@ -155,3 +155,9 @@ Options::get_key_positions () const
{
return _key_positions;
}
INLINE const char *
Options::get_size_type() const
{
return _size_type;
}

View File

@ -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, int stringpool_index, const char *indent
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 ();