The first a bug in pax and should be commited to FBSD, too.
[dragonfly.git] / contrib / gperf / ChangeLog
1 2000-09-26  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>
2
3         * gperf-2.7.2 released.
4
5         * doc/gperf.texi: Add a second bug report address
6           <gperf-bugs@lists.sourceforge.net>.
7         * README: Updated.
8
9 2000-08-28  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>
10
11         * lib/getopt.h (struct option): Use "const" also when compiling in
12           C++ mode. Avoids warnings from Sun CC and HP-UX aCC.
13
14         * doc/Makefile.in (docdir): Change from $(datadir)/doc/@PACKAGE@ to
15           $(prefix)/doc/@PACKAGE@, following the newest GNU standards.
16
17 2000-08-20  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>
18
19         * src/version.cc: Bump version number to 2.7.2.
20         * doc/gperf.texi: Likewise.
21
22         * doc/texinfo.tex: Update to post-texinfo-4.0 version. @code in the
23           title page now chooses a larger font. The overall layout of the
24           text is denser.
25
26         * AUTHORS: New file.
27
28         * tests/Makefile.in (all): Add check-lang-utf8 and check-lang-ucs2.
29           (check-lang-utf8, check-lang-ucs2): New targets.
30           (clean): Remove lu8out and lu2out.
31         * tests/lang-utf8.gperf, tests/lang-utf8.exp: New files.
32         * tests/lang-ucs2.gperf, tests/test2.c, tests/lang-ucs2.in,
33           tests/lang-ucs2.exp: New files.
34
35         Allow the use of embedded NULs in keys.
36         * lib/hash.h (hashpjw): Add a length argument.
37         * lib/hash.cc (hashpjw): Likewise. Don't stop when encountering a NUL
38           character.
39         * src/hash-table.h (Hash_Table constructor): Add ignore_len argument.
40           (Hash_Table::ignore_length): New field.
41           (Hash_Table::insert): Renamed from Hash_Table::operator(). Remove
42           ignore_length argument.
43         * src/hash-table.cc (NIL): Remove macro.
44           (Hash_Table constructor): Add ignore_len argument. Use it to
45           initialize ignore_length.
46           (Hash_Table destructor): Specify explicit length of char_set and
47           key.
48           (Hash_Table::insert): Renamed from Hash_Table::operator(). Remove
49           ignore_length argument. Pass explicit length to hashpjw. Compare
50           char_set using memcmp, not strcmp.
51         * src/list-node.h (List_Node): Rename field length to key_length.
52           New field char_set_length.
53           (List_Node constructor): Accept key and rest, not the entire line.
54         * src/list-node.cc (List_Node constructor): Accept key and rest, not
55           the entire line. Don't NUL terminate key and char_set. Specify
56           explicit length of key. Initialize char_set_length field.
57         * src/key-list.cc: Include <ctype.h>.
58           (parse_line): New function.
59           (Key_List::read_keys): Call parse_line instead of new List_Node.
60           Pass option[NOLENGTH] to Hash_Table constructor, not
61           Hash_Table::insert. Specify explicit length of key and char_set.
62           (Key_List::get_occurrence): Use explicit length of char_set.
63           (Key_List::set_determined): Likewise.
64           (Key_List::already_determined): Likewise.
65           (output_string): Add length argument. Output unprintable characters
66           using octal escape sequence.
67           (output_keyword_entry): Use explicit length of key.
68           (Key_List::output_lookup_array): Specify explicit length of key.
69           (output_switch_case): Likewise.
70           (Key_List::dump): Likewise.
71         * src/gen-perf.h (Gen_Perf::compute_disjoint_union): Add two length
72           arguments.
73         * src/gen-perf.cc (Gen_Perf::compute_disjoint_union): Likewise. Don't
74           stop when encountering NUL characters. Don't NUL terminate the
75           result.
76           (Gen_Perf::hash): Use explicit length of char_set.
77           (Gen_Perf::change): Specify explicit length of key.
78         * doc/gperf.texi: Document it.
79
80         * doc/help2man: New file, help2man version 1.022.
81         * Makefile.devel (all): Add doc/gperf.1.
82           (doc/gperf.1): New target.
83         * doc/gperf.1: Automatically generated.
84
85         * mkinstalldirs: New file, from automake-1.4, grep-2.4.1, guile-1.4,
86           libtool-1.3.3, make-3.79.1, tar-1.13.
87         * src/Makefile.in (MKINSTALLDIRS): New variable.
88           (install, installdirs): Use it instead of mkdir.
89         * doc/Makefile.in (MKINSTALLDIRS): New variable.
90           (install, installdirs): Use it instead of mkdir.
91
92         * INSTALL: Update.
93
94 2000-08-19  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>
95
96         * src/key-list.cc (Output_Compare_Memcmp): New class.
97           (Key_List::output_lookup_function): When option -l is given, use
98           memcmp instead of strcmp or strncmp.
99
100         * doc/gperf.texi: The bug report address is <bug-gnu-utils@gnu.org>.
101           The download address is ftp.gnu.org. Remove mention of -a and -g
102           options (now nops). Explain effect of -c option.
103
104         * doc/configure.in (PACKAGE): New variable.
105         * doc/Makefile.in (datadir, docdir): New variables.
106           (dvidir, htmldir): Change values.
107           (install, installdirs): Update.
108
109         * src/configure.in: Rename cache variable gp_cxx_throw_decl to
110           gp_cv_cxx_throw_decl.
111
112         * src/key-list.cc (Key_List::output_hash_function): When outputting
113           __inline, take advantage of C++ compilers which have inline.
114
115         * src/key-list.cc (Output_Compare_Strncmp::output_comparison):
116           After the call to strncmp, verify that expr2 is not longer than
117           `len'.
118           Reported by Carlo Wood <carlo@runaway.xs4all.nl>.
119
120         * src/key-list.cc (Key_List::output_lookup_function_body): Avoid
121           emitting the loop for dealing with duplicates if
122           total_duplicates == 0.
123
124         * src/key-list.cc (Key_List::read_keys): Don't accept an empty key.
125
126         * src/Makefile.in (install, installdirs, uninstall): Respect
127           $(DESTDIR).
128         * doc/Makefile.in (install, installdirs, uninstall): Likewise.
129
130         * src/options.cc (Options::print_options): Escape the arguments which
131           contain special characters.
132
133         * tests/c-parse.gperf: Updated from gcc-2.95.2/gcc/c-parse.gperf.
134         * tests/objc.gperf: New file, from gcc-2.95.2/gcc/objc/objc.gperf.
135         * tests/chill.gperf: New file, from gcc-2.95.2/gcc/ch/gperf.
136         * tests/cplusplus.gperf: New file, from gcc-2.95.2/gcc/cp/gxx.gperf.
137         * tests/gplus.gperf: Remove file.
138         * tests/java.gperf: New file, from gcc-2.95.2/gcc/java/keyword.gperf.
139         * tests/Makefile: Check them all.
140         * tests/c-parse.exp: Renamed from tests/test-1.exp.
141         * tests/modula2.exp: Renamed from tests/test-2.exp.
142         * tests/cplusplus.exp: Renamed from tests/test-3.exp.
143         * tests/gpc.exp: Renamed from tests/test-5.exp.
144
145         * src/key-list.cc (output_switch_case): Add trailing semicolon to
146           lengthptr assignment line. Fixes bug with -D and -S.
147           From Reini Urban <rurban@sbox.tu-graz.ac.at>. Also reported by
148           David Hunter.
149         * tests/Makefile.in (check-lang-syntax): Perform each test with -D
150           once without and once with duplicates.
151
152         * src/key-list.cc (output_keyword_entry): Avoid outputting a struct
153           initializer of the form {"key",}.
154
155         * src/iterator.cc: Don't include <stream.h>.
156           From Michael Deutschmann <ldeutsch@mail.netshop.net>.
157
158         * tests/Makefile.in (VALIDATE, check-lang-syntax): Use $(srcdir) where
159           appropriate.
160           Reported by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>.
161
162         * tests/validate: Don't run -traditional tests by default.
163
164         * src/main.cc (main): Check for write error on stdout before returning.
165
166         * src/Makefile.in (LDFLAGS): New definition, to catch the value given
167           at configure time.
168
169         Make the structure initializers customizable. Based on a patch by
170         Kaveh R. Ghazi <ghazi@caip.rutgers.edu>.
171         * src/options.h (Options::get_initializer_suffix,
172           Options::initializer_suffix): New declarations.
173         * src/options.icc (Options::get_initializer_suffix): New function.
174         * src/options.cc (DEFAULT_INITIALIZER_SUFFIX): New constant.
175           (Options::initializer_suffix): New variable.
176           (Options::short_usage): Document option "-F".
177           (Options::long_usage): Document option "-F".
178           (Options constructor): Initialize initializer_suffix.
179           (Options destructor): Dump initializer_suffix.
180           (long_options): Add option "-F".
181           (Options::operator()): Accept option "-F". Sets initializer_suffix.
182         * src/key-list.cc (output_keyword_blank_entries): Output
183           initializer_suffix.
184         * doc/gperf.texi: Document option "-F".
185
186         * COPYING: Replace with GPL version 2 (with new FSF address and Y2K
187           safe year format).
188
189         * doc/gpl.texinfo: New file.
190         * doc/gperf.texi: Document it.
191         * doc/Makefile.in (gperf.info, gperf.dvi, gperf.html, gperf_toc.html):
192           Update dependencies.
193
194         * doc/Makefile.in (MAKEINFO): Unset LANG while running makeinfo.
195
196 1998-05-20  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
197
198         * doc/Makefile.in (gperf.dvi, clean): Remove gperf.cps.
199           (install, installdirs, uninstall): Don't install gperf.dvi. The
200           info and HTML documentations are sufficient for on-line use, and
201           users who wish to print the documentation (in PS or DVI format)
202           can do this directly off the source distribution.
203           (DVIPS): Use "-D600" instead of "-Pljfour", for portability.
204
205 1998-05-20  Akim Demaille  <demaille@inf.enst.fr>
206
207         * doc/gperf.texi: Many modifications:
208           (Output Format): Declare `hash' and `in_word_set' as functions.
209           (Concept Index): New section.
210           (Title page): Use standard presentation.
211           (Top): Use @top instead of @unnumbered so that automatic master
212           update works.
213           (Motivation): Avoid spaces in @var.
214           (Options): Use the standard name ``Invoking ...''.
215           (Options): Declare also the long form of the options.
216           (Options): Remove redundant @itemize when @table is used.
217
218 1998-05-08  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
219
220         * aclocal.m4 (CL_PROG_INSTALL): Set cl_cv_path_install, not
221           ac_cv_path_install.
222
223 Sat May  2 13:20:54 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
224
225         * gperf-2.7 released.
226
227 Sat May  2 12:31:51 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
228
229         * src/version.cc (version_string): Remove the "(C++ version)" suffix.
230           It's redundant: the early C versions of gperf are called cperf.
231           Reported by Karl Berry.
232         * src/option.cc (Options::operator()): Trim the output of "gperf -v".
233
234 Thu Apr 16 13:22:16 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
235
236         * lib/Makefile.in, src/Makefile.in: Don't use $(TARGET_ARCH).
237           Solaris "make" sets it to a value not understood by "cc".
238
239 Wed Apr 15 23:52:14 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
240
241         * lib/Makefile.in, src/Makefile.in: Don't use implicit rules. Don't
242           use $<. AIX "make" and OSF/1 "make" have problems with both.
243         * src/gen-perf.cc, src/key-list.cc: Cast free() argument to char*,
244           otherwise it doesn't compile on SunOS 4.
245         * src/key-list.h: Declare structs outside of other declarations,
246           needed for OSF/1 cxx 5.5.
247         * lib/getopt.h: Use prototypes if __STDC__ || __cplusplus.
248           Don't give a prototype for getopt(), to avoid error on SunOS 4.
249         * lib/getopt.c: Declare strncmp, to avoid warnings.
250
251 Tue Apr 14 23:24:07 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
252
253         * lib/GetOpt.{h,cc}: Remove files.
254         * lib/getopt.{h,c}, lib/getopt1.c: New files, from GNU libc.
255         * lib/configure.in (AC_INIT): Search for hash.cc, not GetOpt.cc.
256         * lib/Makefile.in (OBJECTS): Remove GetOpt.o, add getopt.o, getopt1.o.
257           (getopt.o, getopt1.o, hash.o): Use explicit building rules. Some
258           "make"s don't support to have both implicit rules for "%.o : %.c"
259           and "%.o : %.cc" in the same Makefile.
260         * lib/hash.{h,cc}: Remove #pragma; there are no templates here.
261         * src/option.h (Options::usage): Remove.
262           (Options::short_usage, Options::long_usage): Declare.
263         * src/option.cc (Options::usage): Remove.
264           (Options::short_usage, Options::long_usage): New functions.
265           (long_options): New array.
266           (Options::operator()): Use getopt_long instead of GetOpt::operator(),
267           change all references to GetOpt members.
268
269         * src/std-err.{h,cc}: Remove files.
270         * src/gen-perf.cc, src/key-list.cc, list-node.cc, new.cc, options.cc:
271           Call fprintf(stderr) instead of Std_Err::report_error().
272         * src/key-list.h, src/list-node.h, src/options.h: Don't use class
273           Std_Err any more.
274         * src/option.cc (program_name): New variable.
275         * src/Makefile.in: Remove STD_ERR_H.
276           (OBJECTS): Remove std-err.o.
277
278 Mon Mar 23 01:03:35 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
279
280         * aclocal.m4, {lib,src,tests}/configure.in: Remove CL_CC_WORKS and
281           CL_CXX_WORKS, already contained in autoconf 2.12.
282
283         * src/gen-perf.cc, src/key-list.cc: Move some code from
284           Gen_Perf::Gen_Perf() to Key_List::output().
285         * src/Makefile.in: Update dependencies.
286
287         * src/options.{h,cc}: Remove option "-p".
288         * src/key-list.cc (Key_List::set_output_types): Rewrite.
289           (default_array_type, default_return_type): Remove.
290         * src/key-list.cc: Adjust "const" handling.
291           + With option "-t" [TYPE], don't emit wrong code if there is no
292             space before the struct's opening brace.
293
294 Sun Mar 22 16:59:15 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
295
296         * src/key-list.{h,cc}: Completely reorganized the output routines.
297           Rewrote from scratch the output_switch() function. Use classes
298           (Output_Constants, Output_Expr, Output_Compare) for abstraction.
299           In particular:
300           + Don't emit trailing whitespace and spurious blank lines.
301           + Adjust indentation of the arrays.
302           + Don't emit commas at the end of array initializers and
303             struct initializers.
304           + With option "-l" [LENTABLE], compare the length before
305             fetching the word from memory.
306           + With option "-S" [SWITCH], emit the comparison code just once,
307             not once in every switch statement.
308           + With option "-S" [SWITCH], choose the right switch statement
309             through a binary search, not a linear search.
310           + With option "-S" [SWITCH], emit straightforward comparisons
311             instead of switch statements with just one "case" label.
312           + With options "-S -p -t" [SWITCH, POINTER, TYPE], don't emit
313             spurious empty elements at the beginning of the wordlist array.
314           + With option "-D" [DUP] and not option "-S" [SWITCH], if there
315             is no more room for duplicate entries in the lookup array,
316             don't call `assert (i != 0)'. Instead, make the array larger :-)
317           + With option "-D" [DUP], if there are no duplicates, don't
318             automatically fall back to the non-"-D" algorithm. If the user
319             wants the non-"-D" algorithm, he can just not specify "-D".
320           + With option "-D" [DUP] and either options "-p -t" [POINTER, TYPE]
321             or not option "-S" [SWITCH], don't emit spurious empty elements
322             at the beginning of the wordlist array.
323           + With option "-D" [DUP], simplify the detection and processing
324             of duplicate entries in the lookup array.
325           + With options "-D -l" [DUP, LENTABLE] and not option "-S" [SWITCH],
326             don't forget to emit the lengthtable array.
327           + With options "-D -l -S" [DUP, LENTABLE, SWITCH], don't forget to
328             compare the lengths before comparing the strings.
329
330         * src/gen-perf.cc: No need to include <assert.h>.
331         * src/options.cc: Likewise.
332
333         * src/options.cc: Don't use `errno' after freopen failed.
334         * src/std-err.cc: `report_error' doesn't call strerror(errno) any
335           more. No need to include <string.h> and <errno.h>.
336
337         * tests/Makefile.in (check-*): Any difference between .exp and .out
338           is a failure. Don't ignore whitespace differences.
339
340         * tests/Makefile.in (check-lang-syntax): Add some more checks.
341
342 Fri Mar 20 00:54:54 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
343
344         * tests/jscript.gperf: Renamed from tests/javascript.gperf, because
345           of Minix and SVR2 14-character filename limit.
346         * src/key-list.cc (output_string): New function.
347           (Key_List::output_switch, Key_List::output_keyword_table): Call it.
348
349         * src/options.{h,icc,cc} (get_wordlist_name): New function. Add
350           option -W.
351         * src/key-list.cc (Key_List::output_switch,
352           Key_List::output_keyword_table, Key_List::output_lookup_function):
353           Use it.
354         Patch from William Bader <wbader@CSEE.Lehigh.Edu>.
355
356         * src/version.cc: Bump version number directly from 2.5 to 2.7,
357           because Schmidt's last release from 1991 carries version number 2.6.
358
359 Tue Jul 30 00:02:39 1991  Douglas C. Schmidt  (schmidt at net4.ics.uci.edu)
360
361         * Fixed a small bug in the Key_List::output_keyword_table routine
362           that caused an extra newline to be printed if there where no
363           leading blank entries... (who cares, right?!)
364
365 Mon Jul 29 22:05:40 1991  Douglas C. Schmidt  (schmidt at net4.ics.uci.edu)
366
367         * Modified the handling of the -E (emit enums rather than
368           #defines) option in conjunction with the -G option.  Now, if -G
369           and -E are given the enums are generated outside the lookup
370           function, rather than within it!
371
372 Mon Apr  8 18:17:04 1991  Doug Schmidt  (schmidt at net4.ics.uci.edu)
373
374         * Yucko, there was a bug in the handling of -c (and of course the
375           new -I command in key-list.cc).  Apparently when I added the
376           super-duper hack that provided support for duplicate keys I
377           forgot to update the strcmp output...
378
379 Mon Mar  9 02:19:04 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
380
381         * Moved the documentation to doc/, put the stuff borrowed from
382           libg++ into lib/.
383         * Rewrote all Makefile.in's for better compliance with GNU standards.
384         * Autoconf based configuration. Rewrote all configure.in's. Added
385           aclocal.m4, with macros from CLISP and CLN. Added Makefile.devel.
386         * src/depend: Removed. Dependencies are now in src/Makefile.in.
387
388         * src/bool-array.icc: New file, contains inline functions, from both
389           src/bool-array.h and src/bool-array.cc.
390         * src/options.icc: New file, contains inline functions, from both
391           src/options.h and src/options.cc.
392         * src/read-line.icc: New file, contains inline functions, from both
393           src/read-line.h and src/read-line.cc.
394
395         * src/bool-array.h: Don't include <std.h>.
396         * src/bool-array.cc: Include <string.h>.
397         * src/gen-perf.cc: No need to include <ctype.h>. Don't include
398           <_G_config.h>.
399         * src/hash-table.cc: Don't include <std.h> and <builtin.h>. Include
400           <string.h> and lib/hash.h instead.
401         * src/iterator.cc: Don't include <std.h>.
402         * src/key-list.cc: Don't include <builtin.h>. Include <string.h> and
403           <stdlib.h> instead.
404         * src/list-node.cc: Don't include <std.h>. Include <stdlib.h> instead.
405           Remove `index' hack.
406         * src/main.cc: Don't include <_G_config.h>.
407         * src/new.cc: Don't include <std.h>. Include <stdlib.h> instead.
408         * src/options.cc: Don't include <builtin.h>. Include <string.h> and
409           <stdlib.h> instead.
410         * src/read-line.cc: Don't include <builtin.h>. Include <stdlib.h>
411           instead.
412         * src/std-err.cc: Don't include <std.h>. Include <string.h> (for Irix).
413         * src/vectors.h: No need to include <stdio.h>.
414         * src/version.cc: No need to include <stdio.h>.
415
416         * src/bool-array.h: Change `STORAGE_TYPE' from int to unsigned int.
417         * src/bool-array.{h,cc}: Change type of `Bool_Array::size' from int
418           to unsigned int.
419         * src/bool-array.{h,cc}: Change type of `Bool_Array::init' argument
420           from STORAGE_TYPE to unsigned int.
421         * src/gen-perf.{h,cc}: Change two `Gen_Perf::compute_disjoint_union'
422           argument types from `char *' to `const char *'.
423         * src/iterator.h: Change type of `Iterator::str' and argument of
424           `Iterator::Iterator' from `char *' to `const char *'.
425         * src/iterator.cc: Cast to `unsigned char' before calling `isdigit'.
426         * src/key-list.{h,cc}: Change type of `Key_List::array_type',
427           `Key_List::return_type', `Key_List::struct_tag',
428           `Key_List::include_src', `default_array_type', `default_return_type'
429           and return type of `Key_List::get_array_type',
430           `Key_List::get_special_input', `Key_List::save_include_src' from
431           `char *' to `const char *'.
432         * src/key-list.cc: Change "pretty gross" assignment.
433         * src/key-list.cc: Don't use `alloca', HP-UX CC lacks it.
434         * lib/GetOpt.cc: Likewise.
435         * src/key-list.cc (merge): Use iteration instead of recursion.
436         * src/list-node.{h,cc}: Change type of `List_Node::key',
437           `List_Node::rest', `List_Node::char_set' from `char *' to
438           `const char *'.
439         * src/new.cc: Don't use BUFSIZ. Conditionalize the throw() declaration.
440         * src/read-line.h: Don't use BUFSIZ.
441         * src/read-line.cc: Make CHUNK_SIZE a constant, and use allocate the
442           buffers on the stack by default. Use memcpy for copying buffers.
443           Include <string.h>.
444         * src/read-line.icc (get_line): Use iteration instead of tail recursion.
445           Don't call ungetc(EOF,stdin).
446         * src/std-err.{h,cc}: Change type of `Std_Err::program_name' and of
447           argument `Std_Err::report_error' from `char *' to `const char *'.
448         * src/std-err.cc: `report_error' doesn't call `exit' any more. All
449           callers changed to do that themselves.
450         * src/trace.h: Make constructor/destructor calls non-inline.
451
452         * src/key-list.cc (output_hash_function): If option[CPLUSPLUS],
453           always make the hash function inline.
454           (output): Declare the hash function inline, with the right name.
455         * src/options.{h,cc}, src/gen-perf.cc, src/key-list.cc: Remove
456           options -g, making it on by default. Remove option -a. Instead,
457           introduce "-L KR-C", "-L C", "-L ANSI-C", "-L C++".
458         * src/options.{h,cc}, src/key-list.cc: Add option -I.
459         * src/key-list.cc: Don't emit "const" if compiling in mode "-L KR-C".
460         * src/key-list.cc: Don't emit a comma at the end of an enum list.
461         * src/main.cc: Remove COUNT_TIME code.
462         * src/vectors.h, src/key-list.cc, src/options.cc, src/list-node.cc:
463           ALPHA_SIZE defaults to 256 now. Add option -7.
464
465         * tests/javascript.gperf: New file.
466         * tests/jstest*.gperf, tests/validate: New tests.
467
468 Sat Jan 31 01:38:11 1998  Alexandre Oliva <oliva@dcc.unicamp.br>
469
470         * src/Makefile.in ($(TARGETPROG)): Add $(CFLAGS).
471
472 Wed Jan 28 01:56:00 1998  Manfred Hollstein  <manfred@s-direktnet.de>
473
474         * configure.in (package_makefile_rules_frag): New and
475         redirect stderr from ${srcdir}/config.shared to
476         ${package_makefile_rules_frag}.
477         * src/configure.in: Ditto.
478         * tests/configure.in: Ditto.
479
480 Fri Jan 23 08:00:41 1998  H.J. Lu  (hjl@gnu.org)
481
482         * gperf.texi (@ichapter): Changed to @chapter.
483
484 Wed Jan 14 09:16:48 1998  H.J. Lu  (hjl@gnu.org)
485
486         * src/key-list.cc, src/key-list.h (Key_List::strcspn): Don't
487         define if strcspn is defined.
488
489 Fri Jan 24 13:23:47 1997  Mike Stump  <mrs@cygnus.com>
490
491         * src/new.cc (operator delete): Add the exception specification.
492
493 Mon Feb  5 19:29:16 1996  Per Bothner  <bothner@kalessin.cygnus.com>
494
495         * src/read-line.cc (Read_Line::readln_aux):  Handle EOF if last line
496         has a length which is an exact multiple of CHUNK_SIZE.  (Used to throw
497         away the line's contents.)  From Bruno Haible <haible@ilog.ilog.fr>.
498         * src/Makefile.in ($(TARGETPROG)):  Add -lm to link line.
499
500 Tue Jun 11 13:43:50 1996  Brendan Kehoe  <brendan@lisa.cygnus.com>
501
502         * src/list-node.cc (List_Node): Reorder init of nodes to
503         match declaration order.
504         * src/hash-table.cc (Hash_Table): Likewise.
505
506 Tue Oct 10 16:37:28 1995  Mike Stump  <mrs@cygnus.com>
507
508         * src/new.cc: Since malloc/delete are not paired, we cannot call
509         free.
510
511 Wed Jan  4 12:40:14 1995  Per Bothner  <bothner@kalessin.cygnus.com>
512
513         * src/Makefile.in ($(TARGETPROG)):  Link with $(LDFLAGS).
514         Patch from John Interrante <interran@uluru.stanford.edu>.
515
516 Sat Nov  5 19:12:48 1994  Jason Merrill  (jason@phydeaux.cygnus.com)
517
518         * src/Makefile.in (LIBS): Remove.
519
520 Tue Oct 18 17:51:14 1994  Per Bothner  <bothner@kalessin.cygnus.com>
521
522         * src/std-err.cc:  Use stderror, instead of the non-standard
523         sys_nerr and sys_errlist.
524
525 Sat Sep 17 22:02:13 1994  Per Bothner  (bothner@kalessin.cygnus.com)
526
527         * src/key-list.cc (output_hash_function):
528         Patch from William Bader <wbader@CSEE.Lehigh.Edu>.
529
530 Fri Jul 15 09:38:11 1994  Per Bothner  (bothner@cygnus.com)
531
532         * src/std-err.cc:  #include <errno.h>, and only declare
533         extern int errno if errno is not a macro.
534
535 Mon May 30 17:29:34 1994  Per Bothner  (bothner@kalessin.cygnus.com)
536
537         * Makefile.in (src_all, install):  Make sure to add '/' after
538         `pwd` in $rootme, as expected by FLAGS_TO_PASS.
539
540 Wed May 11 00:47:22 1994  Jason Merrill  (jason@deneb.cygnus.com)
541
542         Make libg++ build with gcc -ansi -pedantic-errors
543         * src/options.h: Lose commas at end of enumerator lists.
544
545 Sun Dec  5 19:16:40 1993  Brendan Kehoe  (brendan@lisa.cygnus.com)
546
547         * src/hash-table.cc (Hash_Table::~Hash_Table): Don't pass an
548         argument to fprintf, since it's not expecting one.
549
550 Fri Nov 26 19:03:18 1993  Per Bothner  (bothner@kalessin.cygnus.com)
551
552         * src/list-node.cc:  #undef index, for the sake of broken NeXT,
553
554 Thu Nov  4 11:16:03 1993  Per Bothner  (bothner@kalessin.cygnus.com)
555
556         * Makefile.in (install):  Use INSTALL_DATA for gperf.1.
557
558 Mon Oct 25 18:40:51 1993  Per Bothner  (bothner@kalessin.cygnus.com)
559
560         * src/key-list.cc (Key_List::read_keys):  Use POW macro
561         to increase hash table size to power of 2.
562
563         * options.h (LARGE_STACK_ARRAYS):  New flag.  Defaults to zero.
564         * gen-perf.cc, key-list.cc, read-line.cc:       
565         Only stack-allocate large arrays if LARGE_STACK_ARRAYS is set.
566         * main.cc (main):  Only call setrlimit (RLIMIT_STACK, ...)
567         if LARGE_STACK_ARRAYS.
568
569 Mon Oct  4 17:45:08 1993  Per Bothner  (bothner@kalessin.cygnus.com)
570
571         * src/gen-perf.cc:  Always use ANSI rand/srand instead of BSDisms.
572
573 Wed Aug 18 12:19:53 1993  Per Bothner  (bothner@kalessin.cygnus.com)
574
575         * Makefile.in (src_all):  Make less verbose output.
576
577 Fri May 28 14:01:18 1993  Per Bothner  (bothner@rtl.cygnus.com)
578
579         * src/gen-perf.cc (Gen_Perf::change):  Don't use gcc-specific
580         2-operand conditional expression.
581         * src/key-list.cc (Key_List::output_lookup_array):
582         Don't use variable-size stack arrays, unless compiled by g++.
583
584 Tue May  4 14:08:44 1993  Per Bothner  (bothner@cygnus.com)
585
586         Changes (mostly from Peter Schauer) to permit compilation
587         using cfront 3.0 and otherwise be ARM-conforming.
588         * src/key-list.h:  class Key_List must use public derivation
589         of base class Std_Err (because Gen_Perf::operator() in gen-perf.cc
590         calls Std_Err::report_error).
591         * src/gen-perf.cc (Gen_Perf::affects_prev), src/hash-table.cc
592         (Hash_Table::operator()):  Don't use gcc-specific 2-operand
593         conditional expression.
594         * src/iterator.cc (Iterator::operator()):  Don't use gcc-specific
595         range construct in case label.
596         * key-list.cc (Key_List::output_lookup_array, Key_List::read_keys),
597         src/gen-perf.cc (Gen_Perf::operator(), src/read-line.cc
598         (Read_Line::readln_aux):  If not gcc, don't allocate
599         variable-sized arrays on stack.
600         * src/new.cc (operator new):  Argument type should be size_t.
601         * key-list.cc (Key_List::output_lookup_array, Key_List::read_keys),
602         new/cc (::operator new): Don't use non-standard >?= operator.
603
604 Tue Apr 27 20:11:30 1993  Per Bothner  (bothner@cygnus.com)
605
606         * src/Makefile.in:  Define TARGETPROG, and use it.
607
608 Mon Apr 19 00:29:18 1993  Per Bothner  (bothner@cygnus.com)
609
610         * Makefile.in, configure.in:  Re-vamped configure scheme.
611         * gperf.texinfo:  Renamed to gperf.texi.
612         * src/bool-array.{h,cc}:  ANSIfy bzero->memset.
613
614 Sat Jan 30 20:21:28 1993  Brendan Kehoe  (brendan@lisa.cygnus.com)
615
616         * tests/Makefile.in (mostlyclean): Also delete aout, cout, m3out,
617         pout, and preout.
618
619 Tue Dec 29 08:58:17 1992  Ian Lance Taylor  (ian@cygnus.com)
620
621         * Makefile.in: pass $(FLAGS_TO_PASS) to all calls to make.
622         (FLAGS_TO_PASS): added INSTALL, INSTALL_DATA, INSTALL_PROGRAM.
623
624 Mon Dec 21 18:46:46 1992  Per Bothner  (bothner@rtl.cygnus.com)
625
626         * tests/expected.* renamed to *.exp to fit in 14 chars.
627         * tests/Makefile.in:  Update accordingly.
628         Also rename output.* to *.out.
629         * src/Makefile.in (clean):  Remove gperf program.
630
631 Wed Dec  9 14:33:34 1992  Per Bothner  (bothner@cygnus.com)
632
633         * src/hash-table.cc, src/bool-array.h: ANSIfy bzero->memset.
634
635 Thu Dec  3 19:34:12 1992  Per Bothner  (bothner@cygnus.com)
636
637         * Makefile.in (distclean, realclean): Don't delete
638         Makefile before recursing.
639
640 Fri Nov  6 13:41:49 1992  Per Bothner  (bothner@rtl.cygnus.com)
641
642         * key-list.{h,cc}:  Remove MAX_INT (and similar) constant
643         fields from Key_List class, and use INT_MAX (etc) from limits.h.
644         * key-list.{h,cc}, options.{h,cc}, vectors.h:  Removed all
645         uses of initialized const fields, as they are non-standard
646         - and their use was easy to do away with.  Mostly, just
647         made the constants static non-fields in the .cc file.
648
649 Mon Nov  2 13:10:11 1992  Per Bothner  (bothner@cygnus.com)
650
651         * tests/Makefile.in:  When generating cinset.c, don't pass -C,
652         since -C assumes an ANSI compiler.  Add the -C flag (with -a)
653         when generating test.out.3 instead.
654         * tests/expected.out.3:  Update accordingly.
655
656 Wed Aug 12 11:47:54 1992  Per Bothner  (bothner@cygnus.com)
657
658         * Makefile.in:  Factor out common flags into $(FLAGS_TO_PASS).
659         * Makefile.in:  'install-info' depends on gperf.info.
660
661 Mon Aug 10 11:39:52 1992  Ian Lance Taylor  (ian@dumbest.cygnus.com)
662
663         * Makefile.in, src/Makefile.in: always create installation
664         directories.
665
666 Mon Jul 20 15:33:21 1992  Mike Stump  (mrs@cygnus.com)
667
668         * src/new.cc (operator new):  Add cast from void * to char *,
669         since it is not a standard conversion.
670
671 Wed Jun 17 16:25:30 1992  Per Bothner  (bothner@rtl.cygnus.com)
672
673         * src/gen-perf.cc:  #include <_G_config.h> for _G_SYSV.
674         * src/key-list.cc:  alloca() hair.
675         * src/main.cc (main):  Only call getrlimit if _G_HAVE_SYS_RESOURCE.
676         * Makefile,in, {src,test}/Makefile.in:  Fix *clean rules.
677
678 Fri May 29 13:21:13 1992  Per Bothner  (bothner@rtl.cygnus.com)
679
680         * src/gen-perf.cc:  Replace USG -> _G_SYSV.
681
682 Thu May 14 13:58:36 1992  Per Bothner  (bothner@rtl.cygnus.com)
683
684         * src/Makefile.in:  Don't pass obsolete flag -DUNLIMIT_STACK.
685         * tests/Makefile.in (clean): Fix.
686
687 Sat Mar  7 00:03:56 1992  K. Richard Pixley  (rich@rtl.cygnus.com)
688
689         * gperf.texinfo: added menu item hook.
690
691 Wed Feb 26 18:04:40 1992  K. Richard Pixley  (rich@cygnus.com)
692
693         * Makefile.in, configure.in: removed traces of namesubdir,
694           -subdirs, $(subdir), $(unsubdir), some rcs triggers.  Forced
695           copyrights to '92, changed some from Cygnus to FSF.
696
697 Sun Jan 26 19:21:58 1992  Per Bothner  (bothner at cygnus.com)
698
699         * tests/Makefile.in:  Use re-directed stdin instead of file
700         name in argv.  This allows us to remove the filename
701         from the output, the expected output, and hence the diffs.
702         (Note that the input file is in $(srcdir), which we cannot
703         place in the expected out files.)
704         * tests/expected.out.[1235]:  Edit out input filename,
705         to match new output.
706
707 Thu Jun 28 16:17:27 1990  Doug Schmidt  (schmidt at brilliant)
708
709         * Wow, first fix on the new job!  There was a dumb error
710           in Key_List::output_lookup_function, where I printed the
711           string "&wordlist[key]" instead of the correct "&wordlist[index]".
712           
713         * Added a couple of #ifdefs for USG support.
714                 
715 Sun Jun  3 17:16:36 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
716
717         * Updated the version number to 2.5 and sent to Doug Lea for release
718           with the latest GNU libg++.
719
720         * Changed the error handling when a keyword file cannot be opened
721           (now calls perror).
722
723 Wed May 30 14:49:40 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
724
725         * Instrumented the source code with trace statements automagically
726           inserted using my new automated trace instrumentation tool!
727
728 Wed May  9 11:47:41 1990  Doug Schmidt  (schmidt at siam.ics.uci.edu)
729
730         * Really fixed the previous bug.  Turns out that a small amount
731           of logic had to be duplicated to handle static links that occur
732           as part of dynamic link chains.  What a pain!!!
733
734 Tue May  8 23:11:44 1990  Doug Schmidt  (schmidt at siam.ics.uci.edu)
735
736         * Fixed a stupid bug in Key_List::output_lookup_array that was
737           causing incorrect counts to be generated when there were both
738           static and dynamic links occurring for the same hash value.
739           Also simplified the code that performs the logic in this routine.
740
741 Mon Apr 30 17:37:24 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
742
743         * Fixed stupid bug in Key_List::output_lookup_array that was
744           making the generated lookup[] array contain `chars' even
745           when the values stored in the chars are greater than 127!
746
747         * Changed the behavior of the -G (global table) option so that it
748           will output the `length[]' array in the global scope along with
749           the `word_list[]' array.
750
751         * Fixed a stupid bug in Key_List::output_lookup_function that
752           would always output the complicated `duplicate-handling' lookup
753           logic, even when there were no duplicates in the input!
754
755         * Yikes, had to modify a bunch of stuff in key-list.cc to correctly
756           handle duplicate entries.  Changed the generated code so that
757           the MIN_HASH_VALUE is no longer subtracted off when calculating
758           the hash value for a keyword.  This required changing some other
759           code by substituting MAX_HASH_VALUE for TOTAL_KEYS in several places.
760           Finally, this means that the generated tables may contain leading 
761           null entries, but I suppose it is better to trade-off space to get 
762           faster performance...
763
764 Mon Mar 26 13:08:43 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
765
766         * Updated version number to 2.4 to reflect the latest changes.
767
768         * Changed the main program so that it always prints out gperf's
769           execution timings to the generated output file.
770           
771 Sun Mar 25 12:39:30 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
772
773         * Added the -Z option so that users can specify the name of the
774           generated class explicitly.  Updated documentation to reflect
775           this change.
776           
777         * Modified the generated C++ class interface so that the functions
778           are declared static (to remove the overhead of passing the `this'
779           pointer).  This means that operator()() can no longer be used,
780           since it only works on non-static member functions.
781           Also changed things so that there is no constructor (why waste
782           the extra call, when it doesn't do anything, eh?)
783
784         * Modified the behavior of Key_List::output when the -L C++ option
785           is enabled.  Previously the code generated use const data members
786           to record MIN_WORD_LENGTH, MIN_HASH_VALUE, etc.  However, as
787           pointed out by James Clark this may result in suboptimal behavior
788           on the part of C++ compilers that can't inline these values.
789           Therefore, the new behavior is identical to what happens with
790           -L C, i.e., either #defines or function-specific enums are used.
791           Why sacrifice speed for some abstract notion of `code purity?' ;-)
792
793 Tue Mar  6 18:17:42 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
794
795         * Added the -E option that defines constant values using an enum
796           local to the lookup function rather than with #defines.  This
797           also means that different lookup functions can reside in the
798           same file.  Thanks to James Clark (jjc@ai.mit.edu). 
799
800 Sat Mar  3 20:19:00 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
801
802         * Added a special case to key_list::output_switch that doesn't
803           generate extra comparisons when the `-S' is given an argument
804           of 1 (the normal case).  This should speed up the generated
805           code output a tad...
806
807 Fri Feb 23 14:21:28 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
808
809         * Renamed all instances of member function get_keysig_size
810           to get_max_keysig_size, since this is more precise...
811
812         * Changed all occurrences of charset to keysig (stands for ``key
813           signature'') to reflect the new naming convention used in the 
814           USENIX paper.
815
816 Thu Feb 22 11:28:36 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
817
818         * Changed the name of the generated associated values table from
819           asso_value to asso_values to reflect conventions in the USENIX
820           C++ paper.
821
822 Thu Feb 15 23:29:03 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
823
824         * Updated the gperf.texinfo file to fix some formatting problems
825           that had crept in since last time.
826
827 Wed Feb 14 23:27:24 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
828
829         * Fixed stupid bug in key-list.cc (get_special_input), wher
830           gperf replaced each '%' with the succeeding character.
831
832         * Added support for multiple target language generation.  Currently
833           handled languages are C and C++, with C as the default.  Updated
834           documentation and option handler to reflect the changes.
835
836         * Added a global destructor to new.cc and removed the #ifdef, since
837           the bloody thing now works with libg++.
838
839 Mon Feb 14 13:00:00 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
840
841         * Found out that my gperf paper was accepted at the upcoming
842           USENIX C++ Conference in San Francisco.  Yow!
843
844 Tue Jan 30 09:00:29 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
845
846         * #ifdef'd out the new.cc memory allocator, since there are
847           problems with this and the libg++ stuff.
848
849         * Changed key-list.h so that class Vectors is a public (rather
850           than private) base class for class Key_List.  The previous
851           form was illegal C++, but wasn't being caught by the old
852           g++ compiler.  Should work now... ;-)
853
854 Sun Dec 10 14:08:23 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
855
856         * Added several changes from rfg@ics.uci.edu.  These changes
857           help to automate the build process.
858
859 Wed Nov 15 15:49:33 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
860
861         * Removed conditional compilation for GATHER_STATISTICS.  There's
862           really no good reason to avoid collecting this info at run-time,
863           since that section of code is *hardly* the bottleneck... ;-)
864
865         * Simplified the C output routines in Key_List::set_output_types
866           and Key_List::output_keyword_table a bit in order to
867           speed-up and clean up the code generation.
868
869         * Modified function Key_List::get_special_input so that it does
870           not try to `delete' a buffer that turned out to be too short.
871           This is important since the new memory management scheme
872           does not handle deletions.  However, adding a small amount of
873           garbage won't hurt anything, since we generally don't do this
874           operation more than a couple times *at most*!
875
876         * Created a new file (new.cc) which includes my own overloaded
877           operator new.  This function should dramatically reduce the
878           number of calls to malloc since it grabs large chunks and
879           doles them out in small pieces.  As a result of this change
880           the class-specific `operator new' was removed from class List_Node.
881
882 Tue Nov 14 21:45:30 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
883
884         * Continued to refine the great hack.  The latest trick is to
885           try and replace most uses of dynamic memory (i.e., calls to
886           new) with uses of gcc dynamic arrays (i.e., an alloca solution).
887           This makes life much easier for the overall process-size, since 
888           it reduces the amount of overhead for memory management.  As a
889           side-effect from this change there is no reason to have the
890           Bool_Array::dispose member function, so it's outta here!
891
892         * Fixed a stupid bug that was an disaster waiting to happen...
893           Instead of making the boolean array large enough to index
894           max_hash_value it was only large enough to index max_hash_value
895           - 1.  Once again, an off-by-one mistake in C/C++!!!!
896
897 Mon Nov 13 19:38:27 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
898
899         * Added the final great hack!  This allows us to generate hash tables
900           for near-perfect hash functions that contain duplicates, *without*
901           having to use switch statements!  Since many compilers die on large
902           switch statements this feature is essential.  Furthermore, it appears
903           that the generated code is often *smaller* than that put out by
904           compilers, even though a large, sparse array must be created.
905           Here's the general idea:
906
907              a. Generate the wordlist as a contiguous block of keywords, 
908                 just as before when using a switch statement.  This
909                 wordlist *must* be sorted by hash value. 
910
911              b. Generate the lookup array, which is an array of signed
912                 {chars,shorts,ints}, (which ever allows full coverage of
913                 the wordlist dimensions).  If the value v, where v =
914                 lookup[hash(str,len)], is >= 0 and < TOTAL_KEYWORDS, then we
915                 simply use this result as a direct access into the wordlist 
916                 array to snag the keyword for comparison.  
917
918              c. Otherwise, if v is < -TOTAL_KEYWORDS or > TOTAL_KEYWORDS
919                 this is an indication that we'll need to search through
920                 some number of duplicates hash values.  Using a hash
921                 linking scheme we'd then index into a different part of
922                 the hash table that provides the starting index and total
923                 length of the duplicate entries to find via linear search!
924
925 Sun Nov 12 13:48:10 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
926
927         * Simplified Key_List::output_min_max considerably by recognizing
928           that since the keyword list was already sorted by hash value finding 
929           the min and max values is trivial!
930
931         * Improved the debugging diagnostics considerably in classes Key_List,
932           Hash_Table, and Gen_Perf.
933
934         * Modified the `-s' option so that a negative argument is now 
935           interpreted to mean `allow the maximum associated value to be
936           about x times *smaller* than the number of input keys.'  This
937           should help prevent massive explosion of generated hash table
938           size for large keysets.
939
940 Sat Nov 11 11:31:13 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
941
942         * Added a field in class Key_List that counts the total number
943           of duplicate keywords, both static and dynamic.
944
945         * Added a new member function Bool_Array that deletes the dynamic
946           memory allocated to Bool_Array::storage_array.  This space may
947           be needed for subsequent options, so it made sense to free it as
948           soon as possible...
949           
950         * Renamed file/class Alpha_Vectors to Vectors, to avoid problems
951           with 14 character length filenames on SYSV.  Also changed file
952           adapredefined.gperf to adadefs.gperf in the ./tests directory.
953
954         * Modified class Options by changing the member function
955           Options::total_positions to Options::get_charset_size and
956           Options::set_charset_size.  These two routines now either return
957           the total charset size *or* the length of the largest keyword
958           if the user specifies the -k'*' (ALLCHARS) option.  This change
959           cleans up client code.
960
961         * Merged all the cperf changes into gperf.
962         
963         * Made sure to explicitly initialize perfect.fewest_collisions to
964           0.
965
966         * Cleaned up some loose ends noticed by Nels Olson.
967           1.  Removed `if (collisions <= perfect.fewest_collisions)'
968               from Gen_Perf::affects_prev since it was superfluous.
969           2.  Removed the fields best_char_value and best_asso_value
970               from Gen_Perf.  There were also unnecessary.
971           3.  Fixed a braino in the Bool_Array::bool_array_reset
972               function.  Since iteration numbers can never be zero
973               the `if (bool_array.iteration_number++ == 0)' must be
974               `if (++bool_array.iteration_number == 0).'
975           4.  Modified Std_Err::report_error so that it correctly handles
976               "%%".
977
978         * It is important to note that -D no longer enables -S.
979           There is a good reason for this change, which will become
980           manifested in the next release... (suspense!).
981
982         * Made some subtle changes to Key_List::print_switch so that if finally
983           seems to work correctly.  Needs more stress testing, however...
984
985         * Made a major change to the Key_List::print_switch function.
986           The user can now specify the number of switch statements to generate
987           via an argument to the -S option, i.e., -S1 means `generate 1
988           switch statement with all keywords in it,' -S2 means generate
989           2 switch statements with 1/2 the elements in each one, etc.
990           Hopefully this will fix the problem with C compilers not being
991           able to generate code for giant switch statements (but don't
992           hold your breath!)
993
994         * Changed Key_List::length function to Key_List::keyword_list_length.
995
996         * Added a feature to main.c that prints out the starting wall-clock
997           time before the program begins and prints out the ending wall-clock
998           time when the program is finished.
999
1000         * Added the GATHER_STATISTICS code in hash-table.c so we can
1001           keep track of how well double hashing is doing.  Eventually,
1002           GATHER_STATISTICS will be added so that all instrumentation
1003           code can be conditionally compiled in.
1004
1005         * Fixed a stupid bug in Key_List::print_switch routine.  This
1006           was necessary to make sure the generated switch statement worked
1007           correctly when *both* `natural,' i.e., static links and dynamic
1008           links, i.e., unresolved duplicates, hash to the same value.
1009
1010         * Modified Bool_Array::~Bool_Array destructor so that
1011           it now frees the bool_array.storage_array when it is no longer
1012           needed.  Since this array is generally very large it makes sense
1013           to return the memory to the freelist when it is no longer in use.
1014
1015         * Changed the interface to constructor Hash_Table::Hash_Table.  This 
1016           constructor now passed a pointer to a power-of-two sized buffer that 
1017           serve as storage for the hash table.  Although this weakens information
1018           hiding a little bit it greatly reduces dynamic memory fragmentation,
1019           since we can now obtain the memory via a call to alloca, rather
1020           than malloc.  This change modified Key_List::read_keys calling
1021           interface.
1022
1023         * Since alloca is now being used more aggressively a conditional
1024           compilation section was added in main.c. Taken from GNU GCC,
1025           this code gets rid of any avoidable limit on stack size so that
1026           alloca does not fail.  It is only used if the -DRLIMIT_STACK
1027           symbol is defined when gperf is compiled. 
1028
1029         * Added warnings in option.c so that user's would be informed
1030           that -r superceeds -i on the command-line.
1031           
1032         * Rewrote Gen_Perf::affects_prev.  First, the code structure
1033           was cleaned up considerably (removing the need for a dreaded
1034           goto!).  Secondly, a major change occurred so that Gen_Perf::affects_prev
1035           returns FALSE (success) when fewest_hits gets down to whatever
1036           it was after inserting the previous key (instead of waiting for
1037           it to reach 0).  In other words, it stops trying if it can
1038           resolve the new collisions added by a key, even if there are
1039           still other old, unresolved collisions.  This modification was
1040           suggested by Nels Olson and seems to *greatly* increase the
1041           speed of gperf for large keyfiles.  Thanks Nels!
1042
1043         * In a similar vein, inside the Gen_Perf::change routine 
1044           the variable `perfect.fewest_collisions is no longer initialized
1045           with the length of the keyword list.  Instead it starts out at
1046           0 and is incremented by 1 every time change () is called.
1047           The rationale for this behavior is that there are times when a
1048           collision causes the number of duplicates (collisions) to
1049           increase by a large amount when it would presumably just have
1050           gone up by 1 if none of the asso_values were changed.  That is,
1051           at the beginning of change(), you could initialize fewest_hits
1052           to 1+(previous value of fewest_hits) instead of to the number of
1053           keys.  Thanks again, Nels.
1054
1055         * Replaced alloca with new in the Gen_Perf::change function.
1056           This should eliminate some overhead at the expense of a little
1057           extra memory that is never reclaimed.
1058
1059         * Renamed Gen_Perf::merge_sets to Gen_Perf::compute_disjoint_union
1060           to reflect the change in behavior.
1061
1062         * Added the -e option so users can supply a string containing
1063           the characters used to separate keywords from their attributes.
1064           The default behavior is ",\n".
1065
1066         * Removed the char *uniq_set field from LIST_NODE and modified
1067           uses of uniq_set in perfect.c and keylist.c.  Due to changes
1068           to Gen_Perf::compute_disjoint_sets this field was no longer
1069           necessary, and its removal makes the program smaller and
1070           potentially faster. 
1071           
1072         * Added lots of changes/fixes suggested by Nels Olson
1073           (umls.UUCP!olson@mis.ucsf.edu).  In particular:
1074           1.  Changed Bool_Array so that it would dynamically create
1075               an array of unsigned shorts rather than ints if the 
1076               LO_CAL symbol was defined during program compilation.
1077               This cuts the amount of dynamic memory usage in half,
1078               which is important for large keyfile input.
1079           2.  Added some additional debugging statements that print extra
1080               info to stderr when the -d option is enabled.
1081           3.  Fixed a really stupid bug in Key_List::print_switch
1082               A right paren was placed at the wrong location, which broke
1083               strlen ().
1084           4.  Fixed a subtle problem with printing case values when keylinks
1085               appear.  The logic failed to account for the fact that there
1086               can be keylinks *and* regular node info also!
1087           5.  Changed the behavior of Key_List::read_keys so that it would
1088               honor -D unequivocally, i.e., it doesn't try to turn off dup
1089               handling if the user requests it, even if there are no
1090               immediate links in the keyfile input. 
1091           6.  Modified the -j option so that -j 0 means `try random values
1092               when searching for a way to resolve collisions.'
1093           7.  Added a field `num_done' to the Gen_Perf struct.  This is used
1094               to report information collected when trying to resolve
1095               hash collisions.
1096           8.  Modified the merge_sets algorithm to perform a disjoint
1097               union of two multisets.  This ensures that subsequent
1098               processing in Gen_Perf::affect_prev doesn't
1099               waste time trying to change an associated value that is
1100               shared between two conflicting keywords.
1101           9.  Modified Gen_Perf::affects_prev so that it doesn't try
1102               random jump values unless the -j 0 option is enabled.
1103           10. Fixed a silly bug in Gen_Perf::change.  This problem caused
1104               gperf to seg fault when the -k* option was given and the
1105               keyfile file had long keywords.
1106         
1107 Sun Oct 29 00:18:55 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
1108
1109         * Modified class-specific new operations for Read_Line and
1110           List_Node so they don't fail if SIZE is larger than twice
1111           the previous buffer size.  Note we double buffer size
1112           everytime the previous buffer runs out, as a heuristic
1113           to reduce future calls to malloc.
1114
1115 Sun Oct 22 13:49:43 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1116
1117         * Updated gperf version number to 2.0.  Send to Doug Lea for
1118           incorporation into the long-awaited `official' libg++ 1.36
1119           release! 
1120
1121         * Thanks to Nels Olson a silly bug in Gen_Perf::change ()
1122           was fixed.  This problem caused gperf to seg fault when
1123           the -k* option was given and the keyfile file had long
1124           keywords.
1125           
1126         * Modified Key_List::print_hash_function so that it output
1127           max_hash_value + 1 (rather than just max_hash_value) for
1128           any associated value entries that don't correspond to
1129           keyword charset characters.  This should speed up rejection
1130           of non-keyword strings a little in some cases.
1131
1132 Sat Oct 21 19:28:36 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1133
1134         * Fixed Key_List::print_hash_function so that it no longer output
1135           things like `return 0 + ...'  Although this probably gets
1136           optimized away by even the worst C compilers there isn't any
1137           point tempting fate... ;-)
1138
1139         * Fixed class List_Node's constructor so that it wouldn't a priori
1140           refuse to consider trying to hash keys whose length is less
1141           than the smallest user-specified key position.  It turns out
1142           this is not a problem unless the user also specifies the -n
1143           (NOLENGTH) option, in which case such keys most likely
1144           don't have a prayer of being hashed correctly!
1145
1146         * Changed the name of the generated lookup table from `Hash_Table'
1147           to `asso_value' to be consistent with the gperf paper.
1148
1149 Tue Oct 17 14:19:48 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1150
1151         * Added a flag GATHER_STATISTICS in the Makefile.  If defined
1152           during compilation this turns on certain collection facilities
1153           that track the performance of gperf during its execution.  In
1154           particular, I want to see how many collisions occur for the
1155           double hashing Hash_Table.
1156
1157         * Added a safety check so that we don't screw up if the total
1158           number of `resets' of the Bool_Array exceeds MAX_INT.  Since
1159           this number is around 2^31 it is unlikely that this would ever
1160           occur for most input, but why take the risk?
1161
1162         * Changed the behavior for the -a (ANSI) option so that the
1163           generated prototypes use int rather than size_t for the LEN 
1164           parameter.  It was too ugly having to #include <stddef.h> all
1165           over the place...
1166
1167 Mon Oct 16 11:00:35 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1168
1169         * Continued to work on the gperf paper for the USENIX C++
1170           conference.  At some point this will be merged back into
1171           the gperf documentation...
1172
1173 Sat Oct 14 20:29:43 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
1174
1175         * Added a majorly neat hack to Bool_Array, suggested by rfg.
1176           The basic idea was to throw away the Ullman array technique.
1177           The Ullman array was used to remove the need to reinitialize all 
1178           the Bool_Array elements to zero everytime we needed to determine
1179           whether there were duplicate hash values in the keyword list.  
1180           The current trick uses an `iteration number' scheme, which takes
1181           about 1/3 the space and reduces the overall program running a 
1182           time by about 20 percent for large input!  The hack works as 
1183           follows:
1184           
1185           1. Dynamically allocation 1 boolean array of size k.
1186           2. Initialize the boolean array to zeros, and consider the first
1187              iteration to be iteration 1.
1188           2. Then on all subsequent iterations we `reset' the bool array by
1189              kicking the iteration count by 1. 
1190           3. When it comes time to check whether a hash value is currently
1191              in the boolean array we simply check its index location.  If
1192              the value stored there is *not* equal to the current iteration
1193              number then the item is clearly *not* in the set.  In that
1194              case we assign the iteration number to that array's index
1195              location for future reference.  Otherwise, if the item at
1196              the index location *is* equal to the iteration number we've
1197              found a duplicate.  No muss, no fuss!
1198              
1199 Mon Oct  2 12:30:54 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1200
1201         * Changed some consts in options.h to enumerals, since g++
1202           doesn't seem to like them at the moment!
1203
1204 Sat Sep 30 12:55:24 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1205
1206         * Fixed a stupid bug in Key_List::print_hash_function that manifested
1207           itself if the `-k$' option was given (i.e., only use the key[length]
1208           character in the hash function).
1209
1210         * Added support for the -C option.  This makes the contents of
1211           all generated tables `readonly'.
1212
1213         * Changed the handling of generated switches so that there is
1214           only one call to str[n]?cmp.  This *greatly* reduces the size of
1215           the generated assembly code on all compilers I've seen.
1216
1217         * Fixed a subtle bug that occurred when the -l and -S option
1218           was given.  Code produced looked something like:
1219
1220           if (len != key_len || !strcmp (s1, resword->name)) return resword;
1221
1222           which doesn't make any sense.  Clearly, this should be:
1223
1224           if (len == key_len && !strcmp (s1, resword->name)) return resword;
1225
1226 Tue Sep 26 10:36:50 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1227
1228         * Changed class Read_Line's definition so that it no longer
1229           needs to know about the buffering scheme used to speed up 
1230           dynamic memory allocation of input keywords and their
1231           associated attributes.  This means that operator new is no longer
1232           a friend of Read_Line.
1233
1234 Mon Sep 25 23:17:10 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1235
1236         * Decided that Obstacks had too much overhead, so they were
1237           removed in favor of super-efficient, low-overhead buffered
1238           storage allocation hacks in Read_Line and List_Node.
1239
1240         * No longer try to inline functions that g++ complains about
1241           (Key_List::Merge and Key_List::Merge_Sort).
1242
1243 Sun Sep 24 13:11:24 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1244
1245         * Changed classes Read_Line and List_Node to use Obstacks in order
1246           to cache memory allocation for keyword strings and List_Nodes.
1247           
1248         * Continued to experiment with inheritance schemes.
1249         
1250         * Added a new file `alpha.h', that declares static data shared
1251           (i.e., inherited) between classes List_Node and Key_List.
1252
1253 Tue Sep 12 16:14:41 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1254
1255         * Made numerous changes to incorporate multiple inheritance in 
1256           gperf.
1257
1258 Wed Aug 16 23:04:08 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1259
1260         * Added the -DCOMPILER_FIXED flag to the ./src/Makefile.  This
1261           implies that people trying to compile gperf need to have a
1262           working version of the new g++ compiler (1.36.0).
1263
1264         * Removed some extra spaces that were being added in the generated
1265           C code.
1266
1267 Mon Jul 24 17:09:46 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1268
1269         * Fixed PRINT_HASH_FUNCTION and PRINT_LOOKUP_FUNCTION in keylist.c
1270           so that the generated functions take an unsigned int length argument.
1271           If -a is enabled the prototype is (const char *str, size_t len).
1272
1273 Fri Jul 21 13:06:15 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
1274
1275         * Fixed a typo in PRINT_KEYWORD_TABLE in keylist.cc that prevented
1276           the indentation from working correctly.
1277
1278         * Fixed a horrible typo in PRINT_KEYWORD_TABLE in keylist.cc
1279           that prevented links from being printed correctly.
1280
1281 Tue Jul 18 16:04:31 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
1282
1283         * Fixed up readline.cc and readline.h so that they work OK
1284           with g++ compilers that aren't completely up-to-date.
1285           If symbol COMPILER_FIXED is defined then the behavior
1286           that works on my more recent version of g++ is enabled.
1287
1288 Sun Jul  9 17:53:28 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1289
1290         * Changed the ./tests subdirectory Makefile so that it 
1291           uses $(CC) instead of gcc.
1292
1293 Sun Jul  2 21:52:15 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1294
1295         * Fixed a number of subtle bugs that occurred when -S was
1296           combined with various and sundry options.
1297
1298         * Added the -G option, that makes the generated keyword table
1299           a global static variable, rather than hiding it inside
1300           the lookup function.  This allows other functions to directly
1301           access the contents in this table.
1302
1303         * Added the "#" feature, that allows comments inside the keyword
1304           list from the input file. Comment handling takes place in readline.c.  
1305           This simplifies the code and reduces the number of malloc calls.
1306           
1307         * Also added the -H option (user can give the name of the hash
1308           function) and the -T option (prevents the transfer of the type decl
1309           to the output file, which is useful if the type is already defined
1310           elsewhere).
1311
1312 Thu Jun 22 20:39:39 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1313
1314         * Modified many classes so that they would inherit Std_Err as
1315           a base class.  This makes things more abstract...
1316
1317 Fri Jun 16 14:23:00 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
1318
1319         * Modified the -f (FAST) option.  This now takes an argument.
1320           The argument corresponds to the number of iterations used
1321           to resolve collisions.  -f 0 uses the length of the
1322           keyword list (which is what -f did before).  This makes
1323           life much easier when dealing with large keyword files.
1324
1325 Tue Jun  6 17:53:27 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1326
1327         * Added the -c (comparison) option.  Enabling this
1328           will use the strncmp function for string comparisons.
1329           The default is to use strcmp.
1330
1331         * Fixed a typo in key_list.cc (PRINT_SWITCH).  This caused
1332           faulty C code to be generated when the -D, -p, and -t
1333           options were all enabled.
1334
1335 Thu May 25 14:07:21 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
1336
1337         * Once again, changed class Read_Line to overload global operator
1338           new.  Hopefully, this will work...!
1339
1340 Sun May 21 01:51:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1341
1342         * Modified Key_List::print_hash_function () so that it properly
1343           formats the associated values in the hash table according to
1344           the maximum number of digits required to represent the largest
1345           value.
1346
1347         * Removed the named return value from class Hash_Table's
1348           operator (), since this causes a seg fault when -O is enabled.
1349           No sense tripping subtle g++ bugs if we don't have to.... ;-)
1350
1351         * Removed the operator new hack from Read_Line, since this seemed
1352           to create horrible bus error problems.
1353                     
1354         * Changed many class member functions and data members to be `static', 
1355           if they don't manipulate this!
1356           
1357 Fri May 12 23:06:56 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1358
1359         * Changed class Std_Err to use static member functions, a la
1360           Ada or Modula 2.  This eliminates the need for an explicit
1361           error-handler class object.
1362
1363         * Added the ``named return value'' feature to Hash_Table::operator ()
1364           and Bool_Array::operator [], just for the heck of it.... ;-)
1365
1366         * Changed the previous hack in Read_Line so that we now use
1367           the overloaded global `new' instead of NEW_STRING!
1368
1369 Wed May  3 17:36:55 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
1370
1371         * Updated to version 1.7.  This reflects the recent major changes
1372           and the new C port.
1373
1374         * Modified the GNU getopt.cc routine to have a class-based interface.
1375
1376         * Fixed a typo in Perfect.cc ~Perfect that prevented the actual maximum
1377           hash table size from being printed (maybe the stream classes
1378           weren't so bad after all.... ;-).
1379
1380         * Added support for the -f option.  This generates the perfect
1381           hash function ``fast.''  It reduces the execution time of
1382           gperf, at the cost of minimizing the range of hash values.
1383
1384 Tue May  2 16:23:29 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1385
1386         * Added an efficiency hack to Read_Line.  Instead of making
1387           a call to operator NEW (a.k.a. malloc) for each input string
1388           a new member function NEW_STRING stores a large buffer from
1389           which new strings are carved out, growing the buffer if
1390           necessary.  It might be useful to add this throughout the
1391           program....
1392
1393         * Removed all unnecessary calls to DELETE.  If the program is about
1394           to exit it is silly to waste time freeing memory.
1395
1396         * Added the GNU getopt program to the distribution.  This makes
1397           GPERF portable to systems that don't include getopt in libc.
1398           
1399         * Added a strcspn member to class Key_List.  This also increases
1400           portability.
1401
1402         * Added the get_include_src function from keylist.c as a member
1403           function in class Key_List.  Hopefully every function is 
1404           now associated with a class.  This aids abstraction and
1405           modularity.
1406
1407         * Ported gperf to C.  From now on both K&R C and GNU G++ versions
1408           will be supported.  There will be two ChangeLog files, one
1409           for each version of the program.
1410
1411 Mon May  1 16:41:45 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1412
1413         * Fixed a bug with -k'*'.  This now prints out *all* the cases
1414           up to the length of the longest word in the keyword set.
1415
1416 Sun Apr 30 12:15:25 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1417
1418         * Removed all use of the stream classes.  Too ugly, slow, and
1419           not handled by the c++-mode formatter....
1420
1421         * Modified the handling of links (i.e., keywords that have
1422           identical hash values as other keywords).  This should 
1423           speed up hash function generation for keyword sets with
1424           many duplicate entries.  The trick is to treat duplicate
1425           values as equivalence classes, so that each set of duplicate
1426           values is represented only once in the main list processing.
1427
1428         * Fixed some capitialization typos and indentations mistakes in 
1429           Key_List::print_hash_function.
1430
1431 Sat Apr 29 12:04:03 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
1432
1433         * Fixed a typo/logico in Key_List::print_switch that prevented
1434           the last keyword in the keyword list to be print out.  This
1435           requires further examination.....
1436
1437         * Fixed a stupid bug in List_Node::List_node.  If the -k'*' option
1438           was enabled the KEY_SET string wasn't getting terminated with
1439           '\0'!
1440
1441 Fri Apr 28 12:38:35 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1442
1443         * Renamed strexp.h and strexp.cc to iterator.h and iterator.cc.
1444           Also changed the strexp class to iterator.  Continued to work
1445           on style...
1446
1447         * Updated the version number to 1.6.  This reflects all the 
1448           recent changes.
1449
1450 Thu Apr 27 00:14:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1451
1452         * Added the -D option that properly handles keyword sets that
1453           contain duplicate hash values.
1454
1455         * Continued the stylistic changes.  Added the #pragma once
1456           directive to all the *.h files.  Removed all #defines and
1457           replaced them with static consts.  Also moved the key_sort
1458           routine from options.cc into the options class as a 
1459           member function.
1460
1461 Mon Apr  3 13:26:55 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
1462
1463         * Made massive stylistic changes to bring source code into
1464           conformance with GNU style guidelines.
1465
1466 Thu Mar 30 23:28:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1467
1468         * Fixed up the output routines so that they generate code
1469           corresponding to the GNU style guidelines.
1470
1471 Sat Mar 11 13:12:37 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1472
1473         * Fixed Stderr constructors so that they wouldn't try to
1474           use the base class initializer syntax for the static 
1475           class variable Program_Name.  G++ 1.34 is stricter in
1476           enforcing the rules!
1477
1478 Fri Mar 10 11:24:14 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1479
1480         * Removed -v and ``| more'' from the Makefile to keep rfg happy...
1481
1482 Thu Mar  2 12:37:30 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1483
1484         * Sent latest GNU gperf version 1.5 to Doug Lea for inclusion
1485           into libg++ 1.34.  Note that there is a small bug with
1486           the new %{ ... %} source inclusion facility, since it doesn't
1487           understand comments and will barf if %{ or %} appear nested
1488           inside the outermost delimiters.  This is too trivial of
1489           a defect to fix at the moment...
1490
1491 Tue Feb 28 11:19:58 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1492
1493         * Added the -K option, which allows the user to provide a
1494           alternative name for the keyword structure component.
1495           The default is still ``name.''
1496
1497         * Added the LEX and YACC-like ability to include arbitrary
1498           text at the beginning of the generated C source code output.
1499           This required two new functions Get_Special_Input, 
1500           Key_List::Save_Include_Src;
1501
1502         * Fixed memory allocation bug in Key_List::Set_Types.
1503           Variable Return_Type needs 1 additional location
1504           to store the "*" if the -p option is used.
1505           
1506         * Added code to NULL terminate both Struct_Tag and Return_Type,
1507           *after* the strncpy (stupid mistake).
1508           
1509 Mon Feb 27 14:39:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1510
1511         * Added a new option -N.  This allows the user to specify the
1512           name to be used for the generated lookup function.  The
1513           default name is still ``in_word_set.''  This makes it
1514           possible to completely automate the perfect hash function
1515           generation process!
1516
1517 Mon Feb 20 23:33:14 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1518
1519         * Corrected the Hash_Table::operator () function so that
1520           *it* is responsible for deciding when a new key has the
1521           same signature as a previously seen key.  The key length 
1522           information is now used internally to this function to
1523           decide whether to add to the hash table those keys with
1524           the same key sets, but different lengths.  Before, this
1525           was handled by the Key_List::Read_Keys function.  However,
1526           this failed to work for certain duplicate keys, since
1527           they weren't being entered into the hash table properly.
1528
1529 Sun Feb 19 16:02:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1530
1531         * Modified class Options by moving the enum Option_Type out
1532           of the class.  This is to satisfy the new enumeration
1533           scope rules in C++.
1534
1535 Sun Jan 15 15:12:09 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1536
1537         * Incremented the version number upto 1.4 to reflect the new 
1538           options that affect the generated code.  Send the new 
1539           distribution off to Michael for use with g++ 1.33.
1540
1541         * Added a fix to Key_List::Read_Keys so that it checks for links
1542           properly when the -n option is used.  Previously, it didn't
1543           catch obvious links, which caused it to spend large amount
1544           of time searching for a solution that could never occur!
1545
1546         * Modified the Key_List data structure to record *both* the 
1547           minimum and the maximum key lengths.  This information
1548           is now computed in Key_List::Read_Keys, and thus 
1549           Key_List::Print_Min_Max doesn't need to bother.
1550
1551         * Modifed the key position iterator scheme in options.cc to
1552           eliminate the need for member function Options::Advance.
1553           Now, the Options::Get function performs the advancement
1554           automatically, obviating the need for an extra function call.
1555
1556         * Added the new function Options::Print_Options, to print out
1557           the user-specified command line options to generated C
1558           output file.
1559
1560         * Added a new function, Key_List::Print_Keylength_Table,
1561           which creates a table of lengths for use in speeding
1562           up the keyword search.  This also meant that a new
1563           option, -l (LENTABLE) is recognized.  It controls 
1564           whether the length table is printed and the comparison
1565           made in the generated function ``in_word_set.''
1566
1567         * Added a comment at the top of the generated C code
1568           output file that tells what version of gperf was used.
1569           Next, I'll also dump out the command line options
1570           as a comment too.  Thanks to Michael Tiemann for the
1571           feedback on this.
1572
1573         * Fixed the -n option to make it work correctly with
1574           other parts of the program (most notably the Perfect::Hash
1575           function and the computation of minimum and maximum lengths.
1576
1577 Fri Jan 13 21:25:27 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
1578
1579         * Realized the the need to add a test that will enable
1580           optimziation of the generated C code in the ``hash'' function
1581           by checking whether all the requested key positions are
1582           guaranteed to exist due to the comparison in `in_word_set.''
1583           I'll put this in soon....
1584
1585 Thu Jan 12 20:09:21 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1586
1587         * Added pascal, modula3, and modula2 tests inputs to the 
1588           Makefile
1589         
1590         * Recognised that there is a bug with the -n option.  However
1591           I'm too busy to fix it properly, right now.  The problem 
1592           is that the generated #define end up being 0, since that's
1593           my hack to make -n work.  This needs complete rethinking!
1594
1595 Tue Jan 10 00:08:16 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1596
1597         * Added a new option, -n, that instructs gperf to not use the
1598           length of an identifier when computing the hash functions.
1599           I'm not sure how useful this is!
1600           
1601         * Retransmitted the distribution to rocky.oswego.edu.  Hopefully,
1602           this will work!
1603
1604         * Began fixing the indentation and capitalization to conform
1605           to the GNU coding guidelines.
1606
1607 Mon Jan  9 22:23:18 1989  Doug Schmidt  (schmidt at pompe.ics.uci.edu)
1608
1609         * Fixed horrible bug in Read_Line::Readln_Aux.  This was
1610           a subtle and pernicous off-by-1 error, that overwrote
1611           past the last character of the input string buffer.  I
1612           think this fault was killing the vax!
1613
1614         * Yow, fixed an oversight in List_Node::List_Node, where the
1615           pointer field Next was uninitialized.  Luckily, the new routine
1616           seems to return 0 filled objects the first time through!
1617
1618 Sun Jan  8 13:43:14 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1619
1620         * Modified the ``key linked'' diagnostic in Key_List::Read_Keys
1621           to be more helpful and easy to read.
1622
1623         * Fixed the List_Node::List_Node so that it would ignore trailing
1624           fields if the -t option was not enabled.
1625
1626         * Moved the List_Node declarations out of keylist.h and
1627           into a file of its own, called listnode.cc and listnode.h
1628           Made Set_Sort a member function of class List_Node.
1629
1630         * Massively updated the documentation in the gperf.texinfo file.
1631         
1632         * Polished off the major revision to the print functions,
1633           added a few new tests in the Makefile to check for the
1634           validity of the program and ftp'ed the entire distribution
1635           off to Doug Lea for libg++. ( changed it to
1636           1.3 to reflect the major changes with the generated
1637           C code ).
1638
1639         * Fixed Key_List::Print_Switch to deal with the -p and -t options.
1640           This meant that the ``still-born'' function Key_List::
1641           Print_Type_Switch was superflous, so I removed it.
1642           Also, removed the restriction in Option that the -p and
1643           -t options couldn't be used simultaneously.
1644
1645         * Modified List_Node::List_Node, to perform only 1 call to 
1646           ``new'' when dynamically allocating memory for the Key_Set
1647           and the Uniq_Set.
1648
1649 Sat Jan  7 14:10:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
1650
1651         * Fixed a big bug with the new policy of nesting the
1652           wordlist inside of generated function ``in_word_set.''
1653           I'd forgotten to declare the wordlist array as static!
1654           ( arrgh ).
1655
1656         * Added a new function Key_List::Set_Types, that figures out
1657           the return type for generated function ``in_word_set,''
1658           the user-defined ``struct tag,'' if one is used, and also
1659           formates the array type for the static local array.
1660
1661         * Changed the print routines to take advantage of the
1662           new -p option.
1663
1664         * Began adding the hooks to allow the return of a pointer
1665           to a user defined struct location from the generated
1666           ``in_word_set'' function instead of the current 0 or 1
1667           return value.  Created function Key_List::Print_Type_Switch
1668           and added option -p to class Option, allowing the user to 
1669           request generation of the aforementioned pointers returned 
1670           instead of booleans.
1671
1672         * Put in checks in class Option to make sure that -S and -t
1673           options are not used simultaneously.  This restriction
1674           will be removed in subsequent releases, once I decide on
1675           a clean way to implement it.
1676
1677         * Sent version 1.2 to Doug Lea for possible inclusion into
1678           the libg++ distribution.
1679           
1680         * Moved the static word_list array inside the generated function
1681           in_word_set.  This supports better data hiding.
1682
1683         * Added a texinfo file, gperf.texinfo
1684           
1685         * Revised the Makefile to cleanup the droppings from texinfo
1686           and changed the name of gperf.cc and gperf.h to perfect.cc
1687           and perfect.h.
1688
1689 Fri Jan  6 13:04:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
1690
1691         * Implemented the switch statement output format.  Much better
1692           for large datasets in terms of space used.
1693
1694         * Added new functions to break up the Key_List::Output function.
1695           Functions added were Key_List::Print_Switch, Key_List::Print_Min_Max,
1696           Key_List::Print_Keyword_Table, Key_List::Print_Hash_Function,
1697           and Key_List::Print_Lookup_Function.  This simplifies the
1698           big mess in Key_List::Output considerably!
1699           
1700         * Added switch statement option to Options, which potentially 
1701           trades time for space in the generated lookup code.
1702
1703 Thu Jan  5 22:46:34 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
1704
1705         * Released version 1.1
1706         
1707         * Fixed a bug with Gperf::Merge_Set, it was skipping letters shared
1708           between the Set_1 and Set_2.
1709
1710         * Added the optimal min/max algorithm in Key_List::Output.  This
1711           runs in O ( 3n/2 ), rather than O ( 2n ) time.
1712
1713         * Changed Gperf::Sort_Set to use insertion sort, rather than
1714           bubble sort.
1715         
1716         * Added a check in Key_List::Output for the special case where
1717           the keys used are 1,$.  It is possible to generate more
1718           efficient C code in this case.