Deleted Added
full compact
1c1
< Sat Nov 11 13:43:17 1989 Doug Schmidt (schmidt at zola.ics.uci.edu)
---
> Sat May 2 12:31:51 1998 Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de>
3,4c3,730
< * Modified options by changing macro TOTAL_POSITIONS to GET_CHARSET_SIZE
< and SET_CHARSET_SIZE. These two routines now either return
---
> * 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
9,10c735,736
< Fri Nov 10 15:21:19 1989 Doug Schmidt (schmidt at zola.ics.uci.edu)
<
---
> * Merged all the cperf changes into gperf.
>
14,20d739
< Wed Nov 1 21:39:54 1989 Doug Schmidt (schmidt at zola.ics.uci.edu)
<
< * Upgraded the version number to 2.0, reflecting all the
< major recent changes!
<
< * Rearranged code so that fewer source lines are greater than 80 columns.
<
23c742
< from affects_prev () since it was superfluous.
---
> from Gen_Perf::affects_prev since it was superfluous.
25,26c744,745
< from PERFECT. There were also unnecessary.
< 3. Fixed a braino in boolarray.c's bool_array_reset ()
---
> from Gen_Perf. There were also unnecessary.
> 3. Fixed a braino in the Bool_Array::bool_array_reset
30,32c749
< 4. Broke the -h help options string into 3 pieces. This
< should silence broken C compilers for a while!
< 5. Modified `report_error ()' so that it correctly handled
---
> 4. Modified Std_Err::report_error so that it correctly handles
35,36d751
< Tue Oct 31 23:01:11 1989 Doug Schmidt (schmidt at siam.ics.uci.edu)
<
41c756
< * Made some subtle changes to print_switch so that if finally
---
> * Made some subtle changes to Key_List::print_switch so that if finally
44,46c759
< Mon Oct 30 15:06:59 1989 Doug Schmidt (schmidt at zola.ics.uci.edu)
<
< * Made a major change to the keylist.c's print_switch () function.
---
> * Made a major change to the Key_List::print_switch function.
55,57c768
< * Changed keylist.c's length () function to keyword_list_length ().
< Also put an extern decl for this function and max_key_length ()
< into the keylist.h file (don't know why it wasn't already there...).
---
> * Changed Key_List::length function to Key_List::keyword_list_length.
59,60d769
< Sun Oct 29 08:55:29 1989 Doug Schmidt (schmidt at siam.ics.uci.edu)
<
65c774
< * Added the GATHER_STATISTICS code in hashtable.c so we can
---
> * Added the GATHER_STATISTICS code in hash-table.c so we can
70,76c779
< * Modified xmalloc.c's buffered_malloc () routine so that it
< rounded the SIZE byte requests up to the correct alignment
< size for the target machine.
<
< Sat Oct 28 11:17:36 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu)
<
< * Fixed a stupid bug in keylist.c's print_switch () routine. This
---
> * Fixed a stupid bug in Key_List::print_switch routine. This
81,93c784
< * Modified LIST_NODE so that the char *char_set field is redeclared
< as char char_set[1] and placed at the bottom of the struct. This
< enables us to play the old `variable-length string in the struct
< trick' (third time I fell for it this week, chief!). The
< main purpose of this is to remove n calls to buffered_malloc,
< where n is the number of keywords.
<
< * Added a new function to xmalloc.c called buffered_malloc. This
< reduces the number of calls to malloc by grabbing large chunks
< of memory and doling them out in small pieces. Almost all uses
< of xmalloc were replaced with calls to buffered_malloc ().
<
< * Modified boolarray.c's bool_array_destroy () function so that
---
> * Modified Bool_Array::~Bool_Array destructor so that
98,100c789,791
< * Changed the interface to hash_table_init. This function is
< now passed a pointer to a power-of-two sized buffer that serves
< as storage for the hash table. Although this weakens information
---
> * 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
103c794
< than malloc. This change modified keylist.c's read_keys () calling
---
> than malloc. This change modified Key_List::read_keys calling
107,110c798,801
< compilation section was added to the init_all () routine 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.
---
> 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.
112,118d802
< * Moved the `destructor' for bool_array from destroy_all () in
< main.c into perfect_generate () in perfect.c. This enables
< us to get free up the large dynamic memory as soon as it is no
< longer necessary. Also moved the hash_table destructor from
< destroy_all into read_keys () from keylist.c. This accomplishes
< the same purpose, i.e., we can free up the space immediately.
<
122c806
< * Rewrote affects_prev () from perfect.c. First, the code structure
---
> * Rewrote Gen_Perf::affects_prev. First, the code structure
124c808
< goto!). Secondly, a major change occurred so that affects_prev ()
---
> goto!). Secondly, a major change occurred so that Gen_Perf::affects_prev
133c817
< * In a similar vein, inside the change () routine from perfect.c
---
> * In a similar vein, inside the Gen_Perf::change routine
145c829
< * Replaced alloca with xmalloc in perfect.c's change () function.
---
> * Replaced alloca with new in the Gen_Perf::change function.
149c833
< * Renamed perfect.c's merge_sets () to compute_disjoint_union ()
---
> * Renamed Gen_Perf::merge_sets to Gen_Perf::compute_disjoint_union
152,153d835
< Fri Oct 27 10:12:27 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu)
<
160,162c842,844
< to perfect.c's merge_set () described below this field was
< no longer necessary, and its removal makes the program
< smaller and potentially faster.
---
> to Gen_Perf::compute_disjoint_sets this field was no longer
> necessary, and its removal makes the program smaller and
> potentially faster.
166c848
< 1. Changed BOOL_ARRAY so that it would dynamically create
---
> 1. Changed Bool_Array so that it would dynamically create
173,174c855,857
< 3. Fixed a really stupid bug in the print_switch () from keylist.c.
< A right paren was placed at the wrong location.
---
> 3. Fixed a really stupid bug in Key_List::print_switch
> A right paren was placed at the wrong location, which broke
> strlen ().
178,179c861,864
< 5. Finally split the huge help string into two parts. This keeps
< breaking compilers with static limits on the length of tokens...
---
> 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.
182c867
< 7. Added a field `num_done' to the PERFECT struct. This is used
---
> 7. Added a field `num_done' to the Gen_Perf struct. This is used
187c872
< processing in perfect.c function affect_prev () doesn't
---
> processing in Gen_Perf::affect_prev doesn't
190,199c875,881
< 9. Modified affects_prev so that it doesn't try random jump
< values unless the -j 0 option is enabled.
< 10. Fixed a silly bug in perfect.c change ().
< This problem caused gperf to seg fault when
< the -k* option was given and the keyfile file had long
< keywords.
< 11. Changed the behavior of keylist.c's read_keys () routine
< 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.
---
> 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)
201c883,887
< Mon Oct 16 19:58:08 1989 Doug Schmidt (schmidt at glacier.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.
203,205c889,936
< * Fixed a number of small bugs kindly brought to my attention by
< Adam de Boor (bsw!adam@uunet.UU.NET). Thanks Adam! In particular,
< changed the behavior for the -a (ANSI) option so that the
---
> 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
209a941,948
> 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)
>
220c959
< 1. Dynamically allocate 1 boolean array of size k.
---
> 1. Dynamically allocation 1 boolean array of size k.
232a972,973
>
> Mon Oct 2 12:30:54 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu)
234c975,976
< Thu Oct 12 18:08:43 1989 Doug Schmidt (schmidt at zola.ics.uci.edu)
---
> * Changed some consts in options.h to enumerals, since g++
> doesn't seem to like them at the moment!
236c978
< * Updated the version number to 1.9.
---
> Sat Sep 30 12:55:24 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu)
237a980,983
> * 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).
>
254c1000
< Sat Sep 30 12:55:24 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu)
---
> Tue Sep 26 10:36:50 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu)
256,258c1002,1006
< * 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).
---
> * 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.
260c1008
< Mon Jul 24 17:09:46 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu)
---
> Mon Sep 25 23:17:10 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu)
262,264c1010,1012
< * Fixed a bug in PRINT_MIN_MAX that resulted in MAX_INT being printed
< for the MIN_KEY_LEN if there was only 1 keyword in the input file
< (yeah, that's a pretty unlikely occurrence, I agree!).
---
> * 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.
265a1014,1042
> * 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)
>
271a1049,1051
> * Fixed a typo in PRINT_KEYWORD_TABLE in keylist.cc that prevented
> the indentation from working correctly.
>
274a1055,1061
> 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.
>
280c1067
< Sun Jul 2 12:14:04 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu)
---
> Sun Jul 2 21:52:15 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu)
282,284d1068
< * Moved comment handling from keylist.c to readline.c. This
< simplifies the code and reduces the number of malloc calls.
<
293,294d1076
< Sat Jul 1 10:12:21 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu)
<
296c1078,1079
< list from the input file.
---
> list from the input file. Comment handling takes place in readline.c.
> This simplifies the code and reduces the number of malloc calls.
303c1086
< Fri Jun 30 18:22:35 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu)
---
> Thu Jun 22 20:39:39 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu)
305c1088,1089
< * Added Adam de Boor's changes. Created an UNSET_OPTION macro.
---
> * Modified many classes so that they would inherit Std_Err as
> a base class. This makes things more abstract...
307c1091
< Sat Jun 17 10:56:00 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu)
---
> Fri Jun 16 14:23:00 1989 Doug Schmidt (schmidt at zola.ics.uci.edu)
309,314d1092
< * Modified option.h and option.c so that all mixed operations
< between integers and enumerals are cast correctly to int.
< This prevents errors in some brain-damaged C compilers.
<
< Fri Jun 16 14:13:15 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu)
<
321c1099
< Wed Jun 7 23:07:13 1989 Doug Schmidt (schmidt at zola.ics.uci.edu)
---
> Tue Jun 6 17:53:27 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu)
323,325d1100
< * Updated to version 1.8 in preparation to release to Doug Lea
< and FSF.
<
330c1105,1107
< Tue Jun 6 16:32:09 1989 Doug Schmidt (schmidt at zola.ics.uci.edu)
---
> * 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.
332,334c1109
< * Fixed another stupid typo in xmalloc.c (XMALLOC). I accidentally
< left the ANSI-fied prototype in place. This obviously
< fails on old-style C compilers.
---
> Thu May 25 14:07:21 1989 Doug Schmidt (schmidt at siam.ics.uci.edu)
336,341c1111,1112
< * Fixed stupid typos in PRINT_SWITCH from the keylist.c. This
< caused the -D option to produce incorrect output when used
< in conjunction with -p and -t.
<
< * Replaced the use of STRCMP with STRNCMP for the generated
< C output code.
---
> * Once again, changed class Read_Line to overload global operator
> new. Hopefully, this will work...!
343c1114
< Fri Jun 2 23:16:01 1989 Doug Schmidt (schmidt at trinite.ics.uci.edu)
---
> Sun May 21 01:51:45 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu)
345,348c1116,1119
< * Added a new function (XMALLOC) and file (xmalloc.c). All
< calls to MALLOC were replaced by calls to XMALLOC. This
< will complain when virtual memory runs out (don't laugh,
< this has happened!)
---
> * 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.
350c1121,1123
< Thu Jun 1 21:10:10 1989 Doug Schmidt (schmidt at zola.ics.uci.edu)
---
> * 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.... ;-)
352,353c1125,1131
< * Fixed a typo in options.c that prevented the -f option
< from being given on the command-line.
---
> * 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)
355c1133,1135
< Wed May 3 17:48:02 1989 Doug Schmidt (schmidt at zola.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.
356a1137,1144
> * 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)
>
360,361c1148
< * Fixed a typo in perfect.c perfect_destroy that prevented the actual
< maximum hash table size from being printed.
---
> * Modified the GNU getopt.cc routine to have a class-based interface.
362a1150,1153
> * 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.... ;-).
>
369,371c1160,1165
< * Enabled the diagnostics dump if the debugging option is enabled.
<
< * Removed all calls to FREE (silly to do this at program termination).
---
> * 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....
372a1167,1180
> * 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.
>
374c1182,1183
< will be supported.
---
> will be supported. There will be two ChangeLog files, one
> for each version of the program.
375a1185,1492
> 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.