ChangeLog revision 58551
11844SwollmanSat May  2 12:31:51 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
250476Speter
31844Swollman        * src/version.cc (version_string): Remove the "(C++ version)" suffix.
41638Srgrimes          It's redundant: the early C versions of gperf are called cperf.
538183Speter          Reported by Karl Berry.
638183Speter        * src/option.cc (Options::operator()): Trim the output of "gperf -v".
71638Srgrimes
81638SrgrimesThu Apr 16 13:22:16 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
91638Srgrimes
1038183Speter        * lib/Makefile.in, src/Makefile.in: Don't use $(TARGET_ARCH).
111638Srgrimes          Solaris "make" sets it to a value not understood by "cc".
121844Swollman
131844SwollmanWed Apr 15 23:52:14 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
1438655Sjb
151844Swollman        * lib/Makefile.in, src/Makefile.in: Don't use implicit rules. Don't
161844Swollman          use $<. AIX "make" and OSF/1 "make" have problems with both.
1728945Speter        * src/gen-perf.cc, src/key-list.cc: Cast free() argument to char*,
181844Swollman          otherwise it doesn't compile on SunOS 4.
1942915Sjdp        * src/key-list.h: Declare structs outside of other declarations,
2042915Sjdp          needed for OSF/1 cxx 5.5.
2142915Sjdp        * lib/getopt.h: Use prototypes if __STDC__ || __cplusplus.
2242915Sjdp          Don't give a prototype for getopt(), to avoid error on SunOS 4.
2342915Sjdp        * lib/getopt.c: Declare strncmp, to avoid warnings.
2442915Sjdp
2542915SjdpTue Apr 14 23:24:07 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
2642915Sjdp
2742915Sjdp        * lib/GetOpt.{h,cc}: Remove files.
2842915Sjdp        * lib/getopt.{h,c}, lib/getopt1.c: New files, from GNU libc.
2942915Sjdp        * lib/configure.in (AC_INIT): Search for hash.cc, not GetOpt.cc.
3042915Sjdp        * lib/Makefile.in (OBJECTS): Remove GetOpt.o, add getopt.o, getopt1.o.
3129141Speter          (getopt.o, getopt1.o, hash.o): Use explicit building rules. Some
3242915Sjdp          "make"s don't support to have both implicit rules for "%.o : %.c"
3342915Sjdp          and "%.o : %.cc" in the same Makefile.
3442915Sjdp        * lib/hash.{h,cc}: Remove #pragma; there are no templates here.
3542915Sjdp        * src/option.h (Options::usage): Remove.
3642915Sjdp          (Options::short_usage, Options::long_usage): Declare.
3742915Sjdp        * src/option.cc (Options::usage): Remove.
3842915Sjdp          (Options::short_usage, Options::long_usage): New functions.
3929141Speter          (long_options): New array.
401844Swollman          (Options::operator()): Use getopt_long instead of GetOpt::operator(),
411844Swollman          change all references to GetOpt members.
4226051Sasami
431844Swollman        * src/std-err.{h,cc}: Remove files.
442353Sbde        * src/gen-perf.cc, src/key-list.cc, list-node.cc, new.cc, options.cc:
452827Sjkh          Call fprintf(stderr) instead of Std_Err::report_error().
462827Sjkh        * src/key-list.h, src/list-node.h, src/options.h: Don't use class
472827Sjkh          Std_Err any more.
482827Sjkh        * src/option.cc (program_name): New variable.
492827Sjkh        * src/Makefile.in: Remove STD_ERR_H.
501638Srgrimes          (OBJECTS): Remove std-err.o.
512827Sjkh
521638SrgrimesMon Mar 23 01:03:35 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
5343055Sjdp
5418529Sbde        * aclocal.m4, {lib,src,tests}/configure.in: Remove CL_CC_WORKS and
5531809Sbde          CL_CXX_WORKS, already contained in autoconf 2.12.
5618529Sbde
571638Srgrimes        * src/gen-perf.cc, src/key-list.cc: Move some code from
581638Srgrimes          Gen_Perf::Gen_Perf() to Key_List::output().
591638Srgrimes        * src/Makefile.in: Update dependencies.
6042450Sjdp
611638Srgrimes        * src/options.{h,cc}: Remove option "-p".
6261423Sbde        * src/key-list.cc (Key_List::set_output_types): Rewrite.
631638Srgrimes          (default_array_type, default_return_type): Remove.
641638Srgrimes        * src/key-list.cc: Adjust "const" handling.
651844Swollman          + With option "-t" [TYPE], don't emit wrong code if there is no
6638186Speter            space before the struct's opening brace.
6738186Speter
681638SrgrimesSun Mar 22 16:59:15 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
691638Srgrimes
7024761Sjdp        * src/key-list.{h,cc}: Completely reorganized the output routines.
7138186Speter          Rewrote from scratch the output_switch() function. Use classes
7238186Speter          (Output_Constants, Output_Expr, Output_Compare) for abstraction.
731638Srgrimes          In particular:
7442450Sjdp          + Don't emit trailing whitespace and spurious blank lines.
751844Swollman          + Adjust indentation of the arrays.
7638186Speter          + Don't emit commas at the end of array initializers and
7738186Speter            struct initializers.
781844Swollman          + With option "-l" [LENTABLE], compare the length before
7936673Sdt            fetching the word from memory.
801844Swollman          + With option "-S" [SWITCH], emit the comparison code just once,
8138186Speter            not once in every switch statement.
8238186Speter          + With option "-S" [SWITCH], choose the right switch statement
831844Swollman            through a binary search, not a linear search.
8436673Sdt          + With option "-S" [SWITCH], emit straightforward comparisons
8524761Sjdp            instead of switch statements with just one "case" label.
8638186Speter          + With options "-S -p -t" [SWITCH, POINTER, TYPE], don't emit
8738186Speter            spurious empty elements at the beginning of the wordlist array.
881844Swollman          + With option "-D" [DUP] and not option "-S" [SWITCH], if there
8942450Sjdp            is no more room for duplicate entries in the lookup array,
901844Swollman            don't call `assert (i != 0)'. Instead, make the array larger :-)
9138186Speter          + With option "-D" [DUP], if there are no duplicates, don't
9238186Speter            automatically fall back to the non-"-D" algorithm. If the user
931844Swollman            wants the non-"-D" algorithm, he can just not specify "-D".
941844Swollman          + With option "-D" [DUP] and either options "-p -t" [POINTER, TYPE]
951844Swollman            or not option "-S" [SWITCH], don't emit spurious empty elements
9638186Speter            at the beginning of the wordlist array.
9738186Speter          + With option "-D" [DUP], simplify the detection and processing
981844Swollman            of duplicate entries in the lookup array.
991844Swollman          + With options "-D -l" [DUP, LENTABLE] and not option "-S" [SWITCH],
10024761Sjdp            don't forget to emit the lengthtable array.
10138186Speter          + With options "-D -l -S" [DUP, LENTABLE, SWITCH], don't forget to
10238186Speter            compare the lengths before comparing the strings.
1031844Swollman
10442450Sjdp        * src/gen-perf.cc: No need to include <assert.h>.
1051844Swollman        * src/options.cc: Likewise.
10638186Speter
10738186Speter        * src/options.cc: Don't use `errno' after freopen failed.
1081844Swollman        * src/std-err.cc: `report_error' doesn't call strerror(errno) any
10936054Sbde          more. No need to include <string.h> and <errno.h>.
11036054Sbde
11138186Speter        * tests/Makefile.in (check-*): Any difference between .exp and .out
11238186Speter          is a failure. Don't ignore whitespace differences.
11336054Sbde
11436054Sbde        * tests/Makefile.in (check-lang-syntax): Add some more checks.
11536054Sbde
11638186SpeterFri Mar 20 00:54:54 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
11738186Speter
11836054Sbde        * tests/jscript.gperf: Renamed from tests/javascript.gperf, because
11942450Sjdp          of Minix and SVR2 14-character filename limit.
12036054Sbde        * src/key-list.cc (output_string): New function.
12138186Speter          (Key_List::output_switch, Key_List::output_keyword_table): Call it.
12238186Speter
12336054Sbde        * src/options.{h,icc,cc} (get_wordlist_name): New function. Add
1241638Srgrimes          option -W.
12526715Sasami        * src/key-list.cc (Key_List::output_switch,
12617510Speter          Key_List::output_keyword_table, Key_List::output_lookup_function):
12738186Speter          Use it.
12838186Speter        Patch from William Bader <wbader@CSEE.Lehigh.Edu>.
1291638Srgrimes
1301638Srgrimes        * src/version.cc: Bump version number directly from 2.5 to 2.7,
13126715Sasami          because Schmidt's last release from 1991 carries version number 2.6.
13217510Speter
13338186SpeterTue Jul 30 00:02:39 1991  Douglas C. Schmidt  (schmidt at net4.ics.uci.edu)
13438186Speter
1351638Srgrimes        * Fixed a small bug in the Key_List::output_keyword_table routine
13642450Sjdp          that caused an extra newline to be printed if there where no
13726715Sasami          leading blank entries... (who cares, right?!)
13817510Speter
13938186SpeterMon Jul 29 22:05:40 1991  Douglas C. Schmidt  (schmidt at net4.ics.uci.edu)
14038186Speter
1411638Srgrimes        * Modified the handling of the -E (emit enums rather than
1421844Swollman          #defines) option in conjunction with the -G option.  Now, if -G
14326715Sasami          and -E are given the enums are generated outside the lookup
14438186Speter          function, rather than within it!
14538186Speter
1461844SwollmanMon Apr  8 18:17:04 1991  Doug Schmidt  (schmidt at net4.ics.uci.edu)
1471844Swollman
14826715Sasami        * Yucko, there was a bug in the handling of -c (and of course the
14938186Speter          new -I command in key-list.cc).  Apparently when I added the
15038186Speter          super-duper hack that provided support for duplicate keys I
1511844Swollman          forgot to update the strcmp output...
15242450Sjdp
15326715SasamiMon Mar  9 02:19:04 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
15438186Speter
15538186Speter        * Moved the documentation to doc/, put the stuff borrowed from
1561844Swollman          libg++ into lib/.
1572870Swollman        * Rewrote all Makefile.in's for better compliance with GNU standards.
1582868Swollman        * Autoconf based configuration. Rewrote all configure.in's. Added
1591638Srgrimes          aclocal.m4, with macros from CLISP and CLN. Added Makefile.devel.
1601638Srgrimes        * src/depend: Removed. Dependencies are now in src/Makefile.in.
1611638Srgrimes
1621638Srgrimes        * src/bool-array.icc: New file, contains inline functions, from both
1632870Swollman          src/bool-array.h and src/bool-array.cc.
1641638Srgrimes        * src/options.icc: New file, contains inline functions, from both
16542915Sjdp          src/options.h and src/options.cc.
16642915Sjdp        * src/read-line.icc: New file, contains inline functions, from both
1671638Srgrimes          src/read-line.h and src/read-line.cc.
1681844Swollman
1691844Swollman        * src/bool-array.h: Don't include <std.h>.
1701844Swollman        * src/bool-array.cc: Include <string.h>.
1711638Srgrimes        * src/gen-perf.cc: No need to include <ctype.h>. Don't include
1721844Swollman          <_G_config.h>.
1731844Swollman        * src/hash-table.cc: Don't include <std.h> and <builtin.h>. Include
1741844Swollman          <string.h> and lib/hash.h instead.
1751638Srgrimes        * src/iterator.cc: Don't include <std.h>.
17674805Sru        * src/key-list.cc: Don't include <builtin.h>. Include <string.h> and
17718340Sswallace          <stdlib.h> instead.
17874805Sru        * src/list-node.cc: Don't include <std.h>. Include <stdlib.h> instead.
17974805Sru          Remove `index' hack.
18074805Sru        * src/main.cc: Don't include <_G_config.h>.
1811844Swollman        * src/new.cc: Don't include <std.h>. Include <stdlib.h> instead.
1821844Swollman        * src/options.cc: Don't include <builtin.h>. Include <string.h> and
1831844Swollman          <stdlib.h> instead.
18442915Sjdp        * src/read-line.cc: Don't include <builtin.h>. Include <stdlib.h>
18566534Speter          instead.
1861638Srgrimes        * src/std-err.cc: Don't include <std.h>. Include <string.h> (for Irix).
18742915Sjdp        * src/vectors.h: No need to include <stdio.h>.
1881844Swollman        * src/version.cc: No need to include <stdio.h>.
1891638Srgrimes
19042915Sjdp        * src/bool-array.h: Change `STORAGE_TYPE' from int to unsigned int.
1913859Sbde        * src/bool-array.{h,cc}: Change type of `Bool_Array::size' from int
1921638Srgrimes          to unsigned int.
1932353Sbde        * src/bool-array.{h,cc}: Change type of `Bool_Array::init' argument
1941638Srgrimes          from STORAGE_TYPE to unsigned int.
19517400Sjkh        * src/gen-perf.{h,cc}: Change two `Gen_Perf::compute_disjoint_union'
1961844Swollman          argument types from `char *' to `const char *'.
1973859Sbde        * src/iterator.h: Change type of `Iterator::str' and argument of
1981638Srgrimes          `Iterator::Iterator' from `char *' to `const char *'.
1991844Swollman        * src/iterator.cc: Cast to `unsigned char' before calling `isdigit'.
20036640Speter        * src/key-list.{h,cc}: Change type of `Key_List::array_type',
2011844Swollman          `Key_List::return_type', `Key_List::struct_tag',
2021844Swollman          `Key_List::include_src', `default_array_type', `default_return_type'
20342450Sjdp          and return type of `Key_List::get_array_type',
20428945Speter          `Key_List::get_special_input', `Key_List::save_include_src' from
20542915Sjdp          `char *' to `const char *'.
20642915Sjdp        * src/key-list.cc: Change "pretty gross" assignment.
20742915Sjdp        * src/key-list.cc: Don't use `alloca', HP-UX CC lacks it.
20842915Sjdp        * lib/GetOpt.cc: Likewise.
20942915Sjdp        * src/key-list.cc (merge): Use iteration instead of recursion.
21042915Sjdp        * src/list-node.{h,cc}: Change type of `List_Node::key',
21142915Sjdp          `List_Node::rest', `List_Node::char_set' from `char *' to
21238655Sjb          `const char *'.
21342915Sjdp        * src/new.cc: Don't use BUFSIZ. Conditionalize the throw() declaration.
21442915Sjdp        * src/read-line.h: Don't use BUFSIZ.
21517400Sjkh        * src/read-line.cc: Make CHUNK_SIZE a constant, and use allocate the
21628945Speter          buffers on the stack by default. Use memcpy for copying buffers.
21728945Speter          Include <string.h>.
21842915Sjdp        * src/read-line.icc (get_line): Use iteration instead of tail recursion.
21928945Speter          Don't call ungetc(EOF,stdin).
22028945Speter        * src/std-err.{h,cc}: Change type of `Std_Err::program_name' and of
22142915Sjdp          argument `Std_Err::report_error' from `char *' to `const char *'.
2221844Swollman        * src/std-err.cc: `report_error' doesn't call `exit' any more. All
22342915Sjdp          callers changed to do that themselves.
2241844Swollman        * src/trace.h: Make constructor/destructor calls non-inline.
2252353Sbde
2261844Swollman        * src/key-list.cc (output_hash_function): If option[CPLUSPLUS],
2275253Sache          always make the hash function inline.
2281844Swollman          (output): Declare the hash function inline, with the right name.
2293859Sbde        * src/options.{h,cc}, src/gen-perf.cc, src/key-list.cc: Remove
2301844Swollman          options -g, making it on by default. Remove option -a. Instead,
2311638Srgrimes          introduce "-L KR-C", "-L C", "-L ANSI-C", "-L C++".
2321638Srgrimes        * src/options.{h,cc}, src/key-list.cc: Add option -I.
2331638Srgrimes        * src/key-list.cc: Don't emit "const" if compiling in mode "-L KR-C".
2341638Srgrimes        * src/key-list.cc: Don't emit a comma at the end of an enum list.
23516663Sjkh        * src/main.cc: Remove COUNT_TIME code.
23642915Sjdp        * src/vectors.h, src/key-list.cc, src/options.cc, src/list-node.cc:
23731809Sbde          ALPHA_SIZE defaults to 256 now. Add option -7.
23838187Speter
23942450Sjdp        * tests/javascript.gperf: New file.
24042915Sjdp        * tests/jstest*.gperf, tests/validate: New tests.
24142450Sjdp
24216826SphkSat Jan 31 01:38:11 1998  Alexandre Oliva <oliva@dcc.unicamp.br>
24316437Sphk
2441638Srgrimes	* src/Makefile.in ($(TARGETPROG)): Add $(CFLAGS).
24516437Sphk
2461638SrgrimesWed Jan 28 01:56:00 1998  Manfred Hollstein  <manfred@s-direktnet.de>
24734179Sbde
24824750Sbde	* configure.in (package_makefile_rules_frag): New and
24942450Sjdp	redirect stderr from ${srcdir}/config.shared to
25024750Sbde	${package_makefile_rules_frag}.
25124750Sbde	* src/configure.in: Ditto.
25242915Sjdp	* tests/configure.in: Ditto.
25338655Sjb
25442915SjdpFri Jan 23 08:00:41 1998  H.J. Lu  (hjl@gnu.org)
25525468Sjdp
25625468Sjdp	* gperf.texi (@ichapter): Changed to @chapter.
25728945Speter
25831809SbdeWed Jan 14 09:16:48 1998  H.J. Lu  (hjl@gnu.org)
25942915Sjdp
26027910Sasami	* src/key-list.cc, src/key-list.h (Key_List::strcspn): Don't
26128945Speter	define if strcspn is defined.
26228945Speter
2631638SrgrimesFri Jan 24 13:23:47 1997  Mike Stump  <mrs@cygnus.com>
2641638Srgrimes
2651638Srgrimes	* src/new.cc (operator delete): Add the exception specification.
26655954Srgrimes
2671638SrgrimesMon Feb  5 19:29:16 1996  Per Bothner  <bothner@kalessin.cygnus.com>
2681638Srgrimes
26955954Srgrimes	* src/read-line.cc (Read_Line::readln_aux):  Handle EOF if last	line
27055954Srgrimes	has a length which is an exact multiple of CHUNK_SIZE.  (Used to throw
27155954Srgrimes	away the line's contents.)  From Bruno Haible <haible@ilog.ilog.fr>.
27255954Srgrimes	* src/Makefile.in ($(TARGETPROG)):  Add -lm to link line.
27355954Srgrimes
27455954SrgrimesTue Jun 11 13:43:50 1996  Brendan Kehoe  <brendan@lisa.cygnus.com>
27555954Srgrimes
27655954Srgrimes	* src/list-node.cc (List_Node): Reorder init of nodes to
27755954Srgrimes	match declaration order.
27855954Srgrimes	* src/hash-table.cc (Hash_Table): Likewise.
27948204Sjmg
2802298SwollmanTue Oct 10 16:37:28 1995  Mike Stump  <mrs@cygnus.com>
2812298Swollman
2822298Swollman	* src/new.cc: Since malloc/delete are not paired, we cannot call
28349328Shoek	free.
28449328Shoek
28549328ShoekWed Jan  4 12:40:14 1995  Per Bothner  <bothner@kalessin.cygnus.com>
28649328Shoek
28756971Sru	* src/Makefile.in ($(TARGETPROG)):  Link with $(LDFLAGS).
28849328Shoek	Patch from John Interrante <interran@uluru.stanford.edu>.
28949328Shoek
29049328ShoekSat Nov  5 19:12:48 1994  Jason Merrill  (jason@phydeaux.cygnus.com)
29149328Shoek
2921638Srgrimes	* src/Makefile.in (LIBS): Remove.
2932298Swollman
2941996SwollmanTue Oct 18 17:51:14 1994  Per Bothner  <bothner@kalessin.cygnus.com>
29549328Shoek
2961638Srgrimes	* src/std-err.cc:  Use stderror, instead of the non-standard
2971844Swollman	sys_nerr and sys_errlist.
29849328Shoek
2991638SrgrimesSat Sep 17 22:02:13 1994  Per Bothner  (bothner@kalessin.cygnus.com)
3002298Swollman
30142915Sjdp	* src/key-list.cc (output_hash_function):
30248204Sjmg	Patch from William Bader <wbader@CSEE.Lehigh.Edu>.
30349328Shoek
30442915SjdpFri Jul 15 09:38:11 1994  Per Bothner  (bothner@cygnus.com)
30542915Sjdp
30644946Sbde	* src/std-err.cc:  #include <errno.h>, and only declare
3071844Swollman	extern int errno if errno is not a macro.
30828945Speter
3091844SwollmanMon May 30 17:29:34 1994  Per Bothner  (bothner@kalessin.cygnus.com)
3101844Swollman
31149328Shoek	* Makefile.in (src_all, install):  Make sure to add '/' after
3121844Swollman	`pwd` in $rootme, as expected by FLAGS_TO_PASS.
3131638Srgrimes
3141638SrgrimesWed May 11 00:47:22 1994  Jason Merrill  (jason@deneb.cygnus.com)
3151638Srgrimes
3161638Srgrimes	Make libg++ build with gcc -ansi -pedantic-errors
3171638Srgrimes	* src/options.h: Lose commas at end of enumerator lists.
3181638Srgrimes
3191638SrgrimesSun Dec  5 19:16:40 1993  Brendan Kehoe  (brendan@lisa.cygnus.com)
3202353Sbde
32144946Sbde	* src/hash-table.cc (Hash_Table::~Hash_Table): Don't pass an
3221638Srgrimes	argument to fprintf, since it's not expecting one.
3231638Srgrimes
32444946SbdeFri Nov 26 19:03:18 1993  Per Bothner  (bothner@kalessin.cygnus.com)
32544946Sbde
32644946Sbde	* src/list-node.cc:  #undef index, for the sake of broken NeXT,
32744946Sbde
32844946SbdeThu Nov  4 11:16:03 1993  Per Bothner  (bothner@kalessin.cygnus.com)
32944946Sbde
33044946Sbde	* Makefile.in (install):  Use INSTALL_DATA for gperf.1.
33144946Sbde
33244946SbdeMon Oct 25 18:40:51 1993  Per Bothner  (bothner@kalessin.cygnus.com)
33344946Sbde
33444946Sbde	* src/key-list.cc (Key_List::read_keys):  Use POW macro
3351638Srgrimes	to increase hash table size to power of 2.
33616663Sjkh
3371844Swollman	* options.h (LARGE_STACK_ARRAYS):  New flag.  Defaults to zero.
3381844Swollman	* gen-perf.cc, key-list.cc, read-line.cc:	
3391844Swollman	Only stack-allocate large arrays if LARGE_STACK_ARRAYS is set.
3401638Srgrimes	* main.cc (main):  Only call setrlimit (RLIMIT_STACK, ...)
3411638Srgrimes	if LARGE_STACK_ARRAYS.
3421638Srgrimes
3431638SrgrimesMon Oct  4 17:45:08 1993  Per Bothner  (bothner@kalessin.cygnus.com)
34434528Seivind
34534528Seivind	* src/gen-perf.cc:  Always use ANSI rand/srand instead of BSDisms.
34634528Seivind
34734528SeivindWed Aug 18 12:19:53 1993  Per Bothner  (bothner@kalessin.cygnus.com)
3485585Sjkh
3494442Sphk	* Makefile.in (src_all):  Make less verbose output.
35016663Sjkh
35126760SjkhFri May 28 14:01:18 1993  Per Bothner  (bothner@rtl.cygnus.com)
35226760Sjkh
35326760Sjkh	* src/gen-perf.cc (Gen_Perf::change):  Don't use gcc-specific
3544442Sphk	2-operand conditional expression.
3554442Sphk	* src/key-list.cc (Key_List::output_lookup_array):
3561638Srgrimes	Don't use variable-size stack arrays, unless compiled by g++.
3571638Srgrimes
3581638SrgrimesTue May  4 14:08:44 1993  Per Bothner  (bothner@cygnus.com)
3591638Srgrimes
3601844Swollman	Changes (mostly from Peter Schauer) to permit compilation
3611638Srgrimes	using cfront 3.0 and otherwise be ARM-conforming.
36274842Sru	* src/key-list.h:  class Key_List must use public derivation
36374842Sru	of base class Std_Err (because Gen_Perf::operator() in gen-perf.cc
36474842Sru	calls Std_Err::report_error).
36574842Sru	* src/gen-perf.cc (Gen_Perf::affects_prev), src/hash-table.cc
36674842Sru	(Hash_Table::operator()):  Don't use gcc-specific 2-operand
3671844Swollman	conditional expression.
3681844Swollman	* src/iterator.cc (Iterator::operator()):  Don't use gcc-specific
36974842Sru	range construct in case label.
3701844Swollman	* key-list.cc (Key_List::output_lookup_array, Key_List::read_keys),
3711844Swollman	src/gen-perf.cc (Gen_Perf::operator(), src/read-line.cc
37234092Sbde	(Read_Line::readln_aux):  If not gcc, don't allocate
37334092Sbde	variable-sized arrays on stack.
37442915Sjdp	* src/new.cc (operator new):  Argument type should be size_t.
37534092Sbde	* key-list.cc (Key_List::output_lookup_array, Key_List::read_keys),
37634092Sbde	new/cc (::operator new): Don't use non-standard >?= operator.
37716663Sjkh
37876861SkrisTue Apr 27 20:11:30 1993  Per Bothner  (bothner@cygnus.com)
37976861Skris
380	* src/Makefile.in:  Define TARGETPROG, and use it.
381
382Mon Apr 19 00:29:18 1993  Per Bothner  (bothner@cygnus.com)
383
384	* Makefile.in, configure.in:  Re-vamped configure scheme.
385	* gperf.texinfo:  Renamed to gperf.texi.
386	* src/bool-array.{h,cc}:  ANSIfy bzero->memset.
387
388Sat Jan 30 20:21:28 1993  Brendan Kehoe  (brendan@lisa.cygnus.com)
389
390	* tests/Makefile.in (mostlyclean): Also delete aout, cout, m3out,
391	pout, and preout.
392
393Tue Dec 29 08:58:17 1992  Ian Lance Taylor  (ian@cygnus.com)
394
395	* Makefile.in: pass $(FLAGS_TO_PASS) to all calls to make.
396	(FLAGS_TO_PASS): added INSTALL, INSTALL_DATA, INSTALL_PROGRAM.
397
398Mon Dec 21 18:46:46 1992  Per Bothner  (bothner@rtl.cygnus.com)
399
400	* tests/expected.* renamed to *.exp to fit in 14 chars.
401	* tests/Makefile.in:  Update accordingly.
402	Also rename output.* to *.out.
403	* src/Makefile.in (clean):  Remove gperf program.
404
405Wed Dec  9 14:33:34 1992  Per Bothner  (bothner@cygnus.com)
406
407	* src/hash-table.cc, src/bool-array.h: ANSIfy bzero->memset.
408
409Thu Dec  3 19:34:12 1992  Per Bothner  (bothner@cygnus.com)
410
411	* Makefile.in (distclean, realclean): Don't delete
412	Makefile before recursing.
413
414Fri Nov  6 13:41:49 1992  Per Bothner  (bothner@rtl.cygnus.com)
415
416	* key-list.{h,cc}:  Remove MAX_INT (and similar) constant
417	fields from Key_List class, and use INT_MAX (etc) from limits.h.
418	* key-list.{h,cc}, options.{h,cc}, vectors.h:  Removed all
419	uses of initialized const fields, as they are non-standard
420	- and their use was easy to do away with.  Mostly, just
421	made the constants static non-fields in the .cc file.
422
423Mon Nov  2 13:10:11 1992  Per Bothner  (bothner@cygnus.com)
424
425	* tests/Makefile.in:  When generating cinset.c, don't pass -C,
426	since -C assumes an ANSI compiler.  Add the -C flag (with -a)
427	when generating test.out.3 instead.
428	* tests/expected.out.3:  Update accordingly.
429
430Wed Aug 12 11:47:54 1992  Per Bothner  (bothner@cygnus.com)
431
432	* Makefile.in:  Factor out common flags into $(FLAGS_TO_PASS).
433	* Makefile.in:  'install-info' depends on gperf.info.
434
435Mon Aug 10 11:39:52 1992  Ian Lance Taylor  (ian@dumbest.cygnus.com)
436
437	* Makefile.in, src/Makefile.in: always create installation
438	directories.
439
440Mon Jul 20 15:33:21 1992  Mike Stump  (mrs@cygnus.com)
441
442	* src/new.cc (operator new):  Add cast from void * to char *,
443	since it is not a standard conversion.
444
445Wed Jun 17 16:25:30 1992  Per Bothner  (bothner@rtl.cygnus.com)
446
447	* src/gen-perf.cc:  #include <_G_config.h> for _G_SYSV.
448	* src/key-list.cc:  alloca() hair.
449	* src/main.cc (main):  Only call getrlimit if _G_HAVE_SYS_RESOURCE.
450	* Makefile,in, {src,test}/Makefile.in:  Fix *clean rules.
451
452Fri May 29 13:21:13 1992  Per Bothner  (bothner@rtl.cygnus.com)
453
454	* src/gen-perf.cc:  Replace USG -> _G_SYSV.
455
456Thu May 14 13:58:36 1992  Per Bothner  (bothner@rtl.cygnus.com)
457
458	* src/Makefile.in:  Don't pass obsolete flag -DUNLIMIT_STACK.
459	* tests/Makefile.in (clean): Fix.
460
461Sat Mar  7 00:03:56 1992  K. Richard Pixley  (rich@rtl.cygnus.com)
462
463	* gperf.texinfo: added menu item hook.
464
465Wed Feb 26 18:04:40 1992  K. Richard Pixley  (rich@cygnus.com)
466
467	* Makefile.in, configure.in: removed traces of namesubdir,
468	  -subdirs, $(subdir), $(unsubdir), some rcs triggers.  Forced
469	  copyrights to '92, changed some from Cygnus to FSF.
470
471Sun Jan 26 19:21:58 1992  Per Bothner  (bothner at cygnus.com)
472
473	* tests/Makefile.in:  Use re-directed stdin instead of file
474	name in argv.  This allows us to remove the filename
475	from the output, the expected output, and hence the diffs.
476	(Note that the input file is in $(srcdir), which we cannot
477	place in the expected out files.)
478	* tests/expected.out.[1235]:  Edit out input filename,
479	to match new output.
480
481Thu Jun 28 16:17:27 1990  Doug Schmidt  (schmidt at brilliant)
482
483	* Wow, first fix on the new job!  There was a dumb error
484	  in Key_List::output_lookup_function, where I printed the
485	  string "&wordlist[key]" instead of the correct "&wordlist[index]".
486	  
487	* Added a couple of #ifdefs for USG support.
488	  	
489Sun Jun  3 17:16:36 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
490
491        * Updated the version number to 2.5 and sent to Doug Lea for release
492          with the latest GNU libg++.
493
494        * Changed the error handling when a keyword file cannot be opened
495          (now calls perror).
496
497Wed May 30 14:49:40 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
498
499        * Instrumented the source code with trace statements automagically
500          inserted using my new automated trace instrumentation tool!
501
502Wed May  9 11:47:41 1990  Doug Schmidt  (schmidt at siam.ics.uci.edu)
503
504        * Really fixed the previous bug.  Turns out that a small amount
505          of logic had to be duplicated to handle static links that occur
506          as part of dynamic link chains.  What a pain!!!
507
508Tue May  8 23:11:44 1990  Doug Schmidt  (schmidt at siam.ics.uci.edu)
509
510        * Fixed a stupid bug in Key_List::output_lookup_array that was
511          causing incorrect counts to be generated when there were both
512          static and dynamic links occurring for the same hash value.
513          Also simplified the code that performs the logic in this routine.
514
515Mon Apr 30 17:37:24 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
516
517        * Fixed stupid bug in Key_List::output_lookup_array that was
518          making the generated lookup[] array contain `chars' even
519          when the values stored in the chars are greater than 127!
520
521        * Changed the behavior of the -G (global table) option so that it
522          will output the `length[]' array in the global scope along with
523          the `word_list[]' array.
524
525        * Fixed a stupid bug in Key_List::output_lookup_function that
526          would always output the complicated `duplicate-handling' lookup
527          logic, even when there were no duplicates in the input!
528
529        * Yikes, had to modify a bunch of stuff in key-list.cc to correctly
530          handle duplicate entries.  Changed the generated code so that
531          the MIN_HASH_VALUE is no longer subtracted off when calculating
532          the hash value for a keyword.  This required changing some other
533          code by substituting MAX_HASH_VALUE for TOTAL_KEYS in several places.
534          Finally, this means that the generated tables may contain leading 
535          null entries, but I suppose it is better to trade-off space to get 
536          faster performance...
537
538Mon Mar 26 13:08:43 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
539
540        * Updated version number to 2.4 to reflect the latest changes.
541
542        * Changed the main program so that it always prints out gperf's
543          execution timings to the generated output file.
544          
545Sun Mar 25 12:39:30 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
546
547        * Added the -Z option so that users can specify the name of the
548          generated class explicitly.  Updated documentation to reflect
549          this change.
550          
551        * Modified the generated C++ class interface so that the functions
552          are declared static (to remove the overhead of passing the `this'
553          pointer).  This means that operator()() can no longer be used,
554          since it only works on non-static member functions.
555          Also changed things so that there is no constructor (why waste
556          the extra call, when it doesn't do anything, eh?)
557
558        * Modified the behavior of Key_List::output when the -L C++ option
559          is enabled.  Previously the code generated use const data members
560          to record MIN_WORD_LENGTH, MIN_HASH_VALUE, etc.  However, as
561          pointed out by James Clark this may result in suboptimal behavior
562          on the part of C++ compilers that can't inline these values.
563          Therefore, the new behavior is identical to what happens with
564          -L C, i.e., either #defines or function-specific enums are used.
565          Why sacrifice speed for some abstract notion of `code purity?' ;-)
566
567Tue Mar  6 18:17:42 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
568
569        * Added the -E option that defines constant values using an enum
570          local to the lookup function rather than with #defines.  This
571          also means that different lookup functions can reside in the
572          same file.  Thanks to James Clark (jjc@ai.mit.edu). 
573
574Sat Mar  3 20:19:00 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
575
576        * Added a special case to key_list::output_switch that doesn't
577          generate extra comparisons when the `-S' is given an argument
578          of 1 (the normal case).  This should speed up the generated
579          code output a tad...
580
581Fri Feb 23 14:21:28 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
582
583        * Renamed all instances of member function get_keysig_size
584          to get_max_keysig_size, since this is more precise...
585
586        * Changed all occurrences of charset to keysig (stands for ``key
587          signature'') to reflect the new naming convention used in the 
588          USENIX paper.
589
590Thu Feb 22 11:28:36 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
591
592        * Changed the name of the generated associated values table from
593          asso_value to asso_values to reflect conventions in the USENIX
594          C++ paper.
595
596Thu Feb 15 23:29:03 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
597
598        * Updated the gperf.texinfo file to fix some formatting problems
599          that had crept in since last time.
600
601Wed Feb 14 23:27:24 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
602
603        * Fixed stupid bug in key-list.cc (get_special_input), wher
604          gperf replaced each '%' with the succeeding character.
605
606        * Added support for multiple target language generation.  Currently
607          handled languages are C and C++, with C as the default.  Updated
608          documentation and option handler to reflect the changes.
609
610        * Added a global destructor to new.cc and removed the #ifdef, since
611          the bloody thing now works with libg++.
612
613Mon Feb 14 13:00:00 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
614
615        * Found out that my gperf paper was accepted at the upcoming
616          USENIX C++ Conference in San Francisco.  Yow!
617
618Tue Jan 30 09:00:29 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
619
620        * #ifdef'd out the new.cc memory allocator, since there are
621          problems with this and the libg++ stuff.
622
623        * Changed key-list.h so that class Vectors is a public (rather
624          than private) base class for class Key_List.  The previous
625          form was illegal C++, but wasn't being caught by the old
626          g++ compiler.  Should work now... ;-)
627
628Sun Dec 10 14:08:23 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
629
630        * Added several changes from rfg@ics.uci.edu.  These changes
631          help to automate the build process.
632
633Wed Nov 15 15:49:33 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
634
635        * Removed conditional compilation for GATHER_STATISTICS.  There's
636          really no good reason to avoid collecting this info at run-time,
637          since that section of code is *hardly* the bottleneck... ;-)
638
639        * Simplified the C output routines in Key_List::set_output_types
640          and Key_List::output_keyword_table a bit in order to
641          speed-up and clean up the code generation.
642
643        * Modified function Key_List::get_special_input so that it does
644          not try to `delete' a buffer that turned out to be too short.
645          This is important since the new memory management scheme
646          does not handle deletions.  However, adding a small amount of
647          garbage won't hurt anything, since we generally don't do this
648          operation more than a couple times *at most*!
649
650        * Created a new file (new.cc) which includes my own overloaded
651          operator new.  This function should dramatically reduce the
652          number of calls to malloc since it grabs large chunks and
653          doles them out in small pieces.  As a result of this change
654          the class-specific `operator new' was removed from class List_Node.
655
656Tue Nov 14 21:45:30 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
657
658        * Continued to refine the great hack.  The latest trick is to
659          try and replace most uses of dynamic memory (i.e., calls to
660          new) with uses of gcc dynamic arrays (i.e., an alloca solution).
661          This makes life much easier for the overall process-size, since 
662          it reduces the amount of overhead for memory management.  As a
663          side-effect from this change there is no reason to have the
664          Bool_Array::dispose member function, so it's outta here!
665
666        * Fixed a stupid bug that was an disaster waiting to happen...
667          Instead of making the boolean array large enough to index
668          max_hash_value it was only large enough to index max_hash_value
669          - 1.  Once again, an off-by-one mistake in C/C++!!!!
670
671Mon Nov 13 19:38:27 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
672
673        * Added the final great hack!  This allows us to generate hash tables
674          for near-perfect hash functions that contain duplicates, *without*
675          having to use switch statements!  Since many compilers die on large
676          switch statements this feature is essential.  Furthermore, it appears
677          that the generated code is often *smaller* than that put out by
678          compilers, even though a large, sparse array must be created.
679          Here's the general idea:
680
681             a. Generate the wordlist as a contiguous block of keywords, 
682                just as before when using a switch statement.  This
683                wordlist *must* be sorted by hash value. 
684
685             b. Generate the lookup array, which is an array of signed
686                {chars,shorts,ints}, (which ever allows full coverage of
687                the wordlist dimensions).  If the value v, where v =
688                lookup[hash(str,len)], is >= 0 and < TOTAL_KEYWORDS, then we
689                simply use this result as a direct access into the wordlist 
690                array to snag the keyword for comparison.  
691
692             c. Otherwise, if v is < -TOTAL_KEYWORDS or > TOTAL_KEYWORDS
693                this is an indication that we'll need to search through
694                some number of duplicates hash values.  Using a hash
695                linking scheme we'd then index into a different part of
696                the hash table that provides the starting index and total
697                length of the duplicate entries to find via linear search!
698
699Sun Nov 12 13:48:10 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
700
701        * Simplified Key_List::output_min_max considerably by recognizing
702          that since the keyword list was already sorted by hash value finding 
703          the min and max values is trivial!
704
705        * Improved the debugging diagnostics considerably in classes Key_List,
706          Hash_Table, and Gen_Perf.
707
708        * Modified the `-s' option so that a negative argument is now 
709          interpreted to mean `allow the maximum associated value to be
710          about x times *smaller* than the number of input keys.'  This
711          should help prevent massive explosion of generated hash table
712          size for large keysets.
713
714Sat Nov 11 11:31:13 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
715
716        * Added a field in class Key_List that counts the total number
717          of duplicate keywords, both static and dynamic.
718
719        * Added a new member function Bool_Array that deletes the dynamic
720          memory allocated to Bool_Array::storage_array.  This space may
721          be needed for subsequent options, so it made sense to free it as
722          soon as possible...
723          
724        * Renamed file/class Alpha_Vectors to Vectors, to avoid problems
725          with 14 character length filenames on SYSV.  Also changed file
726          adapredefined.gperf to adadefs.gperf in the ./tests directory.
727
728        * Modified class Options by changing the member function
729          Options::total_positions to Options::get_charset_size and
730          Options::set_charset_size.  These two routines now either return
731          the total charset size *or* the length of the largest keyword
732          if the user specifies the -k'*' (ALLCHARS) option.  This change
733          cleans up client code.
734
735        * Merged all the cperf changes into gperf.
736        
737        * Made sure to explicitly initialize perfect.fewest_collisions to
738          0.
739
740        * Cleaned up some loose ends noticed by Nels Olson.
741          1.  Removed `if (collisions <= perfect.fewest_collisions)'
742              from Gen_Perf::affects_prev since it was superfluous.
743          2.  Removed the fields best_char_value and best_asso_value
744              from Gen_Perf.  There were also unnecessary.
745          3.  Fixed a braino in the Bool_Array::bool_array_reset
746              function.  Since iteration numbers can never be zero
747              the `if (bool_array.iteration_number++ == 0)' must be
748              `if (++bool_array.iteration_number == 0).'
749          4.  Modified Std_Err::report_error so that it correctly handles
750              "%%".
751
752        * It is important to note that -D no longer enables -S.
753          There is a good reason for this change, which will become
754          manifested in the next release... (suspense!).
755
756        * Made some subtle changes to Key_List::print_switch so that if finally
757          seems to work correctly.  Needs more stress testing, however...
758
759        * Made a major change to the Key_List::print_switch function.
760          The user can now specify the number of switch statements to generate
761          via an argument to the -S option, i.e., -S1 means `generate 1
762          switch statement with all keywords in it,' -S2 means generate
763          2 switch statements with 1/2 the elements in each one, etc.
764          Hopefully this will fix the problem with C compilers not being
765          able to generate code for giant switch statements (but don't
766          hold your breath!)
767
768        * Changed Key_List::length function to Key_List::keyword_list_length.
769
770        * Added a feature to main.c that prints out the starting wall-clock
771          time before the program begins and prints out the ending wall-clock
772          time when the program is finished.
773
774        * Added the GATHER_STATISTICS code in hash-table.c so we can
775          keep track of how well double hashing is doing.  Eventually,
776          GATHER_STATISTICS will be added so that all instrumentation
777          code can be conditionally compiled in.
778
779        * Fixed a stupid bug in Key_List::print_switch routine.  This
780          was necessary to make sure the generated switch statement worked
781          correctly when *both* `natural,' i.e., static links and dynamic
782          links, i.e., unresolved duplicates, hash to the same value.
783
784        * Modified Bool_Array::~Bool_Array destructor so that
785          it now frees the bool_array.storage_array when it is no longer
786          needed.  Since this array is generally very large it makes sense
787          to return the memory to the freelist when it is no longer in use.
788
789        * Changed the interface to constructor Hash_Table::Hash_Table.  This 
790          constructor now passed a pointer to a power-of-two sized buffer that 
791          serve as storage for the hash table.  Although this weakens information
792          hiding a little bit it greatly reduces dynamic memory fragmentation,
793          since we can now obtain the memory via a call to alloca, rather
794          than malloc.  This change modified Key_List::read_keys calling
795          interface.
796
797        * Since alloca is now being used more aggressively a conditional
798          compilation section was added in main.c. Taken from GNU GCC,
799          this code gets rid of any avoidable limit on stack size so that
800          alloca does not fail.  It is only used if the -DRLIMIT_STACK
801          symbol is defined when gperf is compiled. 
802
803        * Added warnings in option.c so that user's would be informed
804          that -r superceeds -i on the command-line.
805          
806        * Rewrote Gen_Perf::affects_prev.  First, the code structure
807          was cleaned up considerably (removing the need for a dreaded
808          goto!).  Secondly, a major change occurred so that Gen_Perf::affects_prev
809          returns FALSE (success) when fewest_hits gets down to whatever
810          it was after inserting the previous key (instead of waiting for
811          it to reach 0).  In other words, it stops trying if it can
812          resolve the new collisions added by a key, even if there are
813          still other old, unresolved collisions.  This modification was
814          suggested by Nels Olson and seems to *greatly* increase the
815          speed of gperf for large keyfiles.  Thanks Nels!
816
817        * In a similar vein, inside the Gen_Perf::change routine 
818          the variable `perfect.fewest_collisions is no longer initialized
819          with the length of the keyword list.  Instead it starts out at
820          0 and is incremented by 1 every time change () is called.
821          The rationale for this behavior is that there are times when a
822          collision causes the number of duplicates (collisions) to
823          increase by a large amount when it would presumably just have
824          gone up by 1 if none of the asso_values were changed.  That is,
825          at the beginning of change(), you could initialize fewest_hits
826          to 1+(previous value of fewest_hits) instead of to the number of
827          keys.  Thanks again, Nels.
828
829        * Replaced alloca with new in the Gen_Perf::change function.
830          This should eliminate some overhead at the expense of a little
831          extra memory that is never reclaimed.
832
833        * Renamed Gen_Perf::merge_sets to Gen_Perf::compute_disjoint_union
834          to reflect the change in behavior.
835
836        * Added the -e option so users can supply a string containing
837          the characters used to separate keywords from their attributes.
838          The default behavior is ",\n".
839
840        * Removed the char *uniq_set field from LIST_NODE and modified
841          uses of uniq_set in perfect.c and keylist.c.  Due to changes
842          to Gen_Perf::compute_disjoint_sets this field was no longer
843          necessary, and its removal makes the program smaller and
844          potentially faster. 
845          
846        * Added lots of changes/fixes suggested by Nels Olson
847          (umls.UUCP!olson@mis.ucsf.edu).  In particular:
848          1.  Changed Bool_Array so that it would dynamically create
849              an array of unsigned shorts rather than ints if the 
850              LO_CAL symbol was defined during program compilation.
851              This cuts the amount of dynamic memory usage in half,
852              which is important for large keyfile input.
853          2.  Added some additional debugging statements that print extra
854              info to stderr when the -d option is enabled.
855          3.  Fixed a really stupid bug in Key_List::print_switch
856              A right paren was placed at the wrong location, which broke
857              strlen ().
858          4.  Fixed a subtle problem with printing case values when keylinks
859              appear.  The logic failed to account for the fact that there
860              can be keylinks *and* regular node info also!
861          5.  Changed the behavior of Key_List::read_keys so that it would
862              honor -D unequivocally, i.e., it doesn't try to turn off dup
863              handling if the user requests it, even if there are no
864              immediate links in the keyfile input. 
865          6.  Modified the -j option so that -j 0 means `try random values
866              when searching for a way to resolve collisions.'
867          7.  Added a field `num_done' to the Gen_Perf struct.  This is used
868              to report information collected when trying to resolve
869              hash collisions.
870          8.  Modified the merge_sets algorithm to perform a disjoint
871              union of two multisets.  This ensures that subsequent
872              processing in Gen_Perf::affect_prev doesn't
873              waste time trying to change an associated value that is
874              shared between two conflicting keywords.
875          9.  Modified Gen_Perf::affects_prev so that it doesn't try
876              random jump values unless the -j 0 option is enabled.
877          10. Fixed a silly bug in Gen_Perf::change.  This problem caused
878              gperf to seg fault when the -k* option was given and the
879              keyfile file had long keywords.
880        
881Sun Oct 29 00:18:55 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
882
883        * Modified class-specific new operations for Read_Line and
884          List_Node so they don't fail if SIZE is larger than twice
885          the previous buffer size.  Note we double buffer size
886          everytime the previous buffer runs out, as a heuristic
887          to reduce future calls to malloc.
888
889Sun Oct 22 13:49:43 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
890
891        * Updated gperf version number to 2.0.  Send to Doug Lea for
892          incorporation into the long-awaited `official' libg++ 1.36
893          release! 
894
895        * Thanks to Nels Olson a silly bug in Gen_Perf::change ()
896          was fixed.  This problem caused gperf to seg fault when
897          the -k* option was given and the keyfile file had long
898          keywords.
899          
900        * Modified Key_List::print_hash_function so that it output
901          max_hash_value + 1 (rather than just max_hash_value) for
902          any associated value entries that don't correspond to
903          keyword charset characters.  This should speed up rejection
904          of non-keyword strings a little in some cases.
905
906Sat Oct 21 19:28:36 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
907
908        * Fixed Key_List::print_hash_function so that it no longer output
909          things like `return 0 + ...'  Although this probably gets
910          optimized away by even the worst C compilers there isn't any
911          point tempting fate... ;-)
912
913        * Fixed class List_Node's constructor so that it wouldn't a priori
914          refuse to consider trying to hash keys whose length is less
915          than the smallest user-specified key position.  It turns out
916          this is not a problem unless the user also specifies the -n
917          (NOLENGTH) option, in which case such keys most likely
918          don't have a prayer of being hashed correctly!
919
920        * Changed the name of the generated lookup table from `Hash_Table'
921          to `asso_value' to be consistent with the gperf paper.
922
923Tue Oct 17 14:19:48 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
924
925        * Added a flag GATHER_STATISTICS in the Makefile.  If defined
926          during compilation this turns on certain collection facilities
927          that track the performance of gperf during its execution.  In
928          particular, I want to see how many collisions occur for the
929          double hashing Hash_Table.
930
931        * Added a safety check so that we don't screw up if the total
932          number of `resets' of the Bool_Array exceeds MAX_INT.  Since
933          this number is around 2^31 it is unlikely that this would ever
934          occur for most input, but why take the risk?
935
936        * Changed the behavior for the -a (ANSI) option so that the
937          generated prototypes use int rather than size_t for the LEN 
938          parameter.  It was too ugly having to #include <stddef.h> all
939          over the place...
940
941Mon Oct 16 11:00:35 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
942
943        * Continued to work on the gperf paper for the USENIX C++
944          conference.  At some point this will be merged back into
945          the gperf documentation...
946
947Sat Oct 14 20:29:43 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
948
949        * Added a majorly neat hack to Bool_Array, suggested by rfg.
950          The basic idea was to throw away the Ullman array technique.
951          The Ullman array was used to remove the need to reinitialize all 
952          the Bool_Array elements to zero everytime we needed to determine
953          whether there were duplicate hash values in the keyword list.  
954          The current trick uses an `iteration number' scheme, which takes
955          about 1/3 the space and reduces the overall program running a 
956          time by about 20 percent for large input!  The hack works as 
957          follows:
958          
959          1. Dynamically allocation 1 boolean array of size k.
960          2. Initialize the boolean array to zeros, and consider the first
961             iteration to be iteration 1.
962          2. Then on all subsequent iterations we `reset' the bool array by
963             kicking the iteration count by 1. 
964          3. When it comes time to check whether a hash value is currently
965             in the boolean array we simply check its index location.  If
966             the value stored there is *not* equal to the current iteration
967             number then the item is clearly *not* in the set.  In that
968             case we assign the iteration number to that array's index
969             location for future reference.  Otherwise, if the item at
970             the index location *is* equal to the iteration number we've
971             found a duplicate.  No muss, no fuss!
972             
973Mon Oct  2 12:30:54 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
974
975        * Changed some consts in options.h to enumerals, since g++
976          doesn't seem to like them at the moment!
977
978Sat Sep 30 12:55:24 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
979
980        * Fixed a stupid bug in Key_List::print_hash_function that manifested
981          itself if the `-k$' option was given (i.e., only use the key[length]
982          character in the hash function).
983
984        * Added support for the -C option.  This makes the contents of
985          all generated tables `readonly'.
986
987        * Changed the handling of generated switches so that there is
988          only one call to str[n]?cmp.  This *greatly* reduces the size of
989          the generated assembly code on all compilers I've seen.
990
991        * Fixed a subtle bug that occurred when the -l and -S option
992          was given.  Code produced looked something like:
993
994          if (len != key_len || !strcmp (s1, resword->name)) return resword;
995
996          which doesn't make any sense.  Clearly, this should be:
997
998          if (len == key_len && !strcmp (s1, resword->name)) return resword;
999
1000Tue Sep 26 10:36:50 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1001
1002        * Changed class Read_Line's definition so that it no longer
1003          needs to know about the buffering scheme used to speed up 
1004          dynamic memory allocation of input keywords and their
1005          associated attributes.  This means that operator new is no longer
1006          a friend of Read_Line.
1007
1008Mon Sep 25 23:17:10 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1009
1010        * Decided that Obstacks had too much overhead, so they were
1011          removed in favor of super-efficient, low-overhead buffered
1012          storage allocation hacks in Read_Line and List_Node.
1013
1014        * No longer try to inline functions that g++ complains about
1015          (Key_List::Merge and Key_List::Merge_Sort).
1016
1017Sun Sep 24 13:11:24 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1018
1019        * Changed classes Read_Line and List_Node to use Obstacks in order
1020          to cache memory allocation for keyword strings and List_Nodes.
1021          
1022        * Continued to experiment with inheritance schemes.
1023        
1024        * Added a new file `alpha.h', that declares static data shared
1025          (i.e., inherited) between classes List_Node and Key_List.
1026
1027Tue Sep 12 16:14:41 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1028
1029        * Made numerous changes to incorporate multiple inheritance in 
1030          gperf.
1031
1032Wed Aug 16 23:04:08 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1033
1034        * Added the -DCOMPILER_FIXED flag to the ./src/Makefile.  This
1035          implies that people trying to compile gperf need to have a
1036          working version of the new g++ compiler (1.36.0).
1037
1038        * Removed some extra spaces that were being added in the generated
1039          C code.
1040
1041Mon Jul 24 17:09:46 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1042
1043        * Fixed PRINT_HASH_FUNCTION and PRINT_LOOKUP_FUNCTION in keylist.c
1044          so that the generated functions take an unsigned int length argument.
1045          If -a is enabled the prototype is (const char *str, size_t len).
1046
1047Fri Jul 21 13:06:15 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
1048
1049        * Fixed a typo in PRINT_KEYWORD_TABLE in keylist.cc that prevented
1050          the indentation from working correctly.
1051
1052        * Fixed a horrible typo in PRINT_KEYWORD_TABLE in keylist.cc
1053          that prevented links from being printed correctly.
1054
1055Tue Jul 18 16:04:31 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
1056
1057        * Fixed up readline.cc and readline.h so that they work OK
1058          with g++ compilers that aren't completely up-to-date.
1059          If symbol COMPILER_FIXED is defined then the behavior
1060          that works on my more recent version of g++ is enabled.
1061
1062Sun Jul  9 17:53:28 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1063
1064        * Changed the ./tests subdirectory Makefile so that it 
1065          uses $(CC) instead of gcc.
1066
1067Sun Jul  2 21:52:15 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1068
1069        * Fixed a number of subtle bugs that occurred when -S was
1070          combined with various and sundry options.
1071
1072        * Added the -G option, that makes the generated keyword table
1073          a global static variable, rather than hiding it inside
1074          the lookup function.  This allows other functions to directly
1075          access the contents in this table.
1076
1077        * Added the "#" feature, that allows comments inside the keyword
1078          list from the input file. Comment handling takes place in readline.c.  
1079          This simplifies the code and reduces the number of malloc calls.
1080          
1081        * Also added the -H option (user can give the name of the hash
1082          function) and the -T option (prevents the transfer of the type decl
1083          to the output file, which is useful if the type is already defined
1084          elsewhere).
1085
1086Thu Jun 22 20:39:39 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1087
1088        * Modified many classes so that they would inherit Std_Err as
1089          a base class.  This makes things more abstract...
1090
1091Fri Jun 16 14:23:00 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
1092
1093        * Modified the -f (FAST) option.  This now takes an argument.
1094          The argument corresponds to the number of iterations used
1095          to resolve collisions.  -f 0 uses the length of the
1096          keyword list (which is what -f did before).  This makes
1097          life much easier when dealing with large keyword files.
1098
1099Tue Jun  6 17:53:27 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1100
1101        * Added the -c (comparison) option.  Enabling this
1102          will use the strncmp function for string comparisons.
1103          The default is to use strcmp.
1104
1105        * Fixed a typo in key_list.cc (PRINT_SWITCH).  This caused
1106          faulty C code to be generated when the -D, -p, and -t
1107          options were all enabled.
1108
1109Thu May 25 14:07:21 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
1110
1111        * Once again, changed class Read_Line to overload global operator
1112          new.  Hopefully, this will work...!
1113
1114Sun May 21 01:51:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1115
1116        * Modified Key_List::print_hash_function () so that it properly
1117          formats the associated values in the hash table according to
1118          the maximum number of digits required to represent the largest
1119          value.
1120
1121        * Removed the named return value from class Hash_Table's
1122          operator (), since this causes a seg fault when -O is enabled.
1123          No sense tripping subtle g++ bugs if we don't have to.... ;-)
1124
1125        * Removed the operator new hack from Read_Line, since this seemed
1126          to create horrible bus error problems.
1127                    
1128        * Changed many class member functions and data members to be `static', 
1129          if they don't manipulate this!
1130          
1131Fri May 12 23:06:56 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1132
1133        * Changed class Std_Err to use static member functions, a la
1134          Ada or Modula 2.  This eliminates the need for an explicit
1135          error-handler class object.
1136
1137        * Added the ``named return value'' feature to Hash_Table::operator ()
1138          and Bool_Array::operator [], just for the heck of it.... ;-)
1139
1140        * Changed the previous hack in Read_Line so that we now use
1141          the overloaded global `new' instead of NEW_STRING!
1142
1143Wed May  3 17:36:55 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
1144
1145        * Updated to version 1.7.  This reflects the recent major changes
1146          and the new C port.
1147
1148        * Modified the GNU getopt.cc routine to have a class-based interface.
1149
1150        * Fixed a typo in Perfect.cc ~Perfect that prevented the actual maximum
1151          hash table size from being printed (maybe the stream classes
1152          weren't so bad after all.... ;-).
1153
1154        * Added support for the -f option.  This generates the perfect
1155          hash function ``fast.''  It reduces the execution time of
1156          gperf, at the cost of minimizing the range of hash values.
1157
1158Tue May  2 16:23:29 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1159
1160        * Added an efficiency hack to Read_Line.  Instead of making
1161          a call to operator NEW (a.k.a. malloc) for each input string
1162          a new member function NEW_STRING stores a large buffer from
1163          which new strings are carved out, growing the buffer if
1164          necessary.  It might be useful to add this throughout the
1165          program....
1166
1167        * Removed all unnecessary calls to DELETE.  If the program is about
1168          to exit it is silly to waste time freeing memory.
1169
1170        * Added the GNU getopt program to the distribution.  This makes
1171          GPERF portable to systems that don't include getopt in libc.
1172          
1173        * Added a strcspn member to class Key_List.  This also increases
1174          portability.
1175
1176        * Added the get_include_src function from keylist.c as a member
1177          function in class Key_List.  Hopefully every function is 
1178          now associated with a class.  This aids abstraction and
1179          modularity.
1180
1181        * Ported gperf to C.  From now on both K&R C and GNU G++ versions
1182          will be supported.  There will be two ChangeLog files, one
1183          for each version of the program.
1184
1185Mon May  1 16:41:45 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1186
1187        * Fixed a bug with -k'*'.  This now prints out *all* the cases
1188          up to the length of the longest word in the keyword set.
1189
1190Sun Apr 30 12:15:25 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1191
1192        * Removed all use of the stream classes.  Too ugly, slow, and
1193          not handled by the c++-mode formatter....
1194
1195        * Modified the handling of links (i.e., keywords that have
1196          identical hash values as other keywords).  This should 
1197          speed up hash function generation for keyword sets with
1198          many duplicate entries.  The trick is to treat duplicate
1199          values as equivalence classes, so that each set of duplicate
1200          values is represented only once in the main list processing.
1201
1202        * Fixed some capitialization typos and indentations mistakes in 
1203          Key_List::print_hash_function.
1204
1205Sat Apr 29 12:04:03 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
1206
1207        * Fixed a typo/logico in Key_List::print_switch that prevented
1208          the last keyword in the keyword list to be print out.  This
1209          requires further examination.....
1210
1211        * Fixed a stupid bug in List_Node::List_node.  If the -k'*' option
1212          was enabled the KEY_SET string wasn't getting terminated with
1213          '\0'!
1214
1215Fri Apr 28 12:38:35 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1216
1217        * Renamed strexp.h and strexp.cc to iterator.h and iterator.cc.
1218          Also changed the strexp class to iterator.  Continued to work
1219          on style...
1220
1221        * Updated the version number to 1.6.  This reflects all the 
1222          recent changes.
1223
1224Thu Apr 27 00:14:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1225
1226        * Added the -D option that properly handles keyword sets that
1227          contain duplicate hash values.
1228
1229        * Continued the stylistic changes.  Added the #pragma once
1230          directive to all the *.h files.  Removed all #defines and
1231          replaced them with static consts.  Also moved the key_sort
1232          routine from options.cc into the options class as a 
1233          member function.
1234
1235Mon Apr  3 13:26:55 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
1236
1237        * Made massive stylistic changes to bring source code into
1238          conformance with GNU style guidelines.
1239
1240Thu Mar 30 23:28:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1241
1242        * Fixed up the output routines so that they generate code
1243          corresponding to the GNU style guidelines.
1244
1245Sat Mar 11 13:12:37 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1246
1247        * Fixed Stderr constructors so that they wouldn't try to
1248          use the base class initializer syntax for the static 
1249          class variable Program_Name.  G++ 1.34 is stricter in
1250          enforcing the rules!
1251
1252Fri Mar 10 11:24:14 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1253
1254        * Removed -v and ``| more'' from the Makefile to keep rfg happy...
1255
1256Thu Mar  2 12:37:30 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1257
1258        * Sent latest GNU gperf version 1.5 to Doug Lea for inclusion
1259          into libg++ 1.34.  Note that there is a small bug with
1260          the new %{ ... %} source inclusion facility, since it doesn't
1261          understand comments and will barf if %{ or %} appear nested
1262          inside the outermost delimiters.  This is too trivial of
1263          a defect to fix at the moment...
1264
1265Tue Feb 28 11:19:58 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1266
1267        * Added the -K option, which allows the user to provide a
1268          alternative name for the keyword structure component.
1269          The default is still ``name.''
1270
1271        * Added the LEX and YACC-like ability to include arbitrary
1272          text at the beginning of the generated C source code output.
1273          This required two new functions Get_Special_Input, 
1274          Key_List::Save_Include_Src;
1275
1276        * Fixed memory allocation bug in Key_List::Set_Types.
1277          Variable Return_Type needs 1 additional location
1278          to store the "*" if the -p option is used.
1279          
1280        * Added code to NULL terminate both Struct_Tag and Return_Type,
1281          *after* the strncpy (stupid mistake).
1282          
1283Mon Feb 27 14:39:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1284
1285        * Added a new option -N.  This allows the user to specify the
1286          name to be used for the generated lookup function.  The
1287          default name is still ``in_word_set.''  This makes it
1288          possible to completely automate the perfect hash function
1289          generation process!
1290
1291Mon Feb 20 23:33:14 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1292
1293        * Corrected the Hash_Table::operator () function so that
1294          *it* is responsible for deciding when a new key has the
1295          same signature as a previously seen key.  The key length 
1296          information is now used internally to this function to
1297          decide whether to add to the hash table those keys with
1298          the same key sets, but different lengths.  Before, this
1299          was handled by the Key_List::Read_Keys function.  However,
1300          this failed to work for certain duplicate keys, since
1301          they weren't being entered into the hash table properly.
1302
1303Sun Feb 19 16:02:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1304
1305        * Modified class Options by moving the enum Option_Type out
1306          of the class.  This is to satisfy the new enumeration
1307          scope rules in C++.
1308
1309Sun Jan 15 15:12:09 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1310
1311        * Incremented the version number upto 1.4 to reflect the new 
1312          options that affect the generated code.  Send the new 
1313          distribution off to Michael for use with g++ 1.33.
1314
1315        * Added a fix to Key_List::Read_Keys so that it checks for links
1316          properly when the -n option is used.  Previously, it didn't
1317          catch obvious links, which caused it to spend large amount
1318          of time searching for a solution that could never occur!
1319
1320        * Modified the Key_List data structure to record *both* the 
1321          minimum and the maximum key lengths.  This information
1322          is now computed in Key_List::Read_Keys, and thus 
1323          Key_List::Print_Min_Max doesn't need to bother.
1324
1325        * Modifed the key position iterator scheme in options.cc to
1326          eliminate the need for member function Options::Advance.
1327          Now, the Options::Get function performs the advancement
1328          automatically, obviating the need for an extra function call.
1329
1330        * Added the new function Options::Print_Options, to print out
1331          the user-specified command line options to generated C
1332          output file.
1333
1334        * Added a new function, Key_List::Print_Keylength_Table,
1335          which creates a table of lengths for use in speeding
1336          up the keyword search.  This also meant that a new
1337          option, -l (LENTABLE) is recognized.  It controls 
1338          whether the length table is printed and the comparison
1339          made in the generated function ``in_word_set.''
1340
1341        * Added a comment at the top of the generated C code
1342          output file that tells what version of gperf was used.
1343          Next, I'll also dump out the command line options
1344          as a comment too.  Thanks to Michael Tiemann for the
1345          feedback on this.
1346
1347        * Fixed the -n option to make it work correctly with
1348          other parts of the program (most notably the Perfect::Hash
1349          function and the computation of minimum and maximum lengths.
1350
1351Fri Jan 13 21:25:27 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
1352
1353        * Realized the the need to add a test that will enable
1354          optimziation of the generated C code in the ``hash'' function
1355          by checking whether all the requested key positions are
1356          guaranteed to exist due to the comparison in `in_word_set.''
1357          I'll put this in soon....
1358
1359Thu Jan 12 20:09:21 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1360
1361        * Added pascal, modula3, and modula2 tests inputs to the 
1362          Makefile
1363        
1364        * Recognised that there is a bug with the -n option.  However
1365          I'm too busy to fix it properly, right now.  The problem 
1366          is that the generated #define end up being 0, since that's
1367          my hack to make -n work.  This needs complete rethinking!
1368
1369Tue Jan 10 00:08:16 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1370
1371        * Added a new option, -n, that instructs gperf to not use the
1372          length of an identifier when computing the hash functions.
1373          I'm not sure how useful this is!
1374          
1375        * Retransmitted the distribution to rocky.oswego.edu.  Hopefully,
1376          this will work!
1377
1378        * Began fixing the indentation and capitalization to conform
1379          to the GNU coding guidelines.
1380
1381Mon Jan  9 22:23:18 1989  Doug Schmidt  (schmidt at pompe.ics.uci.edu)
1382
1383        * Fixed horrible bug in Read_Line::Readln_Aux.  This was
1384          a subtle and pernicous off-by-1 error, that overwrote
1385          past the last character of the input string buffer.  I
1386          think this fault was killing the vax!
1387
1388        * Yow, fixed an oversight in List_Node::List_Node, where the
1389          pointer field Next was uninitialized.  Luckily, the new routine
1390          seems to return 0 filled objects the first time through!
1391
1392Sun Jan  8 13:43:14 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1393
1394        * Modified the ``key linked'' diagnostic in Key_List::Read_Keys
1395          to be more helpful and easy to read.
1396
1397        * Fixed the List_Node::List_Node so that it would ignore trailing
1398          fields if the -t option was not enabled.
1399
1400        * Moved the List_Node declarations out of keylist.h and
1401          into a file of its own, called listnode.cc and listnode.h
1402          Made Set_Sort a member function of class List_Node.
1403
1404        * Massively updated the documentation in the gperf.texinfo file.
1405        
1406        * Polished off the major revision to the print functions,
1407          added a few new tests in the Makefile to check for the
1408          validity of the program and ftp'ed the entire distribution
1409          off to Doug Lea for libg++. ( changed it to
1410          1.3 to reflect the major changes with the generated
1411          C code ).
1412
1413        * Fixed Key_List::Print_Switch to deal with the -p and -t options.
1414          This meant that the ``still-born'' function Key_List::
1415          Print_Type_Switch was superflous, so I removed it.
1416          Also, removed the restriction in Option that the -p and
1417          -t options couldn't be used simultaneously.
1418
1419        * Modified List_Node::List_Node, to perform only 1 call to 
1420          ``new'' when dynamically allocating memory for the Key_Set
1421          and the Uniq_Set.
1422
1423Sat Jan  7 14:10:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1424
1425        * Fixed a big bug with the new policy of nesting the
1426          wordlist inside of generated function ``in_word_set.''
1427          I'd forgotten to declare the wordlist array as static!
1428          ( arrgh ).
1429
1430        * Added a new function Key_List::Set_Types, that figures out
1431          the return type for generated function ``in_word_set,''
1432          the user-defined ``struct tag,'' if one is used, and also
1433          formates the array type for the static local array.
1434
1435        * Changed the print routines to take advantage of the
1436          new -p option.
1437
1438        * Began adding the hooks to allow the return of a pointer
1439          to a user defined struct location from the generated
1440          ``in_word_set'' function instead of the current 0 or 1
1441          return value.  Created function Key_List::Print_Type_Switch
1442          and added option -p to class Option, allowing the user to 
1443          request generation of the aforementioned pointers returned 
1444          instead of booleans.
1445
1446        * Put in checks in class Option to make sure that -S and -t
1447          options are not used simultaneously.  This restriction
1448          will be removed in subsequent releases, once I decide on
1449          a clean way to implement it.
1450
1451        * Sent version 1.2 to Doug Lea for possible inclusion into
1452          the libg++ distribution.
1453          
1454        * Moved the static word_list array inside the generated function
1455          in_word_set.  This supports better data hiding.
1456
1457        * Added a texinfo file, gperf.texinfo
1458          
1459        * Revised the Makefile to cleanup the droppings from texinfo
1460          and changed the name of gperf.cc and gperf.h to perfect.cc
1461          and perfect.h.
1462
1463Fri Jan  6 13:04:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1464
1465        * Implemented the switch statement output format.  Much better
1466          for large datasets in terms of space used.
1467
1468        * Added new functions to break up the Key_List::Output function.
1469          Functions added were Key_List::Print_Switch, Key_List::Print_Min_Max,
1470          Key_List::Print_Keyword_Table, Key_List::Print_Hash_Function,
1471          and Key_List::Print_Lookup_Function.  This simplifies the
1472          big mess in Key_List::Output considerably!
1473          
1474        * Added switch statement option to Options, which potentially 
1475          trades time for space in the generated lookup code.
1476
1477Thu Jan  5 22:46:34 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
1478
1479        * Released version 1.1
1480        
1481        * Fixed a bug with Gperf::Merge_Set, it was skipping letters shared
1482          between the Set_1 and Set_2.
1483
1484        * Added the optimal min/max algorithm in Key_List::Output.  This
1485          runs in O ( 3n/2 ), rather than O ( 2n ) time.
1486
1487        * Changed Gperf::Sort_Set to use insertion sort, rather than
1488          bubble sort.
1489        
1490        * Added a check in Key_List::Output for the special case where
1491          the keys used are 1,$.  It is possible to generate more
1492          efficient C code in this case.
1493