ChangeLog revision 67064
167064Sobrien2000-09-26  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>
267064Sobrien
367064Sobrien        * gperf-2.7.2 released.
467064Sobrien
567064Sobrien        * doc/gperf.texi: Add a second bug report address
667064Sobrien          <gperf-bugs@lists.sourceforge.net>.
767064Sobrien        * README: Updated.
867064Sobrien
967064Sobrien2000-08-28  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>
1067064Sobrien
1167064Sobrien        * lib/getopt.h (struct option): Use "const" also when compiling in
1267064Sobrien          C++ mode. Avoids warnings from Sun CC and HP-UX aCC.
1367064Sobrien
1467064Sobrien        * doc/Makefile.in (docdir): Change from $(datadir)/doc/@PACKAGE@ to
1567064Sobrien          $(prefix)/doc/@PACKAGE@, following the newest GNU standards.
1667064Sobrien
1767064Sobrien2000-08-20  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>
1867064Sobrien
1967064Sobrien        * src/version.cc: Bump version number to 2.7.2.
2067064Sobrien        * doc/gperf.texi: Likewise.
2167064Sobrien
2267064Sobrien        * doc/texinfo.tex: Update to post-texinfo-4.0 version. @code in the
2367064Sobrien          title page now chooses a larger font. The overall layout of the
2467064Sobrien          text is denser.
2567064Sobrien
2667064Sobrien        * AUTHORS: New file.
2767064Sobrien
2867064Sobrien        * tests/Makefile.in (all): Add check-lang-utf8 and check-lang-ucs2.
2967064Sobrien          (check-lang-utf8, check-lang-ucs2): New targets.
3067064Sobrien          (clean): Remove lu8out and lu2out.
3167064Sobrien        * tests/lang-utf8.gperf, tests/lang-utf8.exp: New files.
3267064Sobrien        * tests/lang-ucs2.gperf, tests/test2.c, tests/lang-ucs2.in,
3367064Sobrien          tests/lang-ucs2.exp: New files.
3467064Sobrien
3567064Sobrien        Allow the use of embedded NULs in keys.
3667064Sobrien        * lib/hash.h (hashpjw): Add a length argument.
3767064Sobrien        * lib/hash.cc (hashpjw): Likewise. Don't stop when encountering a NUL
3867064Sobrien          character.
3967064Sobrien        * src/hash-table.h (Hash_Table constructor): Add ignore_len argument.
4067064Sobrien          (Hash_Table::ignore_length): New field.
4167064Sobrien          (Hash_Table::insert): Renamed from Hash_Table::operator(). Remove
4267064Sobrien          ignore_length argument.
4367064Sobrien        * src/hash-table.cc (NIL): Remove macro.
4467064Sobrien          (Hash_Table constructor): Add ignore_len argument. Use it to
4567064Sobrien          initialize ignore_length.
4667064Sobrien          (Hash_Table destructor): Specify explicit length of char_set and
4767064Sobrien          key.
4867064Sobrien          (Hash_Table::insert): Renamed from Hash_Table::operator(). Remove
4967064Sobrien          ignore_length argument. Pass explicit length to hashpjw. Compare
5067064Sobrien          char_set using memcmp, not strcmp.
5167064Sobrien        * src/list-node.h (List_Node): Rename field length to key_length.
5267064Sobrien          New field char_set_length.
5367064Sobrien          (List_Node constructor): Accept key and rest, not the entire line.
5467064Sobrien        * src/list-node.cc (List_Node constructor): Accept key and rest, not
5567064Sobrien          the entire line. Don't NUL terminate key and char_set. Specify
5667064Sobrien          explicit length of key. Initialize char_set_length field.
5767064Sobrien        * src/key-list.cc: Include <ctype.h>.
5867064Sobrien          (parse_line): New function.
5967064Sobrien          (Key_List::read_keys): Call parse_line instead of new List_Node.
6067064Sobrien          Pass option[NOLENGTH] to Hash_Table constructor, not
6167064Sobrien          Hash_Table::insert. Specify explicit length of key and char_set.
6267064Sobrien          (Key_List::get_occurrence): Use explicit length of char_set.
6367064Sobrien          (Key_List::set_determined): Likewise.
6467064Sobrien          (Key_List::already_determined): Likewise.
6567064Sobrien          (output_string): Add length argument. Output unprintable characters
6667064Sobrien          using octal escape sequence.
6767064Sobrien          (output_keyword_entry): Use explicit length of key.
6867064Sobrien          (Key_List::output_lookup_array): Specify explicit length of key.
6967064Sobrien          (output_switch_case): Likewise.
7067064Sobrien          (Key_List::dump): Likewise.
7167064Sobrien        * src/gen-perf.h (Gen_Perf::compute_disjoint_union): Add two length
7267064Sobrien          arguments.
7367064Sobrien        * src/gen-perf.cc (Gen_Perf::compute_disjoint_union): Likewise. Don't
7467064Sobrien          stop when encountering NUL characters. Don't NUL terminate the
7567064Sobrien          result.
7667064Sobrien          (Gen_Perf::hash): Use explicit length of char_set.
7767064Sobrien          (Gen_Perf::change): Specify explicit length of key.
7867064Sobrien        * doc/gperf.texi: Document it.
7967064Sobrien
8067064Sobrien        * doc/help2man: New file, help2man version 1.022.
8167064Sobrien        * Makefile.devel (all): Add doc/gperf.1.
8267064Sobrien          (doc/gperf.1): New target.
8367064Sobrien        * doc/gperf.1: Automatically generated.
8467064Sobrien
8567064Sobrien        * mkinstalldirs: New file, from automake-1.4, grep-2.4.1, guile-1.4,
8667064Sobrien          libtool-1.3.3, make-3.79.1, tar-1.13.
8767064Sobrien        * src/Makefile.in (MKINSTALLDIRS): New variable.
8867064Sobrien          (install, installdirs): Use it instead of mkdir.
8967064Sobrien        * doc/Makefile.in (MKINSTALLDIRS): New variable.
9067064Sobrien          (install, installdirs): Use it instead of mkdir.
9167064Sobrien
9267064Sobrien        * INSTALL: Update.
9367064Sobrien
9467064Sobrien2000-08-19  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>
9567064Sobrien
9667064Sobrien        * src/key-list.cc (Output_Compare_Memcmp): New class.
9767064Sobrien          (Key_List::output_lookup_function): When option -l is given, use
9867064Sobrien          memcmp instead of strcmp or strncmp.
9967064Sobrien
10067064Sobrien        * doc/gperf.texi: The bug report address is <bug-gnu-utils@gnu.org>.
10167064Sobrien          The download address is ftp.gnu.org. Remove mention of -a and -g
10267064Sobrien          options (now nops). Explain effect of -c option.
10367064Sobrien
10467064Sobrien        * doc/configure.in (PACKAGE): New variable.
10567064Sobrien        * doc/Makefile.in (datadir, docdir): New variables.
10667064Sobrien          (dvidir, htmldir): Change values.
10767064Sobrien          (install, installdirs): Update.
10867064Sobrien
10967064Sobrien        * src/configure.in: Rename cache variable gp_cxx_throw_decl to
11067064Sobrien          gp_cv_cxx_throw_decl.
11167064Sobrien
11267064Sobrien        * src/key-list.cc (Key_List::output_hash_function): When outputting
11367064Sobrien          __inline, take advantage of C++ compilers which have inline.
11467064Sobrien
11567064Sobrien        * src/key-list.cc (Output_Compare_Strncmp::output_comparison):
11667064Sobrien          After the call to strncmp, verify that expr2 is not longer than
11767064Sobrien          `len'.
11867064Sobrien          Reported by Carlo Wood <carlo@runaway.xs4all.nl>.
11967064Sobrien
12067064Sobrien        * src/key-list.cc (Key_List::output_lookup_function_body): Avoid
12167064Sobrien          emitting the loop for dealing with duplicates if
12267064Sobrien          total_duplicates == 0.
12367064Sobrien
12467064Sobrien        * src/key-list.cc (Key_List::read_keys): Don't accept an empty key.
12567064Sobrien
12667064Sobrien        * src/Makefile.in (install, installdirs, uninstall): Respect
12767064Sobrien          $(DESTDIR).
12867064Sobrien        * doc/Makefile.in (install, installdirs, uninstall): Likewise.
12967064Sobrien
13067064Sobrien        * src/options.cc (Options::print_options): Escape the arguments which
13167064Sobrien          contain special characters.
13267064Sobrien
13367064Sobrien        * tests/c-parse.gperf: Updated from gcc-2.95.2/gcc/c-parse.gperf.
13467064Sobrien        * tests/objc.gperf: New file, from gcc-2.95.2/gcc/objc/objc.gperf.
13567064Sobrien        * tests/chill.gperf: New file, from gcc-2.95.2/gcc/ch/gperf.
13667064Sobrien        * tests/cplusplus.gperf: New file, from gcc-2.95.2/gcc/cp/gxx.gperf.
13767064Sobrien        * tests/gplus.gperf: Remove file.
13867064Sobrien        * tests/java.gperf: New file, from gcc-2.95.2/gcc/java/keyword.gperf.
13967064Sobrien        * tests/Makefile: Check them all.
14067064Sobrien        * tests/c-parse.exp: Renamed from tests/test-1.exp.
14167064Sobrien        * tests/modula2.exp: Renamed from tests/test-2.exp.
14267064Sobrien        * tests/cplusplus.exp: Renamed from tests/test-3.exp.
14367064Sobrien        * tests/gpc.exp: Renamed from tests/test-5.exp.
14467064Sobrien
14567064Sobrien        * src/key-list.cc (output_switch_case): Add trailing semicolon to
14667064Sobrien          lengthptr assignment line. Fixes bug with -D and -S.
14767064Sobrien          From Reini Urban <rurban@sbox.tu-graz.ac.at>. Also reported by
14867064Sobrien          David Hunter.
14967064Sobrien        * tests/Makefile.in (check-lang-syntax): Perform each test with -D
15067064Sobrien          once without and once with duplicates.
15167064Sobrien
15267064Sobrien        * src/key-list.cc (output_keyword_entry): Avoid outputting a struct
15367064Sobrien          initializer of the form {"key",}.
15467064Sobrien
15567064Sobrien        * src/iterator.cc: Don't include <stream.h>.
15667064Sobrien          From Michael Deutschmann <ldeutsch@mail.netshop.net>.
15767064Sobrien
15867064Sobrien        * tests/Makefile.in (VALIDATE, check-lang-syntax): Use $(srcdir) where
15967064Sobrien          appropriate.
16067064Sobrien          Reported by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>.
16167064Sobrien
16267064Sobrien        * tests/validate: Don't run -traditional tests by default.
16367064Sobrien
16467064Sobrien        * src/main.cc (main): Check for write error on stdout before returning.
16567064Sobrien
16667064Sobrien        * src/Makefile.in (LDFLAGS): New definition, to catch the value given
16767064Sobrien          at configure time.
16867064Sobrien
16967064Sobrien        Make the structure initializers customizable. Based on a patch by
17067064Sobrien        Kaveh R. Ghazi <ghazi@caip.rutgers.edu>.
17167064Sobrien        * src/options.h (Options::get_initializer_suffix,
17267064Sobrien          Options::initializer_suffix): New declarations.
17367064Sobrien        * src/options.icc (Options::get_initializer_suffix): New function.
17467064Sobrien        * src/options.cc (DEFAULT_INITIALIZER_SUFFIX): New constant.
17567064Sobrien          (Options::initializer_suffix): New variable.
17667064Sobrien          (Options::short_usage): Document option "-F".
17767064Sobrien          (Options::long_usage): Document option "-F".
17867064Sobrien          (Options constructor): Initialize initializer_suffix.
17967064Sobrien          (Options destructor): Dump initializer_suffix.
18067064Sobrien          (long_options): Add option "-F".
18167064Sobrien          (Options::operator()): Accept option "-F". Sets initializer_suffix.
18267064Sobrien        * src/key-list.cc (output_keyword_blank_entries): Output
18367064Sobrien          initializer_suffix.
18467064Sobrien        * doc/gperf.texi: Document option "-F".
18567064Sobrien
18667064Sobrien        * COPYING: Replace with GPL version 2 (with new FSF address and Y2K
18767064Sobrien          safe year format).
18867064Sobrien
18967064Sobrien        * doc/gpl.texinfo: New file.
19067064Sobrien        * doc/gperf.texi: Document it.
19167064Sobrien        * doc/Makefile.in (gperf.info, gperf.dvi, gperf.html, gperf_toc.html):
19267064Sobrien          Update dependencies.
19367064Sobrien
19467064Sobrien        * doc/Makefile.in (MAKEINFO): Unset LANG while running makeinfo.
19567064Sobrien
19667064Sobrien1998-05-20  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
19767064Sobrien
19867064Sobrien        * doc/Makefile.in (gperf.dvi, clean): Remove gperf.cps.
19967064Sobrien          (install, installdirs, uninstall): Don't install gperf.dvi. The
20067064Sobrien          info and HTML documentations are sufficient for on-line use, and
20167064Sobrien          users who wish to print the documentation (in PS or DVI format)
20267064Sobrien          can do this directly off the source distribution.
20367064Sobrien          (DVIPS): Use "-D600" instead of "-Pljfour", for portability.
20467064Sobrien
20567064Sobrien1998-05-20  Akim Demaille  <demaille@inf.enst.fr>
20667064Sobrien
20767064Sobrien        * doc/gperf.texi: Many modifications:
20867064Sobrien          (Output Format): Declare `hash' and `in_word_set' as functions.
20967064Sobrien          (Concept Index): New section.
21067064Sobrien          (Title page): Use standard presentation.
21167064Sobrien          (Top): Use @top instead of @unnumbered so that automatic master
21267064Sobrien          update works.
21367064Sobrien          (Motivation): Avoid spaces in @var.
21467064Sobrien          (Options): Use the standard name ``Invoking ...''.
21567064Sobrien          (Options): Declare also the long form of the options.
21667064Sobrien          (Options): Remove redundant @itemize when @table is used.
21767064Sobrien
21867064Sobrien1998-05-08  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
21967064Sobrien
22067064Sobrien        * aclocal.m4 (CL_PROG_INSTALL): Set cl_cv_path_install, not
22167064Sobrien          ac_cv_path_install.
22267064Sobrien
22367064SobrienSat May  2 13:20:54 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
22467064Sobrien
22567064Sobrien        * gperf-2.7 released.
22667064Sobrien
22758551SkrisSat May  2 12:31:51 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
22818214Speter
22958551Skris        * src/version.cc (version_string): Remove the "(C++ version)" suffix.
23058551Skris          It's redundant: the early C versions of gperf are called cperf.
23158551Skris          Reported by Karl Berry.
23258551Skris        * src/option.cc (Options::operator()): Trim the output of "gperf -v".
23358551Skris
23458551SkrisThu Apr 16 13:22:16 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
23558551Skris
23658551Skris        * lib/Makefile.in, src/Makefile.in: Don't use $(TARGET_ARCH).
23758551Skris          Solaris "make" sets it to a value not understood by "cc".
23858551Skris
23958551SkrisWed Apr 15 23:52:14 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
24058551Skris
24158551Skris        * lib/Makefile.in, src/Makefile.in: Don't use implicit rules. Don't
24258551Skris          use $<. AIX "make" and OSF/1 "make" have problems with both.
24358551Skris        * src/gen-perf.cc, src/key-list.cc: Cast free() argument to char*,
24458551Skris          otherwise it doesn't compile on SunOS 4.
24558551Skris        * src/key-list.h: Declare structs outside of other declarations,
24658551Skris          needed for OSF/1 cxx 5.5.
24758551Skris        * lib/getopt.h: Use prototypes if __STDC__ || __cplusplus.
24858551Skris          Don't give a prototype for getopt(), to avoid error on SunOS 4.
24958551Skris        * lib/getopt.c: Declare strncmp, to avoid warnings.
25058551Skris
25158551SkrisTue Apr 14 23:24:07 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
25258551Skris
25358551Skris        * lib/GetOpt.{h,cc}: Remove files.
25458551Skris        * lib/getopt.{h,c}, lib/getopt1.c: New files, from GNU libc.
25558551Skris        * lib/configure.in (AC_INIT): Search for hash.cc, not GetOpt.cc.
25658551Skris        * lib/Makefile.in (OBJECTS): Remove GetOpt.o, add getopt.o, getopt1.o.
25758551Skris          (getopt.o, getopt1.o, hash.o): Use explicit building rules. Some
25858551Skris          "make"s don't support to have both implicit rules for "%.o : %.c"
25958551Skris          and "%.o : %.cc" in the same Makefile.
26058551Skris        * lib/hash.{h,cc}: Remove #pragma; there are no templates here.
26158551Skris        * src/option.h (Options::usage): Remove.
26258551Skris          (Options::short_usage, Options::long_usage): Declare.
26358551Skris        * src/option.cc (Options::usage): Remove.
26458551Skris          (Options::short_usage, Options::long_usage): New functions.
26558551Skris          (long_options): New array.
26658551Skris          (Options::operator()): Use getopt_long instead of GetOpt::operator(),
26758551Skris          change all references to GetOpt members.
26858551Skris
26958551Skris        * src/std-err.{h,cc}: Remove files.
27058551Skris        * src/gen-perf.cc, src/key-list.cc, list-node.cc, new.cc, options.cc:
27158551Skris          Call fprintf(stderr) instead of Std_Err::report_error().
27258551Skris        * src/key-list.h, src/list-node.h, src/options.h: Don't use class
27358551Skris          Std_Err any more.
27458551Skris        * src/option.cc (program_name): New variable.
27558551Skris        * src/Makefile.in: Remove STD_ERR_H.
27658551Skris          (OBJECTS): Remove std-err.o.
27758551Skris
27858551SkrisMon Mar 23 01:03:35 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
27958551Skris
28058551Skris        * aclocal.m4, {lib,src,tests}/configure.in: Remove CL_CC_WORKS and
28158551Skris          CL_CXX_WORKS, already contained in autoconf 2.12.
28258551Skris
28358551Skris        * src/gen-perf.cc, src/key-list.cc: Move some code from
28458551Skris          Gen_Perf::Gen_Perf() to Key_List::output().
28558551Skris        * src/Makefile.in: Update dependencies.
28658551Skris
28758551Skris        * src/options.{h,cc}: Remove option "-p".
28858551Skris        * src/key-list.cc (Key_List::set_output_types): Rewrite.
28958551Skris          (default_array_type, default_return_type): Remove.
29058551Skris        * src/key-list.cc: Adjust "const" handling.
29158551Skris          + With option "-t" [TYPE], don't emit wrong code if there is no
29258551Skris            space before the struct's opening brace.
29358551Skris
29458551SkrisSun Mar 22 16:59:15 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
29558551Skris
29658551Skris        * src/key-list.{h,cc}: Completely reorganized the output routines.
29758551Skris          Rewrote from scratch the output_switch() function. Use classes
29858551Skris          (Output_Constants, Output_Expr, Output_Compare) for abstraction.
29958551Skris          In particular:
30058551Skris          + Don't emit trailing whitespace and spurious blank lines.
30158551Skris          + Adjust indentation of the arrays.
30258551Skris          + Don't emit commas at the end of array initializers and
30358551Skris            struct initializers.
30458551Skris          + With option "-l" [LENTABLE], compare the length before
30558551Skris            fetching the word from memory.
30658551Skris          + With option "-S" [SWITCH], emit the comparison code just once,
30758551Skris            not once in every switch statement.
30858551Skris          + With option "-S" [SWITCH], choose the right switch statement
30958551Skris            through a binary search, not a linear search.
31058551Skris          + With option "-S" [SWITCH], emit straightforward comparisons
31158551Skris            instead of switch statements with just one "case" label.
31258551Skris          + With options "-S -p -t" [SWITCH, POINTER, TYPE], don't emit
31358551Skris            spurious empty elements at the beginning of the wordlist array.
31458551Skris          + With option "-D" [DUP] and not option "-S" [SWITCH], if there
31558551Skris            is no more room for duplicate entries in the lookup array,
31658551Skris            don't call `assert (i != 0)'. Instead, make the array larger :-)
31758551Skris          + With option "-D" [DUP], if there are no duplicates, don't
31858551Skris            automatically fall back to the non-"-D" algorithm. If the user
31958551Skris            wants the non-"-D" algorithm, he can just not specify "-D".
32058551Skris          + With option "-D" [DUP] and either options "-p -t" [POINTER, TYPE]
32158551Skris            or not option "-S" [SWITCH], don't emit spurious empty elements
32258551Skris            at the beginning of the wordlist array.
32358551Skris          + With option "-D" [DUP], simplify the detection and processing
32458551Skris            of duplicate entries in the lookup array.
32558551Skris          + With options "-D -l" [DUP, LENTABLE] and not option "-S" [SWITCH],
32658551Skris            don't forget to emit the lengthtable array.
32758551Skris          + With options "-D -l -S" [DUP, LENTABLE, SWITCH], don't forget to
32858551Skris            compare the lengths before comparing the strings.
32958551Skris
33058551Skris        * src/gen-perf.cc: No need to include <assert.h>.
33158551Skris        * src/options.cc: Likewise.
33258551Skris
33358551Skris        * src/options.cc: Don't use `errno' after freopen failed.
33458551Skris        * src/std-err.cc: `report_error' doesn't call strerror(errno) any
33558551Skris          more. No need to include <string.h> and <errno.h>.
33658551Skris
33758551Skris        * tests/Makefile.in (check-*): Any difference between .exp and .out
33858551Skris          is a failure. Don't ignore whitespace differences.
33958551Skris
34058551Skris        * tests/Makefile.in (check-lang-syntax): Add some more checks.
34158551Skris
34258551SkrisFri Mar 20 00:54:54 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
34358551Skris
34458551Skris        * tests/jscript.gperf: Renamed from tests/javascript.gperf, because
34558551Skris          of Minix and SVR2 14-character filename limit.
34658551Skris        * src/key-list.cc (output_string): New function.
34758551Skris          (Key_List::output_switch, Key_List::output_keyword_table): Call it.
34858551Skris
34958551Skris        * src/options.{h,icc,cc} (get_wordlist_name): New function. Add
35058551Skris          option -W.
35158551Skris        * src/key-list.cc (Key_List::output_switch,
35258551Skris          Key_List::output_keyword_table, Key_List::output_lookup_function):
35358551Skris          Use it.
35458551Skris        Patch from William Bader <wbader@CSEE.Lehigh.Edu>.
35558551Skris
35658551Skris        * src/version.cc: Bump version number directly from 2.5 to 2.7,
35758551Skris          because Schmidt's last release from 1991 carries version number 2.6.
35858551Skris
35958551SkrisTue Jul 30 00:02:39 1991  Douglas C. Schmidt  (schmidt at net4.ics.uci.edu)
36058551Skris
36158551Skris        * Fixed a small bug in the Key_List::output_keyword_table routine
36258551Skris          that caused an extra newline to be printed if there where no
36358551Skris          leading blank entries... (who cares, right?!)
36458551Skris
36558551SkrisMon Jul 29 22:05:40 1991  Douglas C. Schmidt  (schmidt at net4.ics.uci.edu)
36658551Skris
36758551Skris        * Modified the handling of the -E (emit enums rather than
36858551Skris          #defines) option in conjunction with the -G option.  Now, if -G
36958551Skris          and -E are given the enums are generated outside the lookup
37058551Skris          function, rather than within it!
37158551Skris
37258551SkrisMon Apr  8 18:17:04 1991  Doug Schmidt  (schmidt at net4.ics.uci.edu)
37358551Skris
37458551Skris        * Yucko, there was a bug in the handling of -c (and of course the
37558551Skris          new -I command in key-list.cc).  Apparently when I added the
37658551Skris          super-duper hack that provided support for duplicate keys I
37758551Skris          forgot to update the strcmp output...
37858551Skris
37958551SkrisMon Mar  9 02:19:04 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
38058551Skris
38158551Skris        * Moved the documentation to doc/, put the stuff borrowed from
38258551Skris          libg++ into lib/.
38358551Skris        * Rewrote all Makefile.in's for better compliance with GNU standards.
38458551Skris        * Autoconf based configuration. Rewrote all configure.in's. Added
38558551Skris          aclocal.m4, with macros from CLISP and CLN. Added Makefile.devel.
38658551Skris        * src/depend: Removed. Dependencies are now in src/Makefile.in.
38758551Skris
38858551Skris        * src/bool-array.icc: New file, contains inline functions, from both
38958551Skris          src/bool-array.h and src/bool-array.cc.
39058551Skris        * src/options.icc: New file, contains inline functions, from both
39158551Skris          src/options.h and src/options.cc.
39258551Skris        * src/read-line.icc: New file, contains inline functions, from both
39358551Skris          src/read-line.h and src/read-line.cc.
39458551Skris
39558551Skris        * src/bool-array.h: Don't include <std.h>.
39658551Skris        * src/bool-array.cc: Include <string.h>.
39758551Skris        * src/gen-perf.cc: No need to include <ctype.h>. Don't include
39858551Skris          <_G_config.h>.
39958551Skris        * src/hash-table.cc: Don't include <std.h> and <builtin.h>. Include
40058551Skris          <string.h> and lib/hash.h instead.
40158551Skris        * src/iterator.cc: Don't include <std.h>.
40258551Skris        * src/key-list.cc: Don't include <builtin.h>. Include <string.h> and
40358551Skris          <stdlib.h> instead.
40458551Skris        * src/list-node.cc: Don't include <std.h>. Include <stdlib.h> instead.
40558551Skris          Remove `index' hack.
40658551Skris        * src/main.cc: Don't include <_G_config.h>.
40758551Skris        * src/new.cc: Don't include <std.h>. Include <stdlib.h> instead.
40858551Skris        * src/options.cc: Don't include <builtin.h>. Include <string.h> and
40958551Skris          <stdlib.h> instead.
41058551Skris        * src/read-line.cc: Don't include <builtin.h>. Include <stdlib.h>
41158551Skris          instead.
41258551Skris        * src/std-err.cc: Don't include <std.h>. Include <string.h> (for Irix).
41358551Skris        * src/vectors.h: No need to include <stdio.h>.
41458551Skris        * src/version.cc: No need to include <stdio.h>.
41558551Skris
41658551Skris        * src/bool-array.h: Change `STORAGE_TYPE' from int to unsigned int.
41758551Skris        * src/bool-array.{h,cc}: Change type of `Bool_Array::size' from int
41858551Skris          to unsigned int.
41958551Skris        * src/bool-array.{h,cc}: Change type of `Bool_Array::init' argument
42058551Skris          from STORAGE_TYPE to unsigned int.
42158551Skris        * src/gen-perf.{h,cc}: Change two `Gen_Perf::compute_disjoint_union'
42258551Skris          argument types from `char *' to `const char *'.
42358551Skris        * src/iterator.h: Change type of `Iterator::str' and argument of
42458551Skris          `Iterator::Iterator' from `char *' to `const char *'.
42558551Skris        * src/iterator.cc: Cast to `unsigned char' before calling `isdigit'.
42658551Skris        * src/key-list.{h,cc}: Change type of `Key_List::array_type',
42758551Skris          `Key_List::return_type', `Key_List::struct_tag',
42858551Skris          `Key_List::include_src', `default_array_type', `default_return_type'
42958551Skris          and return type of `Key_List::get_array_type',
43058551Skris          `Key_List::get_special_input', `Key_List::save_include_src' from
43158551Skris          `char *' to `const char *'.
43258551Skris        * src/key-list.cc: Change "pretty gross" assignment.
43358551Skris        * src/key-list.cc: Don't use `alloca', HP-UX CC lacks it.
43458551Skris        * lib/GetOpt.cc: Likewise.
43558551Skris        * src/key-list.cc (merge): Use iteration instead of recursion.
43658551Skris        * src/list-node.{h,cc}: Change type of `List_Node::key',
43758551Skris          `List_Node::rest', `List_Node::char_set' from `char *' to
43858551Skris          `const char *'.
43958551Skris        * src/new.cc: Don't use BUFSIZ. Conditionalize the throw() declaration.
44058551Skris        * src/read-line.h: Don't use BUFSIZ.
44158551Skris        * src/read-line.cc: Make CHUNK_SIZE a constant, and use allocate the
44258551Skris          buffers on the stack by default. Use memcpy for copying buffers.
44358551Skris          Include <string.h>.
44458551Skris        * src/read-line.icc (get_line): Use iteration instead of tail recursion.
44558551Skris          Don't call ungetc(EOF,stdin).
44658551Skris        * src/std-err.{h,cc}: Change type of `Std_Err::program_name' and of
44758551Skris          argument `Std_Err::report_error' from `char *' to `const char *'.
44858551Skris        * src/std-err.cc: `report_error' doesn't call `exit' any more. All
44958551Skris          callers changed to do that themselves.
45058551Skris        * src/trace.h: Make constructor/destructor calls non-inline.
45158551Skris
45258551Skris        * src/key-list.cc (output_hash_function): If option[CPLUSPLUS],
45358551Skris          always make the hash function inline.
45458551Skris          (output): Declare the hash function inline, with the right name.
45558551Skris        * src/options.{h,cc}, src/gen-perf.cc, src/key-list.cc: Remove
45658551Skris          options -g, making it on by default. Remove option -a. Instead,
45758551Skris          introduce "-L KR-C", "-L C", "-L ANSI-C", "-L C++".
45858551Skris        * src/options.{h,cc}, src/key-list.cc: Add option -I.
45958551Skris        * src/key-list.cc: Don't emit "const" if compiling in mode "-L KR-C".
46058551Skris        * src/key-list.cc: Don't emit a comma at the end of an enum list.
46158551Skris        * src/main.cc: Remove COUNT_TIME code.
46258551Skris        * src/vectors.h, src/key-list.cc, src/options.cc, src/list-node.cc:
46358551Skris          ALPHA_SIZE defaults to 256 now. Add option -7.
46458551Skris
46558551Skris        * tests/javascript.gperf: New file.
46658551Skris        * tests/jstest*.gperf, tests/validate: New tests.
46758551Skris
46858551SkrisSat Jan 31 01:38:11 1998  Alexandre Oliva <oliva@dcc.unicamp.br>
46958551Skris
47058551Skris	* src/Makefile.in ($(TARGETPROG)): Add $(CFLAGS).
47158551Skris
47258551SkrisWed Jan 28 01:56:00 1998  Manfred Hollstein  <manfred@s-direktnet.de>
47358551Skris
47458551Skris	* configure.in (package_makefile_rules_frag): New and
47558551Skris	redirect stderr from ${srcdir}/config.shared to
47658551Skris	${package_makefile_rules_frag}.
47758551Skris	* src/configure.in: Ditto.
47858551Skris	* tests/configure.in: Ditto.
47958551Skris
48058551SkrisFri Jan 23 08:00:41 1998  H.J. Lu  (hjl@gnu.org)
48158551Skris
48258551Skris	* gperf.texi (@ichapter): Changed to @chapter.
48358551Skris
48458551SkrisWed Jan 14 09:16:48 1998  H.J. Lu  (hjl@gnu.org)
48558551Skris
48658551Skris	* src/key-list.cc, src/key-list.h (Key_List::strcspn): Don't
48758551Skris	define if strcspn is defined.
48858551Skris
48958551SkrisFri Jan 24 13:23:47 1997  Mike Stump  <mrs@cygnus.com>
49058551Skris
49158551Skris	* src/new.cc (operator delete): Add the exception specification.
49258551Skris
49358551SkrisMon Feb  5 19:29:16 1996  Per Bothner  <bothner@kalessin.cygnus.com>
49458551Skris
49558551Skris	* src/read-line.cc (Read_Line::readln_aux):  Handle EOF if last	line
49658551Skris	has a length which is an exact multiple of CHUNK_SIZE.  (Used to throw
49758551Skris	away the line's contents.)  From Bruno Haible <haible@ilog.ilog.fr>.
49858551Skris	* src/Makefile.in ($(TARGETPROG)):  Add -lm to link line.
49958551Skris
50058551SkrisTue Jun 11 13:43:50 1996  Brendan Kehoe  <brendan@lisa.cygnus.com>
50158551Skris
50258551Skris	* src/list-node.cc (List_Node): Reorder init of nodes to
50358551Skris	match declaration order.
50458551Skris	* src/hash-table.cc (Hash_Table): Likewise.
50558551Skris
50658551SkrisTue Oct 10 16:37:28 1995  Mike Stump  <mrs@cygnus.com>
50758551Skris
50858551Skris	* src/new.cc: Since malloc/delete are not paired, we cannot call
50958551Skris	free.
51058551Skris
51158551SkrisWed Jan  4 12:40:14 1995  Per Bothner  <bothner@kalessin.cygnus.com>
51258551Skris
51358551Skris	* src/Makefile.in ($(TARGETPROG)):  Link with $(LDFLAGS).
51458551Skris	Patch from John Interrante <interran@uluru.stanford.edu>.
51558551Skris
51658551SkrisSat Nov  5 19:12:48 1994  Jason Merrill  (jason@phydeaux.cygnus.com)
51758551Skris
51858551Skris	* src/Makefile.in (LIBS): Remove.
51958551Skris
52058551SkrisTue Oct 18 17:51:14 1994  Per Bothner  <bothner@kalessin.cygnus.com>
52158551Skris
52258551Skris	* src/std-err.cc:  Use stderror, instead of the non-standard
52358551Skris	sys_nerr and sys_errlist.
52458551Skris
52558551SkrisSat Sep 17 22:02:13 1994  Per Bothner  (bothner@kalessin.cygnus.com)
52658551Skris
52758551Skris	* src/key-list.cc (output_hash_function):
52858551Skris	Patch from William Bader <wbader@CSEE.Lehigh.Edu>.
52958551Skris
53058551SkrisFri Jul 15 09:38:11 1994  Per Bothner  (bothner@cygnus.com)
53158551Skris
53258551Skris	* src/std-err.cc:  #include <errno.h>, and only declare
53358551Skris	extern int errno if errno is not a macro.
53458551Skris
53558551SkrisMon May 30 17:29:34 1994  Per Bothner  (bothner@kalessin.cygnus.com)
53658551Skris
53758551Skris	* Makefile.in (src_all, install):  Make sure to add '/' after
53858551Skris	`pwd` in $rootme, as expected by FLAGS_TO_PASS.
53958551Skris
54058551SkrisWed May 11 00:47:22 1994  Jason Merrill  (jason@deneb.cygnus.com)
54158551Skris
54258551Skris	Make libg++ build with gcc -ansi -pedantic-errors
54358551Skris	* src/options.h: Lose commas at end of enumerator lists.
54458551Skris
54558551SkrisSun Dec  5 19:16:40 1993  Brendan Kehoe  (brendan@lisa.cygnus.com)
54658551Skris
54758551Skris	* src/hash-table.cc (Hash_Table::~Hash_Table): Don't pass an
54858551Skris	argument to fprintf, since it's not expecting one.
54958551Skris
55058551SkrisFri Nov 26 19:03:18 1993  Per Bothner  (bothner@kalessin.cygnus.com)
55158551Skris
55258551Skris	* src/list-node.cc:  #undef index, for the sake of broken NeXT,
55358551Skris
55458551SkrisThu Nov  4 11:16:03 1993  Per Bothner  (bothner@kalessin.cygnus.com)
55558551Skris
55658551Skris	* Makefile.in (install):  Use INSTALL_DATA for gperf.1.
55758551Skris
55858551SkrisMon Oct 25 18:40:51 1993  Per Bothner  (bothner@kalessin.cygnus.com)
55958551Skris
56058551Skris	* src/key-list.cc (Key_List::read_keys):  Use POW macro
56158551Skris	to increase hash table size to power of 2.
56258551Skris
56358551Skris	* options.h (LARGE_STACK_ARRAYS):  New flag.  Defaults to zero.
56458551Skris	* gen-perf.cc, key-list.cc, read-line.cc:	
56558551Skris	Only stack-allocate large arrays if LARGE_STACK_ARRAYS is set.
56658551Skris	* main.cc (main):  Only call setrlimit (RLIMIT_STACK, ...)
56758551Skris	if LARGE_STACK_ARRAYS.
56858551Skris
56958551SkrisMon Oct  4 17:45:08 1993  Per Bothner  (bothner@kalessin.cygnus.com)
57058551Skris
57158551Skris	* src/gen-perf.cc:  Always use ANSI rand/srand instead of BSDisms.
57258551Skris
57358551SkrisWed Aug 18 12:19:53 1993  Per Bothner  (bothner@kalessin.cygnus.com)
57458551Skris
57558551Skris	* Makefile.in (src_all):  Make less verbose output.
57658551Skris
57758551SkrisFri May 28 14:01:18 1993  Per Bothner  (bothner@rtl.cygnus.com)
57858551Skris
57958551Skris	* src/gen-perf.cc (Gen_Perf::change):  Don't use gcc-specific
58058551Skris	2-operand conditional expression.
58158551Skris	* src/key-list.cc (Key_List::output_lookup_array):
58258551Skris	Don't use variable-size stack arrays, unless compiled by g++.
58358551Skris
58458551SkrisTue May  4 14:08:44 1993  Per Bothner  (bothner@cygnus.com)
58558551Skris
58658551Skris	Changes (mostly from Peter Schauer) to permit compilation
58758551Skris	using cfront 3.0 and otherwise be ARM-conforming.
58858551Skris	* src/key-list.h:  class Key_List must use public derivation
58958551Skris	of base class Std_Err (because Gen_Perf::operator() in gen-perf.cc
59058551Skris	calls Std_Err::report_error).
59158551Skris	* src/gen-perf.cc (Gen_Perf::affects_prev), src/hash-table.cc
59258551Skris	(Hash_Table::operator()):  Don't use gcc-specific 2-operand
59358551Skris	conditional expression.
59458551Skris	* src/iterator.cc (Iterator::operator()):  Don't use gcc-specific
59558551Skris	range construct in case label.
59658551Skris	* key-list.cc (Key_List::output_lookup_array, Key_List::read_keys),
59758551Skris	src/gen-perf.cc (Gen_Perf::operator(), src/read-line.cc
59858551Skris	(Read_Line::readln_aux):  If not gcc, don't allocate
59958551Skris	variable-sized arrays on stack.
60058551Skris	* src/new.cc (operator new):  Argument type should be size_t.
60158551Skris	* key-list.cc (Key_List::output_lookup_array, Key_List::read_keys),
60258551Skris	new/cc (::operator new): Don't use non-standard >?= operator.
60358551Skris
60458551SkrisTue Apr 27 20:11:30 1993  Per Bothner  (bothner@cygnus.com)
60558551Skris
60658551Skris	* src/Makefile.in:  Define TARGETPROG, and use it.
60758551Skris
60858551SkrisMon Apr 19 00:29:18 1993  Per Bothner  (bothner@cygnus.com)
60958551Skris
61058551Skris	* Makefile.in, configure.in:  Re-vamped configure scheme.
61158551Skris	* gperf.texinfo:  Renamed to gperf.texi.
61258551Skris	* src/bool-array.{h,cc}:  ANSIfy bzero->memset.
61358551Skris
61458551SkrisSat Jan 30 20:21:28 1993  Brendan Kehoe  (brendan@lisa.cygnus.com)
61558551Skris
61658551Skris	* tests/Makefile.in (mostlyclean): Also delete aout, cout, m3out,
61758551Skris	pout, and preout.
61858551Skris
61958551SkrisTue Dec 29 08:58:17 1992  Ian Lance Taylor  (ian@cygnus.com)
62058551Skris
62158551Skris	* Makefile.in: pass $(FLAGS_TO_PASS) to all calls to make.
62258551Skris	(FLAGS_TO_PASS): added INSTALL, INSTALL_DATA, INSTALL_PROGRAM.
62358551Skris
62458551SkrisMon Dec 21 18:46:46 1992  Per Bothner  (bothner@rtl.cygnus.com)
62558551Skris
62658551Skris	* tests/expected.* renamed to *.exp to fit in 14 chars.
62758551Skris	* tests/Makefile.in:  Update accordingly.
62858551Skris	Also rename output.* to *.out.
62958551Skris	* src/Makefile.in (clean):  Remove gperf program.
63058551Skris
63158551SkrisWed Dec  9 14:33:34 1992  Per Bothner  (bothner@cygnus.com)
63258551Skris
63358551Skris	* src/hash-table.cc, src/bool-array.h: ANSIfy bzero->memset.
63458551Skris
63558551SkrisThu Dec  3 19:34:12 1992  Per Bothner  (bothner@cygnus.com)
63658551Skris
63758551Skris	* Makefile.in (distclean, realclean): Don't delete
63858551Skris	Makefile before recursing.
63958551Skris
64058551SkrisFri Nov  6 13:41:49 1992  Per Bothner  (bothner@rtl.cygnus.com)
64158551Skris
64258551Skris	* key-list.{h,cc}:  Remove MAX_INT (and similar) constant
64358551Skris	fields from Key_List class, and use INT_MAX (etc) from limits.h.
64458551Skris	* key-list.{h,cc}, options.{h,cc}, vectors.h:  Removed all
64558551Skris	uses of initialized const fields, as they are non-standard
64658551Skris	- and their use was easy to do away with.  Mostly, just
64758551Skris	made the constants static non-fields in the .cc file.
64858551Skris
64958551SkrisMon Nov  2 13:10:11 1992  Per Bothner  (bothner@cygnus.com)
65058551Skris
65158551Skris	* tests/Makefile.in:  When generating cinset.c, don't pass -C,
65258551Skris	since -C assumes an ANSI compiler.  Add the -C flag (with -a)
65358551Skris	when generating test.out.3 instead.
65458551Skris	* tests/expected.out.3:  Update accordingly.
65558551Skris
65658551SkrisWed Aug 12 11:47:54 1992  Per Bothner  (bothner@cygnus.com)
65758551Skris
65858551Skris	* Makefile.in:  Factor out common flags into $(FLAGS_TO_PASS).
65958551Skris	* Makefile.in:  'install-info' depends on gperf.info.
66058551Skris
66158551SkrisMon Aug 10 11:39:52 1992  Ian Lance Taylor  (ian@dumbest.cygnus.com)
66258551Skris
66358551Skris	* Makefile.in, src/Makefile.in: always create installation
66458551Skris	directories.
66558551Skris
66658551SkrisMon Jul 20 15:33:21 1992  Mike Stump  (mrs@cygnus.com)
66758551Skris
66858551Skris	* src/new.cc (operator new):  Add cast from void * to char *,
66958551Skris	since it is not a standard conversion.
67058551Skris
67158551SkrisWed Jun 17 16:25:30 1992  Per Bothner  (bothner@rtl.cygnus.com)
67258551Skris
67358551Skris	* src/gen-perf.cc:  #include <_G_config.h> for _G_SYSV.
67458551Skris	* src/key-list.cc:  alloca() hair.
67558551Skris	* src/main.cc (main):  Only call getrlimit if _G_HAVE_SYS_RESOURCE.
67658551Skris	* Makefile,in, {src,test}/Makefile.in:  Fix *clean rules.
67758551Skris
67858551SkrisFri May 29 13:21:13 1992  Per Bothner  (bothner@rtl.cygnus.com)
67958551Skris
68058551Skris	* src/gen-perf.cc:  Replace USG -> _G_SYSV.
68158551Skris
68258551SkrisThu May 14 13:58:36 1992  Per Bothner  (bothner@rtl.cygnus.com)
68358551Skris
68458551Skris	* src/Makefile.in:  Don't pass obsolete flag -DUNLIMIT_STACK.
68558551Skris	* tests/Makefile.in (clean): Fix.
68658551Skris
68758551SkrisSat Mar  7 00:03:56 1992  K. Richard Pixley  (rich@rtl.cygnus.com)
68858551Skris
68958551Skris	* gperf.texinfo: added menu item hook.
69058551Skris
69158551SkrisWed Feb 26 18:04:40 1992  K. Richard Pixley  (rich@cygnus.com)
69258551Skris
69358551Skris	* Makefile.in, configure.in: removed traces of namesubdir,
69458551Skris	  -subdirs, $(subdir), $(unsubdir), some rcs triggers.  Forced
69558551Skris	  copyrights to '92, changed some from Cygnus to FSF.
69658551Skris
69758551SkrisSun Jan 26 19:21:58 1992  Per Bothner  (bothner at cygnus.com)
69858551Skris
69958551Skris	* tests/Makefile.in:  Use re-directed stdin instead of file
70058551Skris	name in argv.  This allows us to remove the filename
70158551Skris	from the output, the expected output, and hence the diffs.
70258551Skris	(Note that the input file is in $(srcdir), which we cannot
70358551Skris	place in the expected out files.)
70458551Skris	* tests/expected.out.[1235]:  Edit out input filename,
70558551Skris	to match new output.
70658551Skris
70758551SkrisThu Jun 28 16:17:27 1990  Doug Schmidt  (schmidt at brilliant)
70858551Skris
70958551Skris	* Wow, first fix on the new job!  There was a dumb error
71058551Skris	  in Key_List::output_lookup_function, where I printed the
71158551Skris	  string "&wordlist[key]" instead of the correct "&wordlist[index]".
71258551Skris	  
71358551Skris	* Added a couple of #ifdefs for USG support.
71458551Skris	  	
71558551SkrisSun Jun  3 17:16:36 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
71658551Skris
71758551Skris        * Updated the version number to 2.5 and sent to Doug Lea for release
71858551Skris          with the latest GNU libg++.
71958551Skris
72058551Skris        * Changed the error handling when a keyword file cannot be opened
72158551Skris          (now calls perror).
72258551Skris
72358551SkrisWed May 30 14:49:40 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
72458551Skris
72558551Skris        * Instrumented the source code with trace statements automagically
72658551Skris          inserted using my new automated trace instrumentation tool!
72758551Skris
72858551SkrisWed May  9 11:47:41 1990  Doug Schmidt  (schmidt at siam.ics.uci.edu)
72958551Skris
73058551Skris        * Really fixed the previous bug.  Turns out that a small amount
73158551Skris          of logic had to be duplicated to handle static links that occur
73258551Skris          as part of dynamic link chains.  What a pain!!!
73358551Skris
73458551SkrisTue May  8 23:11:44 1990  Doug Schmidt  (schmidt at siam.ics.uci.edu)
73558551Skris
73658551Skris        * Fixed a stupid bug in Key_List::output_lookup_array that was
73758551Skris          causing incorrect counts to be generated when there were both
73858551Skris          static and dynamic links occurring for the same hash value.
73958551Skris          Also simplified the code that performs the logic in this routine.
74058551Skris
74158551SkrisMon Apr 30 17:37:24 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
74258551Skris
74358551Skris        * Fixed stupid bug in Key_List::output_lookup_array that was
74458551Skris          making the generated lookup[] array contain `chars' even
74558551Skris          when the values stored in the chars are greater than 127!
74658551Skris
74758551Skris        * Changed the behavior of the -G (global table) option so that it
74858551Skris          will output the `length[]' array in the global scope along with
74958551Skris          the `word_list[]' array.
75058551Skris
75158551Skris        * Fixed a stupid bug in Key_List::output_lookup_function that
75258551Skris          would always output the complicated `duplicate-handling' lookup
75358551Skris          logic, even when there were no duplicates in the input!
75458551Skris
75558551Skris        * Yikes, had to modify a bunch of stuff in key-list.cc to correctly
75658551Skris          handle duplicate entries.  Changed the generated code so that
75758551Skris          the MIN_HASH_VALUE is no longer subtracted off when calculating
75858551Skris          the hash value for a keyword.  This required changing some other
75958551Skris          code by substituting MAX_HASH_VALUE for TOTAL_KEYS in several places.
76058551Skris          Finally, this means that the generated tables may contain leading 
76158551Skris          null entries, but I suppose it is better to trade-off space to get 
76258551Skris          faster performance...
76358551Skris
76458551SkrisMon Mar 26 13:08:43 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
76558551Skris
76658551Skris        * Updated version number to 2.4 to reflect the latest changes.
76758551Skris
76858551Skris        * Changed the main program so that it always prints out gperf's
76958551Skris          execution timings to the generated output file.
77058551Skris          
77158551SkrisSun Mar 25 12:39:30 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
77258551Skris
77358551Skris        * Added the -Z option so that users can specify the name of the
77458551Skris          generated class explicitly.  Updated documentation to reflect
77558551Skris          this change.
77658551Skris          
77758551Skris        * Modified the generated C++ class interface so that the functions
77858551Skris          are declared static (to remove the overhead of passing the `this'
77958551Skris          pointer).  This means that operator()() can no longer be used,
78058551Skris          since it only works on non-static member functions.
78158551Skris          Also changed things so that there is no constructor (why waste
78258551Skris          the extra call, when it doesn't do anything, eh?)
78358551Skris
78458551Skris        * Modified the behavior of Key_List::output when the -L C++ option
78558551Skris          is enabled.  Previously the code generated use const data members
78658551Skris          to record MIN_WORD_LENGTH, MIN_HASH_VALUE, etc.  However, as
78758551Skris          pointed out by James Clark this may result in suboptimal behavior
78858551Skris          on the part of C++ compilers that can't inline these values.
78958551Skris          Therefore, the new behavior is identical to what happens with
79058551Skris          -L C, i.e., either #defines or function-specific enums are used.
79158551Skris          Why sacrifice speed for some abstract notion of `code purity?' ;-)
79258551Skris
79358551SkrisTue Mar  6 18:17:42 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
79458551Skris
79558551Skris        * Added the -E option that defines constant values using an enum
79658551Skris          local to the lookup function rather than with #defines.  This
79758551Skris          also means that different lookup functions can reside in the
79858551Skris          same file.  Thanks to James Clark (jjc@ai.mit.edu). 
79958551Skris
80058551SkrisSat Mar  3 20:19:00 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
80158551Skris
80258551Skris        * Added a special case to key_list::output_switch that doesn't
80358551Skris          generate extra comparisons when the `-S' is given an argument
80458551Skris          of 1 (the normal case).  This should speed up the generated
80558551Skris          code output a tad...
80658551Skris
80758551SkrisFri Feb 23 14:21:28 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
80858551Skris
80958551Skris        * Renamed all instances of member function get_keysig_size
81058551Skris          to get_max_keysig_size, since this is more precise...
81158551Skris
81258551Skris        * Changed all occurrences of charset to keysig (stands for ``key
81358551Skris          signature'') to reflect the new naming convention used in the 
81458551Skris          USENIX paper.
81558551Skris
81658551SkrisThu Feb 22 11:28:36 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
81758551Skris
81858551Skris        * Changed the name of the generated associated values table from
81958551Skris          asso_value to asso_values to reflect conventions in the USENIX
82058551Skris          C++ paper.
82158551Skris
82258551SkrisThu Feb 15 23:29:03 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
82358551Skris
82458551Skris        * Updated the gperf.texinfo file to fix some formatting problems
82558551Skris          that had crept in since last time.
82658551Skris
82758551SkrisWed Feb 14 23:27:24 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
82858551Skris
82958551Skris        * Fixed stupid bug in key-list.cc (get_special_input), wher
83058551Skris          gperf replaced each '%' with the succeeding character.
83158551Skris
83258551Skris        * Added support for multiple target language generation.  Currently
83358551Skris          handled languages are C and C++, with C as the default.  Updated
83458551Skris          documentation and option handler to reflect the changes.
83558551Skris
83658551Skris        * Added a global destructor to new.cc and removed the #ifdef, since
83758551Skris          the bloody thing now works with libg++.
83858551Skris
83958551SkrisMon Feb 14 13:00:00 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
84058551Skris
84158551Skris        * Found out that my gperf paper was accepted at the upcoming
84258551Skris          USENIX C++ Conference in San Francisco.  Yow!
84358551Skris
84458551SkrisTue Jan 30 09:00:29 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
84558551Skris
84658551Skris        * #ifdef'd out the new.cc memory allocator, since there are
84758551Skris          problems with this and the libg++ stuff.
84858551Skris
84958551Skris        * Changed key-list.h so that class Vectors is a public (rather
85058551Skris          than private) base class for class Key_List.  The previous
85158551Skris          form was illegal C++, but wasn't being caught by the old
85258551Skris          g++ compiler.  Should work now... ;-)
85358551Skris
85458551SkrisSun Dec 10 14:08:23 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
85558551Skris
85658551Skris        * Added several changes from rfg@ics.uci.edu.  These changes
85758551Skris          help to automate the build process.
85858551Skris
85958551SkrisWed Nov 15 15:49:33 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
86058551Skris
86158551Skris        * Removed conditional compilation for GATHER_STATISTICS.  There's
86258551Skris          really no good reason to avoid collecting this info at run-time,
86358551Skris          since that section of code is *hardly* the bottleneck... ;-)
86458551Skris
86558551Skris        * Simplified the C output routines in Key_List::set_output_types
86658551Skris          and Key_List::output_keyword_table a bit in order to
86758551Skris          speed-up and clean up the code generation.
86858551Skris
86958551Skris        * Modified function Key_List::get_special_input so that it does
87058551Skris          not try to `delete' a buffer that turned out to be too short.
87158551Skris          This is important since the new memory management scheme
87258551Skris          does not handle deletions.  However, adding a small amount of
87358551Skris          garbage won't hurt anything, since we generally don't do this
87458551Skris          operation more than a couple times *at most*!
87558551Skris
87658551Skris        * Created a new file (new.cc) which includes my own overloaded
87758551Skris          operator new.  This function should dramatically reduce the
87858551Skris          number of calls to malloc since it grabs large chunks and
87958551Skris          doles them out in small pieces.  As a result of this change
88058551Skris          the class-specific `operator new' was removed from class List_Node.
88158551Skris
88258551SkrisTue Nov 14 21:45:30 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
88358551Skris
88458551Skris        * Continued to refine the great hack.  The latest trick is to
88558551Skris          try and replace most uses of dynamic memory (i.e., calls to
88658551Skris          new) with uses of gcc dynamic arrays (i.e., an alloca solution).
88758551Skris          This makes life much easier for the overall process-size, since 
88858551Skris          it reduces the amount of overhead for memory management.  As a
88958551Skris          side-effect from this change there is no reason to have the
89058551Skris          Bool_Array::dispose member function, so it's outta here!
89158551Skris
89258551Skris        * Fixed a stupid bug that was an disaster waiting to happen...
89358551Skris          Instead of making the boolean array large enough to index
89458551Skris          max_hash_value it was only large enough to index max_hash_value
89558551Skris          - 1.  Once again, an off-by-one mistake in C/C++!!!!
89658551Skris
89758551SkrisMon Nov 13 19:38:27 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
89858551Skris
89958551Skris        * Added the final great hack!  This allows us to generate hash tables
90058551Skris          for near-perfect hash functions that contain duplicates, *without*
90158551Skris          having to use switch statements!  Since many compilers die on large
90258551Skris          switch statements this feature is essential.  Furthermore, it appears
90358551Skris          that the generated code is often *smaller* than that put out by
90458551Skris          compilers, even though a large, sparse array must be created.
90558551Skris          Here's the general idea:
90658551Skris
90758551Skris             a. Generate the wordlist as a contiguous block of keywords, 
90858551Skris                just as before when using a switch statement.  This
90958551Skris                wordlist *must* be sorted by hash value. 
91058551Skris
91158551Skris             b. Generate the lookup array, which is an array of signed
91258551Skris                {chars,shorts,ints}, (which ever allows full coverage of
91358551Skris                the wordlist dimensions).  If the value v, where v =
91458551Skris                lookup[hash(str,len)], is >= 0 and < TOTAL_KEYWORDS, then we
91558551Skris                simply use this result as a direct access into the wordlist 
91658551Skris                array to snag the keyword for comparison.  
91758551Skris
91858551Skris             c. Otherwise, if v is < -TOTAL_KEYWORDS or > TOTAL_KEYWORDS
91958551Skris                this is an indication that we'll need to search through
92058551Skris                some number of duplicates hash values.  Using a hash
92158551Skris                linking scheme we'd then index into a different part of
92258551Skris                the hash table that provides the starting index and total
92358551Skris                length of the duplicate entries to find via linear search!
92458551Skris
92558551SkrisSun Nov 12 13:48:10 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
92658551Skris
92758551Skris        * Simplified Key_List::output_min_max considerably by recognizing
92858551Skris          that since the keyword list was already sorted by hash value finding 
92958551Skris          the min and max values is trivial!
93058551Skris
93158551Skris        * Improved the debugging diagnostics considerably in classes Key_List,
93258551Skris          Hash_Table, and Gen_Perf.
93358551Skris
93458551Skris        * Modified the `-s' option so that a negative argument is now 
93558551Skris          interpreted to mean `allow the maximum associated value to be
93658551Skris          about x times *smaller* than the number of input keys.'  This
93758551Skris          should help prevent massive explosion of generated hash table
93858551Skris          size for large keysets.
93958551Skris
94058551SkrisSat Nov 11 11:31:13 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
94158551Skris
94258551Skris        * Added a field in class Key_List that counts the total number
94358551Skris          of duplicate keywords, both static and dynamic.
94458551Skris
94558551Skris        * Added a new member function Bool_Array that deletes the dynamic
94658551Skris          memory allocated to Bool_Array::storage_array.  This space may
94758551Skris          be needed for subsequent options, so it made sense to free it as
94858551Skris          soon as possible...
94958551Skris          
95058551Skris        * Renamed file/class Alpha_Vectors to Vectors, to avoid problems
95158551Skris          with 14 character length filenames on SYSV.  Also changed file
95258551Skris          adapredefined.gperf to adadefs.gperf in the ./tests directory.
95358551Skris
95458551Skris        * Modified class Options by changing the member function
95558551Skris          Options::total_positions to Options::get_charset_size and
95658551Skris          Options::set_charset_size.  These two routines now either return
95718214Speter          the total charset size *or* the length of the largest keyword
95818214Speter          if the user specifies the -k'*' (ALLCHARS) option.  This change
95918214Speter          cleans up client code.
96018214Speter
96158551Skris        * Merged all the cperf changes into gperf.
96258551Skris        
96318214Speter        * Made sure to explicitly initialize perfect.fewest_collisions to
96418214Speter          0.
96518214Speter
96618214Speter        * Cleaned up some loose ends noticed by Nels Olson.
96718214Speter          1.  Removed `if (collisions <= perfect.fewest_collisions)'
96858551Skris              from Gen_Perf::affects_prev since it was superfluous.
96918214Speter          2.  Removed the fields best_char_value and best_asso_value
97058551Skris              from Gen_Perf.  There were also unnecessary.
97158551Skris          3.  Fixed a braino in the Bool_Array::bool_array_reset
97218214Speter              function.  Since iteration numbers can never be zero
97318214Speter              the `if (bool_array.iteration_number++ == 0)' must be
97418214Speter              `if (++bool_array.iteration_number == 0).'
97558551Skris          4.  Modified Std_Err::report_error so that it correctly handles
97618214Speter              "%%".
97718214Speter
97818214Speter        * It is important to note that -D no longer enables -S.
97918214Speter          There is a good reason for this change, which will become
98018214Speter          manifested in the next release... (suspense!).
98118214Speter
98258551Skris        * Made some subtle changes to Key_List::print_switch so that if finally
98318214Speter          seems to work correctly.  Needs more stress testing, however...
98418214Speter
98558551Skris        * Made a major change to the Key_List::print_switch function.
98618214Speter          The user can now specify the number of switch statements to generate
98718214Speter          via an argument to the -S option, i.e., -S1 means `generate 1
98818214Speter          switch statement with all keywords in it,' -S2 means generate
98918214Speter          2 switch statements with 1/2 the elements in each one, etc.
99018214Speter          Hopefully this will fix the problem with C compilers not being
99118214Speter          able to generate code for giant switch statements (but don't
99218214Speter          hold your breath!)
99318214Speter
99458551Skris        * Changed Key_List::length function to Key_List::keyword_list_length.
99518214Speter
99618214Speter        * Added a feature to main.c that prints out the starting wall-clock
99718214Speter          time before the program begins and prints out the ending wall-clock
99818214Speter          time when the program is finished.
99918214Speter
100058551Skris        * Added the GATHER_STATISTICS code in hash-table.c so we can
100118214Speter          keep track of how well double hashing is doing.  Eventually,
100218214Speter          GATHER_STATISTICS will be added so that all instrumentation
100318214Speter          code can be conditionally compiled in.
100418214Speter
100558551Skris        * Fixed a stupid bug in Key_List::print_switch routine.  This
100618214Speter          was necessary to make sure the generated switch statement worked
100718214Speter          correctly when *both* `natural,' i.e., static links and dynamic
100818214Speter          links, i.e., unresolved duplicates, hash to the same value.
100918214Speter
101058551Skris        * Modified Bool_Array::~Bool_Array destructor so that
101118214Speter          it now frees the bool_array.storage_array when it is no longer
101218214Speter          needed.  Since this array is generally very large it makes sense
101318214Speter          to return the memory to the freelist when it is no longer in use.
101418214Speter
101558551Skris        * Changed the interface to constructor Hash_Table::Hash_Table.  This 
101658551Skris          constructor now passed a pointer to a power-of-two sized buffer that 
101758551Skris          serve as storage for the hash table.  Although this weakens information
101818214Speter          hiding a little bit it greatly reduces dynamic memory fragmentation,
101918214Speter          since we can now obtain the memory via a call to alloca, rather
102058551Skris          than malloc.  This change modified Key_List::read_keys calling
102118214Speter          interface.
102218214Speter
102318214Speter        * Since alloca is now being used more aggressively a conditional
102458551Skris          compilation section was added in main.c. Taken from GNU GCC,
102558551Skris          this code gets rid of any avoidable limit on stack size so that
102658551Skris          alloca does not fail.  It is only used if the -DRLIMIT_STACK
102758551Skris          symbol is defined when gperf is compiled. 
102818214Speter
102918214Speter        * Added warnings in option.c so that user's would be informed
103018214Speter          that -r superceeds -i on the command-line.
103118214Speter          
103258551Skris        * Rewrote Gen_Perf::affects_prev.  First, the code structure
103318214Speter          was cleaned up considerably (removing the need for a dreaded
103458551Skris          goto!).  Secondly, a major change occurred so that Gen_Perf::affects_prev
103518214Speter          returns FALSE (success) when fewest_hits gets down to whatever
103618214Speter          it was after inserting the previous key (instead of waiting for
103718214Speter          it to reach 0).  In other words, it stops trying if it can
103818214Speter          resolve the new collisions added by a key, even if there are
103918214Speter          still other old, unresolved collisions.  This modification was
104018214Speter          suggested by Nels Olson and seems to *greatly* increase the
104118214Speter          speed of gperf for large keyfiles.  Thanks Nels!
104218214Speter
104358551Skris        * In a similar vein, inside the Gen_Perf::change routine 
104418214Speter          the variable `perfect.fewest_collisions is no longer initialized
104518214Speter          with the length of the keyword list.  Instead it starts out at
104618214Speter          0 and is incremented by 1 every time change () is called.
104718214Speter          The rationale for this behavior is that there are times when a
104818214Speter          collision causes the number of duplicates (collisions) to
104918214Speter          increase by a large amount when it would presumably just have
105018214Speter          gone up by 1 if none of the asso_values were changed.  That is,
105118214Speter          at the beginning of change(), you could initialize fewest_hits
105218214Speter          to 1+(previous value of fewest_hits) instead of to the number of
105318214Speter          keys.  Thanks again, Nels.
105418214Speter
105558551Skris        * Replaced alloca with new in the Gen_Perf::change function.
105618214Speter          This should eliminate some overhead at the expense of a little
105718214Speter          extra memory that is never reclaimed.
105818214Speter
105958551Skris        * Renamed Gen_Perf::merge_sets to Gen_Perf::compute_disjoint_union
106018214Speter          to reflect the change in behavior.
106118214Speter
106218214Speter        * Added the -e option so users can supply a string containing
106318214Speter          the characters used to separate keywords from their attributes.
106418214Speter          The default behavior is ",\n".
106518214Speter
106618214Speter        * Removed the char *uniq_set field from LIST_NODE and modified
106718214Speter          uses of uniq_set in perfect.c and keylist.c.  Due to changes
106858551Skris          to Gen_Perf::compute_disjoint_sets this field was no longer
106958551Skris          necessary, and its removal makes the program smaller and
107058551Skris          potentially faster. 
107118214Speter          
107218214Speter        * Added lots of changes/fixes suggested by Nels Olson
107318214Speter          (umls.UUCP!olson@mis.ucsf.edu).  In particular:
107458551Skris          1.  Changed Bool_Array so that it would dynamically create
107518214Speter              an array of unsigned shorts rather than ints if the 
107618214Speter              LO_CAL symbol was defined during program compilation.
107718214Speter              This cuts the amount of dynamic memory usage in half,
107818214Speter              which is important for large keyfile input.
107918214Speter          2.  Added some additional debugging statements that print extra
108018214Speter              info to stderr when the -d option is enabled.
108158551Skris          3.  Fixed a really stupid bug in Key_List::print_switch
108258551Skris              A right paren was placed at the wrong location, which broke
108358551Skris              strlen ().
108418214Speter          4.  Fixed a subtle problem with printing case values when keylinks
108518214Speter              appear.  The logic failed to account for the fact that there
108618214Speter              can be keylinks *and* regular node info also!
108758551Skris          5.  Changed the behavior of Key_List::read_keys so that it would
108858551Skris              honor -D unequivocally, i.e., it doesn't try to turn off dup
108958551Skris              handling if the user requests it, even if there are no
109058551Skris              immediate links in the keyfile input. 
109118214Speter          6.  Modified the -j option so that -j 0 means `try random values
109218214Speter              when searching for a way to resolve collisions.'
109358551Skris          7.  Added a field `num_done' to the Gen_Perf struct.  This is used
109418214Speter              to report information collected when trying to resolve
109518214Speter              hash collisions.
109618214Speter          8.  Modified the merge_sets algorithm to perform a disjoint
109718214Speter              union of two multisets.  This ensures that subsequent
109858551Skris              processing in Gen_Perf::affect_prev doesn't
109918214Speter              waste time trying to change an associated value that is
110018214Speter              shared between two conflicting keywords.
110158551Skris          9.  Modified Gen_Perf::affects_prev so that it doesn't try
110258551Skris              random jump values unless the -j 0 option is enabled.
110358551Skris          10. Fixed a silly bug in Gen_Perf::change.  This problem caused
110458551Skris              gperf to seg fault when the -k* option was given and the
110558551Skris              keyfile file had long keywords.
110658551Skris        
110758551SkrisSun Oct 29 00:18:55 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
110818214Speter
110958551Skris        * Modified class-specific new operations for Read_Line and
111058551Skris          List_Node so they don't fail if SIZE is larger than twice
111158551Skris          the previous buffer size.  Note we double buffer size
111258551Skris          everytime the previous buffer runs out, as a heuristic
111358551Skris          to reduce future calls to malloc.
111418214Speter
111558551SkrisSun Oct 22 13:49:43 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
111658551Skris
111758551Skris        * Updated gperf version number to 2.0.  Send to Doug Lea for
111858551Skris          incorporation into the long-awaited `official' libg++ 1.36
111958551Skris          release! 
112058551Skris
112158551Skris        * Thanks to Nels Olson a silly bug in Gen_Perf::change ()
112258551Skris          was fixed.  This problem caused gperf to seg fault when
112358551Skris          the -k* option was given and the keyfile file had long
112458551Skris          keywords.
112558551Skris          
112658551Skris        * Modified Key_List::print_hash_function so that it output
112758551Skris          max_hash_value + 1 (rather than just max_hash_value) for
112858551Skris          any associated value entries that don't correspond to
112958551Skris          keyword charset characters.  This should speed up rejection
113058551Skris          of non-keyword strings a little in some cases.
113158551Skris
113258551SkrisSat Oct 21 19:28:36 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
113358551Skris
113458551Skris        * Fixed Key_List::print_hash_function so that it no longer output
113558551Skris          things like `return 0 + ...'  Although this probably gets
113658551Skris          optimized away by even the worst C compilers there isn't any
113758551Skris          point tempting fate... ;-)
113858551Skris
113958551Skris        * Fixed class List_Node's constructor so that it wouldn't a priori
114058551Skris          refuse to consider trying to hash keys whose length is less
114158551Skris          than the smallest user-specified key position.  It turns out
114258551Skris          this is not a problem unless the user also specifies the -n
114358551Skris          (NOLENGTH) option, in which case such keys most likely
114458551Skris          don't have a prayer of being hashed correctly!
114558551Skris
114658551Skris        * Changed the name of the generated lookup table from `Hash_Table'
114758551Skris          to `asso_value' to be consistent with the gperf paper.
114858551Skris
114958551SkrisTue Oct 17 14:19:48 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
115058551Skris
115158551Skris        * Added a flag GATHER_STATISTICS in the Makefile.  If defined
115258551Skris          during compilation this turns on certain collection facilities
115358551Skris          that track the performance of gperf during its execution.  In
115458551Skris          particular, I want to see how many collisions occur for the
115558551Skris          double hashing Hash_Table.
115658551Skris
115758551Skris        * Added a safety check so that we don't screw up if the total
115858551Skris          number of `resets' of the Bool_Array exceeds MAX_INT.  Since
115958551Skris          this number is around 2^31 it is unlikely that this would ever
116058551Skris          occur for most input, but why take the risk?
116158551Skris
116258551Skris        * Changed the behavior for the -a (ANSI) option so that the
116318214Speter          generated prototypes use int rather than size_t for the LEN 
116418214Speter          parameter.  It was too ugly having to #include <stddef.h> all
116518214Speter          over the place...
116618214Speter
116758551SkrisMon Oct 16 11:00:35 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
116858551Skris
116958551Skris        * Continued to work on the gperf paper for the USENIX C++
117058551Skris          conference.  At some point this will be merged back into
117158551Skris          the gperf documentation...
117258551Skris
117358551SkrisSat Oct 14 20:29:43 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
117458551Skris
117518214Speter        * Added a majorly neat hack to Bool_Array, suggested by rfg.
117618214Speter          The basic idea was to throw away the Ullman array technique.
117718214Speter          The Ullman array was used to remove the need to reinitialize all 
117818214Speter          the Bool_Array elements to zero everytime we needed to determine
117918214Speter          whether there were duplicate hash values in the keyword list.  
118018214Speter          The current trick uses an `iteration number' scheme, which takes
118118214Speter          about 1/3 the space and reduces the overall program running a 
118218214Speter          time by about 20 percent for large input!  The hack works as 
118318214Speter          follows:
118418214Speter          
118558551Skris          1. Dynamically allocation 1 boolean array of size k.
118618214Speter          2. Initialize the boolean array to zeros, and consider the first
118718214Speter             iteration to be iteration 1.
118818214Speter          2. Then on all subsequent iterations we `reset' the bool array by
118918214Speter             kicking the iteration count by 1. 
119018214Speter          3. When it comes time to check whether a hash value is currently
119118214Speter             in the boolean array we simply check its index location.  If
119218214Speter             the value stored there is *not* equal to the current iteration
119318214Speter             number then the item is clearly *not* in the set.  In that
119418214Speter             case we assign the iteration number to that array's index
119518214Speter             location for future reference.  Otherwise, if the item at
119618214Speter             the index location *is* equal to the iteration number we've
119718214Speter             found a duplicate.  No muss, no fuss!
119858551Skris             
119958551SkrisMon Oct  2 12:30:54 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
120018214Speter
120158551Skris        * Changed some consts in options.h to enumerals, since g++
120258551Skris          doesn't seem to like them at the moment!
120318214Speter
120458551SkrisSat Sep 30 12:55:24 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
120518214Speter
120658551Skris        * Fixed a stupid bug in Key_List::print_hash_function that manifested
120758551Skris          itself if the `-k$' option was given (i.e., only use the key[length]
120858551Skris          character in the hash function).
120958551Skris
121018214Speter        * Added support for the -C option.  This makes the contents of
121118214Speter          all generated tables `readonly'.
121218214Speter
121318214Speter        * Changed the handling of generated switches so that there is
121418214Speter          only one call to str[n]?cmp.  This *greatly* reduces the size of
121518214Speter          the generated assembly code on all compilers I've seen.
121618214Speter
121718214Speter        * Fixed a subtle bug that occurred when the -l and -S option
121818214Speter          was given.  Code produced looked something like:
121918214Speter
122018214Speter          if (len != key_len || !strcmp (s1, resword->name)) return resword;
122118214Speter
122218214Speter          which doesn't make any sense.  Clearly, this should be:
122318214Speter
122418214Speter          if (len == key_len && !strcmp (s1, resword->name)) return resword;
122518214Speter
122658551SkrisTue Sep 26 10:36:50 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
122718214Speter
122858551Skris        * Changed class Read_Line's definition so that it no longer
122958551Skris          needs to know about the buffering scheme used to speed up 
123058551Skris          dynamic memory allocation of input keywords and their
123158551Skris          associated attributes.  This means that operator new is no longer
123258551Skris          a friend of Read_Line.
123318214Speter
123458551SkrisMon Sep 25 23:17:10 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
123558551Skris
123658551Skris        * Decided that Obstacks had too much overhead, so they were
123758551Skris          removed in favor of super-efficient, low-overhead buffered
123858551Skris          storage allocation hacks in Read_Line and List_Node.
123958551Skris
124058551Skris        * No longer try to inline functions that g++ complains about
124158551Skris          (Key_List::Merge and Key_List::Merge_Sort).
124258551Skris
124358551SkrisSun Sep 24 13:11:24 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
124458551Skris
124558551Skris        * Changed classes Read_Line and List_Node to use Obstacks in order
124658551Skris          to cache memory allocation for keyword strings and List_Nodes.
124758551Skris          
124858551Skris        * Continued to experiment with inheritance schemes.
124958551Skris        
125058551Skris        * Added a new file `alpha.h', that declares static data shared
125158551Skris          (i.e., inherited) between classes List_Node and Key_List.
125258551Skris
125358551SkrisTue Sep 12 16:14:41 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
125458551Skris
125558551Skris        * Made numerous changes to incorporate multiple inheritance in 
125658551Skris          gperf.
125758551Skris
125858551SkrisWed Aug 16 23:04:08 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
125958551Skris
126058551Skris        * Added the -DCOMPILER_FIXED flag to the ./src/Makefile.  This
126158551Skris          implies that people trying to compile gperf need to have a
126258551Skris          working version of the new g++ compiler (1.36.0).
126358551Skris
126458551Skris        * Removed some extra spaces that were being added in the generated
126558551Skris          C code.
126658551Skris
126718214SpeterMon Jul 24 17:09:46 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
126818214Speter
126918214Speter        * Fixed PRINT_HASH_FUNCTION and PRINT_LOOKUP_FUNCTION in keylist.c
127018214Speter          so that the generated functions take an unsigned int length argument.
127118214Speter          If -a is enabled the prototype is (const char *str, size_t len).
127218214Speter
127318214SpeterFri Jul 21 13:06:15 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
127418214Speter
127558551Skris        * Fixed a typo in PRINT_KEYWORD_TABLE in keylist.cc that prevented
127658551Skris          the indentation from working correctly.
127758551Skris
127818214Speter        * Fixed a horrible typo in PRINT_KEYWORD_TABLE in keylist.cc
127918214Speter          that prevented links from being printed correctly.
128018214Speter
128158551SkrisTue Jul 18 16:04:31 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
128258551Skris
128358551Skris        * Fixed up readline.cc and readline.h so that they work OK
128458551Skris          with g++ compilers that aren't completely up-to-date.
128558551Skris          If symbol COMPILER_FIXED is defined then the behavior
128658551Skris          that works on my more recent version of g++ is enabled.
128758551Skris
128818214SpeterSun Jul  9 17:53:28 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
128918214Speter
129018214Speter        * Changed the ./tests subdirectory Makefile so that it 
129118214Speter          uses $(CC) instead of gcc.
129218214Speter
129358551SkrisSun Jul  2 21:52:15 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
129418214Speter
129518214Speter        * Fixed a number of subtle bugs that occurred when -S was
129618214Speter          combined with various and sundry options.
129718214Speter
129818214Speter        * Added the -G option, that makes the generated keyword table
129918214Speter          a global static variable, rather than hiding it inside
130018214Speter          the lookup function.  This allows other functions to directly
130118214Speter          access the contents in this table.
130218214Speter
130318214Speter        * Added the "#" feature, that allows comments inside the keyword
130458551Skris          list from the input file. Comment handling takes place in readline.c.  
130558551Skris          This simplifies the code and reduces the number of malloc calls.
130618214Speter          
130718214Speter        * Also added the -H option (user can give the name of the hash
130818214Speter          function) and the -T option (prevents the transfer of the type decl
130918214Speter          to the output file, which is useful if the type is already defined
131018214Speter          elsewhere).
131118214Speter
131258551SkrisThu Jun 22 20:39:39 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
131318214Speter
131458551Skris        * Modified many classes so that they would inherit Std_Err as
131558551Skris          a base class.  This makes things more abstract...
131618214Speter
131758551SkrisFri Jun 16 14:23:00 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
131818214Speter
131918214Speter        * Modified the -f (FAST) option.  This now takes an argument.
132018214Speter          The argument corresponds to the number of iterations used
132118214Speter          to resolve collisions.  -f 0 uses the length of the
132218214Speter          keyword list (which is what -f did before).  This makes
132318214Speter          life much easier when dealing with large keyword files.
132418214Speter
132558551SkrisTue Jun  6 17:53:27 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
132618214Speter
132718214Speter        * Added the -c (comparison) option.  Enabling this
132818214Speter          will use the strncmp function for string comparisons.
132918214Speter          The default is to use strcmp.
133018214Speter
133158551Skris        * Fixed a typo in key_list.cc (PRINT_SWITCH).  This caused
133258551Skris          faulty C code to be generated when the -D, -p, and -t
133358551Skris          options were all enabled.
133418214Speter
133558551SkrisThu May 25 14:07:21 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
133618214Speter
133758551Skris        * Once again, changed class Read_Line to overload global operator
133858551Skris          new.  Hopefully, this will work...!
133958551Skris
134058551SkrisSun May 21 01:51:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
134158551Skris
134258551Skris        * Modified Key_List::print_hash_function () so that it properly
134358551Skris          formats the associated values in the hash table according to
134458551Skris          the maximum number of digits required to represent the largest
134558551Skris          value.
134658551Skris
134758551Skris        * Removed the named return value from class Hash_Table's
134858551Skris          operator (), since this causes a seg fault when -O is enabled.
134958551Skris          No sense tripping subtle g++ bugs if we don't have to.... ;-)
135058551Skris
135158551Skris        * Removed the operator new hack from Read_Line, since this seemed
135258551Skris          to create horrible bus error problems.
135358551Skris                    
135458551Skris        * Changed many class member functions and data members to be `static', 
135558551Skris          if they don't manipulate this!
135618214Speter          
135758551SkrisFri May 12 23:06:56 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
135818214Speter
135958551Skris        * Changed class Std_Err to use static member functions, a la
136058551Skris          Ada or Modula 2.  This eliminates the need for an explicit
136158551Skris          error-handler class object.
136218214Speter
136358551Skris        * Added the ``named return value'' feature to Hash_Table::operator ()
136458551Skris          and Bool_Array::operator [], just for the heck of it.... ;-)
136518214Speter
136658551Skris        * Changed the previous hack in Read_Line so that we now use
136758551Skris          the overloaded global `new' instead of NEW_STRING!
136818214Speter
136958551SkrisWed May  3 17:36:55 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
137018214Speter
137118214Speter        * Updated to version 1.7.  This reflects the recent major changes
137218214Speter          and the new C port.
137318214Speter
137458551Skris        * Modified the GNU getopt.cc routine to have a class-based interface.
137518214Speter
137658551Skris        * Fixed a typo in Perfect.cc ~Perfect that prevented the actual maximum
137758551Skris          hash table size from being printed (maybe the stream classes
137858551Skris          weren't so bad after all.... ;-).
137958551Skris
138018214Speter        * Added support for the -f option.  This generates the perfect
138118214Speter          hash function ``fast.''  It reduces the execution time of
138218214Speter          gperf, at the cost of minimizing the range of hash values.
138318214Speter
138418214SpeterTue May  2 16:23:29 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
138518214Speter
138658551Skris        * Added an efficiency hack to Read_Line.  Instead of making
138758551Skris          a call to operator NEW (a.k.a. malloc) for each input string
138858551Skris          a new member function NEW_STRING stores a large buffer from
138958551Skris          which new strings are carved out, growing the buffer if
139058551Skris          necessary.  It might be useful to add this throughout the
139158551Skris          program....
139218214Speter
139358551Skris        * Removed all unnecessary calls to DELETE.  If the program is about
139458551Skris          to exit it is silly to waste time freeing memory.
139558551Skris
139658551Skris        * Added the GNU getopt program to the distribution.  This makes
139758551Skris          GPERF portable to systems that don't include getopt in libc.
139858551Skris          
139958551Skris        * Added a strcspn member to class Key_List.  This also increases
140058551Skris          portability.
140158551Skris
140258551Skris        * Added the get_include_src function from keylist.c as a member
140358551Skris          function in class Key_List.  Hopefully every function is 
140458551Skris          now associated with a class.  This aids abstraction and
140558551Skris          modularity.
140658551Skris
140718214Speter        * Ported gperf to C.  From now on both K&R C and GNU G++ versions
140858551Skris          will be supported.  There will be two ChangeLog files, one
140958551Skris          for each version of the program.
141018214Speter
141158551SkrisMon May  1 16:41:45 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
141258551Skris
141358551Skris        * Fixed a bug with -k'*'.  This now prints out *all* the cases
141458551Skris          up to the length of the longest word in the keyword set.
141558551Skris
141658551SkrisSun Apr 30 12:15:25 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
141758551Skris
141858551Skris        * Removed all use of the stream classes.  Too ugly, slow, and
141958551Skris          not handled by the c++-mode formatter....
142058551Skris
142158551Skris        * Modified the handling of links (i.e., keywords that have
142258551Skris          identical hash values as other keywords).  This should 
142358551Skris          speed up hash function generation for keyword sets with
142458551Skris          many duplicate entries.  The trick is to treat duplicate
142558551Skris          values as equivalence classes, so that each set of duplicate
142658551Skris          values is represented only once in the main list processing.
142758551Skris
142858551Skris        * Fixed some capitialization typos and indentations mistakes in 
142958551Skris          Key_List::print_hash_function.
143058551Skris
143158551SkrisSat Apr 29 12:04:03 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
143258551Skris
143358551Skris        * Fixed a typo/logico in Key_List::print_switch that prevented
143458551Skris          the last keyword in the keyword list to be print out.  This
143558551Skris          requires further examination.....
143658551Skris
143758551Skris        * Fixed a stupid bug in List_Node::List_node.  If the -k'*' option
143858551Skris          was enabled the KEY_SET string wasn't getting terminated with
143958551Skris          '\0'!
144058551Skris
144158551SkrisFri Apr 28 12:38:35 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
144258551Skris
144358551Skris        * Renamed strexp.h and strexp.cc to iterator.h and iterator.cc.
144458551Skris          Also changed the strexp class to iterator.  Continued to work
144558551Skris          on style...
144658551Skris
144758551Skris        * Updated the version number to 1.6.  This reflects all the 
144858551Skris          recent changes.
144958551Skris
145058551SkrisThu Apr 27 00:14:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
145158551Skris
145258551Skris        * Added the -D option that properly handles keyword sets that
145358551Skris          contain duplicate hash values.
145458551Skris
145558551Skris        * Continued the stylistic changes.  Added the #pragma once
145658551Skris          directive to all the *.h files.  Removed all #defines and
145758551Skris          replaced them with static consts.  Also moved the key_sort
145858551Skris          routine from options.cc into the options class as a 
145958551Skris          member function.
146058551Skris
146158551SkrisMon Apr  3 13:26:55 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
146258551Skris
146358551Skris        * Made massive stylistic changes to bring source code into
146458551Skris          conformance with GNU style guidelines.
146558551Skris
146658551SkrisThu Mar 30 23:28:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
146758551Skris
146858551Skris        * Fixed up the output routines so that they generate code
146958551Skris          corresponding to the GNU style guidelines.
147058551Skris
147158551SkrisSat Mar 11 13:12:37 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
147258551Skris
147358551Skris        * Fixed Stderr constructors so that they wouldn't try to
147458551Skris          use the base class initializer syntax for the static 
147558551Skris          class variable Program_Name.  G++ 1.34 is stricter in
147658551Skris          enforcing the rules!
147758551Skris
147858551SkrisFri Mar 10 11:24:14 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
147958551Skris
148058551Skris        * Removed -v and ``| more'' from the Makefile to keep rfg happy...
148158551Skris
148258551SkrisThu Mar  2 12:37:30 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
148358551Skris
148458551Skris        * Sent latest GNU gperf version 1.5 to Doug Lea for inclusion
148558551Skris          into libg++ 1.34.  Note that there is a small bug with
148658551Skris          the new %{ ... %} source inclusion facility, since it doesn't
148758551Skris          understand comments and will barf if %{ or %} appear nested
148858551Skris          inside the outermost delimiters.  This is too trivial of
148958551Skris          a defect to fix at the moment...
149058551Skris
149158551SkrisTue Feb 28 11:19:58 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
149258551Skris
149358551Skris        * Added the -K option, which allows the user to provide a
149458551Skris          alternative name for the keyword structure component.
149558551Skris          The default is still ``name.''
149658551Skris
149758551Skris        * Added the LEX and YACC-like ability to include arbitrary
149858551Skris          text at the beginning of the generated C source code output.
149958551Skris          This required two new functions Get_Special_Input, 
150058551Skris          Key_List::Save_Include_Src;
150158551Skris
150258551Skris        * Fixed memory allocation bug in Key_List::Set_Types.
150358551Skris          Variable Return_Type needs 1 additional location
150458551Skris          to store the "*" if the -p option is used.
150558551Skris          
150658551Skris        * Added code to NULL terminate both Struct_Tag and Return_Type,
150758551Skris          *after* the strncpy (stupid mistake).
150858551Skris          
150958551SkrisMon Feb 27 14:39:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
151058551Skris
151158551Skris        * Added a new option -N.  This allows the user to specify the
151258551Skris          name to be used for the generated lookup function.  The
151358551Skris          default name is still ``in_word_set.''  This makes it
151458551Skris          possible to completely automate the perfect hash function
151558551Skris          generation process!
151658551Skris
151758551SkrisMon Feb 20 23:33:14 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
151858551Skris
151958551Skris        * Corrected the Hash_Table::operator () function so that
152058551Skris          *it* is responsible for deciding when a new key has the
152158551Skris          same signature as a previously seen key.  The key length 
152258551Skris          information is now used internally to this function to
152358551Skris          decide whether to add to the hash table those keys with
152458551Skris          the same key sets, but different lengths.  Before, this
152558551Skris          was handled by the Key_List::Read_Keys function.  However,
152658551Skris          this failed to work for certain duplicate keys, since
152758551Skris          they weren't being entered into the hash table properly.
152858551Skris
152958551SkrisSun Feb 19 16:02:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
153058551Skris
153158551Skris        * Modified class Options by moving the enum Option_Type out
153258551Skris          of the class.  This is to satisfy the new enumeration
153358551Skris          scope rules in C++.
153458551Skris
153558551SkrisSun Jan 15 15:12:09 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
153658551Skris
153758551Skris        * Incremented the version number upto 1.4 to reflect the new 
153858551Skris          options that affect the generated code.  Send the new 
153958551Skris          distribution off to Michael for use with g++ 1.33.
154058551Skris
154158551Skris        * Added a fix to Key_List::Read_Keys so that it checks for links
154258551Skris          properly when the -n option is used.  Previously, it didn't
154358551Skris          catch obvious links, which caused it to spend large amount
154458551Skris          of time searching for a solution that could never occur!
154558551Skris
154658551Skris        * Modified the Key_List data structure to record *both* the 
154758551Skris          minimum and the maximum key lengths.  This information
154858551Skris          is now computed in Key_List::Read_Keys, and thus 
154958551Skris          Key_List::Print_Min_Max doesn't need to bother.
155058551Skris
155158551Skris        * Modifed the key position iterator scheme in options.cc to
155258551Skris          eliminate the need for member function Options::Advance.
155358551Skris          Now, the Options::Get function performs the advancement
155458551Skris          automatically, obviating the need for an extra function call.
155558551Skris
155658551Skris        * Added the new function Options::Print_Options, to print out
155758551Skris          the user-specified command line options to generated C
155858551Skris          output file.
155958551Skris
156058551Skris        * Added a new function, Key_List::Print_Keylength_Table,
156158551Skris          which creates a table of lengths for use in speeding
156258551Skris          up the keyword search.  This also meant that a new
156358551Skris          option, -l (LENTABLE) is recognized.  It controls 
156458551Skris          whether the length table is printed and the comparison
156558551Skris          made in the generated function ``in_word_set.''
156658551Skris
156758551Skris        * Added a comment at the top of the generated C code
156858551Skris          output file that tells what version of gperf was used.
156958551Skris          Next, I'll also dump out the command line options
157058551Skris          as a comment too.  Thanks to Michael Tiemann for the
157158551Skris          feedback on this.
157258551Skris
157358551Skris        * Fixed the -n option to make it work correctly with
157458551Skris          other parts of the program (most notably the Perfect::Hash
157558551Skris          function and the computation of minimum and maximum lengths.
157658551Skris
157758551SkrisFri Jan 13 21:25:27 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
157858551Skris
157958551Skris        * Realized the the need to add a test that will enable
158058551Skris          optimziation of the generated C code in the ``hash'' function
158158551Skris          by checking whether all the requested key positions are
158258551Skris          guaranteed to exist due to the comparison in `in_word_set.''
158358551Skris          I'll put this in soon....
158458551Skris
158558551SkrisThu Jan 12 20:09:21 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
158658551Skris
158758551Skris        * Added pascal, modula3, and modula2 tests inputs to the 
158858551Skris          Makefile
158958551Skris        
159058551Skris        * Recognised that there is a bug with the -n option.  However
159158551Skris          I'm too busy to fix it properly, right now.  The problem 
159258551Skris          is that the generated #define end up being 0, since that's
159358551Skris          my hack to make -n work.  This needs complete rethinking!
159458551Skris
159558551SkrisTue Jan 10 00:08:16 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
159658551Skris
159758551Skris        * Added a new option, -n, that instructs gperf to not use the
159858551Skris          length of an identifier when computing the hash functions.
159958551Skris          I'm not sure how useful this is!
160058551Skris          
160158551Skris        * Retransmitted the distribution to rocky.oswego.edu.  Hopefully,
160258551Skris          this will work!
160358551Skris
160458551Skris        * Began fixing the indentation and capitalization to conform
160558551Skris          to the GNU coding guidelines.
160658551Skris
160758551SkrisMon Jan  9 22:23:18 1989  Doug Schmidt  (schmidt at pompe.ics.uci.edu)
160858551Skris
160958551Skris        * Fixed horrible bug in Read_Line::Readln_Aux.  This was
161058551Skris          a subtle and pernicous off-by-1 error, that overwrote
161158551Skris          past the last character of the input string buffer.  I
161258551Skris          think this fault was killing the vax!
161358551Skris
161458551Skris        * Yow, fixed an oversight in List_Node::List_Node, where the
161558551Skris          pointer field Next was uninitialized.  Luckily, the new routine
161658551Skris          seems to return 0 filled objects the first time through!
161758551Skris
161858551SkrisSun Jan  8 13:43:14 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
161958551Skris
162058551Skris        * Modified the ``key linked'' diagnostic in Key_List::Read_Keys
162158551Skris          to be more helpful and easy to read.
162258551Skris
162358551Skris        * Fixed the List_Node::List_Node so that it would ignore trailing
162458551Skris          fields if the -t option was not enabled.
162558551Skris
162658551Skris        * Moved the List_Node declarations out of keylist.h and
162758551Skris          into a file of its own, called listnode.cc and listnode.h
162858551Skris          Made Set_Sort a member function of class List_Node.
162958551Skris
163058551Skris        * Massively updated the documentation in the gperf.texinfo file.
163158551Skris        
163258551Skris        * Polished off the major revision to the print functions,
163358551Skris          added a few new tests in the Makefile to check for the
163458551Skris          validity of the program and ftp'ed the entire distribution
163558551Skris          off to Doug Lea for libg++. ( changed it to
163658551Skris          1.3 to reflect the major changes with the generated
163758551Skris          C code ).
163858551Skris
163958551Skris        * Fixed Key_List::Print_Switch to deal with the -p and -t options.
164058551Skris          This meant that the ``still-born'' function Key_List::
164158551Skris          Print_Type_Switch was superflous, so I removed it.
164258551Skris          Also, removed the restriction in Option that the -p and
164358551Skris          -t options couldn't be used simultaneously.
164458551Skris
164558551Skris        * Modified List_Node::List_Node, to perform only 1 call to 
164658551Skris          ``new'' when dynamically allocating memory for the Key_Set
164758551Skris          and the Uniq_Set.
164858551Skris
164958551SkrisSat Jan  7 14:10:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
165058551Skris
165158551Skris        * Fixed a big bug with the new policy of nesting the
165258551Skris          wordlist inside of generated function ``in_word_set.''
165358551Skris          I'd forgotten to declare the wordlist array as static!
165458551Skris          ( arrgh ).
165558551Skris
165658551Skris        * Added a new function Key_List::Set_Types, that figures out
165758551Skris          the return type for generated function ``in_word_set,''
165858551Skris          the user-defined ``struct tag,'' if one is used, and also
165958551Skris          formates the array type for the static local array.
166058551Skris
166158551Skris        * Changed the print routines to take advantage of the
166258551Skris          new -p option.
166358551Skris
166458551Skris        * Began adding the hooks to allow the return of a pointer
166558551Skris          to a user defined struct location from the generated
166658551Skris          ``in_word_set'' function instead of the current 0 or 1
166758551Skris          return value.  Created function Key_List::Print_Type_Switch
166858551Skris          and added option -p to class Option, allowing the user to 
166958551Skris          request generation of the aforementioned pointers returned 
167058551Skris          instead of booleans.
167158551Skris
167258551Skris        * Put in checks in class Option to make sure that -S and -t
167358551Skris          options are not used simultaneously.  This restriction
167458551Skris          will be removed in subsequent releases, once I decide on
167558551Skris          a clean way to implement it.
167658551Skris
167758551Skris        * Sent version 1.2 to Doug Lea for possible inclusion into
167858551Skris          the libg++ distribution.
167958551Skris          
168058551Skris        * Moved the static word_list array inside the generated function
168158551Skris          in_word_set.  This supports better data hiding.
168258551Skris
168358551Skris        * Added a texinfo file, gperf.texinfo
168458551Skris          
168558551Skris        * Revised the Makefile to cleanup the droppings from texinfo
168658551Skris          and changed the name of gperf.cc and gperf.h to perfect.cc
168758551Skris          and perfect.h.
168858551Skris
168958551SkrisFri Jan  6 13:04:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
169058551Skris
169158551Skris        * Implemented the switch statement output format.  Much better
169258551Skris          for large datasets in terms of space used.
169358551Skris
169458551Skris        * Added new functions to break up the Key_List::Output function.
169558551Skris          Functions added were Key_List::Print_Switch, Key_List::Print_Min_Max,
169658551Skris          Key_List::Print_Keyword_Table, Key_List::Print_Hash_Function,
169758551Skris          and Key_List::Print_Lookup_Function.  This simplifies the
169858551Skris          big mess in Key_List::Output considerably!
169958551Skris          
170058551Skris        * Added switch statement option to Options, which potentially 
170158551Skris          trades time for space in the generated lookup code.
170258551Skris
170358551SkrisThu Jan  5 22:46:34 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
170458551Skris
170558551Skris        * Released version 1.1
170658551Skris        
170758551Skris        * Fixed a bug with Gperf::Merge_Set, it was skipping letters shared
170858551Skris          between the Set_1 and Set_2.
170958551Skris
171058551Skris        * Added the optimal min/max algorithm in Key_List::Output.  This
171158551Skris          runs in O ( 3n/2 ), rather than O ( 2n ) time.
171258551Skris
171358551Skris        * Changed Gperf::Sort_Set to use insertion sort, rather than
171458551Skris          bubble sort.
171558551Skris        
171658551Skris        * Added a check in Key_List::Output for the special case where
171758551Skris          the keys used are 1,$.  It is possible to generate more
171858551Skris          efficient C code in this case.
1719