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