ChangeLog revision 228060
12007-04-30 Brendan Kehoe <brendan@zen.org> 2 3 * gperf-3.0.3 released. 4 * src/version.cc: Bump to 3.0.3. 5 * tests/*.exp: Bump to 3.0.3 in header. 6 * doc/gperf.1: Regenerate with gperf 3.0.3. 7 82007-04-06 Bruno Haible <bruno@clisp.org> 9 10 Improve support for mingw. 11 * tests/Makefile.in (check-c, check-ada, check-modula3, check-pascal, 12 check-lang-utf8, check-lang-ucs2): Remove '\r' from output before diff. 13 (POSTPROCESS_FOR_MINGW): New variable. 14 (check-test): Use it to postprocess output before diff. 15 162007-04-04 Bruno Haible <bruno@clisp.org> 17 18 Support for newer GNU standards. 19 * doc/configure.ac (mandir): Remove assignment. 20 * doc/Makefile.in (datarootdir): New variable. 21 (docdir, dvidir, psdir, pdfdir, htmldir): Use value determined by 22 autoconf. 23 * configure.ac: Require autoconf >= 2.60. 24 * doc/configure.ac: Likewise. 25 * lib/configure.ac: Likewise. 26 * src/configure.ac: Likewise. 27 * tests/configure.ac: Likewise. 28 * configure: Regenerated with autoconf-2.61. 29 * doc/configure: Likewise. 30 * lib/configure: Likewise. 31 * src/configure: Likewise. 32 * tests/configure: Likewise. 33 * src/config.h.in: Likewise. 34 * src/config.h.msvc: Likewise. 35 * src/config.h_vms: Likewise. 36 372007-04-04 Bruno Haible <bruno@clisp.org> 38 39 * doc/Makefile.in (MAKEINFO): Disable also the LC_MESSAGES and LC_ALL 40 environment variables. 41 422007-04-04 Bruno Haible <bruno@clisp.org> 43 44 * configure.ac: Renamed from configure.in. 45 * doc/configure.ac: Renamed from doc/configure.in. 46 * lib/configure.ac: Renamed from lib/configure.in. 47 * src/configure.ac: Renamed from src/configure.in. 48 * tests/configure.ac: Renamed from tests/configure.in. 49 * Makefile.devel: Update. 50 * INSTALL: Update. 51 522007-03-31 Bruno Haible <bruno@clisp.org> 53 54 * tests/test.c (in_word_set): New declaration. 55 * tests/test2.c (in_word_set): Likewise. 56 572007-03-31 Bruno Haible <bruno@clisp.org> 58 59 * src/options.cc (Options::parse_options): Bump copyright year. 60 612007-03-31 Bruno Haible <bruno@clisp.org> 62 63 * doc/gperf.texi: Fix typo. 64 652007-03-31 Bruno Haible <bruno@clisp.org> 66 67 Change generated code after the meaning of __inline is changed in 68 GCC 4.3. 69 * src/output.cc (Output::output_lookup_function): Emit an inline 70 marker that also works with gcc-4.3 in c99 or gnu99 mode. 71 * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp, 72 tests/cplusplus.exp, tests/gpc.exp, tests/incomplete.exp, 73 tests/java.exp, tests/languages.exp, tests/modula2.exp, 74 tests/objc.exp, tests/permut2.exp, tests/permut3.exp, 75 tests/permutc2.exp, tests/test-4.exp: Update. 76 Reported by Bruce Korb <Bruce.Korb@gmail.com>. 77 782006-06-29 Brendan Kehoe <brendan@zen.org> 79 80 * gperf-3.0.2 released. 81 82 * doc/Makefile.in (all): No longer depend on dvi. 83 842006-01-22 Brendan Kehoe <brendan@zen.org> 85 86 * doc/gperf.texi: Update copyright to be 1989-2006. 87 (UPDATED): Change to 22 January 2006. 88 * doc/gperf.1 (TH): Fix date. 89 * configure.in: Update copyright years. 90 * configure: Regenerate. 91 * src/Makefile.in: Update copyright years. 92 93 * doc/gperf.{dvi,ps,pdf}: Regenerated by manually invoking tex 94 instead of trying to use texi2dvi, whose run of etex ends up 95 actually always running pdfetex, thus always recreating gperf.pdf. 96 972006-01-13 Brendan Kehoe <brendan@zen.org> 98 99 * NEWS: Add note about #line directive fix. 100 * doc/gperf.1: Regenerate with Makefile.devel. 101 102 * doc/gperf.texi (UPDATED): Correct to be today. 103 * doc: Regenerated by doing make in a configured tree. 104 Requires makeinfo, texi2dvi, texi2pdf, and texi2html. 105 106 * configure.in: Add AC_OBJEXT and AC_EXEEXT. 107 * lib/Makefile.in (OBJEXT): Define for subst. 108 (OBJECTS): Use $(OBJEXT) instead of '.o'. 109 * src/Makefile.in: Make dependencies use $(OBJEXT). 110 (OBJEXT, EXEEXT): Define for subst. 111 (TARGETPROG): Add $(EXEEXT). 112 (OBJECTS): Use $(OBJEXT) instead of '.o'. 113 (clean): Remove *.$(OBJEXT) instead of *.o. 114 1152006-01-13 Bruno Haible <bruno@clisp.org> 116 117 Fix #line directives for filenames containing backslashes. 118 * src/output.cc (output_line_directive): New function. 119 (output_keyword_entry, Output::output): Use it. 120 Reported by Alexander <alexander.me@gmail.com>. 121 122 * src/options.cc (Options::parse_options): Update years in --version 123 output. 124 1252005-08-29 Brendan Kehoe <brendan@zen.org> 126 127 * src/keyword.cc: Tweak comment to avoid nesting. 128 1292005-08-27 Bruno Haible <bruno@clisp.org> 130 131 Fix missing ranlib detection when cross-compiling. 132 * aclocal.m4 (CL_PROG_RANLIB): Remove macro. 133 * lib/configure.in: Use AC_PROG_RANLIB instead of CL_PROG_RANLIB. 134 1352005-07-30 Bruno Haible <bruno@clisp.org> 136 137 * src/version.cc: Bump version number to 3.0.2. 138 * doc/gperf.texi: Likewise. 139 * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp, 140 tests/cplusplus.exp, tests/gpc.exp, tests/incomplete.exp, 141 tests/java.exp, tests/languages.exp, tests/modula2.exp, 142 tests/objc.exp, tests/permut2.exp, tests/permut3.exp, 143 tests/permutc2.exp, tests/test-4.exp: Update. 144 1452005-07-30 Bruno Haible <bruno@clisp.org> 146 147 * src/positions.h: Add forward declarations of friend classes. 148 Needed for compilation with g++ 4.0. 149 1502004-08-22 Bruno Haible <bruno@clisp.org> 151 152 * tests/Makefile.in (check-lang-syntax): Add test for the 153 --length-table-name option. 154 * tests/test-6.exp: Update. 155 1562004-08-21 Bruce Lilly <blilly@erols.com> 157 158 * src/input.cc (Input::read_input): Accept length-table-name 159 declaration. 160 * src/options.h (Options::get_lengthtable_name, 161 Options::set_lengthtable_name): New declarations. 162 (Options): Add field _lengthtable_name. 163 * src/options.icc (Options::get_lengthtable_name): New inline method. 164 * src/options.cc (DEFAULT_LENGTHTABLE_NAME): New constant. 165 (Options::long_usage): Document --length-table-name option. 166 (Options::Options): Initialize _lengthtable_name field. 167 (Options::~Options): Update. 168 (Options::set_lengthtable_name): New method. 169 (long_options): Add option --length-table-name. 170 (Options::parse_options): Implement --length-table-name option. 171 * src/output.cc (Output::output_keylength_table, output_switch_case, 172 Output::output_lookup_function_body): Use option.get_lengthtable_name. 173 * doc/gperf.texi (Gperf Declarations): Document %define 174 length-table-name. 175 (Output Details): Document --length-table-name option. 176 1772003-06-12 Bruno Haible <bruno@clisp.org> 178 179 * gperf-3.0.1 released. 180 181 * src/version.cc: Bump version number to 3.0.1. 182 * doc/gperf.texi: Likewise. 183 * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp, 184 tests/cplusplus.exp, tests/gpc.exp, tests/incomplete.exp, 185 tests/java.exp, tests/languages.exp, tests/modula2.exp, 186 tests/objc.exp, tests/permut2.exp, tests/permut3.exp, 187 tests/permutc2.exp, tests/test-4.exp: Update. 188 1892003-05-31 Bruno Haible <bruno@clisp.org> 190 191 * doc/gperf.texi (User-supplied Struct): Mention the possibility of an 192 abbreviated struct declaration. 193 * src/input.cc (Input::read_input): Support struct declarations of the 194 form "struct foo;". 195 * tests/incomplete.gperf: New file. 196 * tests/incomplete.exp: New file. 197 * tests/Makefile.in (check-test): Check incomplete.gperf too. 198 Reported by Rob Leslie <rob@mars.org>. 199 2002003-05-20 Bruno Haible <bruno@clisp.org> 201 202 * doc/Makefile.in (gperf.ps): Don't use $< in a target rule. 203 2042003-05-27 Bruno Haible <bruno@clisp.org> 205 206 * Makefile.vms (CC): Correct value. 207 (getopt.obj, getopt1.obj, getline.obj, hash.obj): Don't set 208 HAVE_CONFIG_H. 209 2102003-05-17 Bruno Haible <bruno@clisp.org> 211 212 * Makefile.msvc (DEBUGFLAGS): New variable. 213 (gperf.exe): Use it, and MFLAGS too. 214 2152003-05-08 Bruno Haible <bruno@clisp.org> 216 217 * gperf-3.0 released. 218 2192003-05-07 Bruno Haible <bruno@clisp.org> 220 221 * src/version.cc: Bump version number to 3.0. 222 * doc/gperf.texi: Likewise. 223 * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp, 224 tests/cplusplus.exp, tests/gpc.exp, tests/java.exp, 225 tests/languages.exp, tests/modula2.exp, tests/objc.exp, 226 tests/permut2.exp, tests/permut3.exp, tests/permutc2.exp, 227 tests/test-4.exp: Update. 228 229 * src/configure.in: Fix AC_INIT argument. 230 231 * Makefile.devel (configure, lib/configure, src/configure, 232 tests/configure, doc/configure): Use the newest autoconf. 233 (src/config.h.in): Use the newest autoheader. 234 2352003-05-03 Bruno Haible <bruno@clisp.org> 236 237 * doc/gperf.texi: Use two spaces as sentence separator, as recommended 238 by the texinfo manual. 239 2402003-04-12 Bruno Haible <bruno@clisp.org> 241 242 * doc/configure.in (mandir): Change default value. 243 * doc/Makefile.in (docdir): Use datadir instead of prefix. 244 * Makefile.msvc (datadir): New variable. 245 (mandir, docdir): Use it instead of prefix. 246 (install, installdirs): Update. 247 * Makefile.vms (datadir): New variable. 248 (mandir, docdir): Use it instead of prefix. 249 (install, installdirs): Update. 250 2512003-04-12 Bruno Haible <bruno@clisp.org> 252 253 * README.vms: New file. 254 * Makefile.vms: New file. 255 * Makefile.devel (src/config.h_vms): New rule. 256 (all): Depend on it. 257 2582003-03-19 Bruno Haible <bruno@clisp.org> 259 260 * src/input.cc (Input::read_input): Ignore comments at the beginning 261 of the declarations section. 262 * doc/gperf.texi (Controls for GNU indent): New section. 263 Reported by Bruce Lilly <blilly@erols.com>. 264 2652003-03-19 Bruno Haible <bruno@clisp.org> 266 267 * src/output.cc (Output::output_hash_function): Avoid lint warning if 268 not all arguments of the hash function are used. Avoid lint warning 269 for fallthrough in switch. 270 * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp, 271 tests/cplusplus.exp, tests/java.exp, tests/languages.exp, 272 tests/modula2.exp, tests/objc.exp: All /*FALLTHROUGH*/ to expected 273 output. 274 Reported by Bruce Lilly <blilly@erols.com>. 275 2762003-03-01 Bruno Haible <bruno@clisp.org> 277 278 * src/options.h (Options::set_initializer_suffix): New declaration. 279 * src/options.cc (Options::set_initializer_suffix): New method. 280 * src/input.cc (Input::read_input): Recognize %define 281 initializer-suffix. 282 * doc/gperf.texi (Gperf Declarations): Document %define 283 initializer-suffix. 284 * NEWS: Update. 285 2862003-02-26 Bruno Haible <bruno@clisp.org> 287 288 * Makefile.msvc: New file. 289 * README.woe32: New file. 290 * Makefile.devel (all): Depend on src/config.h.msvc. 291 (src/config.h.msvc): New rule. 292 2932003-01-07 Bruno Haible <bruno@clisp.org> 294 295 * src/input.h (Input::_charset_dependent): New field. 296 * src/input.cc (Input::read_input): Also set _charset_dependent. 297 * src/main.cc (main): Pass _charset_dependent from Input to Output. 298 * src/output.h (Output::Output): Add charset_dependent argument. 299 (Output::_charset_dependent): New field. 300 * src/output.cc (Output::Output): Add charset_dependent argument. 301 (Output::output): Provoke a compilation error if the execution 302 character set doesn't match the expectations. 303 * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp, 304 tests/cplusplus.exp, tests/gpc.exp, tests/java.exp, 305 tests/languages.exp, tests/modula2.exp, tests/objc.exp, 306 tests/permut2.exp, tests/permut3.exp, tests/permutc2.exp, 307 tests/test-4.exp: Update. 308 309 * src/options.cc (Options::long_usage): Change bug report address to 310 <bug-gnu-gperf@gnu.org>. 311 * tests/test-6.exp: Update. 312 313 * src/output.cc (USE_DOWNCASE_TABLE): New macro. 314 (output_upperlower_table): New function. 315 (output_upperlower_strcmp, output_upperlower_strncmp, 316 output_upperlower_memcmp): Emit gperf_downcase array accesses. 317 (Output::output): Call output_upperlower_table. 318 * tests/permutc2.exp: Update. 319 320 * src/keyword-list.icc (KeywordExt_List::rest): Use a portable cast. 321 (Only in GCC a cast of an lvalue is an lvalue.) 322 3232003-01-01 Bruno Haible <bruno@clisp.org> 324 325 * src/options.cc (Options::parse_options): Update copyright year. 326 327 * doc/gperf.texi (@author): Add me. 328 329 * src/options.h (NULLSTRINGS): New enum value. 330 (Options::get_stringpool_name, Options::set_stringpool_name): New 331 method declarations. 332 (Options::_stringpool_name): New field. 333 * src/options.icc (Options::get_stringpool_name): New method. 334 * src/options.cc (DEFAULT_STRINGPOOL_NAME): New variable. 335 (Options::long_usage): Document -Q and --null-strings. 336 (Options::Options): Initialize _stringpool_name. 337 (Options::~Options): Output _stringpool_name, NULLSTRINGS values too. 338 (Options::set_stringpool_name): New method. 339 (long_options): Add options --string-pool-name, --null-strings. 340 (Options::parse_options): Implement options -P, -Q and --null-strings. 341 * src/input.cc (Input::read_input): Recognize declarations %pic, 342 %define string-pool-name, %null-strings. 343 * src/output.h (Output::output_string_pool, 344 Output::output_lookup_pools): New method declarations. 345 (Output::_wordlist_eltype): New field. 346 * src/output.cc (Output::output_keylength_table): Trivial 347 simplification. 348 (Output::output_string_pool): New method. 349 (output_keyword_entry): Add stringpool_index argument. For SHAREDLIB, 350 use struct offsets. 351 (output_keyword_blank_entries): For SHAREDLIB, use -1 instead of "". 352 (Output::output_keyword_table): Use _wordlist_eltype instead of 353 _struct_tag. Compute stringpool_index for output_keyword_entry. 354 (Output::output_lookup_pools): New method. 355 (Output::output_lookup_function_body): Use _wordlist_eltype instead of 356 _struct_tag. For SHAREDLIB, use "+ stringpool" to convert offsets to 357 strings. Use "o >= 0" to test for nonempty table entry. 358 (Output::output_lookup_function): Call output_lookup_pools. 359 (Output::output): Initialize _wordlist_eltype. Call 360 output_lookup_pools. 361 * tests/jstest4.gperf: New file. 362 * tests/test-6.exp: Update. 363 * tests/Makefile.in (check-lang-syntax): Drop test of -p. Add tests of 364 -P and -Q. 365 * doc/gperf.texi (User-supplied Struct): Mention that first field has 366 to be of type 'int' if -P is given. 367 (Gperf Declarations): Document %pic, %define string-pool-name, 368 %null-strings. 369 (Output Details): Update description of option -P. Document options -Q 370 and --null-strings. 371 372 * tests/Makefile.in (check-link-c, check-ada, check-pascal, 373 check-test): Omit option -p. 374 * tests/c-parse.exp: Regenerated. 375 * tests/chill.exp: Regenerated. 376 * tests/cplusplus.exp: Regenerated. 377 * tests/gpc.exp: Regenerated. 378 * tests/java.exp: Regenerated. 379 * tests/objc.exp: Regenerated. 380 * tests/test-4.exp: Regenerated. 381 382 * src/output.cc (Output::output_lookup_function_body): Omit the 383 multicompare code section and its variables when it is not used. 384 * tests/chill.exp: Regenerated. 385 386 * src/output.c (Output_Compare::output_firstchar_comparison): New 387 method. 388 (Output_Compare_Strcmp::output_comparison, 389 Output_Compare_Strncmp::output_comparison, 390 Output_Compare_Memcmp::output_comparison): Use it. 391 * tests/permutc2.exp: Update. 392 393 * tests/smtp.gperf: New file, based on a contribution by Bruce Lilly. 394 * tests/Makefile.in (check-smtp): New rule. 395 (check): Depend on it. 396 (clean): Update. 397 3982002-12-12 Bruno Haible <bruno@clisp.org> 399 400 * src/search.h (Search::init_selchars_tuple, 401 Search::count_duplicates_tuple): Add alpha_unify argument. 402 (Search::count_duplicates_tuple): New method declaration. 403 * src/search.cc (Search::init_selchars_tuple, 404 Search::count_duplicates_tuple): Add alpha_unify argument. 405 (Search::find_positions): Update. 406 (Search::count_duplicates_tuple): New method. 407 (Search::count_duplicates_multiset): Free temp alpha_unify vector. 408 (Search::find_alpha_inc): Call count_duplicates_tuple. 409 410 * src/configure.in: Add test for stack-allocated variable-size arrays. 411 * src/config.h.in: Regenerated. 412 * src/search.cc: Include config.h. 413 (DYNAMIC_ARRAY, FREE_DYNAMIC_ARRAY): New macros. 414 (Search::find_alpha_inc, Search::count_possible_collisions, 415 Search::find_asso_values): Use them. 416 * src/Makefile.in (search.o): Depend on config.h. 417 418 * src/search.h (Search::keyword_list_length, Search::max_key_length, 419 Search::get_max_keysig_size, Search::prepare): Remove declarations. 420 (Search::prepare): Renamed from Search::preprepare. 421 (Search::_max_selchars_length): New field. 422 * src/search.cc (Search::prepare): Renamed from Search::preprepare. 423 (Search::prepare_asso_values): Merged with old Search::prepare. 424 Initialize _max_selchars_length. 425 (Search::keyword_list_length): Remove function. Use _list_len instead. 426 (Search::max_key_length): Remove function. Use _max_key_len instead. 427 (Search::get_max_keysig_size): Remove function. Use 428 _max_selchars_length instead. 429 (Search::count_possible_collisions, Search::find_asso_values): Update. 430 (Search::find_good_asso_values): Call just prepare_asso_values. 431 (Search::~Search): Update. 432 433 * src/output.h (Output::output_asso_values_ref): New declaration. 434 * src/output.cc (char_to_index): Remove variable. 435 (Output::output_asso_values_ref): New function. 436 (Output::output_hash_function): Use it. 437 (Output::output): Update. 438 439 * src/positions.h (Positions::is_useall, Positions::set_useall, 440 Positions::iterator, Positions::reviterator): New method declarations. 441 (Positions::_useall): New field. 442 (PositionIterator): Make constructor private. Add a constructor and a 443 copy constructor. 444 (PositionIterator::remaining): New declaration. 445 (PositionReverseIterator): Make constructor private. Add a constructor 446 and a copy constructor. 447 (PositionReverseIterator::remaining): New declaration. 448 (PositionReverseIterator::_minindex): New field. 449 * src/positions.icc (Positions::Positions): Initialize _useall. 450 (Positions::operator=): Likewise. 451 (Positions::is_useall, Positions::set_useall): New methods. 452 (Positions::sort): Do nothing if _useall is set. 453 (Positions::iterator, Positions::reviterator): New methods. 454 (PositionIterator::PositionIterator): New constructor. 455 (PositionIterator::remaining): New method. 456 (PositionReverseIterator::PositionReverseIterator): New constructor. 457 (PositionReverseIterator::next): Use _minindex as bound. 458 (PositionReverseIterator::remaining): New method. 459 * src/positions.cc (Positions::add, Positions::remove): Reset the 460 useall flag. 461 (Positions::print): Handle the useall case. 462 * src/options.h (ALLCHARS): Remove. 463 * src/options.cc (Options::~Options): Update. 464 (Options::parse_options): Use Positions::set_useall(). 465 * src/keyword.h (KeywordExt::init_selchars_tuple, 466 KeywordExt::init_selchars_multiset, KeywordExt::init_selchars_low): 467 Remove use_all_chars argument. 468 * src/keyword.cc (KeywordExt::init_selchars_low): Remove use_all_chars 469 argument. Tell the position iterator to stop at _allchars_length. 470 Remove special case code for -k'*'. 471 (KeywordExt::init_selchars_tuple, KeywordExt::init_selchars_multiset): 472 Remove use_all_chars argument. 473 * src/search.h (Search::init_selchars_tuple): Remove use_all_chars 474 argument. 475 (Search::init_selchars_multiset): Likewise. 476 * src/search.cc (Search::init_selchars_tuple): Remove use_all_chars 477 argument. 478 (Search::count_duplicates_tuple, Search::find_positions): Update. 479 (Search::compute_alpha_unify): Remove special case code for -k'*'. 480 (Search::init_selchars_multiset): Remove use_all_chars argument. 481 (Search::count_duplicates_multiset): Update. 482 (Search::find_alpha_inc): Remove special case code for -k'*'. 483 (Search::prepare): Update. 484 (Search::get_max_keysig_size): Update. 485 * src/output.cc (Output::output_hash_function): Remove special case 486 code for -k'*'. 487 * tests/chill.exp: Regenerated. 488 4892002-12-11 Bruno Haible <bruno@clisp.org> 490 491 Change the positions to be 0-based, instead of 1-based. 492 * src/positions.h (Positions::LASTCHAR): Set to -1. 493 (Positions::MAX_SIZE): New constant. 494 (Positions::pointer): Change return type. 495 (Positions::_positions): Change element type. 496 (PositionIterator::EOS, PositionReverseIterator::EOS): Set to -2. 497 * src/positions.icc (Positions::pointer): Change return type. 498 (Positions::sort): Update. 499 * src/positions.cc (Positions::contains, Positions::add, 500 Positions::remove): Update. 501 (Positions::print): Update. Fix off-by-one bug. 502 * src/options.cc (Options::~Options): Update. 503 (Options::parse_options): Set BAD_VALUE to -3. Update. 504 * src/keyword.cc (KeywordExt::init_selchars_low): Update. 505 * src/search.cc (Search::find_positions, Search::compute_alpha_unify, 506 Search::find_alpha_inc): Update. 507 * src/output.cc (Output::output_hash_function): Update. Don't emit 508 a 'case' statement right after 'default:'. 509 * tests/c-parse.exp: Regenerated. 510 * tests/charsets.exp: Regenerated. 511 * tests/cplusplus.exp: Regenerated. 512 * tests/java.exp: Regenerated. 513 * tests/languages.exp: Regenerated. 514 * tests/modula2.exp: Regenerated. 515 * tests/objc.exp: Regenerated. 516 5172002-12-10 Bruno Haible <bruno@clisp.org> 518 519 * src/options.h: Reorder enum values. 520 (Options::short_usage, Options::long_usage): Make static. 521 * src/options.cc (Options::short_usage); No longer print a monster 522 usage line. 523 (Options::print_options): Improve output of options like 524 --key-positions=1,2,$. 525 (Options::~Options): Update. 526 527 * src/options.h (UPPERLOWER): New enum value. 528 * src/options.cc (Options::long_usage): Document option --ignore-case. 529 (Options::~Options): Update. 530 (long_options): Add option --ignore-case. 531 (Options::parse_options): Handle option --ignore-case. 532 * src/input.cc (Input::read_input): Recognize option %ignore-case. 533 * src/keyword.h (KeywordExt::init_selchars_tuple, 534 KeywordExt::init_selchars_multiset, KeywordExt::init_selchars_low): 535 Add alpha_unify argument. 536 * src/keyword.cc (KeywordExt::init_selchars_low): Add alpha_unify 537 argument. 538 (KeywordExt::init_selchars_tuple): Add alpha_unify argument. 539 (KeywordExt::init_selchars_multiset): Add alpha_unify argument. 540 * src/search.h (Search::compute_alpha_size, 541 Search::compute_alpha_unify): New declarations. 542 (Search::init_selchars_multiset): Add alpha_unify argument. 543 (Search::_alpha_unify): New field. 544 * src/search.cc (Search::compute_alpha_size, 545 Search::compute_alpha_unify): New functions. 546 (Search::init_selchars_tuple): Update. 547 (Search::find_positions): Temporarily set _alpha_unify. Perform a 548 case insensitive comparison if needed. 549 (Search::init_selchars_multiset): Add alpha_unify argument. 550 (Search::count_duplicates_multiset): Call compute_alpha_unify. 551 (Search::find_alpha_inc): Temporarily set _alpha_unify. At the end, 552 set _alpha_size and _alpha_unify. 553 (Search::prepare): Update. Don't compute _alpga_size here. 554 (Search::optimize): Propagate unified asso_values. 555 (Search::~Search) Delete _alpha_unify. 556 * src/output.cc (output_upperlower_strcmp, output_upperlower_strncmp, 557 output_upperlower_memcmp): New functions. 558 (Output_Compare_Strcmp::output_comparison, 559 Output_Compare_Strncmp::output_comparison, 560 Output_Compare_Memcmp::output_comparison): Use the case-insensitive 561 comparison function if --ignore-case was given. 562 (Output::output): Emit the auxiliary case-insensitive comparison 563 function if needed. 564 * tests/permutc2.gperf, tests/permutc2.exp: New files. 565 * tests/Makefile.in (check-test): Also check permutc2.gperf. 566 * tests/test-6.exp: Update. 567 * doc/gperf.texi (Gperf Declarations): Document %ignore-case. 568 (Input Details): Document option --ignore-case. 569 * NEWS: Update. 570 571 * src/search.cc (Search::optimize): Fill unused asso_values[] entries 572 with a large value. 573 * src/output.h (Output::Output): Remove occurrences argument. 574 (Output::_occurrences): Remove field. 575 * src/output.cc (Output::Output): Remove occurrences argument. 576 (Output::output_hash_function): Ignore _occurrences. 577 * src/main.cc (main): Don't pass the _occurrences to Output. 578 579 * src/search.cc (Search::preprepare): Exit if keywords contain 580 out-of-range characters. 581 582 * src/search.cc (for): Define so as to avoid errors with old compilers. 583 584 * src/options.h (SHAREDLIB): New enum value. 585 * src/options.cc (Options::short_usage): Mention option -P. 586 (Options::long_usage): Document option -P. 587 (long_options): Add option --pic. 588 (Options::parse_options): Handle option -P/--pic. 589 * src/output.cc (output_keyword_blank_entries): When SHAREDLIB is 590 specified, emit NULL pointers instead of "". 591 (Output::output_lookup_function_body): When SHAREDLIB is specified 592 and SWITCH and DUP and not specified, test the table entry against 593 NULL before the string comparison. 594 * tests/test-6.exp: Update. 595 * doc/gperf.texi (Output Details): Document option -P. 596 * NEWS: Update. 597 Suggested by Ulrich Drepper. 598 5992002-12-08 Bruno Haible <bruno@clisp.org> 600 601 * tests/permut2.gperf, tests/permut2.exp: New files. 602 * tests/permut3.gperf, tests/permut3.exp: New files. 603 * tests/charsets.gperf: New file, from Bruce Lilly. 604 * tests/charsets.exp: New file. 605 * tests/languages.gperf: New file, from Bruce Lilly. 606 * tests/languages.exp: New file. 607 * Makefile.in (check-test): Test them all. 608 609 Completely new asso_values search algorithm. 610 * src/search.h (Search::compute_occurrence, Search::clear_determined, 611 Search::set_determined, Search::already_determined, Search::reorder): 612 Remove functions. 613 (Search::init_asso_values, Search::sort_by_occurrence, 614 Search::compute_occurrence, Search::sort_by_occurrence, 615 Search::has_collisions, Search::collision_prior_to): Remove functions. 616 (Search::compute_partition, Search::count_possible_collisions, 617 Search::unchanged_partition): New method declarations. 618 (Search::_determined): Remove field. 619 * src/search.cc (Search::prepare): Don't initialize _determined. 620 (Search::compute_occurrence, greater_by_occurrence, 621 Search::clear_determined, Search::set_determined, 622 Search::already_determined, Search::reorder): Remove functions. 623 (Search::init_asso_values, compute_disjoint_union, 624 Search::sort_by_occurrence, Search::compute_occurrence, 625 Search::sort_by_occurrence, Search::has_collisions, 626 Search::collision_prior_to): Remove functions. 627 (StackEntry): Remove class. 628 (EquivalenceClass, Step): New classes. 629 (equals, Search::compute_partition, delete_partition, 630 Search::count_possible_collisions, Search::unchanged_partition): New 631 functions. 632 (Search::find_asso_values): Completely rewritten. 633 (Search::find_good_asso_values): Don't call reorder(). 634 (Search::~Search): Don't free _determined. 635 * src/keyword.h (KeywordExt::_occurrence): Remove field. 636 * src/options.h (ORDER, FAST, OPT_CHOICE): Remove enum values. 637 (Options::_iterations): Remove field. 638 * src/options.icc (Options::get_iterations): Remove method. 639 * src/options.cc (Options::long_usage): Remove mention of -f and -o. 640 (Options::Options): Don't initialize _iterations. 641 (Options::~Options): Update. 642 (Options::parse_options): Do nothing for options -f, -o, -O. 643 * doc/gperf.texi: (Contributors): Update. 644 (Algorithmic Details): Remove options -f and -o. Update description 645 of option -s. 646 * tests/c-parse.exp, tests/chill.exp, tests/cplusplus.exp, 647 tests/gpc.exp, tests/java.exp, tests/modula2.exp, tests/objc.exp, 648 tests/test-4.exp): Regenerated, smaller than before. 649 * tests/test-6.exp: Update. 650 * NEWS: Update. 651 6522002-12-08 Bruno Haible <bruno@clisp.org> 653 654 * src/search.h (Search::_alpha_size): Change type to 'unsigned int'. 655 (Search::_asso_value_max): Likewise. 656 * src/search.cc (Search::prepare_asso_values): Update. 657 (Search::init_asso_values): Update. 658 (Search::~Search): Update. 659 * src/output.h (Output::Output): Change alpha_size type to 660 'unsigned int'. 661 (Output::_alpha_size): Change type to 'unsigned int'. 662 * src/output.cc (Output::Output): Change alpha_size type to 663 'unsigned int'. 664 (Output::output_hash_function): Update. 665 6662002-12-07 Bruno Haible <bruno@clisp.org> 667 668 * src/options.h (OPT_CHOICE): New enum value. 669 * src/options.cc (Options::~Options): Update. 670 (long_options): New option --optimized-collision-resolution. 671 (Options::parse_options): Accept option -O. 672 * src/search.h (Search::sort_by_occurrence): Change argument to 673 'unsigned int'. 674 (Search::compute_occurrence, Search::sort_by_occurrence): New method 675 declarations. 676 * src/search.cc (Search::sort_by_occurrence): Change argument to 677 'unsigned int'. 678 (Search::compute_occurrence, Search::sort_by_occurrence): New methods. 679 (Search::find_asso_values): Implement OPT_CHOICE. More debugging 680 output. 681 682 * src/search.cc (Search::prepare_asso_values) [DEBUG]: Also print 683 the keyword list in order. 684 (Search::find_asso_values) [DEBUG]: Upon failure, print the union_set. 685 686 * src/options.h (Options::get_size_multiple): Change return type to 687 float. 688 (Options::_size_multiple): Change type to float. 689 * src/options.icc (Options::get_size_multiple): Change return type to 690 float. 691 * src/options.cc (Options::long_usage): Update description of option 692 -s. 693 (Options::~Options): Update. 694 (Options::parse_options): For option -s, accept a fraction. 695 * src/search.cc (Search::prepare_asso_values): Use get_size_multiple 696 as it is. 697 * tests/test-6.exp: Update. 698 * doc/gperf.texi (Algorithmic Details): Update description of option 699 -s. 700 7012002-12-04 Bruno Haible <bruno@clisp.org> 702 703 Improve debugging output. 704 * src/hash-table.h (Hash_Table::dump): New method. 705 * src/hash-table.cc (Hash_Table::dump): New method, extracted from 706 destructor. 707 (Hash_Table::~Hash_Table): No longer print the contents. 708 * src/positions.h (PositionReverseIterator): New class. 709 * src/positions.icc (PositionReverseIterator::PositionReverseIterator, 710 PositionReverseIterator::next): New methods. 711 * src/search.cc (Search::find_positions): If debugging, print the 712 result. 713 (Search::find_alpha_inc): If debugging, print the result. 714 (Search::prepare): Explicitly dump the hash table's contents here. 715 716 Portability fixes. 717 * src/positions.h (Positions::LASTCHAR, Positions::MAX_KEY_POS, 718 PositionIterator::EOS): Define as compile-time constants using enum. 719 * src/bool-array.cc (Bool_Array::~Bool_Array): Remove const qualifier 720 of pointer to be deleted. 721 * src/input.cc (Input::~Input): Likewise. 722 * src/keyword.cc (KeywordExt::delete_selchars): Likewise. 723 * src/main.cc (main): Likewise. 724 * src/hash-table.cc (Hash_Table::~Hash_Table): Limit scope of 'for' 725 variables. 726 * src/search.cc (Search::prepare_asso_values): Use a static_cast to 727 convert from time_t to long. This is possible because ISO C 99 says 728 time_t is a numeric type. 729 7302002-11-20 Bruno Haible <bruno@clisp.org> 731 732 * src/search.cc (Search::find_asso_values): Avoid gcc warnings about 733 uninitialized variables. 734 735 Implement backtracking. 736 * src/search.h (Search::has_collisions): Renamed from 737 Search::less_collisions. Return a boolean. 738 * src/search.cc (Search::has_collisions): Renamed from 739 Search::less_collisions. Return a boolean. 740 (StackEntry): Remove field _collisions_so_far. 741 (Search::find_asso_values): Backtrack when encountering an unresolved 742 collision. Assume collisions_so_far is always zero. 743 (Search::optimize): Exit if there are accidental duplicates at the end. 744 * src/output.cc (Output::num_hash_values): Simply return the list 745 length. 746 (Output::output_keylength_table): Remove handling of accidental 747 duplicates. 748 (Output::output_keyword_table, Output::output_lookup_array): Likewise. 749 (output_switch_case, output_switches): Likewise. 750 * doc/gperf.texi (Algorithmic Details): Adjust description of options 751 -D, -f, -o, -r. 752 (Bugs): Remove note about missing backtracking. 753 (Projects): Likewise. 754 7552002-11-19 Bruno Haible <bruno@clisp.org> 756 757 Prepare for backtracking. 758 * src/search.h (Search::try_asso_value, Search::change_some_asso_value): 759 Remove declarations. 760 (Search::less_collisions, Search::collision_prior_to): New declarations. 761 (Search::_fewest_collisions, Search::_union_set, Search::_num_done): 762 Remove fields. 763 * src/search.cc (Search::prepare_asso_values): Don't initialize 764 _union_set. 765 (Search::try_asso_value, Search::change_some_asso_value): Remove 766 methods. 767 (Search::less_collisions, Search::collision_prior_to): New methods. 768 (StackEntry): New class. 769 (Search::find_asso_values): Reorganized to use pseudo-recursion. 770 (Search::~Search): Don't free _union_set. 771 772 * src/search.h (Search::find_good_asso_values): New declaration. 773 * src/search.cc: Add comments about the basic structure of the 774 algorithm. 775 (Search::find_positions): Move the option[POSITIONS] test to here. 776 (Search::find_good_asso_values): New method, extracted from 777 Search::optimize. 778 (Search::optimize): Remove option[POSITIONS] test. Call 779 find_good_asso_values. 780 7812002-11-17 Bruno Haible <bruno@clisp.org> 782 783 * src/options.cc (Options::parse_options): Include copyright notice 784 and authors in --version output. 785 786 Avoid artificial duplicates. 787 * src/keyword.h (KeywordExt::init_selchars_tuple): New declaration. 788 (KeywordExt::init_selchars_multiset): Renamed from 789 KeywordExt::init_selchars. 790 (KeywordExt::init_selchars_low): New declaration. 791 * src/keyword.cc (KeywordExt::init_selchars_low): Renamed from 792 KeywordExt::init_selchars. Add alpha_inc argument. Remove sorting. 793 (KeywordExt::init_selchars_tuple): New method. 794 (KeywordExt::init_selchars_multiset): New method, replaces 795 KeywordExt::init_selchars. 796 * src/search.h (Search::init_selchars_tuple): Renamed from 797 Search::init_selchars. 798 (Search::count_duplicates_tuple): Renamed from Search::count_duplicates. 799 (Search::init_selchars_multiset, Search::count_duplicates_multiset, 800 Search::find_alpha_inc): New declarations. 801 (Search::_alpha_inc): New field. 802 (Search::_alpha_size, Search::_occurrences, Search::_asso_values, 803 Search::_determined): Make non-const. 804 * src/search.cc (Search::Search): Don't initialize _key_positions, 805 _alpha_size, _occurrences, _asso_values, _determined here. 806 (Search::init_selchars_tuple): Renamed from Search::init_selchars. 807 (Search::count_duplicates_tuple): Renamed from Search::count_duplicates. 808 (Search::find_positions): Update. 809 (Search::init_selchars_multiset, Search::count_duplicates_multiset, 810 Search::find_alpha_inc): New methods. 811 (Search::prepare): Move preprepare, find_positions calls away. 812 Initialize _alpha_size, _occurrences, _asso_values, _determined here. 813 (Search::optimize): Call preprepare, find_positions here. Initialize 814 _key_positions here. 815 (Search::~Search): Deallocate _alpha_inc. 816 * src/output.cc (Output::Output): Add alpha_inc argument. 817 (Output::output_hash_function): Use _alpha_inc. 818 * src/output.h (Output::Output): Add alpha_inc argument. 819 (Output::_alpha_inc): New field. 820 * src/main.cc (main): Pass _alpha_inc from Search to Output. 821 * tests/chill.exp: Update. 822 * doc/gperf.texi (Algorithmic Details): Remove description of 823 artificial duplicates. 824 825 * src/keyword.h (KeywordExt::_selchars): Change type to 826 'const unsigned int *'. 827 * src/keyword.cc (sort_char_set): Change argument type to 828 'unsigned int *'. 829 (KeywordExt::init_selchars): Update. 830 * src/search.h (Search::sort_by_occurrence): Change argument type to 831 'unsigned int *'. 832 (Search::try_asso_value): Change argument type to 'unsigned int'. 833 (Search::_union_set): Change type to 'unsigned int *'. 834 * src/search.cc (Search::prepare, Search::compute_occurrence, 835 Search::set_determined, Search::already_determined, 836 Search::prepare_asso_values, Search::compute_hash): Update. 837 (compute_disjoint_union): Change argument types to 'unsigned int *'. 838 (Search::sort_by_occurrence): Likewise. 839 (Search::try_asso_value): Change argument type to 'unsigned int'. 840 (Search::change_some_asso_value, Search::~Search): Update. 841 * src/hash-table.cc (Hash_Table::~Hash_Table, Hash_Table::equal, 842 Hash_Table::insert): Update. 843 844 * src/positions.h: New file, extracted from options.h. 845 * src/positions.icc: New file, extracted from options.icc. 846 * src/positions.cc: New file, extracted from options.cc. 847 * src/options.h: Include positions.h. Move classes Positions and 848 PositionsIterator away. 849 * src/options.icc: Move classes Positions and PositionsIterator away. 850 * src/options.cc: Move class Positions away. 851 * src/keyword.cc: Include positions.h instead of options.h. 852 * src/output.h: Include positions.h instead of options.h. 853 * src/search.h: Include positions.h instead of options.h. 854 * src/Makefile.in (OBJECTS): Add positions.o. 855 (POSITIONS_H): New variable. 856 (OPTIONS_H, SEARCH_H, OUTPUT_H, keyword.o): Use it. 857 (positions.o): New rule. 858 859 * src/options.h (POSITIONS): New enum value. 860 (Positions::Positions): New copy constructor. 861 (Positions::operator=, Positions::contains, Position::add, 862 Positions::remove, Positions::print): New method declaration. 863 (Options::get_max_keysig_size): Remove method. 864 * src/options.icc (Positions::Positions): New copy constructor. 865 (Positions::operator=): New method. 866 (Options::get_max_keysig_size): Remove method. 867 * src/options.cc (Options::Options): Initialize _key_positions 868 trivially. 869 (Options::parse_options): Option -k sets POSITIONS. 870 (Positions::contains, Positions::add, Positions::remove, 871 Positions::print): New methods. 872 * src/hash-table.cc (Hash_Table::~Hash_Table): Compute the field 873 width explicitly, instead of using Options::get_max_keysig_size. 874 * src/keyword.h (KeywordExt::init_selchars): Add arguments 875 use_all_chars, positions. 876 (KeywordExt::delete_selchars): New declaration. 877 * src/keyword.cc (KeywordExt::init_selchars): Add arguments 878 use_all_chars, positions. Remove error message if there are no key 879 positions. 880 (KeywordExt::delete_selchars): New method. 881 * src/search.h: Include options.h. 882 (Search::preprepare, Search::init_selchars, Search::delete_selchars, 883 Search::count_duplicates, Search::find_positions): New declarations. 884 (Search::_key_positions): New field. 885 * src/search.cc (Search::Search): Initialize _key_positions. 886 (Search::preprepare, Search::init_selchars, Search::delete_selchars, 887 Search::count_duplicates, Search::find_positions): New functions. 888 (Search::prepare): Call preprepare and find_positions. Tweak error 889 message. 890 (Search::get_max_keysig_size): Use _key_positions instead of 891 option.get_key_positions(). 892 (Search::optimize): Tweak error message. 893 * src/output.h: Include options.h. 894 (Output::Output): Add Positions argument. 895 (Output::_key_positions): New field. 896 * src/output.cc (Output::Output): Add Positions argument. 897 (Output::output_hash_function): Omit the table if there are no 898 positions at all. Use _key_positions instead of 899 option.get_key_positions(). 900 (Output::output): Output the computed positions as a comment. 901 * src/main.cc (main): Pass the Positions from Searcher to Output. 902 * src/Makefile.in (SEARCH_H, OUTPUT_H): Include OPTIONS_H. 903 * tests/Makefile.in (check-test): Pass key positions explicitly. 904 * tests/gpc.exp: Update. 905 * tests/test-4.exp: Update. 906 * doc/gperf.texi (Algorithmic Details): Mention that -k is not needed 907 usually. 908 9092002-11-16 Bruno Haible <bruno@clisp.org> 910 911 * src/options.h (Options::get_slot_name): Renamed from 912 Options::get_key_name. 913 (Options::set, Options::set_language, Options::set_total_switches, 914 Options::set_function_name, Options::set_slot_name, 915 Options::set_class_name, Options::set_hash_name, 916 Options::set_wordlist_name, Options::set_delimiters): New method 917 declarations. 918 (Options::_language): New field. 919 (Options::_slot_name): Renamed from Options::_key_name. 920 * src/options.icc (Options::set): New method. 921 (Options::get_slot_name): Renamed from Options::get_key_name. 922 * src/options.cc (DEFAULT_FUNCTION_NAME): Renamed from DEFAULT_NAME. 923 (DEFAULT_SLOT_NAME): Renamed from DEFAULT_NAME. 924 (Options::Options): Initialize _language. Update. 925 (Options::~Options): Update. 926 (Options::set_language, Options::set_total_switches, 927 Options::set_function_name, Options::set_slot_name, 928 Options::set_class_name, Options::set_hash_name, 929 Options::set_wordlist_name, Options::set_delimiters): New methods. 930 (Options::parse_options): Call set_language. Update. 931 * src/input.cc (is_declaration, is_declaration_with_arg, 932 is_define_declaration): New functions. 933 (Input::read_input): Accept %DECL declarations. 934 * src/output.cc (Output::output_lookup_function_body): Update. 935 * doc/gperf.texi (Declarations): Add new subnodes. 936 (User-supplied Struct, Gperf Declarations, C Code Inclusion): New 937 nodes. 938 (Keywords, Output Format, Binary Strings, Options): Mention % 939 declarations as being equivalent to the command line options. 940 941 * src/options.cc (Options::long_usage): Rename options -H, -N, -l, -G. 942 (long_options): Add --hash-function-name, --lookup-function-name, 943 --compare-lengths. 944 * doc/gperf.texi (Output Details): Rename options -H, -N, -l, -G. 945 * tests/test-6.exp: Update. 946 947 * src/options.cc (DEFAULT_DELIMITERS): Remove newline. 948 * src/options.cc (Options::long_usage): Change default --delimiters. 949 * doc/gperf.texi (Input Details): Likewise. 950 * tests/test-6.exp: Update. 951 952 * doc/gperf.texi: Move description of option -l from section 953 Algorithmic Details to section Output Details. 954 * src/options.cc (Options::long_usage): Likewise. 955 * tests/test-6.exp: Update. 956 9572002-11-12 Bruno Haible <bruno@clisp.org> 958 959 * src/options.h (Output::get_output_file_name): New method. 960 (Output::_output_file_name): New field. 961 * src/options.icc (Options::get_output_file_name): New method. 962 * src/options.cc (Options::long_usage): Document option --output-file. 963 (Options::Options): Initialize _output_file_name. 964 (long_options): Add --output-file. 965 (Options::parse_options): Handle it. 966 * src/main.cc (main): Open the output file if given by name. 967 * doc/gperf.texi (Output File): New section. 968 * tests/test-6.exp: Update. 969 9702002-11-10 Bruno Haible <bruno@clisp.org> 971 972 * src/input.cc (pretty_input_file_name): New function. 973 (read_input): Use it in all error and warning messages. 974 975 * src/keyword.h (Keyword::_lineno): New field. 976 * src/input.h (Input::_struct_decl_lineno): New field. 977 * src/input.cc (Input::read_input): Set _struct_decl_lineno. Fill 978 each keyword's _lineno field. 979 * src/main.cc (main): Pass _struct_decl_lineno from Input to Output. 980 * src/output.h (Output::Output) Add struct_decl_lineno argument. 981 (Output::_struct_decl_lineno): New field. 982 * src/output.cc (Output::Output) Add struct_decl_lineno argument. 983 (output_keyword_entry): Emit #line directive before table entry. 984 (Output::output): Emit #line directive before _struct_decl. 985 986 Fix memory leaks. 987 * src/keyword.h (empty_string): New declaration. 988 * src/keyword.cc (empty_string): New variable. 989 * src/input.h (Input::_input): Make public. 990 (Input::_input_end): New field. 991 * src/input.cc (read_input): When removing leading whitespace from 992 struct_decl, reallocate it. For rest, use empty_string instead of "". 993 Set _input_end. 994 (Input::~Input): Delete _struct_decl, _struct_tag, _return_type. 995 * src/search.cc (Search::prepare): When removing an element from 996 the keyword list, delete the list node. 997 (Search::~Search): Delete _occurrences, _asso_values. 998 * src/main.cc (main): Between Search::~Search and Input::~Input, 999 destroy the keyword list. 1000 1001 Rewrite the input routines. 1002 * src/input.h: Don't include read-line.h. 1003 (Input): Don't inherit from class Read_Line. 1004 (Input::read_keys, Input::strcspn, Input::set_output_types, 1005 Input::get_array_type, Input::save_include_src, 1006 Input::get_special_input): Remove declarations. 1007 (Input::read_input): New declaration. 1008 (Input::_struct_decl): Renamed from Input::_array_type. 1009 (Input::_verbatim_declarations): Renamed from Input::_include_src. 1010 (Input::_verbatim_code): Replaces Input::_additional_code. 1011 * src/input.cc: Completely rewritten. 1012 * src/output.h (Output::Output): Update the verbatim_* arguments. 1013 (Output::_struct_decl): Renamed from Output::_array_type. 1014 (Output::_verbatim_declarations): Renamed from Output::_include_src. 1015 (Output::_verbatim_code): Replaces Output::_additional_code. 1016 * src/output.cc (Output::Output): Update the verbatim_* arguments. 1017 (Output::output): Output the verbatim_* code pieces with #line. 1018 * src/main.cc (main): Call Input::read_input instead of 1019 Input::read_keys. Update Output::Output arguments. 1020 * src/read-line.h: Remove file. 1021 * src/read-line.cc, src/read-line.icc: Remove files. 1022 * src/Makefile.in (OBJECTS): Remove read-line.o. 1023 (READ_LINE_H): Remove variable. 1024 (INPUT_H): Update. 1025 (read-line.o): Remove rule. 1026 * doc/gperf.texi (Declarations): Correct the example. 1027 (Keywords): Mention that lines starting with % are forbidden here. 1028 * tests/c-parse.exp: Update. 1029 * tests/cplusplus.exp: Update. 1030 * tests/gpc.exp: Update. 1031 * tests/java.exp: Update. 1032 * tests/objc.exp: Update. 1033 * tests/test-4.exp: Update. 1034 1035 * src/options.h (Options::get_input_file_name): New declaration. 1036 (Options::_input_file_name): New field. 1037 * src/options.icc (Options::get_input_file_name): New method. 1038 * src/options.cc (Options::Options): Initialize _input_file_name. 1039 (Options::parse_options): Don't open input file, only store it in 1040 _input_file_name. 1041 * src/main.cc (main): Open input file here. 1042 Print an error message upon write error on the output file. 1043 1044 Upgrade to autoconf-2.52. 1045 * configure.in: Use AC_CONFIG_SUBDIRS instead of AC_OUTPUT_SUBDIRS. 1046 * Makefile.devel (configure, lib/configure, src/configure, 1047 tests/configure, doc/configure): Use autoconf-2.52. 1048 10492002-11-09 Bruno Haible <bruno@clisp.org> 1050 1051 * doc/gperf.texi: Talk about "bytes" instead of "characters". Talk 1052 about "keywords", not "keys". Talk about "input file", not "keyfile". 1053 (@menu): Fix a menu entry. 1054 (Contributors): Don't mention cperf. 1055 (Motivation): Fix an off-by-one error in the definition of "minimal". 1056 Mention GNU Java. Recommend http URL instead of anonymous ftp. 1057 (Search Structures): Mention GNU Java. 1058 (Output Format): Drop reference to node 'Implementation'. 1059 (Output Details): Talk about "slot-name" instead of "key name". 1060 (Algorithmic Details): Talk about "selected byte positons", not 1061 "key positions". Upper limit is now 255. Explain a third reason 1062 why duplicates can occur. Describe negative effects of 1063 --occurrence-sort. 1064 (Implementation): Remove chapter. 1065 10662002-11-07 Bruno Haible <bruno@clisp.org> 1067 1068 * src/bool-array.cc (Bool_Array::~Bool_Array): Free _storage_array. 1069 * src/search.cc (Search::~Search): Free _union_set, _determined. 1070 1071 * tests/Makefile.in (check-test): Don't redirect stderr. 1072 10732002-11-05 Bruno Haible <bruno@clisp.org> 1074 1075 * src/keyword-list.h (mergesort_list): New declarations. 1076 * src/keyword-list.cc (Keyword_Comparison): New type. 1077 (merge, mergesort_list): New functions, moved here from search.cc. 1078 * src/search.h (Search::merge, Search::merge_sort): Remove methods. 1079 (Search::_occurrence_sort, Search::_hash_sort): Remove fields. 1080 * src/search.cc (Search::merge, Search::merge_sort): Remove methods. 1081 (greater_by_occurrence, less_by_hash_value): New functions. 1082 (Search::reorder, Search::sort): Use mergesort_list. 1083 10842002-11-04 Bruno Haible <bruno@clisp.org> 1085 1086 * src/options.h (Options::_asso_iterations): New field. 1087 (Options::get_asso_iterations): New method declaration. 1088 * src/options.icc (Options::get_asso_iterations): New method. 1089 * src/options.cc (Options::short_usage): Mention j<jump> and m<num>. 1090 (Options::long_usage): Document option -m. 1091 (Options::Options): Initialize _asso_iterations. 1092 (Options::~Options): Print _asso_iterations too. 1093 (long_options): Add --multiple-iterations. 1094 (Options::parse_options): Handle option -m. 1095 * src/keyword-list.h (copy_list, delete_list): New declarations. 1096 * src/keyword-list.cc (copy_list, delete_list): New functions. 1097 * src/search.h (Search::_initial_asso_value, Search::_jump): New fields. 1098 * src/search.cc (Search::prepare_asso_values): Initialize 1099 _initial_asso_value and _jump here. 1100 (Search::init_asso_values): Use _initial_asso_value. 1101 (Search::try_asso_value): Use _jump. 1102 (Search::optimize): If option -m was given, iterate over different 1103 values for _initial_asso_value and _jump. 1104 * doc/gperf.texi (Algorithmic Details): Document option -m. 1105 * tests/test-6.exp: Update. 1106 11072002-11-03 Bruno Haible <bruno@clisp.org> 1108 1109 Bug fix: When option -j 0 was used without option -r, the output was 1110 not random. 1111 * src/search.h (Search::prepare_asso_values): New method declaration. 1112 * src/search.cc (Search::prepare_asso_values): New method, extracted 1113 from Search::init_asso_values. Call srand also when "-j 0" was given. 1114 (Search::optimize): Call prepare_asso_values(). 1115 1116 * src/hash-table.h (Hash_Table::_ignore_length, Hash_Table::equal): 1117 Declare as const. 1118 * src/hash-table.cc (Hash_Table::equal): Declare as const. 1119 * src/input.h (Input::_factory): Declare as const. 1120 * src/keyword-list.h (Keyword_List::first, KeywordExt_List::first): 1121 Declare as const. 1122 * src/keyword-list.icc (Keyword_List::first, KeywordExt_List::first): 1123 Declare as const. 1124 * src/output.h (Output::num_hash_values, Output::output_constants, 1125 Output::output_hash_function, Output::output_keylength_table, 1126 Output::output_keyword_table, Output::output_lookup_array, 1127 Output::output_lookup_tables, Output::output_lookup_function_body, 1128 Output::output_lookup_function, Output::_array_type, 1129 Output::_additional_code, Output::_include_src, Output::_total_keys, 1130 Output::_total_duplicates, Output::_max_key_len, Output::_min_key_len): 1131 Declare as const. 1132 * src/output.cc (Output::num_hash_values, Output::output_constants, 1133 Output::output_hash_function, Output::output_keylength_table, 1134 Output::output_keyword_table, Output::output_lookup_array, 1135 Output::output_lookup_tables, Output::output_lookup_function_body, 1136 Output::output_lookup_function): Declare as const. 1137 * src/search.h (Search::merge, Search::merge_sort, 1138 Search::compute_occurrence, Search::already_determined, 1139 Search::keyword_list_length, Search::max_key_length, 1140 Search::get_max_keysig_size, Search::compute_hash, 1141 Search::sort_by_occurrence): Declare as const. 1142 * src/search.cc (Search::merge, Search::merge_sort, 1143 Search::compute_occurrence, Search::already_determined, 1144 Search::keyword_list_length, Search::max_key_length, 1145 Search::get_max_keysig_size, Search::compute_hash, 1146 Search::sort_by_occurrence): Declare as const. 1147 1148 * src/output.cc (Output::output): Set char_to_index to a cast in all 1149 cases. Avoids gcc warnings on the generated code. 1150 1151 * src/output.cc (Output_Enum): Prepend an underscore to field names. 1152 (Output_Expr1): Likewise. 1153 (Output::output_hash_function): Simplify the special case for "-k 1,$". 1154 1155 * src/search.h (Search::init_asso_values, Search::find_asso_values): 1156 New declarations. 1157 (Search::try_asso_value): Renamed from Search::affects_prev. 1158 (Search::change_some_asso_value): Renamed from Search::change. 1159 (Search::set_asso_max, Search::get_asso_max): Remove methods. 1160 (Search::_union_set): New field. 1161 * src/search.cc (Search::init_asso_values): New method, extracted 1162 from Search::optimize. 1163 (Search::try_asso_value): Renamed from Search::affects_prev. Take the 1164 iteration count as argument. 1165 (Search::change_some_asso_value): Renamed from Search::change. Don't 1166 make union_set static. Don't increment _fewest_collisions here. 1167 (Search::find_asso_values): New method, extracted from 1168 Search::optimize. 1169 (Search::optimize); Update. 1170 1171 * src/search.h (Search::compute_hash): Renamed from Search::hash. 1172 (Search::compute_disjoint_union): Remove declaration. 1173 (Search::sort_by_occurrence): Renamed from Search::sort_set. 1174 * src/search.cc (Search::compute_hash): Renamed from Search::hash. 1175 (compute_disjoint_union): Renamed from Search::compute_disjoint_union. 1176 (Search::sort_by_occurrence): Renamed from Search::sort_set. 1177 (Search::change): Simplify loop. 1178 1179 * src/search.h (Search::clear_determined): New declaration. 1180 * src/search.cc (Search::clear_determined): New method. 1181 (Search::already_determined): Optimize. 1182 (Search::reorder): Even when the next keyword after the current one 1183 is completely determined, move all determined keywords after the 1184 current one. 1185 1186 Compute the occurrences after removal of duplicates, not before. 1187 * src/keyword.h (KeywordExt::init_selchars): Remove occurrences 1188 argument. 1189 * src/keyword.cc (KeywordExt::init_selchars): Likewise. 1190 * src/search.cc (Search::prepare): Reorder the code. Compute the 1191 occurrences after removal of duplicates. 1192 (Search::merge_sort): Optimize the loop. 1193 (Search::compute_occurrence): Renamed from Search::get_occurrence. 1194 * src/search.h (Search::compute_occurrence): Renamed from 1195 Search::get_occurrence. 1196 * tests/chill.exp: Regenerated. 1197 1198 Bug fix: The hash table could fail to detect duplicates, between 1199 keywords of different length, when option -n (option[NOLENGTH]) was 1200 given. 1201 * src/hash-table.h (Hash_Table::Hash_Table): Pass table size, not 1202 vector and vector size as arguments. 1203 (Hash_Table::_log_size): New field. 1204 (Hash_Table::equal): New declaration. 1205 * src/hash-table.cc (size_factor): New variable. 1206 (Hash_Table::Hash_Table): Pass table size, not vector and vector size 1207 as arguments. Allocate the vector here. 1208 (Hash_Table::~Hash_Table): Deallocate the vector here. 1209 (Hash_Table::equal): New function. 1210 (Hash_Table::insert): Use it. Don't use item->_allchars_length for the 1211 increment if _ignore_length is true. 1212 * src/search.cc (TABLE_MULTIPLE): Remove variable. 1213 (Search::prepare): Update. 1214 12152002-11-02 Bruno Haible <bruno@clisp.org> 1216 1217 Provide documentation also in PDF format. 1218 * doc/Makefile.in (pdfdir, TEXI2PDF): New variables. 1219 (all): Depend on pdf. 1220 (pdf, gperf.pdf): New rules. 1221 (maintainer-clean): Remove the PDF file. 1222 1223 * src/keyword-list.icc: New file, extracted from keyword-list.h. 1224 * src/keyword-list.h: Include keyword-list.icc. Move inline methods 1225 to there. 1226 * src/keyword-list.cc: Include keyword-list.icc. 1227 * src/Makefile.in (KEYWORD_LIST_H): Add keyword-list.icc. 1228 1229 * lib/hashpjw.h (hashpjw): Change argument type to 'unsigned char *'. 1230 * lib/hash.cc (hashpjw): Likewise. 1231 * src/keyword.icc: New file. 1232 * src/keyword.h: Include keyword.icc. 1233 (KeywordExt::_selchars): Change type to 'unsigned char *'. 1234 * src/keyword.cc: Include keyword.icc. 1235 (Keyword::Keyword, KeywordExt::KeywordExt): Move to keyword.icc. 1236 (sort_char_set): Change argument type to 'unsigned char *'. 1237 (KeywordExt::init_selchars): Update. 1238 * src/search.h (Search::compute_disjoint_union): Change argument types 1239 to 'unsigned char *'. 1240 (Search::sort_set): Likewise. 1241 (Search::affects_prev): Change argument type to 'unsigned char'. 1242 * src/search.cc (Search::prepare): Initialize _duplicate_link here. 1243 (Search::get_occurrence, Search::set_determined, 1244 Search::already_determined, Search::hash): Update. 1245 (Search::compute_disjoint_union): Change argument types to 1246 'unsigned char *'. 1247 (Search::sort_set): Likewise. 1248 (Search::affects_prev): Change argument type to 'unsigned char'. 1249 (Search::change): Update. 1250 * src/Makefile.in (KEYWORD_H): Add keyword.icc. 1251 1252 * src/options.cc (Options::parse_options): Fix error message. 1253 1254 * src/read-line.h (Read_Line::Read_Line): Make FILE* argument 1255 mandatory. Move body to read-line.icc. 1256 * src/read-line.icc (Read_Line::Read_Line): New constructor. 1257 * src/input.h (Input::Input): Add FILE* argument. 1258 * src/input.cc (Input::Input): Likewise. 1259 * src/main.cc (main): Pass stdin to Input constructor. 1260 1261 * src/options.h (DEFAULTCHARS): Remove. 1262 (Positions::MAX_KEY_POS): Set to 255. 1263 (Positions::_positions): Increase array size. 1264 (PositionIterator::EOS): Set to -1. 1265 (PositionIterator::_index): Change type to 'unsigned int'. 1266 * src/options.icc (Positions::Positions): Don't store 1267 PositionIterator::EOS. 1268 (PositionIterator::next): Produce PositionIterator::EOS here. 1269 * src/options.cc (Options::long_usage): Use MAX_KEY_POS, not 1270 MAX_KEY_POS-1. 1271 (PositionStringParser): Rename field _size to _in_range. Rename 1272 field _curr_value to _range_curr_value. Rename field _upper_bound 1273 to _range_upper_bound. 1274 (PositionStringParser::nextPosition): Comments. 1275 (Options::Options): Update. 1276 (Options::~Options): Update. 1277 (long_options): Use NULL, not 0. 1278 (Options::parse_options): Set BAD_VALUE to -2; -1 is now EOS. Bug fix: 1279 Check against array overflow when more than MAX_KEY_POS positions are 1280 given. Don't store PositionIterator::EOS. 1281 Check against extra arguments before opening the input file. 1282 * src/output.cc (Output::output_hash_function): Change test which 1283 was for option[DEFAULTCHARS]. 1284 * tests/test-6.exp: Update. 1285 1286 * src/options.h (Options::get_delimiters): Renamed from 1287 Options::get_delimiter. 1288 * src/options.icc (Options::get_delimiters): Renamed from 1289 Options::get_delimiter. 1290 * src/input.cc (Input::read_keys): Update. 1291 1292 Bug fix. 1293 * src/options.cc (Options::print_options): Escape backquote inside 1294 double-quoted strings. 1295 1296 Bug fix. 1297 * src/keyword.cc (KeywordExt::init_selchars): Avoid comparison with 1298 uninitialized member variable. Found with 'valgrind'. 1299 1300 * src/version.cc: Include version.h. 1301 * src/Makefile.in (OBJECTS): Reorder. 1302 (KEYWORD_H, KEYWORD_LIST_H, INPUT_H, SEARCH_H, OUTPUT_H): New 1303 variables. 1304 (HASH_TABLE_H): Update. 1305 (options.o, read-line.o, keyword.o, keyword-list.o, input.o, search.o, 1306 output.o, main.o): Update dependencies. 1307 1308 * src/vectors.h: Remove file. 1309 * src/vectors.cc: Remove file. 1310 * src/search.h: Don't include vectors.h. 1311 (Search): Don't inherit from Vectors. New fields _alpha_size, 1312 _occurrences, _asso_values. 1313 (Search::_determined, Search::get_occurrence, Search::set_determined, 1314 Search::already_determined, Search::hash, Search::sort_set): Make 1315 nonstatic. 1316 * src/search.cc (Search::Search): Initialize _alpha_size, _occurrences, 1317 _asso_values, _determined. 1318 (Search::optimize, Search::~Search): Update. 1319 * src/output.h: Don't include vectors.h. 1320 (Output): Remove field _v. New fields _alpha_size, _occurrences, 1321 _asso_values. 1322 (Output::Output): Replace Vectors* argument with alpha_size, 1323 occurrences, asso_values. 1324 * src/output.cc (Output::Output): Replace Vectors* argument with 1325 alpha_size, occurrences, asso_values. 1326 (Output::output_hash_function): Update. 1327 * src/main.cc (main): Don't set Vectors::ALPHA_SIZE. 1328 Pass _alpha_size, _occurrences, _asso_values from Search to Output. 1329 * src/keyword.h: Don't include vectors.h. 1330 * src/Makefile.in (OBJECTS): Remove vectors.o. 1331 (VECTORS_H): Remove variable. 1332 (vectors.o): Remove rule. 1333 1334 * src/search.h: New file, combines src/key-list.h, src/gen-perf.h. 1335 * src/search,cc: New file, combines src/key-list.cc, src/gen-perf.cc. 1336 * src/key-list.h: Remove file. 1337 * src/key-list.cc: Remove file. 1338 * src/gen-perf.h: Remove file. 1339 * src/gen-perf.cc: Remove file. 1340 * src/main.cc (KeywordExt_Factory): Moved here from gen-perf.cc. 1341 (main): Inline some code from gen-perf.cc. 1342 * src/keyword.h (KeywordExt::init_selchars): Take the occurrences 1343 vector as argument. 1344 * src/keyword.cc (KeywordExt::init_selchars): Take the occurrences 1345 vector as argument. 1346 * src/input.cc (Input::set_output_types): Initialize _array_type, 1347 _return_type, _struct_tag. 1348 (Input::read_keys): Initialize _additional_code. 1349 * src/Makefile.in (OBJECTS): Add search.o. 1350 Remove key-list.o, gen-perf.o. 1351 (KEY_LIST_H, GEN_PERF_H): Remove variables. 1352 (gen-perf.o, key-list.o): Remove rules. 1353 (search.o): New rule. 1354 1355 * *, */*: Update copyright notice to GPL version 2. 1356 1357 * src/keyword-list.h (Keyword_List): New class. 1358 (KeywordExt_List): Inherit from it. 1359 * src/keyword-list.cc (Keyword_List::Keyword_List): New constructor. 1360 (KeywordExt_List::KeywordExt_List): Update. 1361 * src/input.h (Input::Input): Add Keyword_Factory argument. 1362 (Input::_factory): New field. 1363 (Input::_head): Change type to Keyword_List*. 1364 (Input::parse_line): New declaration. 1365 * src/input.cc (Input::Input): New constructor. 1366 (Input::parse_line): Renamed from parse_line. Use the _factory. 1367 (Input::read_keys): Update. 1368 * src/key-list.cc (KeywordExt_Factory): New class. 1369 (Key_List::read_keys): Pass a KeywordExt_Factory as Input constructor 1370 argument. 1371 1372 Avoid g++ -Wold-style-cast warnings. 1373 * src/bool-array.icc: Use new-style casts. 1374 * src/gen-perf.cc: Likewise. 1375 * src/input.cc: Likewise. 1376 * src/key-list.cc: Likewise. 1377 * src/keyword.cc: Likewise. 1378 * src/options.cc: Likewise. 1379 * src/output.cc: Likewise. 1380 * src/hash-table.cc: Likewise. Remove (char *) cast in memset argument. 1381 1382 * src/keyword-list.h (KeywordExt_List): Don't inherit from KeywordExt. 1383 (KeywordExt_List::KeywordExt_List): Take a KeywordExt* as argument. 1384 (KeywordExt_List::_car): New field. 1385 (KeywordExt_List::first): Use it. 1386 * src/keyword-list.cc (KeywordExt_List::KeywordExt_List): Take a 1387 KeywordExt* as argument. 1388 * src/input.cc (parse_line): Create the KeywordExt separately. 1389 1390 Start using bool. 1391 * src/bool-array.h (Bool_Array::set_bit): Change return type to bool. 1392 * src/bool-array.icc (Bool_Array::set_bit): Likewise. 1393 * src/gen-perf.h (Gen_Perf::affects_prev): Likewise. 1394 * src/gen-perf.cc (Gen_Perf::affects_prev): Likewise. 1395 * src/hash-table.h (Hash_Table::_ignore_length): Change type to bool. 1396 (Hash_Table::Hash_Table): Change 3rd argument type to bool. 1397 * src/hash-table.cc (Hash_Table::Hash_Table): Likewise. 1398 * src/input.h (Input::_additional_code): Change type to bool. 1399 * src/input.cc (Input::read_keys): Update. 1400 * src/key-list.h (Key_List::_occurrence_sort, Key_List::_hash_sort, 1401 Key_List::_additional_code): Change type to bool. 1402 (Key_List::_determined): Change element type to bool. 1403 (Key_List::already_determined): Change return type to bool. 1404 * src/key-list.cc (Key_List::_determined): Change element type to bool. 1405 (Key_List::set_determined): Update. 1406 (Key_List::already_determined): Change return type to bool. 1407 (Key_List::reorder, Key_List::sort, Key_List::Key_List): Update. 1408 * src/options.h (Positions::sort): Change return type to bool. 1409 (Options::operator[]): Likewise. 1410 * src/options.icc (Positions::sort): Change return type to bool. 1411 (Options::operator[]): Likewise. 1412 * src/output.h (Output::Output): Change 5th argument type to bool. 1413 (Output::_additional_code): Change type to bool. 1414 * src/output.cc (Output::Output): Change 5th argument type to bool. 1415 14162002-10-16 Bruno Haible <bruno@clisp.org> 1417 1418 * src/*.h: Align all member names at column 24. 1419 14202002-10-15 Bruno Haible <bruno@clisp.org> 1421 1422 * src/input.h: New file. 1423 * src/input.cc: New file, extracted from key-list.cc. 1424 * src/key-list.h (Key_List): Don't inherit from Read_Line. 1425 (Key_List::get_special_input, 1426 Key_List::save_include_src, Key_List::get_array_type, 1427 Key_List::strcspn, Key_List::set_output_types): Remove methods. 1428 * src/key-list.cc (Key_List::get_special_input, 1429 Key_List::save_include_src, Key_List::get_array_type, 1430 Key_List::strcspn, Key_List::set_output_types, parse_line): Move to 1431 src/input.cc. 1432 (Key_List::read_keys): Use Input::read_keys. 1433 (Key_List::Key_List): Update. 1434 * src/gen-perf.cc: Update. 1435 * src/Makefile.in (OBJECTS): Add input.o. 1436 (input.o): New rule. 1437 14382002-10-14 Bruno Haible <bruno@clisp.org> 1439 1440 * src/options.cc: Don't include "vector.h". 1441 (Options::parse_options): Don't initialize Vectors::ALPHA_SIZE here. 1442 * src/vectors.cc (Vectors::ALPHA_SIZE): Don't initialize here. 1443 * src/gen-perf.cc (Gen_Perf::Gen_Perf): Initialize Vectors::ALPHA_SIZE. 1444 1445 * src/options.h (Positions): New class. 1446 (PositionIterator): New class. 1447 (Options::parse_options): Renamed from Options::operator(). 1448 (Options::get_asso_max, Options::set_asso_max): Move to class Key_List. 1449 (Options::reset, Options::get): Remove, replaced by class 1450 PositionIterator. 1451 (Options::get_initial_asso_value): Renamed from Options::initial_value. 1452 (Options::key_sort): Remove, replaced by Positions::sort. 1453 (Options): Make all fields and methods non-static. 1454 * src/options.icc (Positions::Positions, Positions::operator[], 1455 Positions::get_size, Positions::pointer, Positions::set_size, 1456 Positions::sort, PositionIterator::PositionIterator, 1457 PositionIterator::next): New methods. 1458 (Options::get_initial_asso_value): Renamed from Options::initial_value. 1459 (Options::get_size_multiple): New method. 1460 (Options::get_key_positions): New method. 1461 (Options::get_max_keysig_size): Implement using _key_positions. 1462 * src/options.cc (Options::long_usage): Split big string into small 1463 pieces. 1464 (PositionStringParser): Prefix field names with _. 1465 (Options::Options): Update. 1466 (Options::~Options): Fix explanation of of _size_multiple. Don't print 1467 _key_positions if it is effectively ignored. 1468 (Options::parse_options): Renamed from Options::operator(). Update. 1469 * src/key-list.h (Key_List): New field _size. New methods get_asso_max, 1470 set_asso_max, get_max_keysig_size. 1471 * src/key-list.cc (Key_List::read_keys): Don't make side effects on 1472 options. 1473 (Key_List::dump): Use Key_List::get_max_keysig_size() instead of 1474 Options::get_max_keysig_size(). 1475 (Key_List::get_max_keysig_size): New function. 1476 * src/hash-table.cc (Hash_Table::~Hash_Table): Compute the field 1477 width on the fly if option[ALLCHARS]. 1478 * src/gen-perf.cc (Gen_Perf::Gen_Perf): Update, 1479 Use Options::get_size_multiple() instead of Options::get_asso_max(). 1480 Use Key_List::get_asso_max() instead of Options::get_asso_max(). Use 1481 Key_List::get_max_keysig_size() instead of 1482 Options::get_max_keysig_size(). 1483 (Gen_Perf::affects_prev): Likewise. 1484 (Gen_Perf::change): Likewise. 1485 * src/keyword.cc: Update. 1486 * src/main.cc: Update. 1487 * src/output.cc: Update. 1488 * tests/test-6.exp: Update. 1489 14902002-10-13 Bruno Haible <bruno@clisp.org> 1491 1492 * src/bool-array.*: Some polishing. 1493 1494 * src/options.h (Options::operator=, Options::operator!=): Remove 1495 unused methods. 1496 * src/options.icc (Options::operator=, Options::operator!=): Remove. 1497 1498 * src/*.h: Prefix all field names with _. 1499 * src/*.cc, src/*.icc: Update. 1500 1501 * src/*: Simplify declarations of functions without arguments. 1502 15032002-10-04 Bruno Haible <bruno@clisp.org> 1504 1505 * src/output.h: New file, extracted from key-list.h. 1506 * src/output.cc: New file, extracted from key-list.cc. 1507 * src/key-list.h (Key_List): Make some fields protected. Move output 1508 routines to src/output.h. 1509 * src/key-list.cc: Move output routines to src/output.cc. 1510 * src/gen-perf.cc (Gen_Perf::doit_all): Use class Output. 1511 * src/Makefile.in (OBJECTS): Add output.o. 1512 (output.o): New rule. 1513 15142002-10-03 Bruno Haible <bruno@clisp.org> 1515 1516 * src/iterator.h: Remove file. 1517 * src/iterator.cc: Remove file. 1518 * src/options.cc: (PositionStringParser): New class, taken from old 1519 iterator.cc. 1520 * src/Makefile.in (OBJECTS): Remove iterator.o. 1521 (ITERATOR_H): Remove variable. 1522 (iterator.o): Remove rule. 1523 1524 * src/keyword-list.h: New file. 1525 * src/keyword-list.cc: New file. 1526 * src/list-node.h: Remove file. 1527 * src/list-node.cc: Remove file. 1528 * src/keyword.h (KeywordExt::init_selchars): New declaration. 1529 * src/keyword.cc (sort_char_set, KeywordExt::init_selchars): New, from 1530 old list-node.cc. 1531 * src/gen-perf.cc: Replace List_Node by KeywordExt or KeywordExt_List, 1532 as appropriate. 1533 * src/hash-table.h: Likewise. 1534 * src/key-list.h: Likewise. 1535 * src/key-list.cc: Likewise. 1536 * src/Makefile.in (OBJECTS): Remove list-node.o, add keyword-list.o. 1537 (LIST_NODE_H): Remove macro. 1538 (list-node.o): Remove rule. 1539 (keyword-list.o): New rule. 1540 1541 * src/keyword.h (KeywordExt): New class. 1542 * src/keyword.cc (KeywordExt): New constructor. 1543 * src/list-node.h (List_Node): Inherit from KeywordExt. 1544 * src/list-node.cc: Update. 1545 * src/gen-perf.cc: Update. 1546 * src/hash-table.cc: Update. 1547 * src/key-list.cc: Update. 1548 (output_keyword_entry): Change argument type to KeywordExt*. 1549 1550 * src/keyword.h: New file. 1551 * src/keyword.cc: New file. 1552 * src/list-node.h (List_Node): Extend Keyword. 1553 * src/list-node.cc: Update. 1554 * src/gen-perf.cc: Update. 1555 * src/hash-table.cc: Update. 1556 * src/key-list.cc: Update. 1557 * src/Makefile.in (OBJECTS): Add keyword.o. 1558 (keyword.o): New rule. 1559 1560 * src/key-list.cc (Key_List::read_keys): Allocate the memory for the 1561 hash table using 'new'. 1562 (Key_List::output_lookup_array): Allocate the memory for the duplicates 1563 array using 'new'. 1564 * src/options.h (LARGE_STACK_ARRAYS): Remove definition. 1565 * src/main.cc (main): Remove setrlimit call. 1566 * src/configure.in: Don't test for unistd.h, sys/time.h, 1567 sys/resource.h, getrlimit, setrlimit. 1568 1569 * src/bool-array.h (Bool_Array): Make all members non-static. 1570 Add an argument to the constructor. Remove init(), rename reset() to 1571 clear(), rename find() to set_bit(). 1572 * src/bool-array.icc: Move init() code into the constructor. 1573 Rename reset() to clear(), rename find() to set_bit(). 1574 * src/gen-perf.h (Gen_Perf): Add collision_detector member. 1575 * src/gen-perf.cc: Update. 1576 1577 * src/gen-perf.h (Gen_Perf::doit_all): Renamed from 1578 Gen_Perf::operator (). 1579 * src/gen-perf.cc (Gen_Perf::doit_all): Renamed from 1580 Gen_Perf::operator (). 1581 * src/main.cc: Update. 1582 1583 * src/read-line.h (Read_Line::read_next_line): Renamed from 1584 Read_Line::get_line. 1585 * src/read-line.icc: Likewise. 1586 * src/read-line.cc: Update. 1587 * src/key-list.cc: Update. 1588 1589 * lib/getline.h: New file. 1590 * lib/getline.cc: New file. 1591 * lib/Makefile.in (OBJECTS): Add getline.o. 1592 (getline.o): New rule. 1593 * src/read-line.h (Read_Line::readln_aux): Remove declaration. 1594 * src/read-line.cc (Read_Line::readln_aux): Remove function. 1595 * src/read-line.icc (Read_Line::get_line): Use ::get_line. 1596 * src/options.h (LARGE_STACK): Remove macro. 1597 1598 * src/bool-array.h (STORAGE_TYPE): Remove type. 1599 Use 'unsigned int' instead of STORAGE_TYPE. 1600 * src/bool-array.cc: Likewise. 1601 * src/bool-array.icc: Likewise. 1602 * src/gen-perf.cc: Likewise. 1603 1604 * src/new.cc: Remove file. 1605 * src/Makefile.in (OBJECTS): Remove new.o. 1606 (new.o): Remove rule. 1607 * src/configure.in: Remove test for HAVE_THROW_DECL. 1608 * acconfig.h: Remove file. 1609 1610 * src/trace.h: Remove file. 1611 * src/trace.cc: Remove file. 1612 * src/Makefile.in (OBJECTS): Remove trace.o. 1613 (TRACE_H): Remove variable. 1614 (trace.o): Remove rule. 1615 Update all dependencies. 1616 * src/bool-array.h, src/bool-array.cc, src/bool-array.icc: Don't use T. 1617 * src/gen-perf.cc: Likewise. 1618 * src/hash-table.cc: Likewise. 1619 * src/iterator.cc: Likewise. 1620 * src/key-list.cc: Likewise. 1621 * src/list-node.cc: Likewise. 1622 * src/main.cc: Likewise. 1623 * src/new.cc: Likewise. 1624 * src/options.h, src/options.cc, src/options.icc: Likewise. 1625 * src/read-line.h, src/read-line.cc, src/read-line.icc: Likewise. 1626 1627 * tests/Makefile.in: Use gperf option -I, to avoid gcc-3.x warnings. 1628 * tests/test.c: Don't use gets(), to avoid warnings. 1629 16302001-08-02 Bruno Haible <bruno@linuix.math.u-bordeaux.fr> 1631 1632 * doc/gperf.texi: Change bug report address to <bug-gnu-gperf@gnu.org>. 1633 * README: Updated. 1634 16352000-12-18 Bruno Haible <bruno@linuix.math.u-bordeaux.fr> 1636 1637 * src/configure.in: Add check for rand() in libm. Needed for BeOS. 1638 * src/Makefile.in (LIBS): Use @GPERF_LIBM@ instead of hardwiring -lm. 1639 16402000-11-20 Bruno Haible <bruno@linuix.math.u-bordeaux.fr> 1641 1642 * doc/help2man: Update to version 1.23. 1643 16442000-09-26 Bruno Haible <bruno@linuix.math.u-bordeaux.fr> 1645 1646 * gperf-2.7.2 released. 1647 1648 * doc/gperf.texi: Add a second bug report address 1649 <gperf-bugs@lists.sourceforge.net>. 1650 * README: Updated. 1651 16522000-08-28 Bruno Haible <bruno@linuix.math.u-bordeaux.fr> 1653 1654 * lib/getopt.h (struct option): Use "const" also when compiling in 1655 C++ mode. Avoids warnings from Sun CC and HP-UX aCC. 1656 1657 * doc/Makefile.in (docdir): Change from $(datadir)/doc/@PACKAGE@ to 1658 $(prefix)/doc/@PACKAGE@, following the newest GNU standards. 1659 16602000-08-20 Bruno Haible <bruno@linuix.math.u-bordeaux.fr> 1661 1662 * src/version.cc: Bump version number to 2.7.2. 1663 * doc/gperf.texi: Likewise. 1664 1665 * doc/texinfo.tex: Update to post-texinfo-4.0 version. @code in the 1666 title page now chooses a larger font. The overall layout of the 1667 text is denser. 1668 1669 * AUTHORS: New file. 1670 1671 * tests/Makefile.in (all): Add check-lang-utf8 and check-lang-ucs2. 1672 (check-lang-utf8, check-lang-ucs2): New targets. 1673 (clean): Remove lu8out and lu2out. 1674 * tests/lang-utf8.gperf, tests/lang-utf8.exp: New files. 1675 * tests/lang-ucs2.gperf, tests/test2.c, tests/lang-ucs2.in, 1676 tests/lang-ucs2.exp: New files. 1677 1678 Allow the use of embedded NULs in keys. 1679 * lib/hash.h (hashpjw): Add a length argument. 1680 * lib/hash.cc (hashpjw): Likewise. Don't stop when encountering a NUL 1681 character. 1682 * src/hash-table.h (Hash_Table constructor): Add ignore_len argument. 1683 (Hash_Table::ignore_length): New field. 1684 (Hash_Table::insert): Renamed from Hash_Table::operator(). Remove 1685 ignore_length argument. 1686 * src/hash-table.cc (NIL): Remove macro. 1687 (Hash_Table constructor): Add ignore_len argument. Use it to 1688 initialize ignore_length. 1689 (Hash_Table destructor): Specify explicit length of char_set and 1690 key. 1691 (Hash_Table::insert): Renamed from Hash_Table::operator(). Remove 1692 ignore_length argument. Pass explicit length to hashpjw. Compare 1693 char_set using memcmp, not strcmp. 1694 * src/list-node.h (List_Node): Rename field length to key_length. 1695 New field char_set_length. 1696 (List_Node constructor): Accept key and rest, not the entire line. 1697 * src/list-node.cc (List_Node constructor): Accept key and rest, not 1698 the entire line. Don't NUL terminate key and char_set. Specify 1699 explicit length of key. Initialize char_set_length field. 1700 * src/key-list.cc: Include <ctype.h>. 1701 (parse_line): New function. 1702 (Key_List::read_keys): Call parse_line instead of new List_Node. 1703 Pass option[NOLENGTH] to Hash_Table constructor, not 1704 Hash_Table::insert. Specify explicit length of key and char_set. 1705 (Key_List::get_occurrence): Use explicit length of char_set. 1706 (Key_List::set_determined): Likewise. 1707 (Key_List::already_determined): Likewise. 1708 (output_string): Add length argument. Output unprintable characters 1709 using octal escape sequence. 1710 (output_keyword_entry): Use explicit length of key. 1711 (Key_List::output_lookup_array): Specify explicit length of key. 1712 (output_switch_case): Likewise. 1713 (Key_List::dump): Likewise. 1714 * src/gen-perf.h (Gen_Perf::compute_disjoint_union): Add two length 1715 arguments. 1716 * src/gen-perf.cc (Gen_Perf::compute_disjoint_union): Likewise. Don't 1717 stop when encountering NUL characters. Don't NUL terminate the 1718 result. 1719 (Gen_Perf::hash): Use explicit length of char_set. 1720 (Gen_Perf::change): Specify explicit length of key. 1721 * doc/gperf.texi: Document it. 1722 1723 * doc/help2man: New file, help2man version 1.022. 1724 * Makefile.devel (all): Add doc/gperf.1. 1725 (doc/gperf.1): New target. 1726 * doc/gperf.1: Automatically generated. 1727 1728 * mkinstalldirs: New file, from automake-1.4, grep-2.4.1, guile-1.4, 1729 libtool-1.3.3, make-3.79.1, tar-1.13. 1730 * src/Makefile.in (MKINSTALLDIRS): New variable. 1731 (install, installdirs): Use it instead of mkdir. 1732 * doc/Makefile.in (MKINSTALLDIRS): New variable. 1733 (install, installdirs): Use it instead of mkdir. 1734 1735 * INSTALL: Update. 1736 17372000-08-19 Bruno Haible <bruno@linuix.math.u-bordeaux.fr> 1738 1739 * src/key-list.cc (Output_Compare_Memcmp): New class. 1740 (Key_List::output_lookup_function): When option -l is given, use 1741 memcmp instead of strcmp or strncmp. 1742 1743 * doc/gperf.texi: The bug report address is <bug-gnu-utils@gnu.org>. 1744 The download address is ftp.gnu.org. Remove mention of -a and -g 1745 options (now nops). Explain effect of -c option. 1746 1747 * doc/configure.in (PACKAGE): New variable. 1748 * doc/Makefile.in (datadir, docdir): New variables. 1749 (dvidir, htmldir): Change values. 1750 (install, installdirs): Update. 1751 1752 * src/configure.in: Rename cache variable gp_cxx_throw_decl to 1753 gp_cv_cxx_throw_decl. 1754 1755 * src/key-list.cc (Key_List::output_hash_function): When outputting 1756 __inline, take advantage of C++ compilers which have inline. 1757 1758 * src/key-list.cc (Output_Compare_Strncmp::output_comparison): 1759 After the call to strncmp, verify that expr2 is not longer than 1760 `len'. 1761 Reported by Carlo Wood <carlo@runaway.xs4all.nl>. 1762 1763 * src/key-list.cc (Key_List::output_lookup_function_body): Avoid 1764 emitting the loop for dealing with duplicates if 1765 total_duplicates == 0. 1766 1767 * src/key-list.cc (Key_List::read_keys): Don't accept an empty key. 1768 1769 * src/Makefile.in (install, installdirs, uninstall): Respect 1770 $(DESTDIR). 1771 * doc/Makefile.in (install, installdirs, uninstall): Likewise. 1772 1773 * src/options.cc (Options::print_options): Escape the arguments which 1774 contain special characters. 1775 1776 * tests/c-parse.gperf: Updated from gcc-2.95.2/gcc/c-parse.gperf. 1777 * tests/objc.gperf: New file, from gcc-2.95.2/gcc/objc/objc.gperf. 1778 * tests/chill.gperf: New file, from gcc-2.95.2/gcc/ch/gperf. 1779 * tests/cplusplus.gperf: New file, from gcc-2.95.2/gcc/cp/gxx.gperf. 1780 * tests/gplus.gperf: Remove file. 1781 * tests/java.gperf: New file, from gcc-2.95.2/gcc/java/keyword.gperf. 1782 * tests/Makefile: Check them all. 1783 * tests/c-parse.exp: Renamed from tests/test-1.exp. 1784 * tests/modula2.exp: Renamed from tests/test-2.exp. 1785 * tests/cplusplus.exp: Renamed from tests/test-3.exp. 1786 * tests/gpc.exp: Renamed from tests/test-5.exp. 1787 1788 * src/key-list.cc (output_switch_case): Add trailing semicolon to 1789 lengthptr assignment line. Fixes bug with -D and -S. 1790 From Reini Urban <rurban@sbox.tu-graz.ac.at>. Also reported by 1791 David Hunter. 1792 * tests/Makefile.in (check-lang-syntax): Perform each test with -D 1793 once without and once with duplicates. 1794 1795 * src/key-list.cc (output_keyword_entry): Avoid outputting a struct 1796 initializer of the form {"key",}. 1797 1798 * src/iterator.cc: Don't include <stream.h>. 1799 From Michael Deutschmann <ldeutsch@mail.netshop.net>. 1800 1801 * tests/Makefile.in (VALIDATE, check-lang-syntax): Use $(srcdir) where 1802 appropriate. 1803 Reported by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>. 1804 1805 * tests/validate: Don't run -traditional tests by default. 1806 1807 * src/main.cc (main): Check for write error on stdout before returning. 1808 1809 * src/Makefile.in (LDFLAGS): New definition, to catch the value given 1810 at configure time. 1811 1812 Make the structure initializers customizable. Based on a patch by 1813 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>. 1814 * src/options.h (Options::get_initializer_suffix, 1815 Options::initializer_suffix): New declarations. 1816 * src/options.icc (Options::get_initializer_suffix): New function. 1817 * src/options.cc (DEFAULT_INITIALIZER_SUFFIX): New constant. 1818 (Options::initializer_suffix): New variable. 1819 (Options::short_usage): Document option "-F". 1820 (Options::long_usage): Document option "-F". 1821 (Options constructor): Initialize initializer_suffix. 1822 (Options destructor): Dump initializer_suffix. 1823 (long_options): Add option "-F". 1824 (Options::operator()): Accept option "-F". Sets initializer_suffix. 1825 * src/key-list.cc (output_keyword_blank_entries): Output 1826 initializer_suffix. 1827 * doc/gperf.texi: Document option "-F". 1828 1829 * COPYING: Replace with GPL version 2 (with new FSF address and Y2K 1830 safe year format). 1831 1832 * doc/gpl.texinfo: New file. 1833 * doc/gperf.texi: Document it. 1834 * doc/Makefile.in (gperf.info, gperf.dvi, gperf.html, gperf_toc.html): 1835 Update dependencies. 1836 1837 * doc/Makefile.in (MAKEINFO): Unset LANG while running makeinfo. 1838 18391998-05-20 Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de> 1840 1841 * doc/Makefile.in (gperf.dvi, clean): Remove gperf.cps. 1842 (install, installdirs, uninstall): Don't install gperf.dvi. The 1843 info and HTML documentations are sufficient for on-line use, and 1844 users who wish to print the documentation (in PS or DVI format) 1845 can do this directly off the source distribution. 1846 (DVIPS): Use "-D600" instead of "-Pljfour", for portability. 1847 18481998-05-20 Akim Demaille <demaille@inf.enst.fr> 1849 1850 * doc/gperf.texi: Many modifications: 1851 (Output Format): Declare `hash' and `in_word_set' as functions. 1852 (Concept Index): New section. 1853 (Title page): Use standard presentation. 1854 (Top): Use @top instead of @unnumbered so that automatic master 1855 update works. 1856 (Motivation): Avoid spaces in @var. 1857 (Options): Use the standard name ``Invoking ...''. 1858 (Options): Declare also the long form of the options. 1859 (Options): Remove redundant @itemize when @table is used. 1860 18611998-05-08 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> 1862 1863 * aclocal.m4 (CL_PROG_INSTALL): Set cl_cv_path_install, not 1864 ac_cv_path_install. 1865 1866Sat May 2 13:20:54 1998 Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de> 1867 1868 * gperf-2.7 released. 1869 1870Sat May 2 12:31:51 1998 Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de> 1871 1872 * src/version.cc (version_string): Remove the "(C++ version)" suffix. 1873 It's redundant: the early C versions of gperf are called cperf. 1874 Reported by Karl Berry. 1875 * src/option.cc (Options::operator()): Trim the output of "gperf -v". 1876 1877Thu Apr 16 13:22:16 1998 Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de> 1878 1879 * lib/Makefile.in, src/Makefile.in: Don't use $(TARGET_ARCH). 1880 Solaris "make" sets it to a value not understood by "cc". 1881 1882Wed Apr 15 23:52:14 1998 Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de> 1883 1884 * lib/Makefile.in, src/Makefile.in: Don't use implicit rules. Don't 1885 use $<. AIX "make" and OSF/1 "make" have problems with both. 1886 * src/gen-perf.cc, src/key-list.cc: Cast free() argument to char*, 1887 otherwise it doesn't compile on SunOS 4. 1888 * src/key-list.h: Declare structs outside of other declarations, 1889 needed for OSF/1 cxx 5.5. 1890 * lib/getopt.h: Use prototypes if __STDC__ || __cplusplus. 1891 Don't give a prototype for getopt(), to avoid error on SunOS 4. 1892 * lib/getopt.c: Declare strncmp, to avoid warnings. 1893 1894Tue Apr 14 23:24:07 1998 Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de> 1895 1896 * lib/GetOpt.{h,cc}: Remove files. 1897 * lib/getopt.{h,c}, lib/getopt1.c: New files, from GNU libc. 1898 * lib/configure.in (AC_INIT): Search for hash.cc, not GetOpt.cc. 1899 * lib/Makefile.in (OBJECTS): Remove GetOpt.o, add getopt.o, getopt1.o. 1900 (getopt.o, getopt1.o, hash.o): Use explicit building rules. Some 1901 "make"s don't support to have both implicit rules for "%.o : %.c" 1902 and "%.o : %.cc" in the same Makefile. 1903 * lib/hash.{h,cc}: Remove #pragma; there are no templates here. 1904 * src/option.h (Options::usage): Remove. 1905 (Options::short_usage, Options::long_usage): Declare. 1906 * src/option.cc (Options::usage): Remove. 1907 (Options::short_usage, Options::long_usage): New functions. 1908 (long_options): New array. 1909 (Options::operator()): Use getopt_long instead of GetOpt::operator(), 1910 change all references to GetOpt members. 1911 1912 * src/std-err.{h,cc}: Remove files. 1913 * src/gen-perf.cc, src/key-list.cc, list-node.cc, new.cc, options.cc: 1914 Call fprintf(stderr) instead of Std_Err::report_error(). 1915 * src/key-list.h, src/list-node.h, src/options.h: Don't use class 1916 Std_Err any more. 1917 * src/option.cc (program_name): New variable. 1918 * src/Makefile.in: Remove STD_ERR_H. 1919 (OBJECTS): Remove std-err.o. 1920 1921Mon Mar 23 01:03:35 1998 Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de> 1922 1923 * aclocal.m4, {lib,src,tests}/configure.in: Remove CL_CC_WORKS and 1924 CL_CXX_WORKS, already contained in autoconf 2.12. 1925 1926 * src/gen-perf.cc, src/key-list.cc: Move some code from 1927 Gen_Perf::Gen_Perf() to Key_List::output(). 1928 * src/Makefile.in: Update dependencies. 1929 1930 * src/options.{h,cc}: Remove option "-p". 1931 * src/key-list.cc (Key_List::set_output_types): Rewrite. 1932 (default_array_type, default_return_type): Remove. 1933 * src/key-list.cc: Adjust "const" handling. 1934 + With option "-t" [TYPE], don't emit wrong code if there is no 1935 space before the struct's opening brace. 1936 1937Sun Mar 22 16:59:15 1998 Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de> 1938 1939 * src/key-list.{h,cc}: Completely reorganized the output routines. 1940 Rewrote from scratch the output_switch() function. Use classes 1941 (Output_Constants, Output_Expr, Output_Compare) for abstraction. 1942 In particular: 1943 + Don't emit trailing whitespace and spurious blank lines. 1944 + Adjust indentation of the arrays. 1945 + Don't emit commas at the end of array initializers and 1946 struct initializers. 1947 + With option "-l" [LENTABLE], compare the length before 1948 fetching the word from memory. 1949 + With option "-S" [SWITCH], emit the comparison code just once, 1950 not once in every switch statement. 1951 + With option "-S" [SWITCH], choose the right switch statement 1952 through a binary search, not a linear search. 1953 + With option "-S" [SWITCH], emit straightforward comparisons 1954 instead of switch statements with just one "case" label. 1955 + With options "-S -p -t" [SWITCH, POINTER, TYPE], don't emit 1956 spurious empty elements at the beginning of the wordlist array. 1957 + With option "-D" [DUP] and not option "-S" [SWITCH], if there 1958 is no more room for duplicate entries in the lookup array, 1959 don't call `assert (i != 0)'. Instead, make the array larger :-) 1960 + With option "-D" [DUP], if there are no duplicates, don't 1961 automatically fall back to the non-"-D" algorithm. If the user 1962 wants the non-"-D" algorithm, he can just not specify "-D". 1963 + With option "-D" [DUP] and either options "-p -t" [POINTER, TYPE] 1964 or not option "-S" [SWITCH], don't emit spurious empty elements 1965 at the beginning of the wordlist array. 1966 + With option "-D" [DUP], simplify the detection and processing 1967 of duplicate entries in the lookup array. 1968 + With options "-D -l" [DUP, LENTABLE] and not option "-S" [SWITCH], 1969 don't forget to emit the lengthtable array. 1970 + With options "-D -l -S" [DUP, LENTABLE, SWITCH], don't forget to 1971 compare the lengths before comparing the strings. 1972 1973 * src/gen-perf.cc: No need to include <assert.h>. 1974 * src/options.cc: Likewise. 1975 1976 * src/options.cc: Don't use `errno' after freopen failed. 1977 * src/std-err.cc: `report_error' doesn't call strerror(errno) any 1978 more. No need to include <string.h> and <errno.h>. 1979 1980 * tests/Makefile.in (check-*): Any difference between .exp and .out 1981 is a failure. Don't ignore whitespace differences. 1982 1983 * tests/Makefile.in (check-lang-syntax): Add some more checks. 1984 1985Fri Mar 20 00:54:54 1998 Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de> 1986 1987 * tests/jscript.gperf: Renamed from tests/javascript.gperf, because 1988 of Minix and SVR2 14-character filename limit. 1989 * src/key-list.cc (output_string): New function. 1990 (Key_List::output_switch, Key_List::output_keyword_table): Call it. 1991 1992 * src/options.{h,icc,cc} (get_wordlist_name): New function. Add 1993 option -W. 1994 * src/key-list.cc (Key_List::output_switch, 1995 Key_List::output_keyword_table, Key_List::output_lookup_function): 1996 Use it. 1997 Patch from William Bader <wbader@CSEE.Lehigh.Edu>. 1998 1999 * src/version.cc: Bump version number directly from 2.5 to 2.7, 2000 because Schmidt's last release from 1991 carries version number 2.6. 2001 2002Tue Jul 30 00:02:39 1991 Douglas C. Schmidt (schmidt at net4.ics.uci.edu) 2003 2004 * Fixed a small bug in the Key_List::output_keyword_table routine 2005 that caused an extra newline to be printed if there where no 2006 leading blank entries... (who cares, right?!) 2007 2008Mon Jul 29 22:05:40 1991 Douglas C. Schmidt (schmidt at net4.ics.uci.edu) 2009 2010 * Modified the handling of the -E (emit enums rather than 2011 #defines) option in conjunction with the -G option. Now, if -G 2012 and -E are given the enums are generated outside the lookup 2013 function, rather than within it! 2014 2015Mon Apr 8 18:17:04 1991 Doug Schmidt (schmidt at net4.ics.uci.edu) 2016 2017 * Yucko, there was a bug in the handling of -c (and of course the 2018 new -I command in key-list.cc). Apparently when I added the 2019 super-duper hack that provided support for duplicate keys I 2020 forgot to update the strcmp output... 2021 2022Mon Mar 9 02:19:04 1998 Bruno Haible <bruno@linuix.mathematik.uni-karlsruhe.de> 2023 2024 * Moved the documentation to doc/, put the stuff borrowed from 2025 libg++ into lib/. 2026 * Rewrote all Makefile.in's for better compliance with GNU standards. 2027 * Autoconf based configuration. Rewrote all configure.in's. Added 2028 aclocal.m4, with macros from CLISP and CLN. Added Makefile.devel. 2029 * src/depend: Removed. Dependencies are now in src/Makefile.in. 2030 2031 * src/bool-array.icc: New file, contains inline functions, from both 2032 src/bool-array.h and src/bool-array.cc. 2033 * src/options.icc: New file, contains inline functions, from both 2034 src/options.h and src/options.cc. 2035 * src/read-line.icc: New file, contains inline functions, from both 2036 src/read-line.h and src/read-line.cc. 2037 2038 * src/bool-array.h: Don't include <std.h>. 2039 * src/bool-array.cc: Include <string.h>. 2040 * src/gen-perf.cc: No need to include <ctype.h>. Don't include 2041 <_G_config.h>. 2042 * src/hash-table.cc: Don't include <std.h> and <builtin.h>. Include 2043 <string.h> and lib/hash.h instead. 2044 * src/iterator.cc: Don't include <std.h>. 2045 * src/key-list.cc: Don't include <builtin.h>. Include <string.h> and 2046 <stdlib.h> instead. 2047 * src/list-node.cc: Don't include <std.h>. Include <stdlib.h> instead. 2048 Remove `index' hack. 2049 * src/main.cc: Don't include <_G_config.h>. 2050 * src/new.cc: Don't include <std.h>. Include <stdlib.h> instead. 2051 * src/options.cc: Don't include <builtin.h>. Include <string.h> and 2052 <stdlib.h> instead. 2053 * src/read-line.cc: Don't include <builtin.h>. Include <stdlib.h> 2054 instead. 2055 * src/std-err.cc: Don't include <std.h>. Include <string.h> (for Irix). 2056 * src/vectors.h: No need to include <stdio.h>. 2057 * src/version.cc: No need to include <stdio.h>. 2058 2059 * src/bool-array.h: Change `STORAGE_TYPE' from int to unsigned int. 2060 * src/bool-array.{h,cc}: Change type of `Bool_Array::size' from int 2061 to unsigned int. 2062 * src/bool-array.{h,cc}: Change type of `Bool_Array::init' argument 2063 from STORAGE_TYPE to unsigned int. 2064 * src/gen-perf.{h,cc}: Change two `Gen_Perf::compute_disjoint_union' 2065 argument types from `char *' to `const char *'. 2066 * src/iterator.h: Change type of `Iterator::str' and argument of 2067 `Iterator::Iterator' from `char *' to `const char *'. 2068 * src/iterator.cc: Cast to `unsigned char' before calling `isdigit'. 2069 * src/key-list.{h,cc}: Change type of `Key_List::array_type', 2070 `Key_List::return_type', `Key_List::struct_tag', 2071 `Key_List::include_src', `default_array_type', `default_return_type' 2072 and return type of `Key_List::get_array_type', 2073 `Key_List::get_special_input', `Key_List::save_include_src' from 2074 `char *' to `const char *'. 2075 * src/key-list.cc: Change "pretty gross" assignment. 2076 * src/key-list.cc: Don't use `alloca', HP-UX CC lacks it. 2077 * lib/GetOpt.cc: Likewise. 2078 * src/key-list.cc (merge): Use iteration instead of recursion. 2079 * src/list-node.{h,cc}: Change type of `List_Node::key', 2080 `List_Node::rest', `List_Node::char_set' from `char *' to 2081 `const char *'. 2082 * src/new.cc: Don't use BUFSIZ. Conditionalize the throw() declaration. 2083 * src/read-line.h: Don't use BUFSIZ. 2084 * src/read-line.cc: Make CHUNK_SIZE a constant, and use allocate the 2085 buffers on the stack by default. Use memcpy for copying buffers. 2086 Include <string.h>. 2087 * src/read-line.icc (get_line): Use iteration instead of tail recursion. 2088 Don't call ungetc(EOF,stdin). 2089 * src/std-err.{h,cc}: Change type of `Std_Err::program_name' and of 2090 argument `Std_Err::report_error' from `char *' to `const char *'. 2091 * src/std-err.cc: `report_error' doesn't call `exit' any more. All 2092 callers changed to do that themselves. 2093 * src/trace.h: Make constructor/destructor calls non-inline. 2094 2095 * src/key-list.cc (output_hash_function): If option[CPLUSPLUS], 2096 always make the hash function inline. 2097 (output): Declare the hash function inline, with the right name. 2098 * src/options.{h,cc}, src/gen-perf.cc, src/key-list.cc: Remove 2099 options -g, making it on by default. Remove option -a. Instead, 2100 introduce "-L KR-C", "-L C", "-L ANSI-C", "-L C++". 2101 * src/options.{h,cc}, src/key-list.cc: Add option -I. 2102 * src/key-list.cc: Don't emit "const" if compiling in mode "-L KR-C". 2103 * src/key-list.cc: Don't emit a comma at the end of an enum list. 2104 * src/main.cc: Remove COUNT_TIME code. 2105 * src/vectors.h, src/key-list.cc, src/options.cc, src/list-node.cc: 2106 ALPHA_SIZE defaults to 256 now. Add option -7. 2107 2108 * tests/javascript.gperf: New file. 2109 * tests/jstest*.gperf, tests/validate: New tests. 2110 2111Sat Jan 31 01:38:11 1998 Alexandre Oliva <oliva@dcc.unicamp.br> 2112 2113 * src/Makefile.in ($(TARGETPROG)): Add $(CFLAGS). 2114 2115Wed Jan 28 01:56:00 1998 Manfred Hollstein <manfred@s-direktnet.de> 2116 2117 * configure.in (package_makefile_rules_frag): New and 2118 redirect stderr from ${srcdir}/config.shared to 2119 ${package_makefile_rules_frag}. 2120 * src/configure.in: Ditto. 2121 * tests/configure.in: Ditto. 2122 2123Fri Jan 23 08:00:41 1998 H.J. Lu (hjl@gnu.org) 2124 2125 * gperf.texi (@ichapter): Changed to @chapter. 2126 2127Wed Jan 14 09:16:48 1998 H.J. Lu (hjl@gnu.org) 2128 2129 * src/key-list.cc, src/key-list.h (Key_List::strcspn): Don't 2130 define if strcspn is defined. 2131 2132Fri Jan 24 13:23:47 1997 Mike Stump <mrs@cygnus.com> 2133 2134 * src/new.cc (operator delete): Add the exception specification. 2135 2136Mon Feb 5 19:29:16 1996 Per Bothner <bothner@kalessin.cygnus.com> 2137 2138 * src/read-line.cc (Read_Line::readln_aux): Handle EOF if last line 2139 has a length which is an exact multiple of CHUNK_SIZE. (Used to throw 2140 away the line's contents.) From Bruno Haible <haible@ilog.ilog.fr>. 2141 * src/Makefile.in ($(TARGETPROG)): Add -lm to link line. 2142 2143Tue Jun 11 13:43:50 1996 Brendan Kehoe <brendan@lisa.cygnus.com> 2144 2145 * src/list-node.cc (List_Node): Reorder init of nodes to 2146 match declaration order. 2147 * src/hash-table.cc (Hash_Table): Likewise. 2148 2149Tue Oct 10 16:37:28 1995 Mike Stump <mrs@cygnus.com> 2150 2151 * src/new.cc: Since malloc/delete are not paired, we cannot call 2152 free. 2153 2154Wed Jan 4 12:40:14 1995 Per Bothner <bothner@kalessin.cygnus.com> 2155 2156 * src/Makefile.in ($(TARGETPROG)): Link with $(LDFLAGS). 2157 Patch from John Interrante <interran@uluru.stanford.edu>. 2158 2159Sat Nov 5 19:12:48 1994 Jason Merrill (jason@phydeaux.cygnus.com) 2160 2161 * src/Makefile.in (LIBS): Remove. 2162 2163Tue Oct 18 17:51:14 1994 Per Bothner <bothner@kalessin.cygnus.com> 2164 2165 * src/std-err.cc: Use stderror, instead of the non-standard 2166 sys_nerr and sys_errlist. 2167 2168Sat Sep 17 22:02:13 1994 Per Bothner (bothner@kalessin.cygnus.com) 2169 2170 * src/key-list.cc (output_hash_function): 2171 Patch from William Bader <wbader@CSEE.Lehigh.Edu>. 2172 2173Fri Jul 15 09:38:11 1994 Per Bothner (bothner@cygnus.com) 2174 2175 * src/std-err.cc: #include <errno.h>, and only declare 2176 extern int errno if errno is not a macro. 2177 2178Mon May 30 17:29:34 1994 Per Bothner (bothner@kalessin.cygnus.com) 2179 2180 * Makefile.in (src_all, install): Make sure to add '/' after 2181 `pwd` in $rootme, as expected by FLAGS_TO_PASS. 2182 2183Wed May 11 00:47:22 1994 Jason Merrill (jason@deneb.cygnus.com) 2184 2185 Make libg++ build with gcc -ansi -pedantic-errors 2186 * src/options.h: Lose commas at end of enumerator lists. 2187 2188Sun Dec 5 19:16:40 1993 Brendan Kehoe (brendan@lisa.cygnus.com) 2189 2190 * src/hash-table.cc (Hash_Table::~Hash_Table): Don't pass an 2191 argument to fprintf, since it's not expecting one. 2192 2193Fri Nov 26 19:03:18 1993 Per Bothner (bothner@kalessin.cygnus.com) 2194 2195 * src/list-node.cc: #undef index, for the sake of broken NeXT, 2196 2197Thu Nov 4 11:16:03 1993 Per Bothner (bothner@kalessin.cygnus.com) 2198 2199 * Makefile.in (install): Use INSTALL_DATA for gperf.1. 2200 2201Mon Oct 25 18:40:51 1993 Per Bothner (bothner@kalessin.cygnus.com) 2202 2203 * src/key-list.cc (Key_List::read_keys): Use POW macro 2204 to increase hash table size to power of 2. 2205 2206 * options.h (LARGE_STACK_ARRAYS): New flag. Defaults to zero. 2207 * gen-perf.cc, key-list.cc, read-line.cc: 2208 Only stack-allocate large arrays if LARGE_STACK_ARRAYS is set. 2209 * main.cc (main): Only call setrlimit (RLIMIT_STACK, ...) 2210 if LARGE_STACK_ARRAYS. 2211 2212Mon Oct 4 17:45:08 1993 Per Bothner (bothner@kalessin.cygnus.com) 2213 2214 * src/gen-perf.cc: Always use ANSI rand/srand instead of BSDisms. 2215 2216Wed Aug 18 12:19:53 1993 Per Bothner (bothner@kalessin.cygnus.com) 2217 2218 * Makefile.in (src_all): Make less verbose output. 2219 2220Fri May 28 14:01:18 1993 Per Bothner (bothner@rtl.cygnus.com) 2221 2222 * src/gen-perf.cc (Gen_Perf::change): Don't use gcc-specific 2223 2-operand conditional expression. 2224 * src/key-list.cc (Key_List::output_lookup_array): 2225 Don't use variable-size stack arrays, unless compiled by g++. 2226 2227Tue May 4 14:08:44 1993 Per Bothner (bothner@cygnus.com) 2228 2229 Changes (mostly from Peter Schauer) to permit compilation 2230 using cfront 3.0 and otherwise be ARM-conforming. 2231 * src/key-list.h: class Key_List must use public derivation 2232 of base class Std_Err (because Gen_Perf::operator() in gen-perf.cc 2233 calls Std_Err::report_error). 2234 * src/gen-perf.cc (Gen_Perf::affects_prev), src/hash-table.cc 2235 (Hash_Table::operator()): Don't use gcc-specific 2-operand 2236 conditional expression. 2237 * src/iterator.cc (Iterator::operator()): Don't use gcc-specific 2238 range construct in case label. 2239 * key-list.cc (Key_List::output_lookup_array, Key_List::read_keys), 2240 src/gen-perf.cc (Gen_Perf::operator(), src/read-line.cc 2241 (Read_Line::readln_aux): If not gcc, don't allocate 2242 variable-sized arrays on stack. 2243 * src/new.cc (operator new): Argument type should be size_t. 2244 * key-list.cc (Key_List::output_lookup_array, Key_List::read_keys), 2245 new/cc (::operator new): Don't use non-standard >?= operator. 2246 2247Tue Apr 27 20:11:30 1993 Per Bothner (bothner@cygnus.com) 2248 2249 * src/Makefile.in: Define TARGETPROG, and use it. 2250 2251Mon Apr 19 00:29:18 1993 Per Bothner (bothner@cygnus.com) 2252 2253 * Makefile.in, configure.in: Re-vamped configure scheme. 2254 * gperf.texinfo: Renamed to gperf.texi. 2255 * src/bool-array.{h,cc}: ANSIfy bzero->memset. 2256 2257Sat Jan 30 20:21:28 1993 Brendan Kehoe (brendan@lisa.cygnus.com) 2258 2259 * tests/Makefile.in (mostlyclean): Also delete aout, cout, m3out, 2260 pout, and preout. 2261 2262Tue Dec 29 08:58:17 1992 Ian Lance Taylor (ian@cygnus.com) 2263 2264 * Makefile.in: pass $(FLAGS_TO_PASS) to all calls to make. 2265 (FLAGS_TO_PASS): added INSTALL, INSTALL_DATA, INSTALL_PROGRAM. 2266 2267Mon Dec 21 18:46:46 1992 Per Bothner (bothner@rtl.cygnus.com) 2268 2269 * tests/expected.* renamed to *.exp to fit in 14 chars. 2270 * tests/Makefile.in: Update accordingly. 2271 Also rename output.* to *.out. 2272 * src/Makefile.in (clean): Remove gperf program. 2273 2274Wed Dec 9 14:33:34 1992 Per Bothner (bothner@cygnus.com) 2275 2276 * src/hash-table.cc, src/bool-array.h: ANSIfy bzero->memset. 2277 2278Thu Dec 3 19:34:12 1992 Per Bothner (bothner@cygnus.com) 2279 2280 * Makefile.in (distclean, realclean): Don't delete 2281 Makefile before recursing. 2282 2283Fri Nov 6 13:41:49 1992 Per Bothner (bothner@rtl.cygnus.com) 2284 2285 * key-list.{h,cc}: Remove MAX_INT (and similar) constant 2286 fields from Key_List class, and use INT_MAX (etc) from limits.h. 2287 * key-list.{h,cc}, options.{h,cc}, vectors.h: Removed all 2288 uses of initialized const fields, as they are non-standard 2289 - and their use was easy to do away with. Mostly, just 2290 made the constants static non-fields in the .cc file. 2291 2292Mon Nov 2 13:10:11 1992 Per Bothner (bothner@cygnus.com) 2293 2294 * tests/Makefile.in: When generating cinset.c, don't pass -C, 2295 since -C assumes an ANSI compiler. Add the -C flag (with -a) 2296 when generating test.out.3 instead. 2297 * tests/expected.out.3: Update accordingly. 2298 2299Wed Aug 12 11:47:54 1992 Per Bothner (bothner@cygnus.com) 2300 2301 * Makefile.in: Factor out common flags into $(FLAGS_TO_PASS). 2302 * Makefile.in: 'install-info' depends on gperf.info. 2303 2304Mon Aug 10 11:39:52 1992 Ian Lance Taylor (ian@dumbest.cygnus.com) 2305 2306 * Makefile.in, src/Makefile.in: always create installation 2307 directories. 2308 2309Mon Jul 20 15:33:21 1992 Mike Stump (mrs@cygnus.com) 2310 2311 * src/new.cc (operator new): Add cast from void * to char *, 2312 since it is not a standard conversion. 2313 2314Wed Jun 17 16:25:30 1992 Per Bothner (bothner@rtl.cygnus.com) 2315 2316 * src/gen-perf.cc: #include <_G_config.h> for _G_SYSV. 2317 * src/key-list.cc: alloca() hair. 2318 * src/main.cc (main): Only call getrlimit if _G_HAVE_SYS_RESOURCE. 2319 * Makefile,in, {src,test}/Makefile.in: Fix *clean rules. 2320 2321Fri May 29 13:21:13 1992 Per Bothner (bothner@rtl.cygnus.com) 2322 2323 * src/gen-perf.cc: Replace USG -> _G_SYSV. 2324 2325Thu May 14 13:58:36 1992 Per Bothner (bothner@rtl.cygnus.com) 2326 2327 * src/Makefile.in: Don't pass obsolete flag -DUNLIMIT_STACK. 2328 * tests/Makefile.in (clean): Fix. 2329 2330Sat Mar 7 00:03:56 1992 K. Richard Pixley (rich@rtl.cygnus.com) 2331 2332 * gperf.texinfo: added menu item hook. 2333 2334Wed Feb 26 18:04:40 1992 K. Richard Pixley (rich@cygnus.com) 2335 2336 * Makefile.in, configure.in: removed traces of namesubdir, 2337 -subdirs, $(subdir), $(unsubdir), some rcs triggers. Forced 2338 copyrights to '92, changed some from Cygnus to FSF. 2339 2340Sun Jan 26 19:21:58 1992 Per Bothner (bothner at cygnus.com) 2341 2342 * tests/Makefile.in: Use re-directed stdin instead of file 2343 name in argv. This allows us to remove the filename 2344 from the output, the expected output, and hence the diffs. 2345 (Note that the input file is in $(srcdir), which we cannot 2346 place in the expected out files.) 2347 * tests/expected.out.[1235]: Edit out input filename, 2348 to match new output. 2349 2350Thu Jun 28 16:17:27 1990 Doug Schmidt (schmidt at brilliant) 2351 2352 * Wow, first fix on the new job! There was a dumb error 2353 in Key_List::output_lookup_function, where I printed the 2354 string "&wordlist[key]" instead of the correct "&wordlist[index]". 2355 2356 * Added a couple of #ifdefs for USG support. 2357 2358Sun Jun 3 17:16:36 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) 2359 2360 * Updated the version number to 2.5 and sent to Doug Lea for release 2361 with the latest GNU libg++. 2362 2363 * Changed the error handling when a keyword file cannot be opened 2364 (now calls perror). 2365 2366Wed May 30 14:49:40 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) 2367 2368 * Instrumented the source code with trace statements automagically 2369 inserted using my new automated trace instrumentation tool! 2370 2371Wed May 9 11:47:41 1990 Doug Schmidt (schmidt at siam.ics.uci.edu) 2372 2373 * Really fixed the previous bug. Turns out that a small amount 2374 of logic had to be duplicated to handle static links that occur 2375 as part of dynamic link chains. What a pain!!! 2376 2377Tue May 8 23:11:44 1990 Doug Schmidt (schmidt at siam.ics.uci.edu) 2378 2379 * Fixed a stupid bug in Key_List::output_lookup_array that was 2380 causing incorrect counts to be generated when there were both 2381 static and dynamic links occurring for the same hash value. 2382 Also simplified the code that performs the logic in this routine. 2383 2384Mon Apr 30 17:37:24 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) 2385 2386 * Fixed stupid bug in Key_List::output_lookup_array that was 2387 making the generated lookup[] array contain `chars' even 2388 when the values stored in the chars are greater than 127! 2389 2390 * Changed the behavior of the -G (global table) option so that it 2391 will output the `length[]' array in the global scope along with 2392 the `word_list[]' array. 2393 2394 * Fixed a stupid bug in Key_List::output_lookup_function that 2395 would always output the complicated `duplicate-handling' lookup 2396 logic, even when there were no duplicates in the input! 2397 2398 * Yikes, had to modify a bunch of stuff in key-list.cc to correctly 2399 handle duplicate entries. Changed the generated code so that 2400 the MIN_HASH_VALUE is no longer subtracted off when calculating 2401 the hash value for a keyword. This required changing some other 2402 code by substituting MAX_HASH_VALUE for TOTAL_KEYS in several places. 2403 Finally, this means that the generated tables may contain leading 2404 null entries, but I suppose it is better to trade-off space to get 2405 faster performance... 2406 2407Mon Mar 26 13:08:43 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) 2408 2409 * Updated version number to 2.4 to reflect the latest changes. 2410 2411 * Changed the main program so that it always prints out gperf's 2412 execution timings to the generated output file. 2413 2414Sun Mar 25 12:39:30 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) 2415 2416 * Added the -Z option so that users can specify the name of the 2417 generated class explicitly. Updated documentation to reflect 2418 this change. 2419 2420 * Modified the generated C++ class interface so that the functions 2421 are declared static (to remove the overhead of passing the `this' 2422 pointer). This means that operator()() can no longer be used, 2423 since it only works on non-static member functions. 2424 Also changed things so that there is no constructor (why waste 2425 the extra call, when it doesn't do anything, eh?) 2426 2427 * Modified the behavior of Key_List::output when the -L C++ option 2428 is enabled. Previously the code generated use const data members 2429 to record MIN_WORD_LENGTH, MIN_HASH_VALUE, etc. However, as 2430 pointed out by James Clark this may result in suboptimal behavior 2431 on the part of C++ compilers that can't inline these values. 2432 Therefore, the new behavior is identical to what happens with 2433 -L C, i.e., either #defines or function-specific enums are used. 2434 Why sacrifice speed for some abstract notion of `code purity?' ;-) 2435 2436Tue Mar 6 18:17:42 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) 2437 2438 * Added the -E option that defines constant values using an enum 2439 local to the lookup function rather than with #defines. This 2440 also means that different lookup functions can reside in the 2441 same file. Thanks to James Clark (jjc@ai.mit.edu). 2442 2443Sat Mar 3 20:19:00 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) 2444 2445 * Added a special case to key_list::output_switch that doesn't 2446 generate extra comparisons when the `-S' is given an argument 2447 of 1 (the normal case). This should speed up the generated 2448 code output a tad... 2449 2450Fri Feb 23 14:21:28 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) 2451 2452 * Renamed all instances of member function get_keysig_size 2453 to get_max_keysig_size, since this is more precise... 2454 2455 * Changed all occurrences of charset to keysig (stands for ``key 2456 signature'') to reflect the new naming convention used in the 2457 USENIX paper. 2458 2459Thu Feb 22 11:28:36 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) 2460 2461 * Changed the name of the generated associated values table from 2462 asso_value to asso_values to reflect conventions in the USENIX 2463 C++ paper. 2464 2465Thu Feb 15 23:29:03 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) 2466 2467 * Updated the gperf.texinfo file to fix some formatting problems 2468 that had crept in since last time. 2469 2470Wed Feb 14 23:27:24 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) 2471 2472 * Fixed stupid bug in key-list.cc (get_special_input), wher 2473 gperf replaced each '%' with the succeeding character. 2474 2475 * Added support for multiple target language generation. Currently 2476 handled languages are C and C++, with C as the default. Updated 2477 documentation and option handler to reflect the changes. 2478 2479 * Added a global destructor to new.cc and removed the #ifdef, since 2480 the bloody thing now works with libg++. 2481 2482Mon Feb 14 13:00:00 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) 2483 2484 * Found out that my gperf paper was accepted at the upcoming 2485 USENIX C++ Conference in San Francisco. Yow! 2486 2487Tue Jan 30 09:00:29 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) 2488 2489 * #ifdef'd out the new.cc memory allocator, since there are 2490 problems with this and the libg++ stuff. 2491 2492 * Changed key-list.h so that class Vectors is a public (rather 2493 than private) base class for class Key_List. The previous 2494 form was illegal C++, but wasn't being caught by the old 2495 g++ compiler. Should work now... ;-) 2496 2497Sun Dec 10 14:08:23 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2498 2499 * Added several changes from rfg@ics.uci.edu. These changes 2500 help to automate the build process. 2501 2502Wed Nov 15 15:49:33 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) 2503 2504 * Removed conditional compilation for GATHER_STATISTICS. There's 2505 really no good reason to avoid collecting this info at run-time, 2506 since that section of code is *hardly* the bottleneck... ;-) 2507 2508 * Simplified the C output routines in Key_List::set_output_types 2509 and Key_List::output_keyword_table a bit in order to 2510 speed-up and clean up the code generation. 2511 2512 * Modified function Key_List::get_special_input so that it does 2513 not try to `delete' a buffer that turned out to be too short. 2514 This is important since the new memory management scheme 2515 does not handle deletions. However, adding a small amount of 2516 garbage won't hurt anything, since we generally don't do this 2517 operation more than a couple times *at most*! 2518 2519 * Created a new file (new.cc) which includes my own overloaded 2520 operator new. This function should dramatically reduce the 2521 number of calls to malloc since it grabs large chunks and 2522 doles them out in small pieces. As a result of this change 2523 the class-specific `operator new' was removed from class List_Node. 2524 2525Tue Nov 14 21:45:30 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2526 2527 * Continued to refine the great hack. The latest trick is to 2528 try and replace most uses of dynamic memory (i.e., calls to 2529 new) with uses of gcc dynamic arrays (i.e., an alloca solution). 2530 This makes life much easier for the overall process-size, since 2531 it reduces the amount of overhead for memory management. As a 2532 side-effect from this change there is no reason to have the 2533 Bool_Array::dispose member function, so it's outta here! 2534 2535 * Fixed a stupid bug that was an disaster waiting to happen... 2536 Instead of making the boolean array large enough to index 2537 max_hash_value it was only large enough to index max_hash_value 2538 - 1. Once again, an off-by-one mistake in C/C++!!!! 2539 2540Mon Nov 13 19:38:27 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2541 2542 * Added the final great hack! This allows us to generate hash tables 2543 for near-perfect hash functions that contain duplicates, *without* 2544 having to use switch statements! Since many compilers die on large 2545 switch statements this feature is essential. Furthermore, it appears 2546 that the generated code is often *smaller* than that put out by 2547 compilers, even though a large, sparse array must be created. 2548 Here's the general idea: 2549 2550 a. Generate the wordlist as a contiguous block of keywords, 2551 just as before when using a switch statement. This 2552 wordlist *must* be sorted by hash value. 2553 2554 b. Generate the lookup array, which is an array of signed 2555 {chars,shorts,ints}, (which ever allows full coverage of 2556 the wordlist dimensions). If the value v, where v = 2557 lookup[hash(str,len)], is >= 0 and < TOTAL_KEYWORDS, then we 2558 simply use this result as a direct access into the wordlist 2559 array to snag the keyword for comparison. 2560 2561 c. Otherwise, if v is < -TOTAL_KEYWORDS or > TOTAL_KEYWORDS 2562 this is an indication that we'll need to search through 2563 some number of duplicates hash values. Using a hash 2564 linking scheme we'd then index into a different part of 2565 the hash table that provides the starting index and total 2566 length of the duplicate entries to find via linear search! 2567 2568Sun Nov 12 13:48:10 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) 2569 2570 * Simplified Key_List::output_min_max considerably by recognizing 2571 that since the keyword list was already sorted by hash value finding 2572 the min and max values is trivial! 2573 2574 * Improved the debugging diagnostics considerably in classes Key_List, 2575 Hash_Table, and Gen_Perf. 2576 2577 * Modified the `-s' option so that a negative argument is now 2578 interpreted to mean `allow the maximum associated value to be 2579 about x times *smaller* than the number of input keys.' This 2580 should help prevent massive explosion of generated hash table 2581 size for large keysets. 2582 2583Sat Nov 11 11:31:13 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2584 2585 * Added a field in class Key_List that counts the total number 2586 of duplicate keywords, both static and dynamic. 2587 2588 * Added a new member function Bool_Array that deletes the dynamic 2589 memory allocated to Bool_Array::storage_array. This space may 2590 be needed for subsequent options, so it made sense to free it as 2591 soon as possible... 2592 2593 * Renamed file/class Alpha_Vectors to Vectors, to avoid problems 2594 with 14 character length filenames on SYSV. Also changed file 2595 adapredefined.gperf to adadefs.gperf in the ./tests directory. 2596 2597 * Modified class Options by changing the member function 2598 Options::total_positions to Options::get_charset_size and 2599 Options::set_charset_size. These two routines now either return 2600 the total charset size *or* the length of the largest keyword 2601 if the user specifies the -k'*' (ALLCHARS) option. This change 2602 cleans up client code. 2603 2604 * Merged all the cperf changes into gperf. 2605 2606 * Made sure to explicitly initialize perfect.fewest_collisions to 2607 0. 2608 2609 * Cleaned up some loose ends noticed by Nels Olson. 2610 1. Removed `if (collisions <= perfect.fewest_collisions)' 2611 from Gen_Perf::affects_prev since it was superfluous. 2612 2. Removed the fields best_char_value and best_asso_value 2613 from Gen_Perf. There were also unnecessary. 2614 3. Fixed a braino in the Bool_Array::bool_array_reset 2615 function. Since iteration numbers can never be zero 2616 the `if (bool_array.iteration_number++ == 0)' must be 2617 `if (++bool_array.iteration_number == 0).' 2618 4. Modified Std_Err::report_error so that it correctly handles 2619 "%%". 2620 2621 * It is important to note that -D no longer enables -S. 2622 There is a good reason for this change, which will become 2623 manifested in the next release... (suspense!). 2624 2625 * Made some subtle changes to Key_List::print_switch so that if finally 2626 seems to work correctly. Needs more stress testing, however... 2627 2628 * Made a major change to the Key_List::print_switch function. 2629 The user can now specify the number of switch statements to generate 2630 via an argument to the -S option, i.e., -S1 means `generate 1 2631 switch statement with all keywords in it,' -S2 means generate 2632 2 switch statements with 1/2 the elements in each one, etc. 2633 Hopefully this will fix the problem with C compilers not being 2634 able to generate code for giant switch statements (but don't 2635 hold your breath!) 2636 2637 * Changed Key_List::length function to Key_List::keyword_list_length. 2638 2639 * Added a feature to main.c that prints out the starting wall-clock 2640 time before the program begins and prints out the ending wall-clock 2641 time when the program is finished. 2642 2643 * Added the GATHER_STATISTICS code in hash-table.c so we can 2644 keep track of how well double hashing is doing. Eventually, 2645 GATHER_STATISTICS will be added so that all instrumentation 2646 code can be conditionally compiled in. 2647 2648 * Fixed a stupid bug in Key_List::print_switch routine. This 2649 was necessary to make sure the generated switch statement worked 2650 correctly when *both* `natural,' i.e., static links and dynamic 2651 links, i.e., unresolved duplicates, hash to the same value. 2652 2653 * Modified Bool_Array::~Bool_Array destructor so that 2654 it now frees the bool_array.storage_array when it is no longer 2655 needed. Since this array is generally very large it makes sense 2656 to return the memory to the freelist when it is no longer in use. 2657 2658 * Changed the interface to constructor Hash_Table::Hash_Table. This 2659 constructor now passed a pointer to a power-of-two sized buffer that 2660 serve as storage for the hash table. Although this weakens information 2661 hiding a little bit it greatly reduces dynamic memory fragmentation, 2662 since we can now obtain the memory via a call to alloca, rather 2663 than malloc. This change modified Key_List::read_keys calling 2664 interface. 2665 2666 * Since alloca is now being used more aggressively a conditional 2667 compilation section was added in main.c. Taken from GNU GCC, 2668 this code gets rid of any avoidable limit on stack size so that 2669 alloca does not fail. It is only used if the -DRLIMIT_STACK 2670 symbol is defined when gperf is compiled. 2671 2672 * Added warnings in option.c so that user's would be informed 2673 that -r superceeds -i on the command-line. 2674 2675 * Rewrote Gen_Perf::affects_prev. First, the code structure 2676 was cleaned up considerably (removing the need for a dreaded 2677 goto!). Secondly, a major change occurred so that Gen_Perf::affects_prev 2678 returns FALSE (success) when fewest_hits gets down to whatever 2679 it was after inserting the previous key (instead of waiting for 2680 it to reach 0). In other words, it stops trying if it can 2681 resolve the new collisions added by a key, even if there are 2682 still other old, unresolved collisions. This modification was 2683 suggested by Nels Olson and seems to *greatly* increase the 2684 speed of gperf for large keyfiles. Thanks Nels! 2685 2686 * In a similar vein, inside the Gen_Perf::change routine 2687 the variable `perfect.fewest_collisions is no longer initialized 2688 with the length of the keyword list. Instead it starts out at 2689 0 and is incremented by 1 every time change () is called. 2690 The rationale for this behavior is that there are times when a 2691 collision causes the number of duplicates (collisions) to 2692 increase by a large amount when it would presumably just have 2693 gone up by 1 if none of the asso_values were changed. That is, 2694 at the beginning of change(), you could initialize fewest_hits 2695 to 1+(previous value of fewest_hits) instead of to the number of 2696 keys. Thanks again, Nels. 2697 2698 * Replaced alloca with new in the Gen_Perf::change function. 2699 This should eliminate some overhead at the expense of a little 2700 extra memory that is never reclaimed. 2701 2702 * Renamed Gen_Perf::merge_sets to Gen_Perf::compute_disjoint_union 2703 to reflect the change in behavior. 2704 2705 * Added the -e option so users can supply a string containing 2706 the characters used to separate keywords from their attributes. 2707 The default behavior is ",\n". 2708 2709 * Removed the char *uniq_set field from LIST_NODE and modified 2710 uses of uniq_set in perfect.c and keylist.c. Due to changes 2711 to Gen_Perf::compute_disjoint_sets this field was no longer 2712 necessary, and its removal makes the program smaller and 2713 potentially faster. 2714 2715 * Added lots of changes/fixes suggested by Nels Olson 2716 (umls.UUCP!olson@mis.ucsf.edu). In particular: 2717 1. Changed Bool_Array so that it would dynamically create 2718 an array of unsigned shorts rather than ints if the 2719 LO_CAL symbol was defined during program compilation. 2720 This cuts the amount of dynamic memory usage in half, 2721 which is important for large keyfile input. 2722 2. Added some additional debugging statements that print extra 2723 info to stderr when the -d option is enabled. 2724 3. Fixed a really stupid bug in Key_List::print_switch 2725 A right paren was placed at the wrong location, which broke 2726 strlen (). 2727 4. Fixed a subtle problem with printing case values when keylinks 2728 appear. The logic failed to account for the fact that there 2729 can be keylinks *and* regular node info also! 2730 5. Changed the behavior of Key_List::read_keys so that it would 2731 honor -D unequivocally, i.e., it doesn't try to turn off dup 2732 handling if the user requests it, even if there are no 2733 immediate links in the keyfile input. 2734 6. Modified the -j option so that -j 0 means `try random values 2735 when searching for a way to resolve collisions.' 2736 7. Added a field `num_done' to the Gen_Perf struct. This is used 2737 to report information collected when trying to resolve 2738 hash collisions. 2739 8. Modified the merge_sets algorithm to perform a disjoint 2740 union of two multisets. This ensures that subsequent 2741 processing in Gen_Perf::affect_prev doesn't 2742 waste time trying to change an associated value that is 2743 shared between two conflicting keywords. 2744 9. Modified Gen_Perf::affects_prev so that it doesn't try 2745 random jump values unless the -j 0 option is enabled. 2746 10. Fixed a silly bug in Gen_Perf::change. This problem caused 2747 gperf to seg fault when the -k* option was given and the 2748 keyfile file had long keywords. 2749 2750Sun Oct 29 00:18:55 1989 Doug Schmidt (schmidt at siam.ics.uci.edu) 2751 2752 * Modified class-specific new operations for Read_Line and 2753 List_Node so they don't fail if SIZE is larger than twice 2754 the previous buffer size. Note we double buffer size 2755 everytime the previous buffer runs out, as a heuristic 2756 to reduce future calls to malloc. 2757 2758Sun Oct 22 13:49:43 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2759 2760 * Updated gperf version number to 2.0. Send to Doug Lea for 2761 incorporation into the long-awaited `official' libg++ 1.36 2762 release! 2763 2764 * Thanks to Nels Olson a silly bug in Gen_Perf::change () 2765 was fixed. This problem caused gperf to seg fault when 2766 the -k* option was given and the keyfile file had long 2767 keywords. 2768 2769 * Modified Key_List::print_hash_function so that it output 2770 max_hash_value + 1 (rather than just max_hash_value) for 2771 any associated value entries that don't correspond to 2772 keyword charset characters. This should speed up rejection 2773 of non-keyword strings a little in some cases. 2774 2775Sat Oct 21 19:28:36 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) 2776 2777 * Fixed Key_List::print_hash_function so that it no longer output 2778 things like `return 0 + ...' Although this probably gets 2779 optimized away by even the worst C compilers there isn't any 2780 point tempting fate... ;-) 2781 2782 * Fixed class List_Node's constructor so that it wouldn't a priori 2783 refuse to consider trying to hash keys whose length is less 2784 than the smallest user-specified key position. It turns out 2785 this is not a problem unless the user also specifies the -n 2786 (NOLENGTH) option, in which case such keys most likely 2787 don't have a prayer of being hashed correctly! 2788 2789 * Changed the name of the generated lookup table from `Hash_Table' 2790 to `asso_value' to be consistent with the gperf paper. 2791 2792Tue Oct 17 14:19:48 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2793 2794 * Added a flag GATHER_STATISTICS in the Makefile. If defined 2795 during compilation this turns on certain collection facilities 2796 that track the performance of gperf during its execution. In 2797 particular, I want to see how many collisions occur for the 2798 double hashing Hash_Table. 2799 2800 * Added a safety check so that we don't screw up if the total 2801 number of `resets' of the Bool_Array exceeds MAX_INT. Since 2802 this number is around 2^31 it is unlikely that this would ever 2803 occur for most input, but why take the risk? 2804 2805 * Changed the behavior for the -a (ANSI) option so that the 2806 generated prototypes use int rather than size_t for the LEN 2807 parameter. It was too ugly having to #include <stddef.h> all 2808 over the place... 2809 2810Mon Oct 16 11:00:35 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) 2811 2812 * Continued to work on the gperf paper for the USENIX C++ 2813 conference. At some point this will be merged back into 2814 the gperf documentation... 2815 2816Sat Oct 14 20:29:43 1989 Doug Schmidt (schmidt at siam.ics.uci.edu) 2817 2818 * Added a majorly neat hack to Bool_Array, suggested by rfg. 2819 The basic idea was to throw away the Ullman array technique. 2820 The Ullman array was used to remove the need to reinitialize all 2821 the Bool_Array elements to zero everytime we needed to determine 2822 whether there were duplicate hash values in the keyword list. 2823 The current trick uses an `iteration number' scheme, which takes 2824 about 1/3 the space and reduces the overall program running a 2825 time by about 20 percent for large input! The hack works as 2826 follows: 2827 2828 1. Dynamically allocation 1 boolean array of size k. 2829 2. Initialize the boolean array to zeros, and consider the first 2830 iteration to be iteration 1. 2831 2. Then on all subsequent iterations we `reset' the bool array by 2832 kicking the iteration count by 1. 2833 3. When it comes time to check whether a hash value is currently 2834 in the boolean array we simply check its index location. If 2835 the value stored there is *not* equal to the current iteration 2836 number then the item is clearly *not* in the set. In that 2837 case we assign the iteration number to that array's index 2838 location for future reference. Otherwise, if the item at 2839 the index location *is* equal to the iteration number we've 2840 found a duplicate. No muss, no fuss! 2841 2842Mon Oct 2 12:30:54 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2843 2844 * Changed some consts in options.h to enumerals, since g++ 2845 doesn't seem to like them at the moment! 2846 2847Sat Sep 30 12:55:24 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2848 2849 * Fixed a stupid bug in Key_List::print_hash_function that manifested 2850 itself if the `-k$' option was given (i.e., only use the key[length] 2851 character in the hash function). 2852 2853 * Added support for the -C option. This makes the contents of 2854 all generated tables `readonly'. 2855 2856 * Changed the handling of generated switches so that there is 2857 only one call to str[n]?cmp. This *greatly* reduces the size of 2858 the generated assembly code on all compilers I've seen. 2859 2860 * Fixed a subtle bug that occurred when the -l and -S option 2861 was given. Code produced looked something like: 2862 2863 if (len != key_len || !strcmp (s1, resword->name)) return resword; 2864 2865 which doesn't make any sense. Clearly, this should be: 2866 2867 if (len == key_len && !strcmp (s1, resword->name)) return resword; 2868 2869Tue Sep 26 10:36:50 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2870 2871 * Changed class Read_Line's definition so that it no longer 2872 needs to know about the buffering scheme used to speed up 2873 dynamic memory allocation of input keywords and their 2874 associated attributes. This means that operator new is no longer 2875 a friend of Read_Line. 2876 2877Mon Sep 25 23:17:10 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) 2878 2879 * Decided that Obstacks had too much overhead, so they were 2880 removed in favor of super-efficient, low-overhead buffered 2881 storage allocation hacks in Read_Line and List_Node. 2882 2883 * No longer try to inline functions that g++ complains about 2884 (Key_List::Merge and Key_List::Merge_Sort). 2885 2886Sun Sep 24 13:11:24 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2887 2888 * Changed classes Read_Line and List_Node to use Obstacks in order 2889 to cache memory allocation for keyword strings and List_Nodes. 2890 2891 * Continued to experiment with inheritance schemes. 2892 2893 * Added a new file `alpha.h', that declares static data shared 2894 (i.e., inherited) between classes List_Node and Key_List. 2895 2896Tue Sep 12 16:14:41 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2897 2898 * Made numerous changes to incorporate multiple inheritance in 2899 gperf. 2900 2901Wed Aug 16 23:04:08 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2902 2903 * Added the -DCOMPILER_FIXED flag to the ./src/Makefile. This 2904 implies that people trying to compile gperf need to have a 2905 working version of the new g++ compiler (1.36.0). 2906 2907 * Removed some extra spaces that were being added in the generated 2908 C code. 2909 2910Mon Jul 24 17:09:46 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2911 2912 * Fixed PRINT_HASH_FUNCTION and PRINT_LOOKUP_FUNCTION in keylist.c 2913 so that the generated functions take an unsigned int length argument. 2914 If -a is enabled the prototype is (const char *str, size_t len). 2915 2916Fri Jul 21 13:06:15 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) 2917 2918 * Fixed a typo in PRINT_KEYWORD_TABLE in keylist.cc that prevented 2919 the indentation from working correctly. 2920 2921 * Fixed a horrible typo in PRINT_KEYWORD_TABLE in keylist.cc 2922 that prevented links from being printed correctly. 2923 2924Tue Jul 18 16:04:31 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) 2925 2926 * Fixed up readline.cc and readline.h so that they work OK 2927 with g++ compilers that aren't completely up-to-date. 2928 If symbol COMPILER_FIXED is defined then the behavior 2929 that works on my more recent version of g++ is enabled. 2930 2931Sun Jul 9 17:53:28 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2932 2933 * Changed the ./tests subdirectory Makefile so that it 2934 uses $(CC) instead of gcc. 2935 2936Sun Jul 2 21:52:15 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2937 2938 * Fixed a number of subtle bugs that occurred when -S was 2939 combined with various and sundry options. 2940 2941 * Added the -G option, that makes the generated keyword table 2942 a global static variable, rather than hiding it inside 2943 the lookup function. This allows other functions to directly 2944 access the contents in this table. 2945 2946 * Added the "#" feature, that allows comments inside the keyword 2947 list from the input file. Comment handling takes place in readline.c. 2948 This simplifies the code and reduces the number of malloc calls. 2949 2950 * Also added the -H option (user can give the name of the hash 2951 function) and the -T option (prevents the transfer of the type decl 2952 to the output file, which is useful if the type is already defined 2953 elsewhere). 2954 2955Thu Jun 22 20:39:39 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2956 2957 * Modified many classes so that they would inherit Std_Err as 2958 a base class. This makes things more abstract... 2959 2960Fri Jun 16 14:23:00 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) 2961 2962 * Modified the -f (FAST) option. This now takes an argument. 2963 The argument corresponds to the number of iterations used 2964 to resolve collisions. -f 0 uses the length of the 2965 keyword list (which is what -f did before). This makes 2966 life much easier when dealing with large keyword files. 2967 2968Tue Jun 6 17:53:27 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 2969 2970 * Added the -c (comparison) option. Enabling this 2971 will use the strncmp function for string comparisons. 2972 The default is to use strcmp. 2973 2974 * Fixed a typo in key_list.cc (PRINT_SWITCH). This caused 2975 faulty C code to be generated when the -D, -p, and -t 2976 options were all enabled. 2977 2978Thu May 25 14:07:21 1989 Doug Schmidt (schmidt at siam.ics.uci.edu) 2979 2980 * Once again, changed class Read_Line to overload global operator 2981 new. Hopefully, this will work...! 2982 2983Sun May 21 01:51:45 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) 2984 2985 * Modified Key_List::print_hash_function () so that it properly 2986 formats the associated values in the hash table according to 2987 the maximum number of digits required to represent the largest 2988 value. 2989 2990 * Removed the named return value from class Hash_Table's 2991 operator (), since this causes a seg fault when -O is enabled. 2992 No sense tripping subtle g++ bugs if we don't have to.... ;-) 2993 2994 * Removed the operator new hack from Read_Line, since this seemed 2995 to create horrible bus error problems. 2996 2997 * Changed many class member functions and data members to be `static', 2998 if they don't manipulate this! 2999 3000Fri May 12 23:06:56 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 3001 3002 * Changed class Std_Err to use static member functions, a la 3003 Ada or Modula 2. This eliminates the need for an explicit 3004 error-handler class object. 3005 3006 * Added the ``named return value'' feature to Hash_Table::operator () 3007 and Bool_Array::operator [], just for the heck of it.... ;-) 3008 3009 * Changed the previous hack in Read_Line so that we now use 3010 the overloaded global `new' instead of NEW_STRING! 3011 3012Wed May 3 17:36:55 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) 3013 3014 * Updated to version 1.7. This reflects the recent major changes 3015 and the new C port. 3016 3017 * Modified the GNU getopt.cc routine to have a class-based interface. 3018 3019 * Fixed a typo in Perfect.cc ~Perfect that prevented the actual maximum 3020 hash table size from being printed (maybe the stream classes 3021 weren't so bad after all.... ;-). 3022 3023 * Added support for the -f option. This generates the perfect 3024 hash function ``fast.'' It reduces the execution time of 3025 gperf, at the cost of minimizing the range of hash values. 3026 3027Tue May 2 16:23:29 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) 3028 3029 * Added an efficiency hack to Read_Line. Instead of making 3030 a call to operator NEW (a.k.a. malloc) for each input string 3031 a new member function NEW_STRING stores a large buffer from 3032 which new strings are carved out, growing the buffer if 3033 necessary. It might be useful to add this throughout the 3034 program.... 3035 3036 * Removed all unnecessary calls to DELETE. If the program is about 3037 to exit it is silly to waste time freeing memory. 3038 3039 * Added the GNU getopt program to the distribution. This makes 3040 GPERF portable to systems that don't include getopt in libc. 3041 3042 * Added a strcspn member to class Key_List. This also increases 3043 portability. 3044 3045 * Added the get_include_src function from keylist.c as a member 3046 function in class Key_List. Hopefully every function is 3047 now associated with a class. This aids abstraction and 3048 modularity. 3049 3050 * Ported gperf to C. From now on both K&R C and GNU G++ versions 3051 will be supported. There will be two ChangeLog files, one 3052 for each version of the program. 3053 3054Mon May 1 16:41:45 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 3055 3056 * Fixed a bug with -k'*'. This now prints out *all* the cases 3057 up to the length of the longest word in the keyword set. 3058 3059Sun Apr 30 12:15:25 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) 3060 3061 * Removed all use of the stream classes. Too ugly, slow, and 3062 not handled by the c++-mode formatter.... 3063 3064 * Modified the handling of links (i.e., keywords that have 3065 identical hash values as other keywords). This should 3066 speed up hash function generation for keyword sets with 3067 many duplicate entries. The trick is to treat duplicate 3068 values as equivalence classes, so that each set of duplicate 3069 values is represented only once in the main list processing. 3070 3071 * Fixed some capitialization typos and indentations mistakes in 3072 Key_List::print_hash_function. 3073 3074Sat Apr 29 12:04:03 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) 3075 3076 * Fixed a typo/logico in Key_List::print_switch that prevented 3077 the last keyword in the keyword list to be print out. This 3078 requires further examination..... 3079 3080 * Fixed a stupid bug in List_Node::List_node. If the -k'*' option 3081 was enabled the KEY_SET string wasn't getting terminated with 3082 '\0'! 3083 3084Fri Apr 28 12:38:35 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 3085 3086 * Renamed strexp.h and strexp.cc to iterator.h and iterator.cc. 3087 Also changed the strexp class to iterator. Continued to work 3088 on style... 3089 3090 * Updated the version number to 1.6. This reflects all the 3091 recent changes. 3092 3093Thu Apr 27 00:14:51 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 3094 3095 * Added the -D option that properly handles keyword sets that 3096 contain duplicate hash values. 3097 3098 * Continued the stylistic changes. Added the #pragma once 3099 directive to all the *.h files. Removed all #defines and 3100 replaced them with static consts. Also moved the key_sort 3101 routine from options.cc into the options class as a 3102 member function. 3103 3104Mon Apr 3 13:26:55 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) 3105 3106 * Made massive stylistic changes to bring source code into 3107 conformance with GNU style guidelines. 3108 3109Thu Mar 30 23:28:45 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) 3110 3111 * Fixed up the output routines so that they generate code 3112 corresponding to the GNU style guidelines. 3113 3114Sat Mar 11 13:12:37 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 3115 3116 * Fixed Stderr constructors so that they wouldn't try to 3117 use the base class initializer syntax for the static 3118 class variable Program_Name. G++ 1.34 is stricter in 3119 enforcing the rules! 3120 3121Fri Mar 10 11:24:14 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 3122 3123 * Removed -v and ``| more'' from the Makefile to keep rfg happy... 3124 3125Thu Mar 2 12:37:30 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) 3126 3127 * Sent latest GNU gperf version 1.5 to Doug Lea for inclusion 3128 into libg++ 1.34. Note that there is a small bug with 3129 the new %{ ... %} source inclusion facility, since it doesn't 3130 understand comments and will barf if %{ or %} appear nested 3131 inside the outermost delimiters. This is too trivial of 3132 a defect to fix at the moment... 3133 3134Tue Feb 28 11:19:58 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 3135 3136 * Added the -K option, which allows the user to provide a 3137 alternative name for the keyword structure component. 3138 The default is still ``name.'' 3139 3140 * Added the LEX and YACC-like ability to include arbitrary 3141 text at the beginning of the generated C source code output. 3142 This required two new functions Get_Special_Input, 3143 Key_List::Save_Include_Src; 3144 3145 * Fixed memory allocation bug in Key_List::Set_Types. 3146 Variable Return_Type needs 1 additional location 3147 to store the "*" if the -p option is used. 3148 3149 * Added code to NULL terminate both Struct_Tag and Return_Type, 3150 *after* the strncpy (stupid mistake). 3151 3152Mon Feb 27 14:39:51 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 3153 3154 * Added a new option -N. This allows the user to specify the 3155 name to be used for the generated lookup function. The 3156 default name is still ``in_word_set.'' This makes it 3157 possible to completely automate the perfect hash function 3158 generation process! 3159 3160Mon Feb 20 23:33:14 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 3161 3162 * Corrected the Hash_Table::operator () function so that 3163 *it* is responsible for deciding when a new key has the 3164 same signature as a previously seen key. The key length 3165 information is now used internally to this function to 3166 decide whether to add to the hash table those keys with 3167 the same key sets, but different lengths. Before, this 3168 was handled by the Key_List::Read_Keys function. However, 3169 this failed to work for certain duplicate keys, since 3170 they weren't being entered into the hash table properly. 3171 3172Sun Feb 19 16:02:51 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 3173 3174 * Modified class Options by moving the enum Option_Type out 3175 of the class. This is to satisfy the new enumeration 3176 scope rules in C++. 3177 3178Sun Jan 15 15:12:09 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) 3179 3180 * Incremented the version number upto 1.4 to reflect the new 3181 options that affect the generated code. Send the new 3182 distribution off to Michael for use with g++ 1.33. 3183 3184 * Added a fix to Key_List::Read_Keys so that it checks for links 3185 properly when the -n option is used. Previously, it didn't 3186 catch obvious links, which caused it to spend large amount 3187 of time searching for a solution that could never occur! 3188 3189 * Modified the Key_List data structure to record *both* the 3190 minimum and the maximum key lengths. This information 3191 is now computed in Key_List::Read_Keys, and thus 3192 Key_List::Print_Min_Max doesn't need to bother. 3193 3194 * Modifed the key position iterator scheme in options.cc to 3195 eliminate the need for member function Options::Advance. 3196 Now, the Options::Get function performs the advancement 3197 automatically, obviating the need for an extra function call. 3198 3199 * Added the new function Options::Print_Options, to print out 3200 the user-specified command line options to generated C 3201 output file. 3202 3203 * Added a new function, Key_List::Print_Keylength_Table, 3204 which creates a table of lengths for use in speeding 3205 up the keyword search. This also meant that a new 3206 option, -l (LENTABLE) is recognized. It controls 3207 whether the length table is printed and the comparison 3208 made in the generated function ``in_word_set.'' 3209 3210 * Added a comment at the top of the generated C code 3211 output file that tells what version of gperf was used. 3212 Next, I'll also dump out the command line options 3213 as a comment too. Thanks to Michael Tiemann for the 3214 feedback on this. 3215 3216 * Fixed the -n option to make it work correctly with 3217 other parts of the program (most notably the Perfect::Hash 3218 function and the computation of minimum and maximum lengths. 3219 3220Fri Jan 13 21:25:27 1989 Doug Schmidt (schmidt at siam.ics.uci.edu) 3221 3222 * Realized the the need to add a test that will enable 3223 optimziation of the generated C code in the ``hash'' function 3224 by checking whether all the requested key positions are 3225 guaranteed to exist due to the comparison in `in_word_set.'' 3226 I'll put this in soon.... 3227 3228Thu Jan 12 20:09:21 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 3229 3230 * Added pascal, modula3, and modula2 tests inputs to the 3231 Makefile 3232 3233 * Recognised that there is a bug with the -n option. However 3234 I'm too busy to fix it properly, right now. The problem 3235 is that the generated #define end up being 0, since that's 3236 my hack to make -n work. This needs complete rethinking! 3237 3238Tue Jan 10 00:08:16 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) 3239 3240 * Added a new option, -n, that instructs gperf to not use the 3241 length of an identifier when computing the hash functions. 3242 I'm not sure how useful this is! 3243 3244 * Retransmitted the distribution to rocky.oswego.edu. Hopefully, 3245 this will work! 3246 3247 * Began fixing the indentation and capitalization to conform 3248 to the GNU coding guidelines. 3249 3250Mon Jan 9 22:23:18 1989 Doug Schmidt (schmidt at pompe.ics.uci.edu) 3251 3252 * Fixed horrible bug in Read_Line::Readln_Aux. This was 3253 a subtle and pernicous off-by-1 error, that overwrote 3254 past the last character of the input string buffer. I 3255 think this fault was killing the vax! 3256 3257 * Yow, fixed an oversight in List_Node::List_Node, where the 3258 pointer field Next was uninitialized. Luckily, the new routine 3259 seems to return 0 filled objects the first time through! 3260 3261Sun Jan 8 13:43:14 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) 3262 3263 * Modified the ``key linked'' diagnostic in Key_List::Read_Keys 3264 to be more helpful and easy to read. 3265 3266 * Fixed the List_Node::List_Node so that it would ignore trailing 3267 fields if the -t option was not enabled. 3268 3269 * Moved the List_Node declarations out of keylist.h and 3270 into a file of its own, called listnode.cc and listnode.h 3271 Made Set_Sort a member function of class List_Node. 3272 3273 * Massively updated the documentation in the gperf.texinfo file. 3274 3275 * Polished off the major revision to the print functions, 3276 added a few new tests in the Makefile to check for the 3277 validity of the program and ftp'ed the entire distribution 3278 off to Doug Lea for libg++. ( changed it to 3279 1.3 to reflect the major changes with the generated 3280 C code ). 3281 3282 * Fixed Key_List::Print_Switch to deal with the -p and -t options. 3283 This meant that the ``still-born'' function Key_List:: 3284 Print_Type_Switch was superflous, so I removed it. 3285 Also, removed the restriction in Option that the -p and 3286 -t options couldn't be used simultaneously. 3287 3288 * Modified List_Node::List_Node, to perform only 1 call to 3289 ``new'' when dynamically allocating memory for the Key_Set 3290 and the Uniq_Set. 3291 3292Sat Jan 7 14:10:51 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) 3293 3294 * Fixed a big bug with the new policy of nesting the 3295 wordlist inside of generated function ``in_word_set.'' 3296 I'd forgotten to declare the wordlist array as static! 3297 ( arrgh ). 3298 3299 * Added a new function Key_List::Set_Types, that figures out 3300 the return type for generated function ``in_word_set,'' 3301 the user-defined ``struct tag,'' if one is used, and also 3302 formates the array type for the static local array. 3303 3304 * Changed the print routines to take advantage of the 3305 new -p option. 3306 3307 * Began adding the hooks to allow the return of a pointer 3308 to a user defined struct location from the generated 3309 ``in_word_set'' function instead of the current 0 or 1 3310 return value. Created function Key_List::Print_Type_Switch 3311 and added option -p to class Option, allowing the user to 3312 request generation of the aforementioned pointers returned 3313 instead of booleans. 3314 3315 * Put in checks in class Option to make sure that -S and -t 3316 options are not used simultaneously. This restriction 3317 will be removed in subsequent releases, once I decide on 3318 a clean way to implement it. 3319 3320 * Sent version 1.2 to Doug Lea for possible inclusion into 3321 the libg++ distribution. 3322 3323 * Moved the static word_list array inside the generated function 3324 in_word_set. This supports better data hiding. 3325 3326 * Added a texinfo file, gperf.texinfo 3327 3328 * Revised the Makefile to cleanup the droppings from texinfo 3329 and changed the name of gperf.cc and gperf.h to perfect.cc 3330 and perfect.h. 3331 3332Fri Jan 6 13:04:45 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) 3333 3334 * Implemented the switch statement output format. Much better 3335 for large datasets in terms of space used. 3336 3337 * Added new functions to break up the Key_List::Output function. 3338 Functions added were Key_List::Print_Switch, Key_List::Print_Min_Max, 3339 Key_List::Print_Keyword_Table, Key_List::Print_Hash_Function, 3340 and Key_List::Print_Lookup_Function. This simplifies the 3341 big mess in Key_List::Output considerably! 3342 3343 * Added switch statement option to Options, which potentially 3344 trades time for space in the generated lookup code. 3345 3346Thu Jan 5 22:46:34 1989 Doug Schmidt (schmidt at siam.ics.uci.edu) 3347 3348 * Released version 1.1 3349 3350 * Fixed a bug with Gperf::Merge_Set, it was skipping letters shared 3351 between the Set_1 and Set_2. 3352 3353 * Added the optimal min/max algorithm in Key_List::Output. This 3354 runs in O ( 3n/2 ), rather than O ( 2n ) time. 3355 3356 * Changed Gperf::Sort_Set to use insertion sort, rather than 3357 bubble sort. 3358 3359 * Added a check in Key_List::Output for the special case where 3360 the keys used are 1,$. It is possible to generate more 3361 efficient C code in this case. 3362