2003-06-12  Bruno Haible  <bruno@clisp.org>

	* gperf-3.0.1 released.

	* src/version.cc: Bump version number to 3.0.1.
	* doc/gperf.texi: Likewise.
	* tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
	tests/cplusplus.exp, tests/gpc.exp, tests/incomplete.exp,
	tests/java.exp, tests/languages.exp, tests/modula2.exp,
	tests/objc.exp, tests/permut2.exp, tests/permut3.exp,
	tests/permutc2.exp, tests/test-4.exp: Update.

2003-05-31  Bruno Haible  <bruno@clisp.org>

	* doc/gperf.texi (User-supplied Struct): Mention the possibility of an
	abbreviated struct declaration.
	* src/input.cc (Input::read_input): Support struct declarations of the
	form "struct foo;".
	* tests/incomplete.gperf: New file.
	* tests/incomplete.exp: New file.
	* tests/Makefile.in (check-test): Check incomplete.gperf too.
	Reported by Rob Leslie <rob@mars.org>.

2003-05-20  Bruno Haible  <bruno@clisp.org>

	* doc/Makefile.in (gperf.ps): Don't use $< in a target rule.

2003-05-27  Bruno Haible  <bruno@clisp.org>

	* Makefile.vms (CC): Correct value.
	(getopt.obj, getopt1.obj, getline.obj, hash.obj): Don't set
	HAVE_CONFIG_H.

2003-05-17  Bruno Haible  <bruno@clisp.org>

	* Makefile.msvc (DEBUGFLAGS): New variable.
	(gperf.exe): Use it, and MFLAGS too.

2003-05-08  Bruno Haible  <bruno@clisp.org>

	* gperf-3.0 released.

2003-05-07  Bruno Haible  <bruno@clisp.org>

	* src/version.cc: Bump version number to 3.0.
	* doc/gperf.texi: Likewise.
	* tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
	tests/cplusplus.exp, tests/gpc.exp, tests/java.exp,
	tests/languages.exp, tests/modula2.exp, tests/objc.exp,
	tests/permut2.exp, tests/permut3.exp, tests/permutc2.exp,
	tests/test-4.exp: Update.

	* src/configure.in: Fix AC_INIT argument.

	* Makefile.devel (configure, lib/configure, src/configure,
	tests/configure, doc/configure): Use the newest autoconf.
	(src/config.h.in): Use the newest autoheader.

2003-05-03  Bruno Haible  <bruno@clisp.org>

	* doc/gperf.texi: Use two spaces as sentence separator, as recommended
	by the texinfo manual.

2003-04-12  Bruno Haible  <bruno@clisp.org>

	* doc/configure.in (mandir): Change default value.
	* doc/Makefile.in (docdir): Use datadir instead of prefix.
	* Makefile.msvc (datadir): New variable.
	(mandir, docdir): Use it instead of prefix.
	(install, installdirs): Update.
	* Makefile.vms (datadir): New variable.
	(mandir, docdir): Use it instead of prefix.
	(install, installdirs): Update.

2003-04-12  Bruno Haible  <bruno@clisp.org>

	* README.vms: New file.
	* Makefile.vms: New file.
	* Makefile.devel (src/config.h_vms): New rule.
	(all): Depend on it.

2003-03-19  Bruno Haible  <bruno@clisp.org>

	* src/input.cc (Input::read_input): Ignore comments at the beginning
	of the declarations section.
	* doc/gperf.texi (Controls for GNU indent): New section.
	Reported by Bruce Lilly <blilly@erols.com>.

2003-03-19  Bruno Haible  <bruno@clisp.org>

	* src/output.cc (Output::output_hash_function): Avoid lint warning if
	not all arguments of the hash function are used. Avoid lint warning
	for fallthrough in switch.
	* tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
	tests/cplusplus.exp, tests/java.exp, tests/languages.exp,
	tests/modula2.exp, tests/objc.exp: All /*FALLTHROUGH*/ to expected
	output.
	Reported by Bruce Lilly <blilly@erols.com>.

2003-03-01  Bruno Haible  <bruno@clisp.org>

	* src/options.h (Options::set_initializer_suffix): New declaration.
	* src/options.cc (Options::set_initializer_suffix): New method.
	* src/input.cc (Input::read_input): Recognize %define
	initializer-suffix.
	* doc/gperf.texi (Gperf Declarations): Document %define
	initializer-suffix.
	* NEWS: Update.

2003-02-26  Bruno Haible  <bruno@clisp.org>

	* Makefile.msvc: New file.
	* README.woe32: New file.
	* Makefile.devel (all): Depend on src/config.h.msvc.
	(src/config.h.msvc): New rule.

2003-01-07  Bruno Haible  <bruno@clisp.org>

	* src/input.h (Input::_charset_dependent): New field.
	* src/input.cc (Input::read_input): Also set _charset_dependent.
	* src/main.cc (main): Pass _charset_dependent from Input to Output.
	* src/output.h (Output::Output): Add charset_dependent argument.
	(Output::_charset_dependent): New field.
	* src/output.cc (Output::Output): Add charset_dependent argument.
	(Output::output): Provoke a compilation error if the execution
	character set doesn't match the expectations.
	* tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
	tests/cplusplus.exp, tests/gpc.exp, tests/java.exp,
	tests/languages.exp, tests/modula2.exp, tests/objc.exp,
	tests/permut2.exp, tests/permut3.exp, tests/permutc2.exp,
	tests/test-4.exp: Update.

	* src/options.cc (Options::long_usage): Change bug report address to
	<bug-gnu-gperf@gnu.org>.
	* tests/test-6.exp: Update.

	* src/output.cc (USE_DOWNCASE_TABLE): New macro.
	(output_upperlower_table): New function.
	(output_upperlower_strcmp, output_upperlower_strncmp,
	output_upperlower_memcmp): Emit gperf_downcase array accesses.
	(Output::output): Call output_upperlower_table.
	* tests/permutc2.exp: Update.

	* src/keyword-list.icc (KeywordExt_List::rest): Use a portable cast.
	(Only in GCC a cast of an lvalue is an lvalue.)

2003-01-01  Bruno Haible  <bruno@clisp.org>

	* src/options.cc (Options::parse_options): Update copyright year.

	* doc/gperf.texi (@author): Add me.

	* src/options.h (NULLSTRINGS): New enum value.
	(Options::get_stringpool_name, Options::set_stringpool_name): New
	method declarations.
	(Options::_stringpool_name): New field.
	* src/options.icc (Options::get_stringpool_name): New method.
	* src/options.cc (DEFAULT_STRINGPOOL_NAME): New variable.
	(Options::long_usage): Document -Q and --null-strings.
	(Options::Options): Initialize _stringpool_name.
	(Options::~Options): Output _stringpool_name, NULLSTRINGS values too.
	(Options::set_stringpool_name): New method.
	(long_options): Add options --string-pool-name, --null-strings.
	(Options::parse_options): Implement options -P, -Q and --null-strings.
	* src/input.cc (Input::read_input): Recognize declarations %pic,
	%define string-pool-name, %null-strings.
	* src/output.h (Output::output_string_pool,
	Output::output_lookup_pools): New method declarations.
	(Output::_wordlist_eltype): New field.
	* src/output.cc (Output::output_keylength_table): Trivial
	simplification.
	(Output::output_string_pool): New method.
	(output_keyword_entry): Add stringpool_index argument. For SHAREDLIB,
	use struct offsets.
	(output_keyword_blank_entries): For SHAREDLIB, use -1 instead of "".
	(Output::output_keyword_table): Use _wordlist_eltype instead of
	_struct_tag. Compute stringpool_index for output_keyword_entry.
	(Output::output_lookup_pools): New method.
	(Output::output_lookup_function_body): Use _wordlist_eltype instead of
	_struct_tag. For SHAREDLIB, use "+ stringpool" to convert offsets to
	strings. Use "o >= 0" to test for nonempty table entry.
	(Output::output_lookup_function): Call output_lookup_pools.
	(Output::output): Initialize _wordlist_eltype. Call
	output_lookup_pools.
	* tests/jstest4.gperf: New file.
	* tests/test-6.exp: Update.
	* tests/Makefile.in (check-lang-syntax): Drop test of -p. Add tests of
	-P and -Q.
	* doc/gperf.texi (User-supplied Struct): Mention that first field has
	to be of type 'int' if -P is given.
	(Gperf Declarations): Document %pic, %define string-pool-name,
	%null-strings.
	(Output Details): Update description of option -P. Document options -Q
	and --null-strings.

	* tests/Makefile.in (check-link-c, check-ada, check-pascal,
	check-test): Omit option -p.
	* tests/c-parse.exp: Regenerated.
	* tests/chill.exp: Regenerated.
	* tests/cplusplus.exp: Regenerated.
	* tests/gpc.exp: Regenerated.
	* tests/java.exp: Regenerated.
	* tests/objc.exp: Regenerated.
	* tests/test-4.exp: Regenerated.

	* src/output.cc (Output::output_lookup_function_body): Omit the
	multicompare code section and its variables when it is not used.
	* tests/chill.exp: Regenerated.

	* src/output.c (Output_Compare::output_firstchar_comparison): New
	method.
	(Output_Compare_Strcmp::output_comparison,
	Output_Compare_Strncmp::output_comparison,
	Output_Compare_Memcmp::output_comparison): Use it.
	* tests/permutc2.exp: Update.

	* tests/smtp.gperf: New file, based on a contribution by Bruce Lilly.
	* tests/Makefile.in (check-smtp): New rule.
	(check): Depend on it.
	(clean): Update.

2002-12-12  Bruno Haible  <bruno@clisp.org>

	* src/search.h (Search::init_selchars_tuple,
	Search::count_duplicates_tuple): Add alpha_unify argument.
	(Search::count_duplicates_tuple): New method declaration.
	* src/search.cc (Search::init_selchars_tuple,
	Search::count_duplicates_tuple): Add alpha_unify argument.
	(Search::find_positions): Update.
	(Search::count_duplicates_tuple): New method.
	(Search::count_duplicates_multiset): Free temp alpha_unify vector.
	(Search::find_alpha_inc): Call count_duplicates_tuple.

	* src/configure.in: Add test for stack-allocated variable-size arrays.
	* src/config.h.in: Regenerated.
	* src/search.cc: Include config.h.
	(DYNAMIC_ARRAY, FREE_DYNAMIC_ARRAY): New macros.
	(Search::find_alpha_inc, Search::count_possible_collisions,
	Search::find_asso_values): Use them.
	* src/Makefile.in (search.o): Depend on config.h.

	* src/search.h (Search::keyword_list_length, Search::max_key_length,
	Search::get_max_keysig_size, Search::prepare): Remove declarations.
	(Search::prepare): Renamed from Search::preprepare.
	(Search::_max_selchars_length): New field.
	* src/search.cc (Search::prepare): Renamed from Search::preprepare.
	(Search::prepare_asso_values): Merged with old Search::prepare.
	Initialize _max_selchars_length.
	(Search::keyword_list_length): Remove function. Use _list_len instead.
	(Search::max_key_length): Remove function. Use _max_key_len instead.
	(Search::get_max_keysig_size): Remove function. Use
	_max_selchars_length instead.
	(Search::count_possible_collisions, Search::find_asso_values): Update.
	(Search::find_good_asso_values): Call just prepare_asso_values.
	(Search::~Search): Update.

	* src/output.h (Output::output_asso_values_ref): New declaration.
	* src/output.cc (char_to_index): Remove variable.
	(Output::output_asso_values_ref): New function.
	(Output::output_hash_function): Use it.
	(Output::output): Update.

	* src/positions.h (Positions::is_useall, Positions::set_useall,
	Positions::iterator, Positions::reviterator): New method declarations.
	(Positions::_useall): New field.
	(PositionIterator): Make constructor private. Add a constructor and a
	copy constructor.
	(PositionIterator::remaining): New declaration.
	(PositionReverseIterator): Make constructor private. Add a constructor
	and a copy constructor.
	(PositionReverseIterator::remaining): New declaration.
	(PositionReverseIterator::_minindex): New field.
	* src/positions.icc (Positions::Positions): Initialize _useall.
	(Positions::operator=): Likewise.
	(Positions::is_useall, Positions::set_useall): New methods.
	(Positions::sort): Do nothing if _useall is set.
	(Positions::iterator, Positions::reviterator): New methods.
	(PositionIterator::PositionIterator): New constructor.
	(PositionIterator::remaining): New method.
	(PositionReverseIterator::PositionReverseIterator): New constructor.
	(PositionReverseIterator::next): Use _minindex as bound.
	(PositionReverseIterator::remaining): New method.
	* src/positions.cc (Positions::add, Positions::remove): Reset the
	useall flag.
	(Positions::print): Handle the useall case.
	* src/options.h (ALLCHARS): Remove.
	* src/options.cc (Options::~Options): Update.
	(Options::parse_options): Use Positions::set_useall().
	* src/keyword.h (KeywordExt::init_selchars_tuple,
	KeywordExt::init_selchars_multiset, KeywordExt::init_selchars_low):
	Remove use_all_chars argument.
	* src/keyword.cc (KeywordExt::init_selchars_low): Remove use_all_chars
	argument. Tell the position iterator to stop at _allchars_length.
	Remove special case code for -k'*'.
	(KeywordExt::init_selchars_tuple, KeywordExt::init_selchars_multiset):
	Remove use_all_chars argument.
	* src/search.h (Search::init_selchars_tuple): Remove use_all_chars
	argument.
	(Search::init_selchars_multiset): Likewise.
	* src/search.cc (Search::init_selchars_tuple): Remove use_all_chars
	argument.
	(Search::count_duplicates_tuple, Search::find_positions): Update.
	(Search::compute_alpha_unify): Remove special case code for -k'*'.
	(Search::init_selchars_multiset): Remove use_all_chars argument.
	(Search::count_duplicates_multiset): Update.
	(Search::find_alpha_inc): Remove special case code for -k'*'.
	(Search::prepare): Update.
	(Search::get_max_keysig_size): Update.
	* src/output.cc (Output::output_hash_function): Remove special case
	code for -k'*'.
	* tests/chill.exp: Regenerated.

2002-12-11  Bruno Haible  <bruno@clisp.org>

	Change the positions to be 0-based, instead of 1-based.
	* src/positions.h (Positions::LASTCHAR): Set to -1.
	(Positions::MAX_SIZE): New constant.
	(Positions::pointer): Change return type.
	(Positions::_positions): Change element type.
	(PositionIterator::EOS, PositionReverseIterator::EOS): Set to -2.
	* src/positions.icc (Positions::pointer): Change return type.
	(Positions::sort): Update.
	* src/positions.cc (Positions::contains, Positions::add,
	Positions::remove): Update.
	(Positions::print): Update. Fix off-by-one bug.
	* src/options.cc (Options::~Options): Update.
	(Options::parse_options): Set BAD_VALUE to -3. Update.
	* src/keyword.cc (KeywordExt::init_selchars_low): Update.
	* src/search.cc (Search::find_positions, Search::compute_alpha_unify,
	Search::find_alpha_inc): Update.
	* src/output.cc (Output::output_hash_function): Update. Don't emit
	a 'case' statement right after 'default:'.
	* tests/c-parse.exp: Regenerated.
	* tests/charsets.exp: Regenerated.
	* tests/cplusplus.exp: Regenerated.
	* tests/java.exp: Regenerated.
	* tests/languages.exp: Regenerated.
	* tests/modula2.exp: Regenerated.
	* tests/objc.exp: Regenerated.

2002-12-10  Bruno Haible  <bruno@clisp.org>

	* src/options.h: Reorder enum values.
	(Options::short_usage, Options::long_usage): Make static.
	* src/options.cc (Options::short_usage); No longer print a monster
	usage line.
	(Options::print_options): Improve output of options like
	--key-positions=1,2,$.
	(Options::~Options): Update.

	* src/options.h (UPPERLOWER): New enum value.
	* src/options.cc (Options::long_usage): Document option --ignore-case.
	(Options::~Options): Update.
	(long_options): Add option --ignore-case.
	(Options::parse_options): Handle option --ignore-case.
	* src/input.cc (Input::read_input): Recognize option %ignore-case.
	* src/keyword.h (KeywordExt::init_selchars_tuple,
	KeywordExt::init_selchars_multiset, KeywordExt::init_selchars_low):
	Add alpha_unify argument.
	* src/keyword.cc (KeywordExt::init_selchars_low): Add alpha_unify
	argument.
	(KeywordExt::init_selchars_tuple): Add alpha_unify argument.
	(KeywordExt::init_selchars_multiset): Add alpha_unify argument.
	* src/search.h (Search::compute_alpha_size,
	Search::compute_alpha_unify): New declarations.
	(Search::init_selchars_multiset): Add alpha_unify argument.
	(Search::_alpha_unify): New field.
	* src/search.cc (Search::compute_alpha_size,
	Search::compute_alpha_unify): New functions.
	(Search::init_selchars_tuple): Update.
	(Search::find_positions): Temporarily set _alpha_unify. Perform a
	case insensitive comparison if needed.
	(Search::init_selchars_multiset): Add alpha_unify argument.
	(Search::count_duplicates_multiset): Call compute_alpha_unify.
	(Search::find_alpha_inc): Temporarily set _alpha_unify. At the end,
	set _alpha_size and _alpha_unify.
	(Search::prepare): Update. Don't compute _alpga_size here.
	(Search::optimize): Propagate unified asso_values.
	(Search::~Search) Delete _alpha_unify.
	* src/output.cc (output_upperlower_strcmp, output_upperlower_strncmp,
	output_upperlower_memcmp): New functions.
	(Output_Compare_Strcmp::output_comparison,
	Output_Compare_Strncmp::output_comparison,
	Output_Compare_Memcmp::output_comparison): Use the case-insensitive
	comparison function if --ignore-case was given.
	(Output::output): Emit the auxiliary case-insensitive comparison
	function if needed.
	* tests/permutc2.gperf, tests/permutc2.exp: New files.
	* tests/Makefile.in (check-test): Also check permutc2.gperf.
	* tests/test-6.exp: Update.
	* doc/gperf.texi (Gperf Declarations): Document %ignore-case.
	(Input Details): Document option --ignore-case.
	* NEWS: Update.

	* src/search.cc (Search::optimize): Fill unused asso_values[] entries
	with a large value.
	* src/output.h (Output::Output): Remove occurrences argument.
	(Output::_occurrences): Remove field.
	* src/output.cc (Output::Output): Remove occurrences argument.
	(Output::output_hash_function): Ignore _occurrences.
	* src/main.cc (main): Don't pass the _occurrences to Output.

	* src/search.cc (Search::preprepare): Exit if keywords contain
	out-of-range characters.

	* src/search.cc (for): Define so as to avoid errors with old compilers.

	* src/options.h (SHAREDLIB): New enum value.
	* src/options.cc (Options::short_usage): Mention option -P.
	(Options::long_usage): Document option -P.
	(long_options): Add option --pic.
	(Options::parse_options): Handle option -P/--pic.
	* src/output.cc (output_keyword_blank_entries): When SHAREDLIB is
	specified, emit NULL pointers instead of "".
	(Output::output_lookup_function_body): When SHAREDLIB is specified
	and SWITCH and DUP and not specified, test the table entry against
	NULL before the string comparison.
	* tests/test-6.exp: Update.
	* doc/gperf.texi (Output Details): Document option -P.
	* NEWS: Update.
	Suggested by Ulrich Drepper.

2002-12-08  Bruno Haible  <bruno@clisp.org>

	* tests/permut2.gperf, tests/permut2.exp: New files.
	* tests/permut3.gperf, tests/permut3.exp: New files.
	* tests/charsets.gperf: New file, from Bruce Lilly.
	* tests/charsets.exp: New file.
	* tests/languages.gperf: New file, from Bruce Lilly.
	* tests/languages.exp: New file.
	* Makefile.in (check-test): Test them all.

	Completely new asso_values search algorithm.
	* src/search.h (Search::compute_occurrence, Search::clear_determined,
	Search::set_determined, Search::already_determined, Search::reorder):
	Remove functions.
	(Search::init_asso_values, Search::sort_by_occurrence,
	Search::compute_occurrence, Search::sort_by_occurrence,
	Search::has_collisions, Search::collision_prior_to): Remove functions.
	(Search::compute_partition, Search::count_possible_collisions,
	Search::unchanged_partition): New method declarations.
	(Search::_determined): Remove field.
	* src/search.cc (Search::prepare): Don't initialize _determined.
	(Search::compute_occurrence, greater_by_occurrence,
	Search::clear_determined, Search::set_determined,
	Search::already_determined, Search::reorder): Remove functions.
	(Search::init_asso_values, compute_disjoint_union,
	Search::sort_by_occurrence, Search::compute_occurrence,
	Search::sort_by_occurrence, Search::has_collisions,
	Search::collision_prior_to): Remove functions.
	(StackEntry): Remove class.
	(EquivalenceClass, Step): New classes.
	(equals, Search::compute_partition, delete_partition,
	Search::count_possible_collisions, Search::unchanged_partition): New
	functions.
	(Search::find_asso_values): Completely rewritten.
	(Search::find_good_asso_values): Don't call reorder().
	(Search::~Search): Don't free _determined.
	* src/keyword.h (KeywordExt::_occurrence): Remove field.
	* src/options.h (ORDER, FAST, OPT_CHOICE): Remove enum values.
	(Options::_iterations): Remove field.
	* src/options.icc (Options::get_iterations): Remove method.
	* src/options.cc (Options::long_usage): Remove mention of -f and -o.
	(Options::Options): Don't initialize _iterations.
	(Options::~Options): Update.
	(Options::parse_options): Do nothing for options -f, -o, -O.
	* doc/gperf.texi: (Contributors): Update.
	(Algorithmic Details): Remove options -f and -o. Update description
	of option -s.
	* tests/c-parse.exp, tests/chill.exp, tests/cplusplus.exp,
	tests/gpc.exp, tests/java.exp, tests/modula2.exp, tests/objc.exp,
	tests/test-4.exp): Regenerated, smaller than before.
	* tests/test-6.exp: Update.
	* NEWS: Update.

2002-12-08  Bruno Haible  <bruno@clisp.org>

	* src/search.h (Search::_alpha_size): Change type to 'unsigned int'.
	(Search::_asso_value_max): Likewise.
	* src/search.cc (Search::prepare_asso_values): Update.
	(Search::init_asso_values): Update.
	(Search::~Search): Update.
	* src/output.h (Output::Output): Change alpha_size type to
	'unsigned int'.
	(Output::_alpha_size): Change type to 'unsigned int'.
	* src/output.cc (Output::Output): Change alpha_size type to
	'unsigned int'.
	(Output::output_hash_function): Update.

2002-12-07  Bruno Haible  <bruno@clisp.org>

	* src/options.h (OPT_CHOICE): New enum value.
	* src/options.cc (Options::~Options): Update.
	(long_options): New option --optimized-collision-resolution.
	(Options::parse_options): Accept option -O.
	* src/search.h (Search::sort_by_occurrence): Change argument to
	'unsigned int'.
	(Search::compute_occurrence, Search::sort_by_occurrence): New method
	declarations.
	* src/search.cc (Search::sort_by_occurrence): Change argument to
	'unsigned int'.
	(Search::compute_occurrence, Search::sort_by_occurrence): New methods.
	(Search::find_asso_values): Implement OPT_CHOICE. More debugging
	output.

	* src/search.cc (Search::prepare_asso_values) [DEBUG]: Also print
	the keyword list in order.
	(Search::find_asso_values) [DEBUG]: Upon failure, print the union_set.

	* src/options.h (Options::get_size_multiple): Change return type to
	float.
	(Options::_size_multiple): Change type to float.
	* src/options.icc (Options::get_size_multiple): Change return type to
	float.
	* src/options.cc (Options::long_usage): Update description of option
	-s.
	(Options::~Options): Update.
	(Options::parse_options): For option -s, accept a fraction.
	* src/search.cc (Search::prepare_asso_values): Use get_size_multiple
	as it is.
	* tests/test-6.exp: Update.
	* doc/gperf.texi (Algorithmic Details): Update description of option
	-s.

2002-12-04  Bruno Haible  <bruno@clisp.org>

	Improve debugging output.
	* src/hash-table.h (Hash_Table::dump): New method.
	* src/hash-table.cc (Hash_Table::dump): New method, extracted from
	destructor.
	(Hash_Table::~Hash_Table): No longer print the contents.
	* src/positions.h (PositionReverseIterator): New class.
	* src/positions.icc (PositionReverseIterator::PositionReverseIterator,
	PositionReverseIterator::next): New methods.
	* src/search.cc (Search::find_positions): If debugging, print the
	result.
	(Search::find_alpha_inc): If debugging, print the result.
	(Search::prepare): Explicitly dump the hash table's contents here.

	Portability fixes.
	* src/positions.h (Positions::LASTCHAR, Positions::MAX_KEY_POS,
	PositionIterator::EOS): Define as compile-time constants using enum.
	* src/bool-array.cc (Bool_Array::~Bool_Array): Remove const qualifier
	of pointer to be deleted.
	* src/input.cc (Input::~Input): Likewise.
	* src/keyword.cc (KeywordExt::delete_selchars): Likewise.
	* src/main.cc (main): Likewise.
	* src/hash-table.cc (Hash_Table::~Hash_Table): Limit scope of 'for'
	variables.
	* src/search.cc (Search::prepare_asso_values): Use a static_cast to
	convert from time_t to long. This is possible because ISO C 99 says
	time_t is a numeric type.

2002-11-20  Bruno Haible  <bruno@clisp.org>

	* src/search.cc (Search::find_asso_values): Avoid gcc warnings about
	uninitialized variables.

	Implement backtracking.
	* src/search.h (Search::has_collisions): Renamed from
	Search::less_collisions. Return a boolean.
	* src/search.cc (Search::has_collisions): Renamed from
	Search::less_collisions. Return a boolean.
	(StackEntry): Remove field _collisions_so_far.
	(Search::find_asso_values): Backtrack when encountering an unresolved
	collision. Assume collisions_so_far is always zero.
	(Search::optimize): Exit if there are accidental duplicates at the end.
	* src/output.cc (Output::num_hash_values): Simply return the list
	length.
	(Output::output_keylength_table): Remove handling of accidental
	duplicates.
	(Output::output_keyword_table, Output::output_lookup_array): Likewise.
	(output_switch_case, output_switches): Likewise.
	* doc/gperf.texi (Algorithmic Details): Adjust description of options
	-D, -f, -o, -r.
	(Bugs): Remove note about missing backtracking.
	(Projects): Likewise.

2002-11-19  Bruno Haible  <bruno@clisp.org>

	Prepare for backtracking.
	* src/search.h (Search::try_asso_value, Search::change_some_asso_value):
	Remove declarations.
	(Search::less_collisions, Search::collision_prior_to): New declarations.
	(Search::_fewest_collisions, Search::_union_set, Search::_num_done):
	Remove fields.
	* src/search.cc (Search::prepare_asso_values): Don't initialize
	_union_set.
	(Search::try_asso_value, Search::change_some_asso_value): Remove
	methods.
	(Search::less_collisions, Search::collision_prior_to): New methods.
	(StackEntry): New class.
	(Search::find_asso_values): Reorganized to use pseudo-recursion.
	(Search::~Search): Don't free _union_set.

	* src/search.h (Search::find_good_asso_values): New declaration.
	* src/search.cc: Add comments about the basic structure of the
	algorithm.
	(Search::find_positions): Move the option[POSITIONS] test to here.
	(Search::find_good_asso_values): New method, extracted from
	Search::optimize.
	(Search::optimize): Remove option[POSITIONS] test. Call
	find_good_asso_values.

2002-11-17  Bruno Haible  <bruno@clisp.org>

	* src/options.cc (Options::parse_options): Include copyright notice
	and authors in --version output.

	Avoid artificial duplicates.
	* src/keyword.h (KeywordExt::init_selchars_tuple): New declaration.
	(KeywordExt::init_selchars_multiset): Renamed from
	KeywordExt::init_selchars.
	(KeywordExt::init_selchars_low): New declaration.
	* src/keyword.cc (KeywordExt::init_selchars_low): Renamed from
	KeywordExt::init_selchars. Add alpha_inc argument. Remove sorting.
	(KeywordExt::init_selchars_tuple): New method.
	(KeywordExt::init_selchars_multiset): New method, replaces
	KeywordExt::init_selchars.
	* src/search.h (Search::init_selchars_tuple): Renamed from
	Search::init_selchars.
	(Search::count_duplicates_tuple): Renamed from Search::count_duplicates.
	(Search::init_selchars_multiset, Search::count_duplicates_multiset,
	Search::find_alpha_inc): New declarations.
	(Search::_alpha_inc): New field.
	(Search::_alpha_size, Search::_occurrences, Search::_asso_values,
	Search::_determined): Make non-const.
	* src/search.cc (Search::Search): Don't initialize _key_positions,
	_alpha_size, _occurrences, _asso_values, _determined here.
	(Search::init_selchars_tuple): Renamed from Search::init_selchars.
	(Search::count_duplicates_tuple): Renamed from Search::count_duplicates.
	(Search::find_positions): Update.
	(Search::init_selchars_multiset, Search::count_duplicates_multiset,
	Search::find_alpha_inc): New methods.
	(Search::prepare): Move preprepare, find_positions calls away.
	Initialize _alpha_size, _occurrences, _asso_values, _determined here.
	(Search::optimize): Call preprepare, find_positions here. Initialize
	_key_positions here.
	(Search::~Search): Deallocate _alpha_inc.
	* src/output.cc (Output::Output): Add alpha_inc argument.
	(Output::output_hash_function): Use _alpha_inc.
	* src/output.h (Output::Output): Add alpha_inc argument.
	(Output::_alpha_inc): New field.
	* src/main.cc (main): Pass _alpha_inc from Search to Output.
	* tests/chill.exp: Update.
	* doc/gperf.texi (Algorithmic Details): Remove description of
	artificial duplicates.

	* src/keyword.h (KeywordExt::_selchars): Change type to
	'const unsigned int *'.
	* src/keyword.cc (sort_char_set): Change argument type to
	'unsigned int *'.
	(KeywordExt::init_selchars): Update.
	* src/search.h (Search::sort_by_occurrence): Change argument type to
	'unsigned int *'.
	(Search::try_asso_value): Change argument type to 'unsigned int'.
	(Search::_union_set): Change type to 'unsigned int *'.
	* src/search.cc (Search::prepare, Search::compute_occurrence,
	Search::set_determined, Search::already_determined,
	Search::prepare_asso_values, Search::compute_hash): Update.
	(compute_disjoint_union): Change argument types to 'unsigned int *'.
	(Search::sort_by_occurrence): Likewise.
	(Search::try_asso_value): Change argument type to 'unsigned int'.
	(Search::change_some_asso_value, Search::~Search): Update.
	* src/hash-table.cc (Hash_Table::~Hash_Table, Hash_Table::equal,
	Hash_Table::insert): Update.

	* src/positions.h: New file, extracted from options.h.
	* src/positions.icc: New file, extracted from options.icc.
	* src/positions.cc: New file, extracted from options.cc.
	* src/options.h: Include positions.h. Move classes Positions and
	PositionsIterator away.
	* src/options.icc: Move classes Positions and PositionsIterator away.
	* src/options.cc: Move class Positions away.
	* src/keyword.cc: Include positions.h instead of options.h.
	* src/output.h: Include positions.h instead of options.h.
	* src/search.h: Include positions.h instead of options.h.
	* src/Makefile.in (OBJECTS): Add positions.o.
	(POSITIONS_H): New variable.
	(OPTIONS_H, SEARCH_H, OUTPUT_H, keyword.o): Use it.
	(positions.o): New rule.

	* src/options.h (POSITIONS): New enum value.
	(Positions::Positions): New copy constructor.
	(Positions::operator=, Positions::contains, Position::add,
	Positions::remove, Positions::print): New method declaration.
	(Options::get_max_keysig_size): Remove method.
	* src/options.icc (Positions::Positions): New copy constructor.
	(Positions::operator=): New method.
	(Options::get_max_keysig_size): Remove method.
	* src/options.cc (Options::Options): Initialize _key_positions
	trivially.
	(Options::parse_options): Option -k sets POSITIONS.
	(Positions::contains, Positions::add, Positions::remove,
	Positions::print): New methods.
	* src/hash-table.cc (Hash_Table::~Hash_Table): Compute the field
	width explicitly, instead of using Options::get_max_keysig_size.
	* src/keyword.h (KeywordExt::init_selchars): Add arguments
	use_all_chars, positions.
	(KeywordExt::delete_selchars): New declaration.
	* src/keyword.cc (KeywordExt::init_selchars): Add arguments
	use_all_chars, positions. Remove error message if there are no key
	positions.
	(KeywordExt::delete_selchars): New method.
	* src/search.h: Include options.h.
	(Search::preprepare, Search::init_selchars, Search::delete_selchars,
	Search::count_duplicates, Search::find_positions): New declarations.
	(Search::_key_positions): New field.
	* src/search.cc (Search::Search): Initialize _key_positions.
	(Search::preprepare, Search::init_selchars, Search::delete_selchars,
	Search::count_duplicates, Search::find_positions): New functions.
	(Search::prepare): Call preprepare and find_positions. Tweak error
	message.
	(Search::get_max_keysig_size): Use _key_positions instead of
	option.get_key_positions().
	(Search::optimize): Tweak error message.
	* src/output.h: Include options.h.
	(Output::Output): Add Positions argument.
	(Output::_key_positions): New field.
	* src/output.cc (Output::Output): Add Positions argument.
	(Output::output_hash_function): Omit the table if there are no
	positions at all. Use _key_positions instead of
	option.get_key_positions().
	(Output::output): Output the computed positions as a comment.
	* src/main.cc (main): Pass the Positions from Searcher to Output.
	* src/Makefile.in (SEARCH_H, OUTPUT_H): Include OPTIONS_H.
	* tests/Makefile.in (check-test): Pass key positions explicitly.
	* tests/gpc.exp: Update.
	* tests/test-4.exp: Update.
	* doc/gperf.texi (Algorithmic Details): Mention that -k is not needed
	usually.

2002-11-16  Bruno Haible  <bruno@clisp.org>

	* src/options.h (Options::get_slot_name): Renamed from
	Options::get_key_name.
	(Options::set, Options::set_language, Options::set_total_switches,
	Options::set_function_name, Options::set_slot_name,
	Options::set_class_name, Options::set_hash_name,
	Options::set_wordlist_name, Options::set_delimiters): New method
	declarations.
	(Options::_language): New field.
	(Options::_slot_name): Renamed from Options::_key_name.
	* src/options.icc (Options::set): New method.
	(Options::get_slot_name): Renamed from Options::get_key_name.
	* src/options.cc (DEFAULT_FUNCTION_NAME): Renamed from DEFAULT_NAME.
	(DEFAULT_SLOT_NAME): Renamed from DEFAULT_NAME.
	(Options::Options): Initialize _language. Update.
	(Options::~Options): Update.
	(Options::set_language, Options::set_total_switches,
	Options::set_function_name, Options::set_slot_name,
	Options::set_class_name, Options::set_hash_name,
	Options::set_wordlist_name, Options::set_delimiters): New methods.
	(Options::parse_options): Call set_language. Update.
	* src/input.cc (is_declaration, is_declaration_with_arg,
	is_define_declaration): New functions.
	(Input::read_input): Accept %DECL declarations.
	* src/output.cc (Output::output_lookup_function_body): Update.
	* doc/gperf.texi (Declarations): Add new subnodes.
	(User-supplied Struct, Gperf Declarations, C Code Inclusion): New
	nodes.
	(Keywords, Output Format, Binary Strings, Options): Mention %
	declarations as being equivalent to the command line options.

	* src/options.cc (Options::long_usage): Rename options -H, -N, -l, -G.
	(long_options): Add --hash-function-name, --lookup-function-name,
	--compare-lengths.
	* doc/gperf.texi (Output Details): Rename options -H, -N, -l, -G.
	* tests/test-6.exp: Update.

	* src/options.cc (DEFAULT_DELIMITERS): Remove newline.
	* src/options.cc (Options::long_usage): Change default --delimiters.
	* doc/gperf.texi (Input Details): Likewise.
	* tests/test-6.exp: Update.

	* doc/gperf.texi: Move description of option -l from section
	Algorithmic Details to section Output Details.
	* src/options.cc (Options::long_usage): Likewise.
	* tests/test-6.exp: Update.

2002-11-12  Bruno Haible  <bruno@clisp.org>

	* src/options.h (Output::get_output_file_name): New method.
	(Output::_output_file_name): New field.
	* src/options.icc (Options::get_output_file_name): New method.
	* src/options.cc (Options::long_usage): Document option --output-file.
	(Options::Options): Initialize _output_file_name.
	(long_options): Add --output-file.
	(Options::parse_options): Handle it.
	* src/main.cc (main): Open the output file if given by name.
	* doc/gperf.texi (Output File): New section.
	* tests/test-6.exp: Update.

2002-11-10  Bruno Haible  <bruno@clisp.org>

	* src/input.cc (pretty_input_file_name): New function.
	(read_input): Use it in all error and warning messages.

	* src/keyword.h (Keyword::_lineno): New field.
	* src/input.h (Input::_struct_decl_lineno): New field.
	* src/input.cc (Input::read_input): Set _struct_decl_lineno. Fill
	each keyword's _lineno field.
	* src/main.cc (main): Pass _struct_decl_lineno from Input to Output.
	* src/output.h (Output::Output) Add struct_decl_lineno argument.
	(Output::_struct_decl_lineno): New field.
	* src/output.cc (Output::Output) Add struct_decl_lineno argument.
	(output_keyword_entry): Emit #line directive before table entry.
	(Output::output): Emit #line directive before _struct_decl.

	Fix memory leaks.
	* src/keyword.h (empty_string): New declaration.
	* src/keyword.cc (empty_string): New variable.
	* src/input.h (Input::_input): Make public.
	(Input::_input_end): New field.
	* src/input.cc (read_input): When removing leading whitespace from
	struct_decl, reallocate it. For rest, use empty_string instead of "".
	Set _input_end.
	(Input::~Input): Delete _struct_decl, _struct_tag, _return_type.
	* src/search.cc (Search::prepare): When removing an element from
	the keyword list, delete the list node.
	(Search::~Search): Delete _occurrences, _asso_values.
	* src/main.cc (main): Between Search::~Search and Input::~Input,
	destroy the keyword list.

	Rewrite the input routines.
	* src/input.h: Don't include read-line.h.
	(Input): Don't inherit from class Read_Line.
	(Input::read_keys, Input::strcspn, Input::set_output_types,
	Input::get_array_type, Input::save_include_src,
	Input::get_special_input): Remove declarations.
	(Input::read_input): New declaration.
	(Input::_struct_decl): Renamed from Input::_array_type.
	(Input::_verbatim_declarations): Renamed from Input::_include_src.
	(Input::_verbatim_code): Replaces Input::_additional_code.
	* src/input.cc: Completely rewritten.
	* src/output.h (Output::Output): Update the verbatim_* arguments.
	(Output::_struct_decl): Renamed from Output::_array_type.
	(Output::_verbatim_declarations): Renamed from Output::_include_src.
	(Output::_verbatim_code): Replaces Output::_additional_code.
	* src/output.cc (Output::Output): Update the verbatim_* arguments.
	(Output::output): Output the verbatim_* code pieces with #line.
	* src/main.cc (main): Call Input::read_input instead of
	Input::read_keys. Update Output::Output arguments.
	* src/read-line.h: Remove file.
	* src/read-line.cc, src/read-line.icc: Remove files.
	* src/Makefile.in (OBJECTS): Remove read-line.o.
	(READ_LINE_H): Remove variable.
	(INPUT_H): Update.
	(read-line.o): Remove rule.
	* doc/gperf.texi (Declarations): Correct the example.
	(Keywords): Mention that lines starting with % are forbidden here.
	* tests/c-parse.exp: Update.
	* tests/cplusplus.exp: Update.
	* tests/gpc.exp: Update.
	* tests/java.exp: Update.
	* tests/objc.exp: Update.
	* tests/test-4.exp: Update.

	* src/options.h (Options::get_input_file_name): New declaration.
	(Options::_input_file_name): New field.
	* src/options.icc (Options::get_input_file_name): New method.
	* src/options.cc (Options::Options): Initialize _input_file_name.
	(Options::parse_options): Don't open input file, only store it in
	_input_file_name.
	* src/main.cc (main): Open input file here.
	Print an error message upon write error on the output file.

	Upgrade to autoconf-2.52.
	* configure.in: Use AC_CONFIG_SUBDIRS instead of AC_OUTPUT_SUBDIRS.
	* Makefile.devel (configure, lib/configure, src/configure,
	tests/configure, doc/configure): Use autoconf-2.52.

2002-11-09  Bruno Haible  <bruno@clisp.org>

	* doc/gperf.texi: Talk about "bytes" instead of "characters". Talk
	about "keywords", not "keys". Talk about "input file", not "keyfile".
	(@menu): Fix a menu entry.
	(Contributors): Don't mention cperf.
	(Motivation): Fix an off-by-one error in the definition of "minimal".
	Mention GNU Java. Recommend http URL instead of anonymous ftp.
	(Search Structures): Mention GNU Java.
	(Output Format): Drop reference to node 'Implementation'.
	(Output Details): Talk about "slot-name" instead of "key name".
	(Algorithmic Details): Talk about "selected byte positons", not
	"key positions". Upper limit is now 255. Explain a third reason
	why duplicates can occur. Describe negative effects of
	--occurrence-sort.
	(Implementation): Remove chapter.

2002-11-07  Bruno Haible  <bruno@clisp.org>

	* src/bool-array.cc (Bool_Array::~Bool_Array): Free _storage_array.
	* src/search.cc (Search::~Search): Free _union_set, _determined.

	* tests/Makefile.in (check-test): Don't redirect stderr.

2002-11-05  Bruno Haible  <bruno@clisp.org>

	* src/keyword-list.h (mergesort_list): New declarations.
	* src/keyword-list.cc (Keyword_Comparison): New type.
	(merge, mergesort_list): New functions, moved here from search.cc.
	* src/search.h (Search::merge, Search::merge_sort): Remove methods.
	(Search::_occurrence_sort, Search::_hash_sort): Remove fields.
	* src/search.cc (Search::merge, Search::merge_sort): Remove methods.
	(greater_by_occurrence, less_by_hash_value): New functions.
	(Search::reorder, Search::sort): Use mergesort_list.

2002-11-04  Bruno Haible  <bruno@clisp.org>

	* src/options.h (Options::_asso_iterations): New field.
	(Options::get_asso_iterations): New method declaration.
	* src/options.icc (Options::get_asso_iterations): New method.
	* src/options.cc (Options::short_usage): Mention j<jump> and m<num>.
	(Options::long_usage): Document option -m.
	(Options::Options): Initialize _asso_iterations.
	(Options::~Options): Print _asso_iterations too.
	(long_options): Add --multiple-iterations.
	(Options::parse_options): Handle option -m.
	* src/keyword-list.h (copy_list, delete_list): New declarations.
	* src/keyword-list.cc (copy_list, delete_list): New functions.
	* src/search.h (Search::_initial_asso_value, Search::_jump): New fields.
	* src/search.cc (Search::prepare_asso_values): Initialize
	_initial_asso_value and _jump here.
	(Search::init_asso_values): Use _initial_asso_value.
	(Search::try_asso_value): Use _jump.
	(Search::optimize): If option -m was given, iterate over different
	values for _initial_asso_value and _jump.
	* doc/gperf.texi (Algorithmic Details): Document option -m.
	* tests/test-6.exp: Update.

2002-11-03  Bruno Haible  <bruno@clisp.org>

	Bug fix: When option -j 0 was used without option -r, the output was
	not random.
	* src/search.h (Search::prepare_asso_values): New method declaration.
	* src/search.cc (Search::prepare_asso_values): New method, extracted
	from Search::init_asso_values. Call srand also when "-j 0" was given.
	(Search::optimize): Call prepare_asso_values().

	* src/hash-table.h (Hash_Table::_ignore_length, Hash_Table::equal):
	Declare as const.
	* src/hash-table.cc (Hash_Table::equal): Declare as const.
	* src/input.h (Input::_factory): Declare as const.
	* src/keyword-list.h (Keyword_List::first, KeywordExt_List::first):
	Declare as const.
	* src/keyword-list.icc (Keyword_List::first, KeywordExt_List::first):
	Declare as const.
	* src/output.h (Output::num_hash_values, Output::output_constants,
	Output::output_hash_function, Output::output_keylength_table,
	Output::output_keyword_table, Output::output_lookup_array,
	Output::output_lookup_tables, Output::output_lookup_function_body,
	Output::output_lookup_function, Output::_array_type,
	Output::_additional_code, Output::_include_src, Output::_total_keys,
	Output::_total_duplicates, Output::_max_key_len, Output::_min_key_len):
	Declare as const.
	* src/output.cc (Output::num_hash_values, Output::output_constants,
	Output::output_hash_function, Output::output_keylength_table,
	Output::output_keyword_table, Output::output_lookup_array,
	Output::output_lookup_tables, Output::output_lookup_function_body,
	Output::output_lookup_function): Declare as const.
	* src/search.h (Search::merge, Search::merge_sort,
	Search::compute_occurrence, Search::already_determined,
	Search::keyword_list_length, Search::max_key_length,
	Search::get_max_keysig_size, Search::compute_hash,
	Search::sort_by_occurrence): Declare as const.
	* src/search.cc (Search::merge, Search::merge_sort,
	Search::compute_occurrence, Search::already_determined,
	Search::keyword_list_length, Search::max_key_length,
	Search::get_max_keysig_size, Search::compute_hash,
	Search::sort_by_occurrence): Declare as const.

	* src/output.cc (Output::output): Set char_to_index to a cast in all
	cases. Avoids gcc warnings on the generated code.

	* src/output.cc (Output_Enum): Prepend an underscore to field names.
	(Output_Expr1): Likewise.
	(Output::output_hash_function): Simplify the special case for "-k 1,$".

	* src/search.h (Search::init_asso_values, Search::find_asso_values):
	New declarations.
	(Search::try_asso_value): Renamed from Search::affects_prev.
	(Search::change_some_asso_value): Renamed from Search::change.
	(Search::set_asso_max, Search::get_asso_max): Remove methods.
	(Search::_union_set): New field.
	* src/search.cc (Search::init_asso_values): New method, extracted
	from Search::optimize.
	(Search::try_asso_value): Renamed from Search::affects_prev. Take the
	iteration count as argument.
	(Search::change_some_asso_value): Renamed from Search::change. Don't
	make union_set static. Don't increment _fewest_collisions here.
	(Search::find_asso_values): New method, extracted from
	Search::optimize.
	(Search::optimize); Update.

	* src/search.h (Search::compute_hash): Renamed from Search::hash.
	(Search::compute_disjoint_union): Remove declaration.
	(Search::sort_by_occurrence): Renamed from Search::sort_set.
	* src/search.cc (Search::compute_hash): Renamed from Search::hash.
	(compute_disjoint_union): Renamed from Search::compute_disjoint_union.
	(Search::sort_by_occurrence): Renamed from Search::sort_set.
	(Search::change): Simplify loop.

	* src/search.h (Search::clear_determined): New declaration.
	* src/search.cc (Search::clear_determined): New method.
	(Search::already_determined): Optimize.
	(Search::reorder): Even when the next keyword after the current one
	is completely determined, move all determined keywords after the
	current one.

	Compute the occurrences after removal of duplicates, not before.
	* src/keyword.h (KeywordExt::init_selchars): Remove occurrences
	argument.
	* src/keyword.cc (KeywordExt::init_selchars): Likewise.
	* src/search.cc (Search::prepare): Reorder the code. Compute the
	occurrences after removal of duplicates.
	(Search::merge_sort): Optimize the loop.
	(Search::compute_occurrence): Renamed from Search::get_occurrence.
	* src/search.h (Search::compute_occurrence): Renamed from
	Search::get_occurrence.
	* tests/chill.exp: Regenerated.

	Bug fix: The hash table could fail to detect duplicates, between
	keywords of different length, when option -n (option[NOLENGTH]) was
	given.
	* src/hash-table.h (Hash_Table::Hash_Table): Pass table size, not
	vector and vector size as arguments.
	(Hash_Table::_log_size): New field.
	(Hash_Table::equal): New declaration.
	* src/hash-table.cc (size_factor): New variable.
	(Hash_Table::Hash_Table): Pass table size, not vector and vector size
	as arguments. Allocate the vector here.
	(Hash_Table::~Hash_Table): Deallocate the vector here.
	(Hash_Table::equal): New function.
	(Hash_Table::insert): Use it. Don't use item->_allchars_length for the
	increment if _ignore_length is true.
	* src/search.cc (TABLE_MULTIPLE): Remove variable.
	(Search::prepare): Update.

2002-11-02  Bruno Haible  <bruno@clisp.org>

	Provide documentation also in PDF format.
	* doc/Makefile.in (pdfdir, TEXI2PDF): New variables.
	(all): Depend on pdf.
	(pdf, gperf.pdf): New rules.
	(maintainer-clean): Remove the PDF file.

	* src/keyword-list.icc: New file, extracted from keyword-list.h.
	* src/keyword-list.h: Include keyword-list.icc. Move inline methods
	to there.
	* src/keyword-list.cc: Include keyword-list.icc.
	* src/Makefile.in (KEYWORD_LIST_H): Add keyword-list.icc.

	* lib/hashpjw.h (hashpjw): Change argument type to 'unsigned char *'.
	* lib/hash.cc (hashpjw): Likewise.
	* src/keyword.icc: New file.
	* src/keyword.h: Include keyword.icc.
	(KeywordExt::_selchars): Change type to 'unsigned char *'.
	* src/keyword.cc: Include keyword.icc.
	(Keyword::Keyword, KeywordExt::KeywordExt): Move to keyword.icc.
	(sort_char_set): Change argument type to 'unsigned char *'.
	(KeywordExt::init_selchars): Update.
	* src/search.h (Search::compute_disjoint_union): Change argument types
	to 'unsigned char *'.
	(Search::sort_set): Likewise.
	(Search::affects_prev): Change argument type to 'unsigned char'.
	* src/search.cc (Search::prepare): Initialize _duplicate_link here.
	(Search::get_occurrence, Search::set_determined,
	Search::already_determined, Search::hash): Update.
	(Search::compute_disjoint_union): Change argument types to
	'unsigned char *'.
	(Search::sort_set): Likewise.
	(Search::affects_prev): Change argument type to 'unsigned char'.
	(Search::change): Update.
	* src/Makefile.in (KEYWORD_H): Add keyword.icc.

	* src/options.cc (Options::parse_options): Fix error message.

	* src/read-line.h (Read_Line::Read_Line): Make FILE* argument
	mandatory. Move body to read-line.icc.
	* src/read-line.icc (Read_Line::Read_Line): New constructor.
	* src/input.h (Input::Input): Add FILE* argument.
	* src/input.cc (Input::Input): Likewise.
	* src/main.cc (main): Pass stdin to Input constructor.

	* src/options.h (DEFAULTCHARS): Remove.
	(Positions::MAX_KEY_POS): Set to 255.
	(Positions::_positions): Increase array size.
	(PositionIterator::EOS): Set to -1.
	(PositionIterator::_index): Change type to 'unsigned int'.
	* src/options.icc (Positions::Positions): Don't store
	PositionIterator::EOS.
	(PositionIterator::next): Produce PositionIterator::EOS here.
	* src/options.cc (Options::long_usage): Use MAX_KEY_POS, not
	MAX_KEY_POS-1.
	(PositionStringParser): Rename field _size to _in_range. Rename
	field _curr_value to _range_curr_value. Rename field _upper_bound
	to _range_upper_bound.
	(PositionStringParser::nextPosition): Comments.
	(Options::Options): Update.
	(Options::~Options): Update.
	(long_options): Use NULL, not 0.
	(Options::parse_options): Set BAD_VALUE to -2; -1 is now EOS. Bug fix:
	Check against array overflow when more than MAX_KEY_POS positions are
	given. Don't store PositionIterator::EOS.
	Check against extra arguments before opening the input file.
	* src/output.cc (Output::output_hash_function): Change test which
	was for option[DEFAULTCHARS].
	* tests/test-6.exp: Update.

	* src/options.h (Options::get_delimiters): Renamed from
	Options::get_delimiter.
	* src/options.icc (Options::get_delimiters): Renamed from
	Options::get_delimiter.
	* src/input.cc (Input::read_keys): Update.

	Bug fix.
	* src/options.cc (Options::print_options): Escape backquote inside
	double-quoted strings.

	Bug fix.
	* src/keyword.cc (KeywordExt::init_selchars): Avoid comparison with
	uninitialized member variable. Found with 'valgrind'.

	* src/version.cc: Include version.h.
	* src/Makefile.in (OBJECTS): Reorder.
	(KEYWORD_H, KEYWORD_LIST_H, INPUT_H, SEARCH_H, OUTPUT_H): New
	variables.
	(HASH_TABLE_H): Update.
	(options.o, read-line.o, keyword.o, keyword-list.o, input.o, search.o,
	output.o, main.o): Update dependencies.

	* src/vectors.h: Remove file.
	* src/vectors.cc: Remove file.
	* src/search.h: Don't include vectors.h.
	(Search): Don't inherit from Vectors. New fields _alpha_size,
	_occurrences, _asso_values.
	(Search::_determined, Search::get_occurrence, Search::set_determined,
	Search::already_determined, Search::hash, Search::sort_set): Make
	nonstatic.
	* src/search.cc (Search::Search): Initialize _alpha_size, _occurrences,
	_asso_values, _determined.
	(Search::optimize, Search::~Search): Update.
	* src/output.h: Don't include vectors.h.
	(Output): Remove field _v. New fields _alpha_size, _occurrences,
	_asso_values.
	(Output::Output): Replace Vectors* argument with alpha_size,
	occurrences, asso_values.
	* src/output.cc (Output::Output): Replace Vectors* argument with
	alpha_size, occurrences, asso_values.
	(Output::output_hash_function): Update.
	* src/main.cc (main): Don't set Vectors::ALPHA_SIZE.
	Pass _alpha_size, _occurrences, _asso_values from Search to Output.
	* src/keyword.h: Don't include vectors.h.
	* src/Makefile.in (OBJECTS): Remove vectors.o.
	(VECTORS_H): Remove variable.
	(vectors.o): Remove rule.

	* src/search.h: New file, combines src/key-list.h, src/gen-perf.h.
	* src/search,cc: New file, combines src/key-list.cc, src/gen-perf.cc.
	* src/key-list.h: Remove file.
	* src/key-list.cc: Remove file.
	* src/gen-perf.h: Remove file.
	* src/gen-perf.cc: Remove file.
	* src/main.cc (KeywordExt_Factory): Moved here from gen-perf.cc.
	(main): Inline some code from gen-perf.cc.
	* src/keyword.h (KeywordExt::init_selchars): Take the occurrences
	vector as argument.
	* src/keyword.cc (KeywordExt::init_selchars): Take the occurrences
	vector as argument.
	* src/input.cc (Input::set_output_types): Initialize _array_type,
	_return_type, _struct_tag.
	(Input::read_keys): Initialize _additional_code.
	* src/Makefile.in (OBJECTS): Add search.o.
	Remove key-list.o, gen-perf.o.
	(KEY_LIST_H, GEN_PERF_H): Remove variables.
	(gen-perf.o, key-list.o): Remove rules.
	(search.o): New rule.

	* *, */*: Update copyright notice to GPL version 2.

	* src/keyword-list.h (Keyword_List): New class.
	(KeywordExt_List): Inherit from it.
	* src/keyword-list.cc (Keyword_List::Keyword_List): New constructor.
	(KeywordExt_List::KeywordExt_List): Update.
	* src/input.h (Input::Input): Add Keyword_Factory argument.
	(Input::_factory): New field.
	(Input::_head): Change type to Keyword_List*.
	(Input::parse_line): New declaration.
	* src/input.cc (Input::Input): New constructor.
	(Input::parse_line): Renamed from parse_line. Use the _factory.
	(Input::read_keys): Update.
	* src/key-list.cc (KeywordExt_Factory): New class.
	(Key_List::read_keys): Pass a KeywordExt_Factory as Input constructor
	argument.

	Avoid g++ -Wold-style-cast warnings.
	* src/bool-array.icc: Use new-style casts.
	* src/gen-perf.cc: Likewise.
	* src/input.cc: Likewise.
	* src/key-list.cc: Likewise.
	* src/keyword.cc: Likewise.
	* src/options.cc: Likewise.
	* src/output.cc: Likewise.
	* src/hash-table.cc: Likewise. Remove (char *) cast in memset argument.

	* src/keyword-list.h (KeywordExt_List): Don't inherit from KeywordExt.
	(KeywordExt_List::KeywordExt_List): Take a KeywordExt* as argument.
	(KeywordExt_List::_car): New field.
	(KeywordExt_List::first): Use it.
	* src/keyword-list.cc (KeywordExt_List::KeywordExt_List): Take a
	KeywordExt* as argument.
	* src/input.cc (parse_line): Create the KeywordExt separately.

	Start using bool.
	* src/bool-array.h (Bool_Array::set_bit): Change return type to bool.
	* src/bool-array.icc (Bool_Array::set_bit): Likewise.
	* src/gen-perf.h (Gen_Perf::affects_prev): Likewise.
	* src/gen-perf.cc (Gen_Perf::affects_prev): Likewise.
	* src/hash-table.h (Hash_Table::_ignore_length): Change type to bool.
	(Hash_Table::Hash_Table): Change 3rd argument type to bool.
	* src/hash-table.cc (Hash_Table::Hash_Table): Likewise.
	* src/input.h (Input::_additional_code): Change type to bool.
	* src/input.cc (Input::read_keys): Update.
	* src/key-list.h (Key_List::_occurrence_sort, Key_List::_hash_sort,
	Key_List::_additional_code): Change type to bool.
	(Key_List::_determined): Change element type to bool.
	(Key_List::already_determined): Change return type to bool.
	* src/key-list.cc (Key_List::_determined): Change element type to bool.
	(Key_List::set_determined): Update.
	(Key_List::already_determined): Change return type to bool.
	(Key_List::reorder, Key_List::sort, Key_List::Key_List): Update.
	* src/options.h (Positions::sort): Change return type to bool.
	(Options::operator[]): Likewise.
	* src/options.icc (Positions::sort): Change return type to bool.
	(Options::operator[]): Likewise.
	* src/output.h (Output::Output): Change 5th argument type to bool.
	(Output::_additional_code): Change type to bool.
	* src/output.cc (Output::Output): Change 5th argument type to bool.

2002-10-16  Bruno Haible  <bruno@clisp.org>

	* src/*.h: Align all member names at column 24.

2002-10-15  Bruno Haible  <bruno@clisp.org>

	* src/input.h: New file.
	* src/input.cc: New file, extracted from key-list.cc.
	* src/key-list.h (Key_List): Don't inherit from Read_Line.
	(Key_List::get_special_input,
	Key_List::save_include_src, Key_List::get_array_type,
	Key_List::strcspn, Key_List::set_output_types): Remove methods.
	* src/key-list.cc (Key_List::get_special_input,
	Key_List::save_include_src, Key_List::get_array_type,
	Key_List::strcspn, Key_List::set_output_types, parse_line): Move to
	src/input.cc.
	(Key_List::read_keys): Use Input::read_keys.
	(Key_List::Key_List): Update.
	* src/gen-perf.cc: Update.
	* src/Makefile.in (OBJECTS): Add input.o.
	(input.o): New rule.

2002-10-14  Bruno Haible  <bruno@clisp.org>

	* src/options.cc: Don't include "vector.h".
	(Options::parse_options): Don't initialize Vectors::ALPHA_SIZE here.
	* src/vectors.cc (Vectors::ALPHA_SIZE): Don't initialize here.
	* src/gen-perf.cc (Gen_Perf::Gen_Perf): Initialize Vectors::ALPHA_SIZE.

	* src/options.h (Positions): New class.
	(PositionIterator): New class.
	(Options::parse_options): Renamed from Options::operator().
	(Options::get_asso_max, Options::set_asso_max): Move to class Key_List.
	(Options::reset, Options::get): Remove, replaced by class
	PositionIterator.
	(Options::get_initial_asso_value): Renamed from Options::initial_value.
	(Options::key_sort): Remove, replaced by Positions::sort.
	(Options): Make all fields and methods non-static.
	* src/options.icc (Positions::Positions, Positions::operator[],
	Positions::get_size, Positions::pointer, Positions::set_size,
	Positions::sort, PositionIterator::PositionIterator,
	PositionIterator::next): New methods.
	(Options::get_initial_asso_value): Renamed from Options::initial_value.
	(Options::get_size_multiple): New method.
	(Options::get_key_positions): New method.
	(Options::get_max_keysig_size): Implement using _key_positions.
	* src/options.cc (Options::long_usage): Split big string into small
	pieces.
	(PositionStringParser): Prefix field names with _.
	(Options::Options): Update.
	(Options::~Options): Fix explanation of of _size_multiple. Don't print
	_key_positions if it is effectively ignored.
	(Options::parse_options): Renamed from Options::operator(). Update.
	* src/key-list.h (Key_List): New field _size. New methods get_asso_max,
	set_asso_max, get_max_keysig_size.
	* src/key-list.cc (Key_List::read_keys): Don't make side effects on
	options.
	(Key_List::dump): Use Key_List::get_max_keysig_size() instead of
	Options::get_max_keysig_size().
	(Key_List::get_max_keysig_size): New function.
	* src/hash-table.cc (Hash_Table::~Hash_Table): Compute the field
	width on the fly if option[ALLCHARS].
	* src/gen-perf.cc (Gen_Perf::Gen_Perf): Update,
	Use Options::get_size_multiple() instead of Options::get_asso_max().
	Use Key_List::get_asso_max() instead of Options::get_asso_max(). Use
	Key_List::get_max_keysig_size() instead of
	Options::get_max_keysig_size().
	(Gen_Perf::affects_prev): Likewise.
	(Gen_Perf::change): Likewise.
	* src/keyword.cc: Update.
	* src/main.cc: Update.
	* src/output.cc: Update.
	* tests/test-6.exp: Update.

2002-10-13  Bruno Haible  <bruno@clisp.org>

	* src/bool-array.*: Some polishing.

	* src/options.h (Options::operator=, Options::operator!=): Remove
	unused methods.
	* src/options.icc (Options::operator=, Options::operator!=): Remove.

	* src/*.h: Prefix all field names with _.
	* src/*.cc, src/*.icc: Update.

	* src/*: Simplify declarations of functions without arguments.

2002-10-04  Bruno Haible  <bruno@clisp.org>

	* src/output.h: New file, extracted from key-list.h.
	* src/output.cc: New file, extracted from key-list.cc.
	* src/key-list.h (Key_List): Make some fields protected. Move output
	routines to src/output.h.
	* src/key-list.cc: Move output routines to src/output.cc.
	* src/gen-perf.cc (Gen_Perf::doit_all): Use class Output.
	* src/Makefile.in (OBJECTS): Add output.o.
	(output.o): New rule.

2002-10-03  Bruno Haible  <bruno@clisp.org>

	* src/iterator.h: Remove file.
	* src/iterator.cc: Remove file.
	* src/options.cc: (PositionStringParser): New class, taken from old
	iterator.cc.
	* src/Makefile.in (OBJECTS): Remove iterator.o.
	(ITERATOR_H): Remove variable.
	(iterator.o): Remove rule.

	* src/keyword-list.h: New file.
	* src/keyword-list.cc: New file.
	* src/list-node.h: Remove file.
	* src/list-node.cc: Remove file.
	* src/keyword.h (KeywordExt::init_selchars): New declaration.
	* src/keyword.cc (sort_char_set, KeywordExt::init_selchars): New, from
	old list-node.cc.
	* src/gen-perf.cc: Replace List_Node by KeywordExt or KeywordExt_List,
	as appropriate.
	* src/hash-table.h: Likewise.
	* src/key-list.h: Likewise.
	* src/key-list.cc: Likewise.
	* src/Makefile.in (OBJECTS): Remove list-node.o, add keyword-list.o.
	(LIST_NODE_H): Remove macro.
	(list-node.o): Remove rule.
	(keyword-list.o): New rule.

	* src/keyword.h (KeywordExt): New class.
	* src/keyword.cc (KeywordExt): New constructor.
	* src/list-node.h (List_Node): Inherit from KeywordExt.
	* src/list-node.cc: Update.
	* src/gen-perf.cc: Update.
	* src/hash-table.cc: Update.
	* src/key-list.cc: Update.
	(output_keyword_entry): Change argument type to KeywordExt*.

	* src/keyword.h: New file.
	* src/keyword.cc: New file.
	* src/list-node.h (List_Node): Extend Keyword.
	* src/list-node.cc: Update.
	* src/gen-perf.cc: Update.
	* src/hash-table.cc: Update.
	* src/key-list.cc: Update.
	* src/Makefile.in (OBJECTS): Add keyword.o.
	(keyword.o): New rule.

	* src/key-list.cc (Key_List::read_keys): Allocate the memory for the
	hash table using 'new'.
	(Key_List::output_lookup_array): Allocate the memory for the duplicates
	array using 'new'.
	* src/options.h (LARGE_STACK_ARRAYS): Remove definition.
	* src/main.cc (main): Remove setrlimit call.
	* src/configure.in: Don't test for unistd.h, sys/time.h,
	sys/resource.h, getrlimit, setrlimit.

	* src/bool-array.h (Bool_Array): Make all members non-static.
	Add an argument to the constructor. Remove init(), rename reset() to
	clear(), rename find() to set_bit().
	* src/bool-array.icc: Move init() code into the constructor.
	Rename reset() to clear(), rename find() to set_bit().
	* src/gen-perf.h (Gen_Perf): Add collision_detector member.
	* src/gen-perf.cc: Update.

	* src/gen-perf.h (Gen_Perf::doit_all): Renamed from
	Gen_Perf::operator ().
	* src/gen-perf.cc (Gen_Perf::doit_all): Renamed from
	Gen_Perf::operator ().
	* src/main.cc: Update.

	* src/read-line.h (Read_Line::read_next_line): Renamed from
	Read_Line::get_line.
	* src/read-line.icc: Likewise.
	* src/read-line.cc: Update.
	* src/key-list.cc: Update.

	* lib/getline.h: New file.
	* lib/getline.cc: New file.
	* lib/Makefile.in (OBJECTS): Add getline.o.
	(getline.o): New rule.
	* src/read-line.h (Read_Line::readln_aux): Remove declaration.
	* src/read-line.cc (Read_Line::readln_aux): Remove function.
	* src/read-line.icc (Read_Line::get_line): Use ::get_line.
	* src/options.h (LARGE_STACK): Remove macro.

	* src/bool-array.h (STORAGE_TYPE): Remove type.
	Use 'unsigned int' instead of STORAGE_TYPE.
	* src/bool-array.cc: Likewise.
	* src/bool-array.icc: Likewise.
	* src/gen-perf.cc: Likewise.

	* src/new.cc: Remove file.
	* src/Makefile.in (OBJECTS): Remove new.o.
	(new.o): Remove rule.
	* src/configure.in: Remove test for HAVE_THROW_DECL.
	* acconfig.h: Remove file.

	* src/trace.h: Remove file.
	* src/trace.cc: Remove file.
	* src/Makefile.in (OBJECTS): Remove trace.o.
	(TRACE_H): Remove variable.
	(trace.o): Remove rule.
	Update all dependencies.
	* src/bool-array.h, src/bool-array.cc, src/bool-array.icc: Don't use T.
	* src/gen-perf.cc: Likewise.
	* src/hash-table.cc: Likewise.
	* src/iterator.cc: Likewise.
	* src/key-list.cc: Likewise.
	* src/list-node.cc: Likewise.
	* src/main.cc: Likewise.
	* src/new.cc: Likewise.
	* src/options.h, src/options.cc, src/options.icc: Likewise.
	* src/read-line.h, src/read-line.cc, src/read-line.icc: Likewise.

	* tests/Makefile.in: Use gperf option -I, to avoid gcc-3.x warnings.
	* tests/test.c: Don't use gets(), to avoid warnings.

2001-08-02  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>

	* doc/gperf.texi: Change bug report address to <bug-gnu-gperf@gnu.org>.
	* README: Updated.

2000-12-18  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>

        * src/configure.in: Add check for rand() in libm. Needed for BeOS.
        * src/Makefile.in (LIBS): Use @GPERF_LIBM@ instead of hardwiring -lm.

2000-11-20  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>

        * doc/help2man: Update to version 1.23.

2000-09-26  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>

        * gperf-2.7.2 released.

        * doc/gperf.texi: Add a second bug report address
          <gperf-bugs@lists.sourceforge.net>.
        * README: Updated.

2000-08-28  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>

        * lib/getopt.h (struct option): Use "const" also when compiling in
          C++ mode. Avoids warnings from Sun CC and HP-UX aCC.

        * doc/Makefile.in (docdir): Change from $(datadir)/doc/@PACKAGE@ to
          $(prefix)/doc/@PACKAGE@, following the newest GNU standards.

2000-08-20  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>

        * src/version.cc: Bump version number to 2.7.2.
        * doc/gperf.texi: Likewise.

        * doc/texinfo.tex: Update to post-texinfo-4.0 version. @code in the
          title page now chooses a larger font. The overall layout of the
          text is denser.

        * AUTHORS: New file.

        * tests/Makefile.in (all): Add check-lang-utf8 and check-lang-ucs2.
          (check-lang-utf8, check-lang-ucs2): New targets.
          (clean): Remove lu8out and lu2out.
        * tests/lang-utf8.gperf, tests/lang-utf8.exp: New files.
        * tests/lang-ucs2.gperf, tests/test2.c, tests/lang-ucs2.in,
          tests/lang-ucs2.exp: New files.

        Allow the use of embedded NULs in keys.
        * lib/hash.h (hashpjw): Add a length argument.
        * lib/hash.cc (hashpjw): Likewise. Don't stop when encountering a NUL
          character.
        * src/hash-table.h (Hash_Table constructor): Add ignore_len argument.
          (Hash_Table::ignore_length): New field.
          (Hash_Table::insert): Renamed from Hash_Table::operator(). Remove
          ignore_length argument.
        * src/hash-table.cc (NIL): Remove macro.
          (Hash_Table constructor): Add ignore_len argument. Use it to
          initialize ignore_length.
          (Hash_Table destructor): Specify explicit length of char_set and
          key.
          (Hash_Table::insert): Renamed from Hash_Table::operator(). Remove
          ignore_length argument. Pass explicit length to hashpjw. Compare
          char_set using memcmp, not strcmp.
        * src/list-node.h (List_Node): Rename field length to key_length.
          New field char_set_length.
          (List_Node constructor): Accept key and rest, not the entire line.
        * src/list-node.cc (List_Node constructor): Accept key and rest, not
          the entire line. Don't NUL terminate key and char_set. Specify
          explicit length of key. Initialize char_set_length field.
        * src/key-list.cc: Include <ctype.h>.
          (parse_line): New function.
          (Key_List::read_keys): Call parse_line instead of new List_Node.
          Pass option[NOLENGTH] to Hash_Table constructor, not
          Hash_Table::insert. Specify explicit length of key and char_set.
          (Key_List::get_occurrence): Use explicit length of char_set.
          (Key_List::set_determined): Likewise.
          (Key_List::already_determined): Likewise.
          (output_string): Add length argument. Output unprintable characters
          using octal escape sequence.
          (output_keyword_entry): Use explicit length of key.
          (Key_List::output_lookup_array): Specify explicit length of key.
          (output_switch_case): Likewise.
          (Key_List::dump): Likewise.
        * src/gen-perf.h (Gen_Perf::compute_disjoint_union): Add two length
          arguments.
        * src/gen-perf.cc (Gen_Perf::compute_disjoint_union): Likewise. Don't
          stop when encountering NUL characters. Don't NUL terminate the
          result.
          (Gen_Perf::hash): Use explicit length of char_set.
          (Gen_Perf::change): Specify explicit length of key.
        * doc/gperf.texi: Document it.

        * doc/help2man: New file, help2man version 1.022.
        * Makefile.devel (all): Add doc/gperf.1.
          (doc/gperf.1): New target.
        * doc/gperf.1: Automatically generated.

        * mkinstalldirs: New file, from automake-1.4, grep-2.4.1, guile-1.4,
          libtool-1.3.3, make-3.79.1, tar-1.13.
        * src/Makefile.in (MKINSTALLDIRS): New variable.
          (install, installdirs): Use it instead of mkdir.
        * doc/Makefile.in (MKINSTALLDIRS): New variable.
          (install, installdirs): Use it instead of mkdir.

        * INSTALL: Update.

2000-08-19  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>

        * src/key-list.cc (Output_Compare_Memcmp): New class.
          (Key_List::output_lookup_function): When option -l is given, use
          memcmp instead of strcmp or strncmp.

        * doc/gperf.texi: The bug report address is <bug-gnu-utils@gnu.org>.
          The download address is ftp.gnu.org. Remove mention of -a and -g
          options (now nops). Explain effect of -c option.

        * doc/configure.in (PACKAGE): New variable.
        * doc/Makefile.in (datadir, docdir): New variables.
          (dvidir, htmldir): Change values.
          (install, installdirs): Update.

        * src/configure.in: Rename cache variable gp_cxx_throw_decl to
          gp_cv_cxx_throw_decl.

        * src/key-list.cc (Key_List::output_hash_function): When outputting
          __inline, take advantage of C++ compilers which have inline.

        * src/key-list.cc (Output_Compare_Strncmp::output_comparison):
          After the call to strncmp, verify that expr2 is not longer than
          `len'.
          Reported by Carlo Wood <carlo@runaway.xs4all.nl>.

        * src/key-list.cc (Key_List::output_lookup_function_body): Avoid
          emitting the loop for dealing with duplicates if
          total_duplicates == 0.

        * src/key-list.cc (Key_List::read_keys): Don't accept an empty key.

        * src/Makefile.in (install, installdirs, uninstall): Respect
          $(DESTDIR).
        * doc/Makefile.in (install, installdirs, uninstall): Likewise.

        * src/options.cc (Options::print_options): Escape the arguments which
          contain special characters.

        * tests/c-parse.gperf: Updated from gcc-2.95.2/gcc/c-parse.gperf.
        * tests/objc.gperf: New file, from gcc-2.95.2/gcc/objc/objc.gperf.
        * tests/chill.gperf: New file, from gcc-2.95.2/gcc/ch/gperf.
        * tests/cplusplus.gperf: New file, from gcc-2.95.2/gcc/cp/gxx.gperf.
        * tests/gplus.gperf: Remove file.
        * tests/java.gperf: New file, from gcc-2.95.2/gcc/java/keyword.gperf.
        * tests/Makefile: Check them all.
        * tests/c-parse.exp: Renamed from tests/test-1.exp.
        * tests/modula2.exp: Renamed from tests/test-2.exp.
        * tests/cplusplus.exp: Renamed from tests/test-3.exp.
        * tests/gpc.exp: Renamed from tests/test-5.exp.

        * src/key-list.cc (output_switch_case): Add trailing semicolon to
          lengthptr assignment line. Fixes bug with -D and -S.
          From Reini Urban <rurban@sbox.tu-graz.ac.at>. Also reported by
          David Hunter.
        * tests/Makefile.in (check-lang-syntax): Perform each test with -D
          once without and once with duplicates.

        * src/key-list.cc (output_keyword_entry): Avoid outputting a struct
          initializer of the form {"key",}.

        * src/iterator.cc: Don't include <stream.h>.
          From Michael Deutschmann <ldeutsch@mail.netshop.net>.

        * tests/Makefile.in (VALIDATE, check-lang-syntax): Use $(srcdir) where
          appropriate.
          Reported by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>.

        * tests/validate: Don't run -traditional tests by default.

        * src/main.cc (main): Check for write error on stdout before returning.

        * src/Makefile.in (LDFLAGS): New definition, to catch the value given
          at configure time.

        Make the structure initializers customizable. Based on a patch by
        Kaveh R. Ghazi <ghazi@caip.rutgers.edu>.
        * src/options.h (Options::get_initializer_suffix,
          Options::initializer_suffix): New declarations.
        * src/options.icc (Options::get_initializer_suffix): New function.
        * src/options.cc (DEFAULT_INITIALIZER_SUFFIX): New constant.
          (Options::initializer_suffix): New variable.
          (Options::short_usage): Document option "-F".
          (Options::long_usage): Document option "-F".
          (Options constructor): Initialize initializer_suffix.
          (Options destructor): Dump initializer_suffix.
          (long_options): Add option "-F".
          (Options::operator()): Accept option "-F". Sets initializer_suffix.
        * src/key-list.cc (output_keyword_blank_entries): Output
          initializer_suffix.
        * doc/gperf.texi: Document option "-F".

        * COPYING: Replace with GPL version 2 (with new FSF address and Y2K
          safe year format).

        * doc/gpl.texinfo: New file.
        * doc/gperf.texi: Document it.
        * doc/Makefile.in (gperf.info, gperf.dvi, gperf.html, gperf_toc.html):
          Update dependencies.

        * doc/Makefile.in (MAKEINFO): Unset LANG while running makeinfo.

1998-05-20  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * doc/Makefile.in (gperf.dvi, clean): Remove gperf.cps.
          (install, installdirs, uninstall): Don't install gperf.dvi. The
          info and HTML documentations are sufficient for on-line use, and
          users who wish to print the documentation (in PS or DVI format)
          can do this directly off the source distribution.
          (DVIPS): Use "-D600" instead of "-Pljfour", for portability.

1998-05-20  Akim Demaille  <demaille@inf.enst.fr>

        * doc/gperf.texi: Many modifications:
          (Output Format): Declare `hash' and `in_word_set' as functions.
          (Concept Index): New section.
          (Title page): Use standard presentation.
          (Top): Use @top instead of @unnumbered so that automatic master
          update works.
          (Motivation): Avoid spaces in @var.
          (Options): Use the standard name ``Invoking ...''.
          (Options): Declare also the long form of the options.
          (Options): Remove redundant @itemize when @table is used.

1998-05-08  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

        * aclocal.m4 (CL_PROG_INSTALL): Set cl_cv_path_install, not
          ac_cv_path_install.

Sat May  2 13:20:54 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * gperf-2.7 released.

Sat May  2 12:31:51 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * src/version.cc (version_string): Remove the "(C++ version)" suffix.
          It's redundant: the early C versions of gperf are called cperf.
          Reported by Karl Berry.
        * src/option.cc (Options::operator()): Trim the output of "gperf -v".

Thu Apr 16 13:22:16 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * lib/Makefile.in, src/Makefile.in: Don't use $(TARGET_ARCH).
          Solaris "make" sets it to a value not understood by "cc".

Wed Apr 15 23:52:14 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * lib/Makefile.in, src/Makefile.in: Don't use implicit rules. Don't
          use $<. AIX "make" and OSF/1 "make" have problems with both.
        * src/gen-perf.cc, src/key-list.cc: Cast free() argument to char*,
          otherwise it doesn't compile on SunOS 4.
        * src/key-list.h: Declare structs outside of other declarations,
          needed for OSF/1 cxx 5.5.
        * lib/getopt.h: Use prototypes if __STDC__ || __cplusplus.
          Don't give a prototype for getopt(), to avoid error on SunOS 4.
        * lib/getopt.c: Declare strncmp, to avoid warnings.

Tue Apr 14 23:24:07 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * lib/GetOpt.{h,cc}: Remove files.
        * lib/getopt.{h,c}, lib/getopt1.c: New files, from GNU libc.
        * lib/configure.in (AC_INIT): Search for hash.cc, not GetOpt.cc.
        * lib/Makefile.in (OBJECTS): Remove GetOpt.o, add getopt.o, getopt1.o.
          (getopt.o, getopt1.o, hash.o): Use explicit building rules. Some
          "make"s don't support to have both implicit rules for "%.o : %.c"
          and "%.o : %.cc" in the same Makefile.
        * lib/hash.{h,cc}: Remove #pragma; there are no templates here.
        * src/option.h (Options::usage): Remove.
          (Options::short_usage, Options::long_usage): Declare.
        * src/option.cc (Options::usage): Remove.
          (Options::short_usage, Options::long_usage): New functions.
          (long_options): New array.
          (Options::operator()): Use getopt_long instead of GetOpt::operator(),
          change all references to GetOpt members.

        * src/std-err.{h,cc}: Remove files.
        * src/gen-perf.cc, src/key-list.cc, list-node.cc, new.cc, options.cc:
          Call fprintf(stderr) instead of Std_Err::report_error().
        * src/key-list.h, src/list-node.h, src/options.h: Don't use class
          Std_Err any more.
        * src/option.cc (program_name): New variable.
        * src/Makefile.in: Remove STD_ERR_H.
          (OBJECTS): Remove std-err.o.

Mon Mar 23 01:03:35 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * aclocal.m4, {lib,src,tests}/configure.in: Remove CL_CC_WORKS and
          CL_CXX_WORKS, already contained in autoconf 2.12.

        * src/gen-perf.cc, src/key-list.cc: Move some code from
          Gen_Perf::Gen_Perf() to Key_List::output().
        * src/Makefile.in: Update dependencies.

        * src/options.{h,cc}: Remove option "-p".
        * src/key-list.cc (Key_List::set_output_types): Rewrite.
          (default_array_type, default_return_type): Remove.
        * src/key-list.cc: Adjust "const" handling.
          + With option "-t" [TYPE], don't emit wrong code if there is no
            space before the struct's opening brace.

Sun Mar 22 16:59:15 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * src/key-list.{h,cc}: Completely reorganized the output routines.
          Rewrote from scratch the output_switch() function. Use classes
          (Output_Constants, Output_Expr, Output_Compare) for abstraction.
          In particular:
          + Don't emit trailing whitespace and spurious blank lines.
          + Adjust indentation of the arrays.
          + Don't emit commas at the end of array initializers and
            struct initializers.
          + With option "-l" [LENTABLE], compare the length before
            fetching the word from memory.
          + With option "-S" [SWITCH], emit the comparison code just once,
            not once in every switch statement.
          + With option "-S" [SWITCH], choose the right switch statement
            through a binary search, not a linear search.
          + With option "-S" [SWITCH], emit straightforward comparisons
            instead of switch statements with just one "case" label.
          + With options "-S -p -t" [SWITCH, POINTER, TYPE], don't emit
            spurious empty elements at the beginning of the wordlist array.
          + With option "-D" [DUP] and not option "-S" [SWITCH], if there
            is no more room for duplicate entries in the lookup array,
            don't call `assert (i != 0)'. Instead, make the array larger :-)
          + With option "-D" [DUP], if there are no duplicates, don't
            automatically fall back to the non-"-D" algorithm. If the user
            wants the non-"-D" algorithm, he can just not specify "-D".
          + With option "-D" [DUP] and either options "-p -t" [POINTER, TYPE]
            or not option "-S" [SWITCH], don't emit spurious empty elements
            at the beginning of the wordlist array.
          + With option "-D" [DUP], simplify the detection and processing
            of duplicate entries in the lookup array.
          + With options "-D -l" [DUP, LENTABLE] and not option "-S" [SWITCH],
            don't forget to emit the lengthtable array.
          + With options "-D -l -S" [DUP, LENTABLE, SWITCH], don't forget to
            compare the lengths before comparing the strings.

        * src/gen-perf.cc: No need to include <assert.h>.
        * src/options.cc: Likewise.

        * src/options.cc: Don't use `errno' after freopen failed.
        * src/std-err.cc: `report_error' doesn't call strerror(errno) any
          more. No need to include <string.h> and <errno.h>.

        * tests/Makefile.in (check-*): Any difference between .exp and .out
          is a failure. Don't ignore whitespace differences.

        * tests/Makefile.in (check-lang-syntax): Add some more checks.

Fri Mar 20 00:54:54 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * tests/jscript.gperf: Renamed from tests/javascript.gperf, because
          of Minix and SVR2 14-character filename limit.
        * src/key-list.cc (output_string): New function.
          (Key_List::output_switch, Key_List::output_keyword_table): Call it.

        * src/options.{h,icc,cc} (get_wordlist_name): New function. Add
          option -W.
        * src/key-list.cc (Key_List::output_switch,
          Key_List::output_keyword_table, Key_List::output_lookup_function):
          Use it.
        Patch from William Bader <wbader@CSEE.Lehigh.Edu>.

        * src/version.cc: Bump version number directly from 2.5 to 2.7,
          because Schmidt's last release from 1991 carries version number 2.6.

Tue Jul 30 00:02:39 1991  Douglas C. Schmidt  (schmidt at net4.ics.uci.edu)

        * Fixed a small bug in the Key_List::output_keyword_table routine
          that caused an extra newline to be printed if there where no
          leading blank entries... (who cares, right?!)

Mon Jul 29 22:05:40 1991  Douglas C. Schmidt  (schmidt at net4.ics.uci.edu)

        * Modified the handling of the -E (emit enums rather than
          #defines) option in conjunction with the -G option.  Now, if -G
          and -E are given the enums are generated outside the lookup
          function, rather than within it!

Mon Apr  8 18:17:04 1991  Doug Schmidt  (schmidt at net4.ics.uci.edu)

        * Yucko, there was a bug in the handling of -c (and of course the
          new -I command in key-list.cc).  Apparently when I added the
          super-duper hack that provided support for duplicate keys I
          forgot to update the strcmp output...

Mon Mar  9 02:19:04 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * Moved the documentation to doc/, put the stuff borrowed from
          libg++ into lib/.
        * Rewrote all Makefile.in's for better compliance with GNU standards.
        * Autoconf based configuration. Rewrote all configure.in's. Added
          aclocal.m4, with macros from CLISP and CLN. Added Makefile.devel.
        * src/depend: Removed. Dependencies are now in src/Makefile.in.

        * src/bool-array.icc: New file, contains inline functions, from both
          src/bool-array.h and src/bool-array.cc.
        * src/options.icc: New file, contains inline functions, from both
          src/options.h and src/options.cc.
        * src/read-line.icc: New file, contains inline functions, from both
          src/read-line.h and src/read-line.cc.

        * src/bool-array.h: Don't include <std.h>.
        * src/bool-array.cc: Include <string.h>.
        * src/gen-perf.cc: No need to include <ctype.h>. Don't include
          <_G_config.h>.
        * src/hash-table.cc: Don't include <std.h> and <builtin.h>. Include
          <string.h> and lib/hash.h instead.
        * src/iterator.cc: Don't include <std.h>.
        * src/key-list.cc: Don't include <builtin.h>. Include <string.h> and
          <stdlib.h> instead.
        * src/list-node.cc: Don't include <std.h>. Include <stdlib.h> instead.
          Remove `index' hack.
        * src/main.cc: Don't include <_G_config.h>.
        * src/new.cc: Don't include <std.h>. Include <stdlib.h> instead.
        * src/options.cc: Don't include <builtin.h>. Include <string.h> and
          <stdlib.h> instead.
        * src/read-line.cc: Don't include <builtin.h>. Include <stdlib.h>
          instead.
        * src/std-err.cc: Don't include <std.h>. Include <string.h> (for Irix).
        * src/vectors.h: No need to include <stdio.h>.
        * src/version.cc: No need to include <stdio.h>.

        * src/bool-array.h: Change `STORAGE_TYPE' from int to unsigned int.
        * src/bool-array.{h,cc}: Change type of `Bool_Array::size' from int
          to unsigned int.
        * src/bool-array.{h,cc}: Change type of `Bool_Array::init' argument
          from STORAGE_TYPE to unsigned int.
        * src/gen-perf.{h,cc}: Change two `Gen_Perf::compute_disjoint_union'
          argument types from `char *' to `const char *'.
        * src/iterator.h: Change type of `Iterator::str' and argument of
          `Iterator::Iterator' from `char *' to `const char *'.
        * src/iterator.cc: Cast to `unsigned char' before calling `isdigit'.
        * src/key-list.{h,cc}: Change type of `Key_List::array_type',
          `Key_List::return_type', `Key_List::struct_tag',
          `Key_List::include_src', `default_array_type', `default_return_type'
          and return type of `Key_List::get_array_type',
          `Key_List::get_special_input', `Key_List::save_include_src' from
          `char *' to `const char *'.
        * src/key-list.cc: Change "pretty gross" assignment.
        * src/key-list.cc: Don't use `alloca', HP-UX CC lacks it.
        * lib/GetOpt.cc: Likewise.
        * src/key-list.cc (merge): Use iteration instead of recursion.
        * src/list-node.{h,cc}: Change type of `List_Node::key',
          `List_Node::rest', `List_Node::char_set' from `char *' to
          `const char *'.
        * src/new.cc: Don't use BUFSIZ. Conditionalize the throw() declaration.
        * src/read-line.h: Don't use BUFSIZ.
        * src/read-line.cc: Make CHUNK_SIZE a constant, and use allocate the
          buffers on the stack by default. Use memcpy for copying buffers.
          Include <string.h>.
        * src/read-line.icc (get_line): Use iteration instead of tail recursion.
          Don't call ungetc(EOF,stdin).
        * src/std-err.{h,cc}: Change type of `Std_Err::program_name' and of
          argument `Std_Err::report_error' from `char *' to `const char *'.
        * src/std-err.cc: `report_error' doesn't call `exit' any more. All
          callers changed to do that themselves.
        * src/trace.h: Make constructor/destructor calls non-inline.

        * src/key-list.cc (output_hash_function): If option[CPLUSPLUS],
          always make the hash function inline.
          (output): Declare the hash function inline, with the right name.
        * src/options.{h,cc}, src/gen-perf.cc, src/key-list.cc: Remove
          options -g, making it on by default. Remove option -a. Instead,
          introduce "-L KR-C", "-L C", "-L ANSI-C", "-L C++".
        * src/options.{h,cc}, src/key-list.cc: Add option -I.
        * src/key-list.cc: Don't emit "const" if compiling in mode "-L KR-C".
        * src/key-list.cc: Don't emit a comma at the end of an enum list.
        * src/main.cc: Remove COUNT_TIME code.
        * src/vectors.h, src/key-list.cc, src/options.cc, src/list-node.cc:
          ALPHA_SIZE defaults to 256 now. Add option -7.

        * tests/javascript.gperf: New file.
        * tests/jstest*.gperf, tests/validate: New tests.

Sat Jan 31 01:38:11 1998  Alexandre Oliva <oliva@dcc.unicamp.br>

	* src/Makefile.in ($(TARGETPROG)): Add $(CFLAGS).

Wed Jan 28 01:56:00 1998  Manfred Hollstein  <manfred@s-direktnet.de>

	* configure.in (package_makefile_rules_frag): New and
	redirect stderr from ${srcdir}/config.shared to
	${package_makefile_rules_frag}.
	* src/configure.in: Ditto.
	* tests/configure.in: Ditto.

Fri Jan 23 08:00:41 1998  H.J. Lu  (hjl@gnu.org)

	* gperf.texi (@ichapter): Changed to @chapter.

Wed Jan 14 09:16:48 1998  H.J. Lu  (hjl@gnu.org)

	* src/key-list.cc, src/key-list.h (Key_List::strcspn): Don't
	define if strcspn is defined.

Fri Jan 24 13:23:47 1997  Mike Stump  <mrs@cygnus.com>

	* src/new.cc (operator delete): Add the exception specification.

Mon Feb  5 19:29:16 1996  Per Bothner  <bothner@kalessin.cygnus.com>

	* src/read-line.cc (Read_Line::readln_aux):  Handle EOF if last	line
	has a length which is an exact multiple of CHUNK_SIZE.  (Used to throw
	away the line's contents.)  From Bruno Haible <haible@ilog.ilog.fr>.
	* src/Makefile.in ($(TARGETPROG)):  Add -lm to link line.

Tue Jun 11 13:43:50 1996  Brendan Kehoe  <brendan@lisa.cygnus.com>

	* src/list-node.cc (List_Node): Reorder init of nodes to
	match declaration order.
	* src/hash-table.cc (Hash_Table): Likewise.

Tue Oct 10 16:37:28 1995  Mike Stump  <mrs@cygnus.com>

	* src/new.cc: Since malloc/delete are not paired, we cannot call
	free.

Wed Jan  4 12:40:14 1995  Per Bothner  <bothner@kalessin.cygnus.com>

	* src/Makefile.in ($(TARGETPROG)):  Link with $(LDFLAGS).
	Patch from John Interrante <interran@uluru.stanford.edu>.

Sat Nov  5 19:12:48 1994  Jason Merrill  (jason@phydeaux.cygnus.com)

	* src/Makefile.in (LIBS): Remove.

Tue Oct 18 17:51:14 1994  Per Bothner  <bothner@kalessin.cygnus.com>

	* src/std-err.cc:  Use stderror, instead of the non-standard
	sys_nerr and sys_errlist.

Sat Sep 17 22:02:13 1994  Per Bothner  (bothner@kalessin.cygnus.com)

	* src/key-list.cc (output_hash_function):
	Patch from William Bader <wbader@CSEE.Lehigh.Edu>.

Fri Jul 15 09:38:11 1994  Per Bothner  (bothner@cygnus.com)

	* src/std-err.cc:  #include <errno.h>, and only declare
	extern int errno if errno is not a macro.

Mon May 30 17:29:34 1994  Per Bothner  (bothner@kalessin.cygnus.com)

	* Makefile.in (src_all, install):  Make sure to add '/' after
	`pwd` in $rootme, as expected by FLAGS_TO_PASS.

Wed May 11 00:47:22 1994  Jason Merrill  (jason@deneb.cygnus.com)

	Make libg++ build with gcc -ansi -pedantic-errors
	* src/options.h: Lose commas at end of enumerator lists.

Sun Dec  5 19:16:40 1993  Brendan Kehoe  (brendan@lisa.cygnus.com)

	* src/hash-table.cc (Hash_Table::~Hash_Table): Don't pass an
	argument to fprintf, since it's not expecting one.

Fri Nov 26 19:03:18 1993  Per Bothner  (bothner@kalessin.cygnus.com)

	* src/list-node.cc:  #undef index, for the sake of broken NeXT,

Thu Nov  4 11:16:03 1993  Per Bothner  (bothner@kalessin.cygnus.com)

	* Makefile.in (install):  Use INSTALL_DATA for gperf.1.

Mon Oct 25 18:40:51 1993  Per Bothner  (bothner@kalessin.cygnus.com)

	* src/key-list.cc (Key_List::read_keys):  Use POW macro
	to increase hash table size to power of 2.

	* options.h (LARGE_STACK_ARRAYS):  New flag.  Defaults to zero.
	* gen-perf.cc, key-list.cc, read-line.cc:	
	Only stack-allocate large arrays if LARGE_STACK_ARRAYS is set.
	* main.cc (main):  Only call setrlimit (RLIMIT_STACK, ...)
	if LARGE_STACK_ARRAYS.

Mon Oct  4 17:45:08 1993  Per Bothner  (bothner@kalessin.cygnus.com)

	* src/gen-perf.cc:  Always use ANSI rand/srand instead of BSDisms.

Wed Aug 18 12:19:53 1993  Per Bothner  (bothner@kalessin.cygnus.com)

	* Makefile.in (src_all):  Make less verbose output.

Fri May 28 14:01:18 1993  Per Bothner  (bothner@rtl.cygnus.com)

	* src/gen-perf.cc (Gen_Perf::change):  Don't use gcc-specific
	2-operand conditional expression.
	* src/key-list.cc (Key_List::output_lookup_array):
	Don't use variable-size stack arrays, unless compiled by g++.

Tue May  4 14:08:44 1993  Per Bothner  (bothner@cygnus.com)

	Changes (mostly from Peter Schauer) to permit compilation
	using cfront 3.0 and otherwise be ARM-conforming.
	* src/key-list.h:  class Key_List must use public derivation
	of base class Std_Err (because Gen_Perf::operator() in gen-perf.cc
	calls Std_Err::report_error).
	* src/gen-perf.cc (Gen_Perf::affects_prev), src/hash-table.cc
	(Hash_Table::operator()):  Don't use gcc-specific 2-operand
	conditional expression.
	* src/iterator.cc (Iterator::operator()):  Don't use gcc-specific
	range construct in case label.
	* key-list.cc (Key_List::output_lookup_array, Key_List::read_keys),
	src/gen-perf.cc (Gen_Perf::operator(), src/read-line.cc
	(Read_Line::readln_aux):  If not gcc, don't allocate
	variable-sized arrays on stack.
	* src/new.cc (operator new):  Argument type should be size_t.
	* key-list.cc (Key_List::output_lookup_array, Key_List::read_keys),
	new/cc (::operator new): Don't use non-standard >?= operator.

Tue Apr 27 20:11:30 1993  Per Bothner  (bothner@cygnus.com)

	* src/Makefile.in:  Define TARGETPROG, and use it.

Mon Apr 19 00:29:18 1993  Per Bothner  (bothner@cygnus.com)

	* Makefile.in, configure.in:  Re-vamped configure scheme.
	* gperf.texinfo:  Renamed to gperf.texi.
	* src/bool-array.{h,cc}:  ANSIfy bzero->memset.

Sat Jan 30 20:21:28 1993  Brendan Kehoe  (brendan@lisa.cygnus.com)

	* tests/Makefile.in (mostlyclean): Also delete aout, cout, m3out,
	pout, and preout.

Tue Dec 29 08:58:17 1992  Ian Lance Taylor  (ian@cygnus.com)

	* Makefile.in: pass $(FLAGS_TO_PASS) to all calls to make.
	(FLAGS_TO_PASS): added INSTALL, INSTALL_DATA, INSTALL_PROGRAM.

Mon Dec 21 18:46:46 1992  Per Bothner  (bothner@rtl.cygnus.com)

	* tests/expected.* renamed to *.exp to fit in 14 chars.
	* tests/Makefile.in:  Update accordingly.
	Also rename output.* to *.out.
	* src/Makefile.in (clean):  Remove gperf program.

Wed Dec  9 14:33:34 1992  Per Bothner  (bothner@cygnus.com)

	* src/hash-table.cc, src/bool-array.h: ANSIfy bzero->memset.

Thu Dec  3 19:34:12 1992  Per Bothner  (bothner@cygnus.com)

	* Makefile.in (distclean, realclean): Don't delete
	Makefile before recursing.

Fri Nov  6 13:41:49 1992  Per Bothner  (bothner@rtl.cygnus.com)

	* key-list.{h,cc}:  Remove MAX_INT (and similar) constant
	fields from Key_List class, and use INT_MAX (etc) from limits.h.
	* key-list.{h,cc}, options.{h,cc}, vectors.h:  Removed all
	uses of initialized const fields, as they are non-standard
	- and their use was easy to do away with.  Mostly, just
	made the constants static non-fields in the .cc file.

Mon Nov  2 13:10:11 1992  Per Bothner  (bothner@cygnus.com)

	* tests/Makefile.in:  When generating cinset.c, don't pass -C,
	since -C assumes an ANSI compiler.  Add the -C flag (with -a)
	when generating test.out.3 instead.
	* tests/expected.out.3:  Update accordingly.

Wed Aug 12 11:47:54 1992  Per Bothner  (bothner@cygnus.com)

	* Makefile.in:  Factor out common flags into $(FLAGS_TO_PASS).
	* Makefile.in:  'install-info' depends on gperf.info.

Mon Aug 10 11:39:52 1992  Ian Lance Taylor  (ian@dumbest.cygnus.com)

	* Makefile.in, src/Makefile.in: always create installation
	directories.

Mon Jul 20 15:33:21 1992  Mike Stump  (mrs@cygnus.com)

	* src/new.cc (operator new):  Add cast from void * to char *,
	since it is not a standard conversion.

Wed Jun 17 16:25:30 1992  Per Bothner  (bothner@rtl.cygnus.com)

	* src/gen-perf.cc:  #include <_G_config.h> for _G_SYSV.
	* src/key-list.cc:  alloca() hair.
	* src/main.cc (main):  Only call getrlimit if _G_HAVE_SYS_RESOURCE.
	* Makefile,in, {src,test}/Makefile.in:  Fix *clean rules.

Fri May 29 13:21:13 1992  Per Bothner  (bothner@rtl.cygnus.com)

	* src/gen-perf.cc:  Replace USG -> _G_SYSV.

Thu May 14 13:58:36 1992  Per Bothner  (bothner@rtl.cygnus.com)

	* src/Makefile.in:  Don't pass obsolete flag -DUNLIMIT_STACK.
	* tests/Makefile.in (clean): Fix.

Sat Mar  7 00:03:56 1992  K. Richard Pixley  (rich@rtl.cygnus.com)

	* gperf.texinfo: added menu item hook.

Wed Feb 26 18:04:40 1992  K. Richard Pixley  (rich@cygnus.com)

	* Makefile.in, configure.in: removed traces of namesubdir,
	  -subdirs, $(subdir), $(unsubdir), some rcs triggers.  Forced
	  copyrights to '92, changed some from Cygnus to FSF.

Sun Jan 26 19:21:58 1992  Per Bothner  (bothner at cygnus.com)

	* tests/Makefile.in:  Use re-directed stdin instead of file
	name in argv.  This allows us to remove the filename
	from the output, the expected output, and hence the diffs.
	(Note that the input file is in $(srcdir), which we cannot
	place in the expected out files.)
	* tests/expected.out.[1235]:  Edit out input filename,
	to match new output.

Thu Jun 28 16:17:27 1990  Doug Schmidt  (schmidt at brilliant)

	* Wow, first fix on the new job!  There was a dumb error
	  in Key_List::output_lookup_function, where I printed the
	  string "&wordlist[key]" instead of the correct "&wordlist[index]".
	  
	* Added a couple of #ifdefs for USG support.
	  	
Sun Jun  3 17:16:36 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Updated the version number to 2.5 and sent to Doug Lea for release
          with the latest GNU libg++.

        * Changed the error handling when a keyword file cannot be opened
          (now calls perror).

Wed May 30 14:49:40 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Instrumented the source code with trace statements automagically
          inserted using my new automated trace instrumentation tool!

Wed May  9 11:47:41 1990  Doug Schmidt  (schmidt at siam.ics.uci.edu)

        * Really fixed the previous bug.  Turns out that a small amount
          of logic had to be duplicated to handle static links that occur
          as part of dynamic link chains.  What a pain!!!

Tue May  8 23:11:44 1990  Doug Schmidt  (schmidt at siam.ics.uci.edu)

        * Fixed a stupid bug in Key_List::output_lookup_array that was
          causing incorrect counts to be generated when there were both
          static and dynamic links occurring for the same hash value.
          Also simplified the code that performs the logic in this routine.

Mon Apr 30 17:37:24 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Fixed stupid bug in Key_List::output_lookup_array that was
          making the generated lookup[] array contain `chars' even
          when the values stored in the chars are greater than 127!

        * Changed the behavior of the -G (global table) option so that it
          will output the `length[]' array in the global scope along with
          the `word_list[]' array.

        * Fixed a stupid bug in Key_List::output_lookup_function that
          would always output the complicated `duplicate-handling' lookup
          logic, even when there were no duplicates in the input!

        * Yikes, had to modify a bunch of stuff in key-list.cc to correctly
          handle duplicate entries.  Changed the generated code so that
          the MIN_HASH_VALUE is no longer subtracted off when calculating
          the hash value for a keyword.  This required changing some other
          code by substituting MAX_HASH_VALUE for TOTAL_KEYS in several places.
          Finally, this means that the generated tables may contain leading 
          null entries, but I suppose it is better to trade-off space to get 
          faster performance...

Mon Mar 26 13:08:43 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Updated version number to 2.4 to reflect the latest changes.

        * Changed the main program so that it always prints out gperf's
          execution timings to the generated output file.
          
Sun Mar 25 12:39:30 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Added the -Z option so that users can specify the name of the
          generated class explicitly.  Updated documentation to reflect
          this change.
          
        * Modified the generated C++ class interface so that the functions
          are declared static (to remove the overhead of passing the `this'
          pointer).  This means that operator()() can no longer be used,
          since it only works on non-static member functions.
          Also changed things so that there is no constructor (why waste
          the extra call, when it doesn't do anything, eh?)

        * Modified the behavior of Key_List::output when the -L C++ option
          is enabled.  Previously the code generated use const data members
          to record MIN_WORD_LENGTH, MIN_HASH_VALUE, etc.  However, as
          pointed out by James Clark this may result in suboptimal behavior
          on the part of C++ compilers that can't inline these values.
          Therefore, the new behavior is identical to what happens with
          -L C, i.e., either #defines or function-specific enums are used.
          Why sacrifice speed for some abstract notion of `code purity?' ;-)

Tue Mar  6 18:17:42 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Added the -E option that defines constant values using an enum
          local to the lookup function rather than with #defines.  This
          also means that different lookup functions can reside in the
          same file.  Thanks to James Clark (jjc@ai.mit.edu). 

Sat Mar  3 20:19:00 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Added a special case to key_list::output_switch that doesn't
          generate extra comparisons when the `-S' is given an argument
          of 1 (the normal case).  This should speed up the generated
          code output a tad...

Fri Feb 23 14:21:28 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Renamed all instances of member function get_keysig_size
          to get_max_keysig_size, since this is more precise...

        * Changed all occurrences of charset to keysig (stands for ``key
          signature'') to reflect the new naming convention used in the 
          USENIX paper.

Thu Feb 22 11:28:36 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Changed the name of the generated associated values table from
          asso_value to asso_values to reflect conventions in the USENIX
          C++ paper.

Thu Feb 15 23:29:03 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Updated the gperf.texinfo file to fix some formatting problems
          that had crept in since last time.

Wed Feb 14 23:27:24 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Fixed stupid bug in key-list.cc (get_special_input), wher
          gperf replaced each '%' with the succeeding character.

        * Added support for multiple target language generation.  Currently
          handled languages are C and C++, with C as the default.  Updated
          documentation and option handler to reflect the changes.

        * Added a global destructor to new.cc and removed the #ifdef, since
          the bloody thing now works with libg++.

Mon Feb 14 13:00:00 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Found out that my gperf paper was accepted at the upcoming
          USENIX C++ Conference in San Francisco.  Yow!

Tue Jan 30 09:00:29 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * #ifdef'd out the new.cc memory allocator, since there are
          problems with this and the libg++ stuff.

        * Changed key-list.h so that class Vectors is a public (rather
          than private) base class for class Key_List.  The previous
          form was illegal C++, but wasn't being caught by the old
          g++ compiler.  Should work now... ;-)

Sun Dec 10 14:08:23 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added several changes from rfg@ics.uci.edu.  These changes
          help to automate the build process.

Wed Nov 15 15:49:33 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Removed conditional compilation for GATHER_STATISTICS.  There's
          really no good reason to avoid collecting this info at run-time,
          since that section of code is *hardly* the bottleneck... ;-)

        * Simplified the C output routines in Key_List::set_output_types
          and Key_List::output_keyword_table a bit in order to
          speed-up and clean up the code generation.

        * Modified function Key_List::get_special_input so that it does
          not try to `delete' a buffer that turned out to be too short.
          This is important since the new memory management scheme
          does not handle deletions.  However, adding a small amount of
          garbage won't hurt anything, since we generally don't do this
          operation more than a couple times *at most*!

        * Created a new file (new.cc) which includes my own overloaded
          operator new.  This function should dramatically reduce the
          number of calls to malloc since it grabs large chunks and
          doles them out in small pieces.  As a result of this change
          the class-specific `operator new' was removed from class List_Node.

Tue Nov 14 21:45:30 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Continued to refine the great hack.  The latest trick is to
          try and replace most uses of dynamic memory (i.e., calls to
          new) with uses of gcc dynamic arrays (i.e., an alloca solution).
          This makes life much easier for the overall process-size, since 
          it reduces the amount of overhead for memory management.  As a
          side-effect from this change there is no reason to have the
          Bool_Array::dispose member function, so it's outta here!

        * Fixed a stupid bug that was an disaster waiting to happen...
          Instead of making the boolean array large enough to index
          max_hash_value it was only large enough to index max_hash_value
          - 1.  Once again, an off-by-one mistake in C/C++!!!!

Mon Nov 13 19:38:27 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added the final great hack!  This allows us to generate hash tables
          for near-perfect hash functions that contain duplicates, *without*
          having to use switch statements!  Since many compilers die on large
          switch statements this feature is essential.  Furthermore, it appears
          that the generated code is often *smaller* than that put out by
          compilers, even though a large, sparse array must be created.
          Here's the general idea:

             a. Generate the wordlist as a contiguous block of keywords, 
                just as before when using a switch statement.  This
                wordlist *must* be sorted by hash value. 

             b. Generate the lookup array, which is an array of signed
                {chars,shorts,ints}, (which ever allows full coverage of
                the wordlist dimensions).  If the value v, where v =
                lookup[hash(str,len)], is >= 0 and < TOTAL_KEYWORDS, then we
                simply use this result as a direct access into the wordlist 
                array to snag the keyword for comparison.  

             c. Otherwise, if v is < -TOTAL_KEYWORDS or > TOTAL_KEYWORDS
                this is an indication that we'll need to search through
                some number of duplicates hash values.  Using a hash
                linking scheme we'd then index into a different part of
                the hash table that provides the starting index and total
                length of the duplicate entries to find via linear search!

Sun Nov 12 13:48:10 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Simplified Key_List::output_min_max considerably by recognizing
          that since the keyword list was already sorted by hash value finding 
          the min and max values is trivial!

        * Improved the debugging diagnostics considerably in classes Key_List,
          Hash_Table, and Gen_Perf.

        * Modified the `-s' option so that a negative argument is now 
          interpreted to mean `allow the maximum associated value to be
          about x times *smaller* than the number of input keys.'  This
          should help prevent massive explosion of generated hash table
          size for large keysets.

Sat Nov 11 11:31:13 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added a field in class Key_List that counts the total number
          of duplicate keywords, both static and dynamic.

        * Added a new member function Bool_Array that deletes the dynamic
          memory allocated to Bool_Array::storage_array.  This space may
          be needed for subsequent options, so it made sense to free it as
          soon as possible...
          
        * Renamed file/class Alpha_Vectors to Vectors, to avoid problems
          with 14 character length filenames on SYSV.  Also changed file
          adapredefined.gperf to adadefs.gperf in the ./tests directory.

        * Modified class Options by changing the member function
          Options::total_positions to Options::get_charset_size and
          Options::set_charset_size.  These two routines now either return
          the total charset size *or* the length of the largest keyword
          if the user specifies the -k'*' (ALLCHARS) option.  This change
          cleans up client code.

        * Merged all the cperf changes into gperf.
        
        * Made sure to explicitly initialize perfect.fewest_collisions to
          0.

        * Cleaned up some loose ends noticed by Nels Olson.
          1.  Removed `if (collisions <= perfect.fewest_collisions)'
              from Gen_Perf::affects_prev since it was superfluous.
          2.  Removed the fields best_char_value and best_asso_value
              from Gen_Perf.  There were also unnecessary.
          3.  Fixed a braino in the Bool_Array::bool_array_reset
              function.  Since iteration numbers can never be zero
              the `if (bool_array.iteration_number++ == 0)' must be
              `if (++bool_array.iteration_number == 0).'
          4.  Modified Std_Err::report_error so that it correctly handles
              "%%".

        * It is important to note that -D no longer enables -S.
          There is a good reason for this change, which will become
          manifested in the next release... (suspense!).

        * Made some subtle changes to Key_List::print_switch so that if finally
          seems to work correctly.  Needs more stress testing, however...

        * Made a major change to the Key_List::print_switch function.
          The user can now specify the number of switch statements to generate
          via an argument to the -S option, i.e., -S1 means `generate 1
          switch statement with all keywords in it,' -S2 means generate
          2 switch statements with 1/2 the elements in each one, etc.
          Hopefully this will fix the problem with C compilers not being
          able to generate code for giant switch statements (but don't
          hold your breath!)

        * Changed Key_List::length function to Key_List::keyword_list_length.

        * Added a feature to main.c that prints out the starting wall-clock
          time before the program begins and prints out the ending wall-clock
          time when the program is finished.

        * Added the GATHER_STATISTICS code in hash-table.c so we can
          keep track of how well double hashing is doing.  Eventually,
          GATHER_STATISTICS will be added so that all instrumentation
          code can be conditionally compiled in.

        * Fixed a stupid bug in Key_List::print_switch routine.  This
          was necessary to make sure the generated switch statement worked
          correctly when *both* `natural,' i.e., static links and dynamic
          links, i.e., unresolved duplicates, hash to the same value.

        * Modified Bool_Array::~Bool_Array destructor so that
          it now frees the bool_array.storage_array when it is no longer
          needed.  Since this array is generally very large it makes sense
          to return the memory to the freelist when it is no longer in use.

        * Changed the interface to constructor Hash_Table::Hash_Table.  This 
          constructor now passed a pointer to a power-of-two sized buffer that 
          serve as storage for the hash table.  Although this weakens information
          hiding a little bit it greatly reduces dynamic memory fragmentation,
          since we can now obtain the memory via a call to alloca, rather
          than malloc.  This change modified Key_List::read_keys calling
          interface.

        * Since alloca is now being used more aggressively a conditional
          compilation section was added in main.c. Taken from GNU GCC,
          this code gets rid of any avoidable limit on stack size so that
          alloca does not fail.  It is only used if the -DRLIMIT_STACK
          symbol is defined when gperf is compiled. 

        * Added warnings in option.c so that user's would be informed
          that -r superceeds -i on the command-line.
          
        * Rewrote Gen_Perf::affects_prev.  First, the code structure
          was cleaned up considerably (removing the need for a dreaded
          goto!).  Secondly, a major change occurred so that Gen_Perf::affects_prev
          returns FALSE (success) when fewest_hits gets down to whatever
          it was after inserting the previous key (instead of waiting for
          it to reach 0).  In other words, it stops trying if it can
          resolve the new collisions added by a key, even if there are
          still other old, unresolved collisions.  This modification was
          suggested by Nels Olson and seems to *greatly* increase the
          speed of gperf for large keyfiles.  Thanks Nels!

        * In a similar vein, inside the Gen_Perf::change routine 
          the variable `perfect.fewest_collisions is no longer initialized
          with the length of the keyword list.  Instead it starts out at
          0 and is incremented by 1 every time change () is called.
          The rationale for this behavior is that there are times when a
          collision causes the number of duplicates (collisions) to
          increase by a large amount when it would presumably just have
          gone up by 1 if none of the asso_values were changed.  That is,
          at the beginning of change(), you could initialize fewest_hits
          to 1+(previous value of fewest_hits) instead of to the number of
          keys.  Thanks again, Nels.

        * Replaced alloca with new in the Gen_Perf::change function.
          This should eliminate some overhead at the expense of a little
          extra memory that is never reclaimed.

        * Renamed Gen_Perf::merge_sets to Gen_Perf::compute_disjoint_union
          to reflect the change in behavior.

        * Added the -e option so users can supply a string containing
          the characters used to separate keywords from their attributes.
          The default behavior is ",\n".

        * Removed the char *uniq_set field from LIST_NODE and modified
          uses of uniq_set in perfect.c and keylist.c.  Due to changes
          to Gen_Perf::compute_disjoint_sets this field was no longer
          necessary, and its removal makes the program smaller and
          potentially faster. 
          
        * Added lots of changes/fixes suggested by Nels Olson
          (umls.UUCP!olson@mis.ucsf.edu).  In particular:
          1.  Changed Bool_Array so that it would dynamically create
              an array of unsigned shorts rather than ints if the 
              LO_CAL symbol was defined during program compilation.
              This cuts the amount of dynamic memory usage in half,
              which is important for large keyfile input.
          2.  Added some additional debugging statements that print extra
              info to stderr when the -d option is enabled.
          3.  Fixed a really stupid bug in Key_List::print_switch
              A right paren was placed at the wrong location, which broke
              strlen ().
          4.  Fixed a subtle problem with printing case values when keylinks
              appear.  The logic failed to account for the fact that there
              can be keylinks *and* regular node info also!
          5.  Changed the behavior of Key_List::read_keys so that it would
              honor -D unequivocally, i.e., it doesn't try to turn off dup
              handling if the user requests it, even if there are no
              immediate links in the keyfile input. 
          6.  Modified the -j option so that -j 0 means `try random values
              when searching for a way to resolve collisions.'
          7.  Added a field `num_done' to the Gen_Perf struct.  This is used
              to report information collected when trying to resolve
              hash collisions.
          8.  Modified the merge_sets algorithm to perform a disjoint
              union of two multisets.  This ensures that subsequent
              processing in Gen_Perf::affect_prev doesn't
              waste time trying to change an associated value that is
              shared between two conflicting keywords.
          9.  Modified Gen_Perf::affects_prev so that it doesn't try
              random jump values unless the -j 0 option is enabled.
          10. Fixed a silly bug in Gen_Perf::change.  This problem caused
              gperf to seg fault when the -k* option was given and the
              keyfile file had long keywords.
        
Sun Oct 29 00:18:55 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)

        * Modified class-specific new operations for Read_Line and
          List_Node so they don't fail if SIZE is larger than twice
          the previous buffer size.  Note we double buffer size
          everytime the previous buffer runs out, as a heuristic
          to reduce future calls to malloc.

Sun Oct 22 13:49:43 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Updated gperf version number to 2.0.  Send to Doug Lea for
          incorporation into the long-awaited `official' libg++ 1.36
          release! 

        * Thanks to Nels Olson a silly bug in Gen_Perf::change ()
          was fixed.  This problem caused gperf to seg fault when
          the -k* option was given and the keyfile file had long
          keywords.
          
        * Modified Key_List::print_hash_function so that it output
          max_hash_value + 1 (rather than just max_hash_value) for
          any associated value entries that don't correspond to
          keyword charset characters.  This should speed up rejection
          of non-keyword strings a little in some cases.

Sat Oct 21 19:28:36 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Fixed Key_List::print_hash_function so that it no longer output
          things like `return 0 + ...'  Although this probably gets
          optimized away by even the worst C compilers there isn't any
          point tempting fate... ;-)

        * Fixed class List_Node's constructor so that it wouldn't a priori
          refuse to consider trying to hash keys whose length is less
          than the smallest user-specified key position.  It turns out
          this is not a problem unless the user also specifies the -n
          (NOLENGTH) option, in which case such keys most likely
          don't have a prayer of being hashed correctly!

        * Changed the name of the generated lookup table from `Hash_Table'
          to `asso_value' to be consistent with the gperf paper.

Tue Oct 17 14:19:48 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added a flag GATHER_STATISTICS in the Makefile.  If defined
          during compilation this turns on certain collection facilities
          that track the performance of gperf during its execution.  In
          particular, I want to see how many collisions occur for the
          double hashing Hash_Table.

        * Added a safety check so that we don't screw up if the total
          number of `resets' of the Bool_Array exceeds MAX_INT.  Since
          this number is around 2^31 it is unlikely that this would ever
          occur for most input, but why take the risk?

        * Changed the behavior for the -a (ANSI) option so that the
          generated prototypes use int rather than size_t for the LEN 
          parameter.  It was too ugly having to #include <stddef.h> all
          over the place...

Mon Oct 16 11:00:35 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Continued to work on the gperf paper for the USENIX C++
          conference.  At some point this will be merged back into
          the gperf documentation...

Sat Oct 14 20:29:43 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)

        * Added a majorly neat hack to Bool_Array, suggested by rfg.
          The basic idea was to throw away the Ullman array technique.
          The Ullman array was used to remove the need to reinitialize all 
          the Bool_Array elements to zero everytime we needed to determine
          whether there were duplicate hash values in the keyword list.  
          The current trick uses an `iteration number' scheme, which takes
          about 1/3 the space and reduces the overall program running a 
          time by about 20 percent for large input!  The hack works as 
          follows:
          
          1. Dynamically allocation 1 boolean array of size k.
          2. Initialize the boolean array to zeros, and consider the first
             iteration to be iteration 1.
          2. Then on all subsequent iterations we `reset' the bool array by
             kicking the iteration count by 1. 
          3. When it comes time to check whether a hash value is currently
             in the boolean array we simply check its index location.  If
             the value stored there is *not* equal to the current iteration
             number then the item is clearly *not* in the set.  In that
             case we assign the iteration number to that array's index
             location for future reference.  Otherwise, if the item at
             the index location *is* equal to the iteration number we've
             found a duplicate.  No muss, no fuss!
             
Mon Oct  2 12:30:54 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Changed some consts in options.h to enumerals, since g++
          doesn't seem to like them at the moment!

Sat Sep 30 12:55:24 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Fixed a stupid bug in Key_List::print_hash_function that manifested
          itself if the `-k$' option was given (i.e., only use the key[length]
          character in the hash function).

        * Added support for the -C option.  This makes the contents of
          all generated tables `readonly'.

        * Changed the handling of generated switches so that there is
          only one call to str[n]?cmp.  This *greatly* reduces the size of
          the generated assembly code on all compilers I've seen.

        * Fixed a subtle bug that occurred when the -l and -S option
          was given.  Code produced looked something like:

          if (len != key_len || !strcmp (s1, resword->name)) return resword;

          which doesn't make any sense.  Clearly, this should be:

          if (len == key_len && !strcmp (s1, resword->name)) return resword;

Tue Sep 26 10:36:50 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Changed class Read_Line's definition so that it no longer
          needs to know about the buffering scheme used to speed up 
          dynamic memory allocation of input keywords and their
          associated attributes.  This means that operator new is no longer
          a friend of Read_Line.

Mon Sep 25 23:17:10 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Decided that Obstacks had too much overhead, so they were
          removed in favor of super-efficient, low-overhead buffered
          storage allocation hacks in Read_Line and List_Node.

        * No longer try to inline functions that g++ complains about
          (Key_List::Merge and Key_List::Merge_Sort).

Sun Sep 24 13:11:24 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Changed classes Read_Line and List_Node to use Obstacks in order
          to cache memory allocation for keyword strings and List_Nodes.
          
        * Continued to experiment with inheritance schemes.
        
        * Added a new file `alpha.h', that declares static data shared
          (i.e., inherited) between classes List_Node and Key_List.

Tue Sep 12 16:14:41 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Made numerous changes to incorporate multiple inheritance in 
          gperf.

Wed Aug 16 23:04:08 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added the -DCOMPILER_FIXED flag to the ./src/Makefile.  This
          implies that people trying to compile gperf need to have a
          working version of the new g++ compiler (1.36.0).

        * Removed some extra spaces that were being added in the generated
          C code.

Mon Jul 24 17:09:46 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Fixed PRINT_HASH_FUNCTION and PRINT_LOOKUP_FUNCTION in keylist.c
          so that the generated functions take an unsigned int length argument.
          If -a is enabled the prototype is (const char *str, size_t len).

Fri Jul 21 13:06:15 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Fixed a typo in PRINT_KEYWORD_TABLE in keylist.cc that prevented
          the indentation from working correctly.

        * Fixed a horrible typo in PRINT_KEYWORD_TABLE in keylist.cc
          that prevented links from being printed correctly.

Tue Jul 18 16:04:31 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Fixed up readline.cc and readline.h so that they work OK
          with g++ compilers that aren't completely up-to-date.
          If symbol COMPILER_FIXED is defined then the behavior
          that works on my more recent version of g++ is enabled.

Sun Jul  9 17:53:28 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Changed the ./tests subdirectory Makefile so that it 
          uses $(CC) instead of gcc.

Sun Jul  2 21:52:15 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Fixed a number of subtle bugs that occurred when -S was
          combined with various and sundry options.

        * Added the -G option, that makes the generated keyword table
          a global static variable, rather than hiding it inside
          the lookup function.  This allows other functions to directly
          access the contents in this table.

        * Added the "#" feature, that allows comments inside the keyword
          list from the input file. Comment handling takes place in readline.c.  
          This simplifies the code and reduces the number of malloc calls.
          
        * Also added the -H option (user can give the name of the hash
          function) and the -T option (prevents the transfer of the type decl
          to the output file, which is useful if the type is already defined
          elsewhere).

Thu Jun 22 20:39:39 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Modified many classes so that they would inherit Std_Err as
          a base class.  This makes things more abstract...

Fri Jun 16 14:23:00 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Modified the -f (FAST) option.  This now takes an argument.
          The argument corresponds to the number of iterations used
          to resolve collisions.  -f 0 uses the length of the
          keyword list (which is what -f did before).  This makes
          life much easier when dealing with large keyword files.

Tue Jun  6 17:53:27 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added the -c (comparison) option.  Enabling this
          will use the strncmp function for string comparisons.
          The default is to use strcmp.

        * Fixed a typo in key_list.cc (PRINT_SWITCH).  This caused
          faulty C code to be generated when the -D, -p, and -t
          options were all enabled.

Thu May 25 14:07:21 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)

        * Once again, changed class Read_Line to overload global operator
          new.  Hopefully, this will work...!

Sun May 21 01:51:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Modified Key_List::print_hash_function () so that it properly
          formats the associated values in the hash table according to
          the maximum number of digits required to represent the largest
          value.

        * Removed the named return value from class Hash_Table's
          operator (), since this causes a seg fault when -O is enabled.
          No sense tripping subtle g++ bugs if we don't have to.... ;-)

        * Removed the operator new hack from Read_Line, since this seemed
          to create horrible bus error problems.
                    
        * Changed many class member functions and data members to be `static', 
          if they don't manipulate this!
          
Fri May 12 23:06:56 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Changed class Std_Err to use static member functions, a la
          Ada or Modula 2.  This eliminates the need for an explicit
          error-handler class object.

        * Added the ``named return value'' feature to Hash_Table::operator ()
          and Bool_Array::operator [], just for the heck of it.... ;-)

        * Changed the previous hack in Read_Line so that we now use
          the overloaded global `new' instead of NEW_STRING!

Wed May  3 17:36:55 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Updated to version 1.7.  This reflects the recent major changes
          and the new C port.

        * Modified the GNU getopt.cc routine to have a class-based interface.

        * Fixed a typo in Perfect.cc ~Perfect that prevented the actual maximum
          hash table size from being printed (maybe the stream classes
          weren't so bad after all.... ;-).

        * Added support for the -f option.  This generates the perfect
          hash function ``fast.''  It reduces the execution time of
          gperf, at the cost of minimizing the range of hash values.

Tue May  2 16:23:29 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Added an efficiency hack to Read_Line.  Instead of making
          a call to operator NEW (a.k.a. malloc) for each input string
          a new member function NEW_STRING stores a large buffer from
          which new strings are carved out, growing the buffer if
          necessary.  It might be useful to add this throughout the
          program....

        * Removed all unnecessary calls to DELETE.  If the program is about
          to exit it is silly to waste time freeing memory.

        * Added the GNU getopt program to the distribution.  This makes
          GPERF portable to systems that don't include getopt in libc.
          
        * Added a strcspn member to class Key_List.  This also increases
          portability.

        * Added the get_include_src function from keylist.c as a member
          function in class Key_List.  Hopefully every function is 
          now associated with a class.  This aids abstraction and
          modularity.

        * Ported gperf to C.  From now on both K&R C and GNU G++ versions
          will be supported.  There will be two ChangeLog files, one
          for each version of the program.

Mon May  1 16:41:45 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Fixed a bug with -k'*'.  This now prints out *all* the cases
          up to the length of the longest word in the keyword set.

Sun Apr 30 12:15:25 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Removed all use of the stream classes.  Too ugly, slow, and
          not handled by the c++-mode formatter....

        * Modified the handling of links (i.e., keywords that have
          identical hash values as other keywords).  This should 
          speed up hash function generation for keyword sets with
          many duplicate entries.  The trick is to treat duplicate
          values as equivalence classes, so that each set of duplicate
          values is represented only once in the main list processing.

        * Fixed some capitialization typos and indentations mistakes in 
          Key_List::print_hash_function.

Sat Apr 29 12:04:03 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Fixed a typo/logico in Key_List::print_switch that prevented
          the last keyword in the keyword list to be print out.  This
          requires further examination.....

        * Fixed a stupid bug in List_Node::List_node.  If the -k'*' option
          was enabled the KEY_SET string wasn't getting terminated with
          '\0'!

Fri Apr 28 12:38:35 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Renamed strexp.h and strexp.cc to iterator.h and iterator.cc.
          Also changed the strexp class to iterator.  Continued to work
          on style...

        * Updated the version number to 1.6.  This reflects all the 
          recent changes.

Thu Apr 27 00:14:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added the -D option that properly handles keyword sets that
          contain duplicate hash values.

        * Continued the stylistic changes.  Added the #pragma once
          directive to all the *.h files.  Removed all #defines and
          replaced them with static consts.  Also moved the key_sort
          routine from options.cc into the options class as a 
          member function.

Mon Apr  3 13:26:55 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Made massive stylistic changes to bring source code into
          conformance with GNU style guidelines.

Thu Mar 30 23:28:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Fixed up the output routines so that they generate code
          corresponding to the GNU style guidelines.

Sat Mar 11 13:12:37 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Fixed Stderr constructors so that they wouldn't try to
          use the base class initializer syntax for the static 
          class variable Program_Name.  G++ 1.34 is stricter in
          enforcing the rules!

Fri Mar 10 11:24:14 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Removed -v and ``| more'' from the Makefile to keep rfg happy...

Thu Mar  2 12:37:30 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Sent latest GNU gperf version 1.5 to Doug Lea for inclusion
          into libg++ 1.34.  Note that there is a small bug with
          the new %{ ... %} source inclusion facility, since it doesn't
          understand comments and will barf if %{ or %} appear nested
          inside the outermost delimiters.  This is too trivial of
          a defect to fix at the moment...

Tue Feb 28 11:19:58 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added the -K option, which allows the user to provide a
          alternative name for the keyword structure component.
          The default is still ``name.''

        * Added the LEX and YACC-like ability to include arbitrary
          text at the beginning of the generated C source code output.
          This required two new functions Get_Special_Input, 
          Key_List::Save_Include_Src;

        * Fixed memory allocation bug in Key_List::Set_Types.
          Variable Return_Type needs 1 additional location
          to store the "*" if the -p option is used.
          
        * Added code to NULL terminate both Struct_Tag and Return_Type,
          *after* the strncpy (stupid mistake).
          
Mon Feb 27 14:39:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added a new option -N.  This allows the user to specify the
          name to be used for the generated lookup function.  The
          default name is still ``in_word_set.''  This makes it
          possible to completely automate the perfect hash function
          generation process!

Mon Feb 20 23:33:14 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Corrected the Hash_Table::operator () function so that
          *it* is responsible for deciding when a new key has the
          same signature as a previously seen key.  The key length 
          information is now used internally to this function to
          decide whether to add to the hash table those keys with
          the same key sets, but different lengths.  Before, this
          was handled by the Key_List::Read_Keys function.  However,
          this failed to work for certain duplicate keys, since
          they weren't being entered into the hash table properly.

Sun Feb 19 16:02:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Modified class Options by moving the enum Option_Type out
          of the class.  This is to satisfy the new enumeration
          scope rules in C++.

Sun Jan 15 15:12:09 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Incremented the version number upto 1.4 to reflect the new 
          options that affect the generated code.  Send the new 
          distribution off to Michael for use with g++ 1.33.

        * Added a fix to Key_List::Read_Keys so that it checks for links
          properly when the -n option is used.  Previously, it didn't
          catch obvious links, which caused it to spend large amount
          of time searching for a solution that could never occur!

        * Modified the Key_List data structure to record *both* the 
          minimum and the maximum key lengths.  This information
          is now computed in Key_List::Read_Keys, and thus 
          Key_List::Print_Min_Max doesn't need to bother.

        * Modifed the key position iterator scheme in options.cc to
          eliminate the need for member function Options::Advance.
          Now, the Options::Get function performs the advancement
          automatically, obviating the need for an extra function call.

        * Added the new function Options::Print_Options, to print out
          the user-specified command line options to generated C
          output file.

        * Added a new function, Key_List::Print_Keylength_Table,
          which creates a table of lengths for use in speeding
          up the keyword search.  This also meant that a new
          option, -l (LENTABLE) is recognized.  It controls 
          whether the length table is printed and the comparison
          made in the generated function ``in_word_set.''

        * Added a comment at the top of the generated C code
          output file that tells what version of gperf was used.
          Next, I'll also dump out the command line options
          as a comment too.  Thanks to Michael Tiemann for the
          feedback on this.

        * Fixed the -n option to make it work correctly with
          other parts of the program (most notably the Perfect::Hash
          function and the computation of minimum and maximum lengths.

Fri Jan 13 21:25:27 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)

        * Realized the the need to add a test that will enable
          optimziation of the generated C code in the ``hash'' function
          by checking whether all the requested key positions are
          guaranteed to exist due to the comparison in `in_word_set.''
          I'll put this in soon....

Thu Jan 12 20:09:21 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added pascal, modula3, and modula2 tests inputs to the 
          Makefile
        
        * Recognised that there is a bug with the -n option.  However
          I'm too busy to fix it properly, right now.  The problem 
          is that the generated #define end up being 0, since that's
          my hack to make -n work.  This needs complete rethinking!

Tue Jan 10 00:08:16 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Added a new option, -n, that instructs gperf to not use the
          length of an identifier when computing the hash functions.
          I'm not sure how useful this is!
          
        * Retransmitted the distribution to rocky.oswego.edu.  Hopefully,
          this will work!

        * Began fixing the indentation and capitalization to conform
          to the GNU coding guidelines.

Mon Jan  9 22:23:18 1989  Doug Schmidt  (schmidt at pompe.ics.uci.edu)

        * Fixed horrible bug in Read_Line::Readln_Aux.  This was
          a subtle and pernicous off-by-1 error, that overwrote
          past the last character of the input string buffer.  I
          think this fault was killing the vax!

        * Yow, fixed an oversight in List_Node::List_Node, where the
          pointer field Next was uninitialized.  Luckily, the new routine
          seems to return 0 filled objects the first time through!

Sun Jan  8 13:43:14 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Modified the ``key linked'' diagnostic in Key_List::Read_Keys
          to be more helpful and easy to read.

        * Fixed the List_Node::List_Node so that it would ignore trailing
          fields if the -t option was not enabled.

        * Moved the List_Node declarations out of keylist.h and
          into a file of its own, called listnode.cc and listnode.h
          Made Set_Sort a member function of class List_Node.

        * Massively updated the documentation in the gperf.texinfo file.
        
        * Polished off the major revision to the print functions,
          added a few new tests in the Makefile to check for the
          validity of the program and ftp'ed the entire distribution
          off to Doug Lea for libg++. ( changed it to
          1.3 to reflect the major changes with the generated
          C code ).

        * Fixed Key_List::Print_Switch to deal with the -p and -t options.
          This meant that the ``still-born'' function Key_List::
          Print_Type_Switch was superflous, so I removed it.
          Also, removed the restriction in Option that the -p and
          -t options couldn't be used simultaneously.

        * Modified List_Node::List_Node, to perform only 1 call to 
          ``new'' when dynamically allocating memory for the Key_Set
          and the Uniq_Set.

Sat Jan  7 14:10:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Fixed a big bug with the new policy of nesting the
          wordlist inside of generated function ``in_word_set.''
          I'd forgotten to declare the wordlist array as static!
          ( arrgh ).

        * Added a new function Key_List::Set_Types, that figures out
          the return type for generated function ``in_word_set,''
          the user-defined ``struct tag,'' if one is used, and also
          formates the array type for the static local array.

        * Changed the print routines to take advantage of the
          new -p option.

        * Began adding the hooks to allow the return of a pointer
          to a user defined struct location from the generated
          ``in_word_set'' function instead of the current 0 or 1
          return value.  Created function Key_List::Print_Type_Switch
          and added option -p to class Option, allowing the user to 
          request generation of the aforementioned pointers returned 
          instead of booleans.

        * Put in checks in class Option to make sure that -S and -t
          options are not used simultaneously.  This restriction
          will be removed in subsequent releases, once I decide on
          a clean way to implement it.

        * Sent version 1.2 to Doug Lea for possible inclusion into
          the libg++ distribution.
          
        * Moved the static word_list array inside the generated function
          in_word_set.  This supports better data hiding.

        * Added a texinfo file, gperf.texinfo
          
        * Revised the Makefile to cleanup the droppings from texinfo
          and changed the name of gperf.cc and gperf.h to perfect.cc
          and perfect.h.

Fri Jan  6 13:04:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Implemented the switch statement output format.  Much better
          for large datasets in terms of space used.

        * Added new functions to break up the Key_List::Output function.
          Functions added were Key_List::Print_Switch, Key_List::Print_Min_Max,
          Key_List::Print_Keyword_Table, Key_List::Print_Hash_Function,
          and Key_List::Print_Lookup_Function.  This simplifies the
          big mess in Key_List::Output considerably!
          
        * Added switch statement option to Options, which potentially 
          trades time for space in the generated lookup code.

Thu Jan  5 22:46:34 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)

        * Released version 1.1
        
        * Fixed a bug with Gperf::Merge_Set, it was skipping letters shared
          between the Set_1 and Set_2.

        * Added the optimal min/max algorithm in Key_List::Output.  This
          runs in O ( 3n/2 ), rather than O ( 2n ) time.

        * Changed Gperf::Sort_Set to use insertion sort, rather than
          bubble sort.
        
        * Added a check in Key_List::Output for the special case where
          the keys used are 1,$.  It is possible to generate more
          efficient C code in this case.
