summaryrefslogtreecommitdiff
path: root/apps/gperf/ChangeLog
blob: 1aec5ddb8e64d6366af979471680ac42b1700602 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
Tue Jun 17 11:38:36 2003  Douglas C. Schmidt  <schmidt@macarena.cs.wustl.edu>

	* src/Gen_Perf.cpp (run): 
	* src/Key_List.cpp (already_determined): 
	* src/List_Node.cpp (List_Node): Added casts to prevent GCC 3.3
	  from complaining about stupid stuff...  Thanks to Bala for
 	  reporting this.

Sun Jul 28 17:04:54 2002  Douglas C. Schmidt  <schmidt@ace.cs.wustl.edu>

	* src/gperf.cpp (main): Only generate the timestamps if the
	  DEBUGGING option ('-d') is enabled.  Thanks to Kier Schmitt
 	  <SchmittKC@kpt.nuwc.navy.mil> for this suggestion.

Tue Feb 26 23:15:47 2002  Ossama Othman  <ossama@uci.edu>

	* gperf.texi:

	  Added missing "@dircategory" entry.  It is required for proper
	  installation when using `install-info'.

	  Use "@direntry" instead of "{START,END}-INFO-DIR-ENTRY"
	  directly.

	* gperf.info:

	  Regenerated this file.

Mon Jan 14 14:43:53 2002  Carlos O'Ryan  <coryan@uci.edu>

	* tests/Makefile:
	  Re-generate dependencies.

Mon Dec 24 12:47:27 2001  Carlos O'Ryan  <coryan@uci.edu>

	* src/Options.cpp:
	  Add temporary fix until something better shows up, at least it
	  compiles this way!

Sat Sep 22 09:06:10 2001  Douglas C. Schmidt  <schmidt@macarena.cs.wustl.edu>

	* src/Makefile: Removed the rules.lib.GNU file since it didn't
	  seem to be needed and was causing problems for MinGW.  Thanks to
 	  Jeff McNiel <JMcNiel@datacrit.com> for reporting this.

Wed Sep 19 02:29:37 2001  Carlos O'Ryan  <coryan@uci.edu>

        * tests/Makefile:
          Another minor problem in the generated Makefile, i.e. the script
          continues to break for filenames that contain a '+' sign in them.

Wed Sep 12 16:06:46 2001  Krishnakumar B  <kitty@cs.wustl.edu>

        * tests/Makefile:

          Added missing dependency in runtests and entry in realclean for
          taoout. This fixes a long standing nagging problem.

Sat Sep  8 22:40:21 2001  Krishnakumar B  <kitty@cs.wustl.edu>

        * src/Key_List.cpp (output_lookup_array):

          Removed a compilation warning on 64-bit Linux.

Sun Jul 29 12:17:55 2001  Douglas C. Schmidt  <schmidt@ace.cs.wustl.edu>

        * The following changes fix a bug reported by Karl Proese
          <karl.proese@mchp.siemens.de> and Jeff Parsons.

        * tests: Patched the *.exp files to include the new WORDLIST_SIZE
          macro.

        * src/Key_List.cpp: Generate a new const/enum that defines the
          size of the wordlist array.  This is now used to fix a nasty bug
          where MAX_HASH_VALUE was used instead of WORDLIST_SIZE.

        * src/Key_List.cpp (output_lookup_array): Reformatted the
          debugging output to make it easier to tell what's going on.

        * tests/tao.exp: Updated this file based on the expected output of
          the new test example.

        * tests/tao.gperf: Updated this to use a different set of keys since
          they exercise the range of screwy inputs better than the earlier
          contents of this file.  In particular, this should detect
          certain nasty bugs that were plaguing GPERF earlier for keyword
          sets with a large number of duplicates.

        * src/Key_List.cpp (read_keys): Clarified the debugging message
          to indicate the key links are *static*.

        * src/Options.cpp (parse_args): Fixed a stupid typo...

Sun Jul  1 08:33:56 2001  Douglas C. Schmidt  <schmidt@tango.doc.wustl.edu>

        * tests/Makefile: For some strange reason there was a BIN2 macro
          but no BIN macro, which caused problems...

        * tests: Added support to check for the condition that caused
          TAO's IDL compiler to break on keylists that have a large number
          of duplicates!

        * src/Key_List.cpp (output_lookup_function): Fixed a tiny mistake
          where "slot < MAX_HASH_VALUE" should have been "slot <=
          MAX_HASH_VALUE".  Thanks to Vsevolod Novikov
          <novikov@df.nnov.rfnet.ru> and Jeff Parsons
          <parsons@cs.wustl.edu> for helping to track this down.

Sat Jun  2 13:30:30 2001  Douglas C. Schmidt  <schmidt@tango.doc.wustl.edu>

        * src/Makefile (INSTALL): Fixed several minor problems with the
          Makefile so that this will build correctly on mingw.  Thanks to
          Cristian Ferretti <cristian_ferretti@yahoo.com> for pointing
          this out.

Fri Mar 30 11:30:54 2001  Carlos O'Ryan  <coryan@uci.edu>

        * tests/Makefile:
          And we need to patch dependencies yet another time.

Wed Jan 24 13:44:53 2001  Carlos O'Ryan  <coryan@uci.edu>

        * tests/Makefile:
          And I got nailed by the same problem again:
          Just doing 'make depend' generates invalid dependencies for some
          reason, had to manually patch them.

Mon Oct 16 10:34:06 2000  Carlos O'Ryan  <coryan@uci.edu>

        * tests/Makefile:
          Just doing 'make depend' generates invalid dependencies for some
          reason, had to manually patch them.

Fri Apr 21 20:33:11 2000  Carlos O'Ryan  <coryan@uci.edu>

        * tests/Makefile:
          Add dependencies for the runtest rule, otherwise parallel builds
          fail.

Thu Apr 20 09:04:27 2000  Carlos O'Ryan  <coryan@uci.edu>

        * tests/Makefile:
          Just running 'make depend' on this file introduces an spurious
          'c++' string in the middle of the dependencies.  Have no time to
          figure out why.

Wed Mar  8 17:26:22 2000  Ossama Othman  <ossama@uci.edu>

        * src/Key_List.cpp (Key_List, ~Key_List, output_types):

          Fixed memory leaks related to lack of deallocation of variables
          that were initialized with static strings, and then
          reinitialized with strings that were dynamically allocated.
          [Bug 334]

Tue Feb 22 18:25:02 2000  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * src/Key_List.cpp,
          src/Bool_Array.cpp,
          src/Gen_Perf.cpp,
          src/Hash_Table.cpp,
          src/Options.h,
          src/Options.cpp: Renamed the DEBUG enum to DEBUGGING enum
          to avoid problems with -DDEBUG is enabled.  Thanks to
          Tobin Bergen-Hill <tbhill@dctd.saic.com> for reporting this.

Sat Nov 13 18:43:53 1999  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * src/Key_List.cpp: The code for output_lookup_function() was
          not being called if option[GLOBAL] was set.  Thanks to Eugene
          Surovegin <ebs@glasnet.ru> for reporting the bug and the fix.

Tue Aug 31 14:47:06 1999  Pradeep Gore  <pradeep@flamenco.cs.wustl.edu>

        * Makefile:
          Fix for Bug#:250 - The Makefile now uses ACE's build commands.
          This also gets rid of the build warning on egcs when compiling
          with repo=1. Thanks to David, Ossama, Bala and Yamuna.

Thu Jul  1 09:31:32 1999  Carlos O'Ryan  <coryan@cs.wustl.edu>

        * Makefile:
          If we are cross compiling we shouldn't compile gperf, it is not
          going to help anyway, because we could not run it.

Sun Jun 27 20:40:30 1999  Douglas C. Schmidt  <schmidt@ace.cs.wustl.edu>

        * src/Key_List.cpp: Added some initializers to keep EGCS from
          complaining.

Wed Jun 23 07:24:58 1999  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * src/Key_List.cpp (output_hash_function): Use conditional
          compilation rather than a runtime check to test if
          ACE_STANDARD_CHARACTER_SET_SIZE == ACE_EBCDIC_SIZE.  This
          suppresses a warning on DEC UNIX.  Thanks to David Levine for
          reporting this.

Fri Jun 18 16:54:43 1999  Irfan Pyarali  <irfan@cs.wustl.edu>

        * apps/gperf/src/Key_List.cpp (output_lookup_array): Prefixed
          debug message with "GPERF".

Thu Jun 17 18:04:30 1999  Douglas C. Schmidt  <schmidt@mambo.cs.wustl.edu>

        * tests/test-[1-5].exp: Fixed all the tests to account for the new
          EBCDIC output.

Thu Jun 17 17:25:00 1999  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * src/Key_List.cpp (output_hash_function): Generate an asso_values
          table that will have the appropriate values for both EBCDIC or
          ASCII, depending on the platform.

        * src/Key_List.cpp (output_hash_function),
          src/Gen_Perf.cpp (Gen_Perf),
          src/Vectors.h: Replaced the use of ALPHA_SIZE with
          ACE_STANDARD_CHARACTER_SET_SIZE, which works correctly for
          EBCDIC platforms, as well as ASCII ones.  Thanks to
          Jim Rogers  <jrogers@viasoft.com> for this suggestion.

Wed Jun 16 19:08:01 1999  Alexander Babu Arulanthu  <alex@cs.wustl.edu>

        * src/Key_List.cpp: Fixed the key_word table generation so that it
          generates the "default fill" string for the null entries in the
          table. Thanks to Irfan and Naga for helping in this.

Sun Jun  6 15:47:23 1999  Douglas C. Schmidt  <schmidt@danzon.cs.wustl.edu>

        * src/Key_List.cpp (output_switch): Make sure to generate "const
          char *resword;" rather than "char *resword" since otherwise C++
          compilers correctly complain.

        * tests: Fixed a bunch of warnings related to misuses of "const
          char *".

Sun Jun  6 10:30:09 1999  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * tests/test-4.exp: Fixed another use of "index".  Thanks to David
          Levine for reporting this.

Sat Jun  5 23:17:39 1999  Douglas C. Schmidt  <schmidt@danzon.cs.wustl.edu>

        * Replaced all uses of "index" with "slot" to avoid problems with
          broken C++ compilers that define a macro called "index".

Tue May  4 14:24:27 1999  Alexander Babu Arulanthu  <alex@cs.wustl.edu>

        * src/Options.cpp (parse_args): Removed %a flag from -v option and
          used ACE_OS::exit (0) instead.

Mon Apr 26 15:42:54 1999  Ossama Othman  <othman@cs.wustl.edu>

        * tests/test-{1,2,3,4,5}.exp: Forgot to update the expected test
          output to reflect the version string update listed below.

Mon Apr 26 10:42:08 1999  Ossama Othman  <othman@cs.wustl.edu>

        * src/Version.cpp (version_string): Updated version string to "2.8
          (ACE version)" since 2.7 is used by the old Cygnus maintained
          gperf.

        * src/*.{h,cpp}: Updated copyright/distribution information to GPL
          v2 style notice.

Sun Apr 25 16:16:12 1999  Ossama Othman  <othman@cs.wustl.edu>

        * mdate-sh: Added this file to the CVS repository.  It will be
          used once the auto{conf,make} integrations are in place.

Sun Apr 25 16:13:40 1999  Ossama Othman  <othman@cs.wustl.edu>

        * COPYING: Updated to GPL version 2.

Sat Apr 24 18:18:35 1999  Ossama Othman  <othman@cs.wustl.edu>

        * gperf.1:
        * gperf.info:
        * gperf.texi: Added missing quote, cosmetic fix, regenerated
          gperf.info.

        * src/Key_List.cpp
        * src/Options.h:
        * src/Options.cpp: Merged Cygnus patch that allows the user to
          specify a default fill expression/value in the keyword table.
          Updated help message with new `-F' option.  Made some cosmetic
          fixes to the help message, too.

        * tests/test.cpp: Minor spelling correction in comment

        * tests/test-6.exp: Updated with new expected gperf output.

Mon Nov  9 23:37:09 1998  Vishal Kachroo <vishal@cs.wustl.edu>

        * src/Key_List.cpp: Fixed the problem with Binary and Linear
          Search code.

Sat Oct 10 18:40:56 1998  Vishal Kachroo  <vishal@merengue.cs.wustl.edu>

        * tests/test-6.exp (Usage): copied the output of gperf -h option
          into test-6.exp. This test was failing because it didn't have
          the -b option previously. Thanks to David for reporting the
          failure of tests.

        * src/Options.cpp : Changed the option case 'h' to include the
          following line " -b/t Code for Linear Search".

Fri Oct  9 01:06:56 1998  Alexander Babu Arulanthu  <alex@cs.wustl.edu>

        * src/Options.cpp :
        * src/Key_List.cpp (output_linear_search_function): Changed option
          -z to -b for generating linear search. Removed <len> parameter
          from the lookup code. We dont need <len> in the generated code
          in the case of linear/binary search options.

Thu Oct  8 17:40:19 1998  Vishal Kachroo  <vishal@merengue.cs.wustl.edu>

        * src/Gen_Perf.cpp (run): added the linear search changes.
        * src/Gen_Perf.h        : added the linear search changes.
        * src/Options.cpp       : added the linear search changes.
        * src/Options.h         : added the linear search changes.
        * src/Key_List.cpp      : added the linear search changes.
        * src/Key_List.h        : added the linear search changes.


Wed Oct  7 01:20:35 1998  Alexander Babu Arulanthu  <alex@cs.wustl.edu>

        * tests/test-6.exp:
          Updated thif file to the current help message. Thanks to Hans
          for reporting this.

Tue Oct  6 11:51:47 1998  Alexander Babu Arulanthu  <alex@cs.wustl.edu>

        * src/Key_List.cpp (Key_List): Fixed g++ warnings.

Tue Oct  6 02:48:37 1998  Alexander Babu Arulanthu  <alex@cs.wustl.edu>

        Thanks to Vishal the following things have been done to get Binary
        Search code generated from GPERF.

        * src/Options.cpp (parse_args): Added the -B option for the binary
          search.

        * src/Options.h (enum Option_Type): Added the BINARYSEARCH in the
          enumeration.

        * src/Key_List.cpp : Added the function
          output_binary_search_function(void). Changed the output function
          to include the Binary Search option.  Used option[BINARYSEARCH]
          to distinguish the binary search case from the hashing case.

        * src/Key_List.h : Added the prototype for
          output_binary_search_function.  Also added the key_sort variable
          to enable sorting based on key values.

Mon Oct  5 18:24:15 1998  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * src/Gen_Perf: Created a new function that allows us to split the
          binary search and perfect hash logic apart.  Thanks to Vishal
          and Alex for reporting this.

        * src/Key_List.cpp (dump): Fixed the unsigned problems with line
          1502 YET again...  Thanks to David/Darrell for reporting this.

Sun Oct  4 20:42:56 1998  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * src: Fixed yet another problem with switching from array-based
          lookups to switch-based lookups.  Thanks to Carlos for reporting
          this.

Sat Oct  3 19:36:52 1998  Alexander Babu Arulanthu  <alex@cs.wustl.edu>

        * src/Options.h:
        * src/Options.cpp:
        * src/Key_List.h:
        * src/Key_List.cpp: Reverted all the changes done for Binary
          Search.

Sat Oct  3 17:51:10 1998  Carlos O'Ryan  <coryan@cs.wustl.edu>

        * tests/test-6.exp: Added the new -B option.

Sat Oct  3 13:47:40 1998  Alexander Babu Arulanthu  <alex@cs.wustl.edu>

        * src/Key_List.cpp (output_binary_search_function): Added a new
          line after binary search code.

Sat Oct  3 10:11:15 1998  Alexander Babu Arulanthu  <alex@cs.wustl.edu>

        * src/Options.cpp (parse_args): Changed the option for binary
          search to '-B'

Fri Oct  2 21:38:54 1998  Vishal Kachroo  <vishal@merengue.cs.wustl.edu>

        * src/Options.cpp (parse_args): Added the -b option for the binary
          search.

        * src/Options.h (enum Option_Type): Added the BINARYSEARCH in the
          enumeration.

        * src/Key_List.cpp : Added the function
          output_binary_search_function (void). Changed the output
          function to include the Binary Search option.  Used
          option[BINARYSEARCH] to distinguish the binary search case from
          the hashing case.

        * src/Key_List.h : Added the prototype for
          output_binary_search_function.  Also added the key_sort variable
          to enable sorting based on key values.

Thu Oct  1 12:40:59 1998  Alexander Babu Arulanthu  <alex@cs.wustl.edu>

        * src/Options.cpp (parse_args): Comments for Vishal to incorporate
          Binary Seach on to GPERF.

Wed Sep 30 16:55:53 1998  Carlos O'Ryan  <coryan@cs.wustl.edu>

        * tests/Makefile: Updated dependencies, added a realclean target
          to remove the output from the tests.

Wed Sep 30 12:41:29 1998  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * src/Key_List.cpp (dump): Fixed another signed/unsigned int
          mismatch.  Thanks to David Levine for reporting this.

Mon Sep 28 13:18:05 1998  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * tests: Updated all the test-*.exp files to reflect the latest
          "unsigned" changes.

        * src/Key_List.cpp (output_hash_function): Fixed another use of
          int to be unsigned int.

        * tests/test.cpp: Fixed the signature of in_word_set() to be
          consistent with the new gperf.  Thanks to David Levine and
          Carlos O'Ryan for this fix.

Sun Sep 27 00:04:18 1998  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * src/Key_List.cpp (dump): Reverted back to using int for
          keyword_width to keep certain compilers happy.  Thanks to David
          Levine for reporting this.

        * src/Key_List: MAke sure that we don't generate the lookup table
          twice if we're forced to change to the switch format.

        * src/Key_List: Replaced the use of "int" with "unsigned int" for
          parameters and hash values.

        * src/Key_List: Fixed the code so that if we change over to using
          the switch statement then we use the already generated keyword
          table appropriately.  This prevents unnecessary warnings from
          some C++ compilers.  Thanks to David Levine for reporting this.

        * src/Key_List.cpp (output): If it's not possible to use the
          lookup_array implementation of -D (e.g., because there aren't
          enough empty slots in the lookup_array), then default to using
          -S1 option...  This fixes a nasty bug that's been in gperf for
          years....

        * src/Key_List.cpp: (output_lookup_array): Added a "return 0" to
          make the C++ compiler happy.  Thanks to David for noticing this.

        * tests/c++-res.exp: Added a new test for C++ keywords.

        * tests/corba.gperf: Added a proper test for CORBA keywords.

Sat Sep 26 15:32:56 1998  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * src/Hash_Table.cpp (find): Fixed a bug in the increment
          computation that arose if the -n option was given.

        * src: Removed all set_ and get_ prefixes to be more consistent
          with ACE programming guidelines.

        * src: GPERF now Purifies cleanly.

        * src/Gen_Perf: Cleaned up the code so that if errors occur they
          get handled properly.

        * src/List_Node: Added a destructor to remove the memory when
          we're done.

        * src: Continued to tidy up the source code so that it is better
          designed and Purifies cleanly on shutdown.

        * src/Makefile: Removed the need for libGperf.{a,so}.

        * src/Key_List: Changed read_keys() to return a value so that we
          can check for errors.

Fri Sep 25 08:54:41 1998  David L. Levine  <levine@cs.wustl.edu>

        * src/Key_List.cpp (Key_List ctor): reordered initializers to
          match declaration order.

Thu Sep 24 18:20:36 1998  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * src/Key_List: Changed char_set field to keysig to be consistent
          with the paper.

        * src/Hash_Table: Renamed operator() to find().  What the heck was
          I thinking in '92?!

        * src/gperf.cpp (main): Removed the LARGE_STACK_ARRAYS option.
          This was annoying...

Tue Sep 22 21:30:59 1998  David L. Levine  <levine@cs.wustl.edu>

        * tests/corba.exp: added this file, it hadn't been checked in.

Tue Sep 22 18:02:01 1998  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * tests/Makefile: Added a new test for CORBA keywords.

        * tests: Added a new test for the type of input that is causing
          problems with TAO's IDL compiler.

        * src/Key_List.cpp (output_lookup_array): Changed the assertion
          from assert (i != 0) to assert (i >= 0) since I think that's
          correct... (ah, so THAT's why comments are important thinks the
          '92 Doug... ;-)).

        * src/Options: Improved the comments for the '-h' option to
          reflect current reality...

Thu Sep 17 11:42:53 1998  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * src/Key_List.cpp (output_lookup_array): Put 'signed' keyword
          before 'char lookup' to avoid problems on platforms where char
          is defined as unsigned.  Thanks to Margherita Vittone Wiersma
          <vittone@fndaub.fnal.gov> for reporting this.

Wed Sep 16 19:08:13 1998  David L. Levine  <levine@cs.wustl.edu>

        * Makefile: don't run build/run tests on CROSS-COMPILE platforms.
          Thanks to Raja Ati <rati@montereynets.com> for reporting this
          problem.

Wed Sep 16 18:18:41 1998  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * tests/Makefile: Changed CFLAGS to CCFLAGS to make aCC happy on
          HP/UX.  Thanks to John Mulhern for reporting this.

Tue Sep 15 18:14:08 1998  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * tests/test-6.exp (Usage): Fixed the usage so diff should no
          longer complain...  Thanks to David for reporting this.

Tue Sep 15 21:54:07 1998  David L. Levine  <levine@cs.wustl.edu>

        * tests/Makefile: filter timestamps from test output so that
          diffs will pass.

Tue Sep 15 18:14:08 1998  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * tests: Updated the expected output to look for 2.7 vs 2.6
          of gperf.

Thu Sep 10 16:50:21 1998  Carlos O'Ryan  <coryan@cs.wustl.edu>

        * tests/Makefile:
          The test programs were not linking against ACE.

Tue Sep  8 12:45:53 1998  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * tests/test.cpp: Added #include "ace/OS.h" so that the ACE_RCSID
          macro is defined.  Thanks to Arturo Montes
          <mitosys@colomsat.net.co> for reporting this.

Sat Aug 22 08:44:15 1998  Alexander Babu Arulanthu  <alex@cs.wustl.edu>

        * src/Options.cpp : Fixed the typo (-V instead of -v) under 'case
          h' print string.

Fri Aug 21 11:57:57 1998  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * src/Key_List.cpp (set_output_types): Make sure that we leave an
          extra space between the struct tag and the wordlist so the
          compiler doesn't complain.  Thanks to Andy Gokhale for reporting
          this.

        * src/gperf.cpp: Modified the main() program so that it doesn't
          print the starting time until AFTER we've parsed the arguments.

        * src/Version.cpp: Updated the version to 2.7 to reflect the
          new changes.

        * src/Options.cpp (operator): Added a new -V option, which just
          exits with a value of 0.  This is useful for checking if gperf
          exists in the search path.  We use the feature in TAO.

        * src: Removed the globally overloaded new operator.  This was a
          portability pain and didn't really improve performance very
          much.

        * src/Options.cpp (operator): Fixed '%e' to be '%r' to come up to
          speed with ACE changes.

Sat Aug 15 07:59:58 1998  David L. Levine  <levine@cs.wustl.edu>

        * src/gperf.cpp (main): added ACE_UNUSED_ARGS for argc and
          argv if ! ACE_HAS_GPERF.

Fri Aug 14 13:47:00 1998  David L. Levine  <levine@cs.wustl.edu>

        * src/new.cpp (delete): aded ACE_UNUSED_ARG (ptr).

Fri Jul 31 18:28:45 1998  Gonzalo Diethelm  <gonzo@tango.cs.wustl.edu>

        * src/Bool_Array.cpp:
        * src/Gen_Perf.cpp:
        * src/Hash_Table.cpp:
        * src/Iterator.cpp:
        * src/Key_List.cpp:
        * src/List_Node.cpp:
        * src/Options.cpp:
        * src/Vectors.cpp:
        * src/Version.cpp:
        * src/gperf.cpp:
        * src/new.cpp:
        * tests/test.cpp:
        Added ACE_RCSID to these files.

Tue Jul 21 09:30:51 1998  David L. Levine  <levine@cs.wustl.edu>

        * src/gperf.cpp (main): added a trivial main () if ! ACE_HAS_GPERF,
          so that the link succeeds.

Mon Jul 20 16:02:18 1998  David L. Levine  <levine@cs.wustl.edu>

        * src/Makefile: fixed INSTALL.  It works with the latest
          $ACE_ROOT/include/makeinclude/rules.lib.GNU.

Mon Jul 20 15:35:59 1998  Alexander Babu Arulanthu  <alex@cs.wustl.edu>

        * Wrapped all the files with "#if defined (ACE_HAS_GPERF)" so that
        it compiles on appropriate platforms.

Sun Jul 19 22:21:17 1998  David L. Levine  <levine@cs.wustl.edu>

        * src/new.cpp (new): wrapped assignment with parens where used
          as a conditional.

        * src/Iterator.cpp (Iterator), List_Node.cpp (List_Node),
          Hash_Table.cpp (Hash_Table):
          reordered initializers to match declaration order.

        * src/Hash_Table.cpp (~Hash_Table),
        * src/Bool_Array.cpp (init): cast sizeof
          to int to avoid compiler (g++/Linux alpha) warning about
          mismatch with %d format specifier.

        * src/new.cpp (new): use ACE_THROW_SPEC instead of
          _RWSTD_THROW_SPEC.

Sun Jul 19 13:11:59 1998  Douglas C. Schmidt  <schmidt@tango.cs.wustl.edu>

        * src/new.cpp: Added support for the _RWSTD_THROW_SPEC macro for
          DEC UNIX.  Thanks to David Levine for reporting this.

        * src/Key_List.cpp: Fixed one of those nasty "for loop counter
          scoping glitches.  Again, thanks to David Levine and DEC C++ for
          catching this.  * src/Key_List.cpp (reorder): Clarified the code
          so that we don't write horrible C-style hacks.  Thanks to David
          Levine and the DEC C++ compiler for finding this one!

Tue Jun 30 15:43:16 1998  Alexander Babu Arulanthu  <alex@cs.wustl.edu>

        * src/Options.h         :
        * src/Options.cpp       :
        * src/Key_List.cpp      : Added the following options to gperf.
                -       "-m" To mute warnings. (If -D option is enabled,
                        gperf doesnt say anything about duplicate hash
                        values etc.
                -       "-M" To skip class definition while in C++ mode.
                -       "-J" To skip the line "#include <string.h>" in the
                        output.

Thu May 14 16:37:39 1998  Douglas C. Schmidt  <schmidt@flamenco.cs.wustl.edu>

        * src: ACE'ifed most of the gperf source code, yow!

Sun Apr 14 14:31:10 1996  Douglas C. Schmidt  (schmidt@tango.cs.wustl.edu)

        * src: Changed things so that there's no longer any use of the
          Read_Line and Std_Err code.  All of this has been pushed into
          the ACE components, which is where it belongs...

        * src: Changed things so that there's no longer any use of the
          pointless inheritance in the code.  This was a result of my not
          understanding inheritance back in 1989... ;-)

        * Began to integrate GNU gperf into the ACE release.  Started off
          by bringing the standard GNU version up to date wrt to the
          changes I made back in 1991!

Tue Oct 10 16:37:28 1995  Mike Stump  <mrs@cygnus.com>

        * src/new.cc: Since malloc/delete are not paired, we cannot call
        free.

Wed Jan  4 12:40:14 1995  Per Bothner  <bothner@kalessin.cygnus.com>

        * src/Makefile.in ($(TARGETPROG)):  Link with $(LDFLAGS).
        Patch from John Interrante <interran@uluru.stanford.edu>.

Sat Nov  5 19:12:48 1994  Jason Merrill  (jason@phydeaux.cygnus.com)

        * src/Makefile.in (LIBS): Remove.

Tue Oct 18 17:51:14 1994  Per Bothner  <bothner@kalessin.cygnus.com>

        * src/std-err.cc:  Use stderror, instead of the non-standard
        sys_nerr and sys_errlist.

Sat Sep 17 22:02:13 1994  Per Bothner  (bothner@kalessin.cygnus.com)

        * src/key-list.cc (output_hash_function):
        Patch from William Bader <wbader@CSEE.Lehigh.Edu>.

Fri Jul 15 09:38:11 1994  Per Bothner  (bothner@cygnus.com)

        * src/std-err.cc:  #include <errno.h>, and only declare
        extern int errno if errno is not a macro.

Mon May 30 17:29:34 1994  Per Bothner  (bothner@kalessin.cygnus.com)

        * Makefile.in (src_all, install):  Make sure to add '/' after
        `pwd` in $rootme, as expected by FLAGS_TO_PASS.

Wed May 11 00:47:22 1994  Jason Merrill  (jason@deneb.cygnus.com)

        Make libg++ build with gcc -ansi -pedantic-errors
        * src/options.h: Lose commas at end of enumerator lists.

Sun Dec  5 19:16:40 1993  Brendan Kehoe  (brendan@lisa.cygnus.com)

        * src/hash-table.cc (Hash_Table::~Hash_Table): Don't pass an
        argument to fprintf, since it's not expecting one.

Fri Nov 26 19:03:18 1993  Per Bothner  (bothner@kalessin.cygnus.com)

        * src/list-node.cc:  #undef index, for the sake of broken NeXT,

Thu Nov  4 11:16:03 1993  Per Bothner  (bothner@kalessin.cygnus.com)

        * Makefile.in (install):  Use INSTALL_DATA for gperf.1.

Mon Oct 25 18:40:51 1993  Per Bothner  (bothner@kalessin.cygnus.com)

        * src/key-list.cc (Key_List::read_keys):  Use POW macro
        to increase hash table size to power of 2.

        * options.h (LARGE_STACK_ARRAYS):  New flag.  Defaults to zero.
        * gen-perf.cc, key-list.cc, read-line.cc:
        Only stack-allocate large arrays if LARGE_STACK_ARRAYS is set.
        * main.cc (main):  Only call setrlimit (RLIMIT_STACK, ...)
        if LARGE_STACK_ARRAYS.

Mon Oct  4 17:45:08 1993  Per Bothner  (bothner@kalessin.cygnus.com)

        * src/gen-perf.cc:  Always use ANSI rand/srand instead of BSDisms.

Wed Aug 18 12:19:53 1993  Per Bothner  (bothner@kalessin.cygnus.com)

        * Makefile.in (src_all):  Make less verbose output.

Fri May 28 14:01:18 1993  Per Bothner  (bothner@rtl.cygnus.com)

        * src/gen-perf.cc (Gen_Perf::change):  Don't use gcc-specific
        2-operand conditional expression.
        * src/key-list.cc (Key_List::output_lookup_array):
        Don't use variable-size stack arrays, unless compiled by g++.

Tue May  4 14:08:44 1993  Per Bothner  (bothner@cygnus.com)

        Changes (mostly from Peter Schauer) to permit compilation
        using cfront 3.0 and otherwise be ARM-conforming.
        * src/key-list.h:  class Key_List must use public derivation
        of base class Std_Err (because Gen_Perf::operator() in gen-perf.cc
        calls Std_Err::report_error).
        * src/gen-perf.cc (Gen_Perf::affects_prev), src/hash-table.cc
        (Hash_Table::operator()):  Don't use gcc-specific 2-operand
        conditional expression.
        * src/iterator.cc (Iterator::operator()):  Don't use gcc-specific
        range construct in case label.
        * key-list.cc (Key_List::output_lookup_array, Key_List::read_keys),
        src/gen-perf.cc (Gen_Perf::operator(), src/read-line.cc
        (Read_Line::readln_aux):  If not gcc, don't allocate
        variable-sized arrays on stack.
        * src/new.cc (operator new):  Argument type should be size_t.
        * key-list.cc (Key_List::output_lookup_array, Key_List::read_keys),
        new/cc (::operator new): Don't use non-standard >?= operator.

Tue Apr 27 20:11:30 1993  Per Bothner  (bothner@cygnus.com)

        * src/Makefile.in:  Define TARGETPROG, and use it.

Mon Apr 19 00:29:18 1993  Per Bothner  (bothner@cygnus.com)

        * Makefile.in, configure.in:  Re-vamped configure scheme.
        * gperf.texinfo:  Renamed to gperf.texi.
        * src/bool-array.{h,cc}:  ANSIfy bzero->memset.

Sat Jan 30 20:21:28 1993  Brendan Kehoe  (brendan@lisa.cygnus.com)

        * tests/Makefile.in (mostlyclean): Also delete aout, cout, m3out,
        pout, and preout.

Tue Dec 29 08:58:17 1992  Ian Lance Taylor  (ian@cygnus.com)

        * Makefile.in: pass $(FLAGS_TO_PASS) to all calls to make.
        (FLAGS_TO_PASS): added INSTALL, INSTALL_DATA, INSTALL_PROGRAM.

Mon Dec 21 18:46:46 1992  Per Bothner  (bothner@rtl.cygnus.com)

        * tests/expected.* renamed to *.exp to fit in 14 chars.
        * tests/Makefile.in:  Update accordingly.
        Also rename output.* to *.out.
        * src/Makefile.in (clean):  Remove gperf program.

Wed Dec  9 14:33:34 1992  Per Bothner  (bothner@cygnus.com)

        * src/hash-table.cc, src/bool-array.h: ANSIfy bzero->memset.

Thu Dec  3 19:34:12 1992  Per Bothner  (bothner@cygnus.com)

        * Makefile.in (distclean, realclean): Don't delete
        Makefile before recursing.

Fri Nov  6 13:41:49 1992  Per Bothner  (bothner@rtl.cygnus.com)

        * key-list.{h,cc}:  Remove MAX_INT (and similar) constant
        fields from Key_List class, and use INT_MAX (etc) from limits.h.
        * key-list.{h,cc}, options.{h,cc}, vectors.h:  Removed all
        uses of initialized const fields, as they are non-standard
        - and their use was easy to do away with.  Mostly, just
        made the constants static non-fields in the .cc file.

Mon Nov  2 13:10:11 1992  Per Bothner  (bothner@cygnus.com)

        * tests/Makefile.in:  When generating cinset.c, don't pass -C,
        since -C assumes an ANSI compiler.  Add the -C flag (with -a)
        when generating test.out.3 instead.
        * tests/expected.out.3:  Update accordingly.

Wed Aug 12 11:47:54 1992  Per Bothner  (bothner@cygnus.com)

        * Makefile.in:  Factor out common flags into $(FLAGS_TO_PASS).
        * Makefile.in:  'install-info' depends on gperf.info.

Mon Aug 10 11:39:52 1992  Ian Lance Taylor  (ian@dumbest.cygnus.com)

        * Makefile.in, src/Makefile.in: always create installation
        directories.

Mon Jul 20 15:33:21 1992  Mike Stump  (mrs@cygnus.com)

        * src/new.cc (operator new):  Add cast from void * to char *,
        since it is not a standard conversion.

Wed Jun 17 16:25:30 1992  Per Bothner  (bothner@rtl.cygnus.com)

        * src/gen-perf.cc:  #include <_G_config.h> for _G_SYSV.
        * src/key-list.cc:  alloca() hair.
        * src/main.cc (main):  Only call getrlimit if _G_HAVE_SYS_RESOURCE.
        * Makefile,in, {src,test}/Makefile.in:  Fix *clean rules.

Fri May 29 13:21:13 1992  Per Bothner  (bothner@rtl.cygnus.com)

        * src/gen-perf.cc:  Replace USG -> _G_SYSV.

Thu May 14 13:58:36 1992  Per Bothner  (bothner@rtl.cygnus.com)

        * src/Makefile.in:  Don't pass obsolete flag -DUNLIMIT_STACK.
        * tests/Makefile.in (clean): Fix.

Sat Mar  7 00:03:56 1992  K. Richard Pixley  (rich@rtl.cygnus.com)

        * gperf.texinfo: added menu item hook.

Wed Feb 26 18:04:40 1992  K. Richard Pixley  (rich@cygnus.com)

        * Makefile.in, configure.in: removed traces of namesubdir,
          -subdirs, $(subdir), $(unsubdir), some rcs triggers.  Forced
          copyrights to '92, changed some from Cygnus to FSF.

Sun Jan 26 19:21:58 1992  Per Bothner  (bothner at cygnus.com)

        * tests/Makefile.in:  Use re-directed stdin instead of file
        name in argv.  This allows us to remove the filename
        from the output, the expected output, and hence the diffs.
        (Note that the input file is in $(srcdir), which we cannot
        place in the expected out files.)
        * tests/expected.out.[1235]:  Edit out input filename,
        to match new output.

Mon Nov  4 15:04:41 1991  Douglas C. Schmidt  (schmidt at bastille.ics.uci.edu)

        * Need to do something about the end-of-line marker being
          hard-coded to '\n'...

        * Need to do something about the comment character being
          hard-coded to '#'...

Fri Sep 27 09:30:15 1991  Douglas C. Schmidt  (schmidt at net4.ics.uci.edu)

        * Fixed a stupid problem with printout out a local enum with the
          -E option (I forgot to check for the case of 0 duplicates, so it
          was saying 1 duplicate instead!).

Mon Aug 19 00:39:40 1991  Douglas C. Schmidt  (schmidt at javel.ics.uci.edu)

        * Yow, all finished making gperf run with cfront/Saber C++.  Not
          really all that hard, actually, though did need to remove some
          GNU specific hacks, like dynamically sized arrays and
          initializing class data members in their declarations, etc.

        * Bumped up the version # to reflect the recent changes.

Sun Aug 18 22:25:32 1991  Douglas C. Schmidt  (schmidt at javel.ics.uci.edu)

        * Changed passage of Options::usage function in Options.C to have
          a leading `&' so that Saber C++ wouldn't complain...

        * Added a new header file called gperf.h that includes system-wide
          info.

        * Hacked up the release to work with Saber C++!  Changed all *.cc
          files to *.C.

Mon Aug  5 21:18:47 1991  Douglas C. Schmidt  (schmidt at net1.ics.uci.edu)

        * Yow, hacked in the nifty changes to the Std_Err error handling
          abstraction.  This now adds format string support for printing
          out signals and the name of the function when things go wrong.
          Make changes throughout the source to make use of the new
          facilities and also to make sure all previous uses of
          Std_Err::report_error are now prefixed by the name of the class.

Tue Jul 30 00:02:39 1991  Douglas C. Schmidt  (schmidt at net4.ics.uci.edu)

        * Make sure to add 1 to the Key_List::total_duplicates value when
          printing it out since any time we have more than zero duplicates
          we really have two or more duplicates!

        * Added support for the -O (optimize option).  This option
          optimizes the generated lookup function by assuming that all
          input keywords are members of the keyset from the keyfile.

        * Added #define DUPLICATES and #define HASH_VALUE_RANGE (and of
          course the enum equivalent) to the generated output.  Don't know
          how useful this will be, but it allows us to determine at a
          glance whether we've got a minimal perfect hash function (in
          which case TOTAL_KEYWORDS = HASH_VALUE_RANGE, and DUPLICATES =
          0).

        * Fixed a small bug in the Key_List::output_keyword_table routine
          that caused an extra newline to be printed if there where no
          leading blank entries... (who cares, right?!)

Mon Jul 29 22:05:40 1991  Douglas C. Schmidt  (schmidt at net4.ics.uci.edu)

        * Modified the handling of the -E (emit enums rather than
          #defines) option in conjunction with the -G option.  Now, if -G
          and -E are given the enums are generated outside the lookup
          function, rather than within it!

        * Yow, as part of my Software Practice and Experience submission
          writeup I realized I needed to make the # comment character work
          correctly.  Now if you put a backslash character ('\') in front
          of the # it treats the first character as a #.  Naturally, to
          put a '\' character on the front of the line you need to escape
          it also, i.e.,
          \\I'm a line that starts with only one \
          # I'm a comment line
          \#define I'm walking a fine line... ;-)

Wed Jun 26 11:21:02 1991  Douglas C. Schmidt  (schmidt at bastille.ics.uci.edu)

        * Changed all uses of the identifier `iteration_number' to
        `generation_number' (also updated the paper!).

Tue Apr  9 07:59:42 1991  Doug Schmidt  (schmidt at net4.ics.uci.edu)

        * Had to change a whole bunch of little thangs in key-list.cc and
          list-node.cc to make the -I option work.

        * Changed an alloca statement in key-list.cc to reflect the
          strncasecmp modification (i.e., we now need to be able to
          allocate a longer buffer if the -I option is used).

Mon Apr  8 18:17:04 1991  Doug Schmidt  (schmidt at net4.ics.uci.edu)

        * Yucko, there was a bug in the handling of -c (and of course the
          new -I command in key-list.cc).  Apparently when I added the
          super-duper hack that provided support for duplicate keys I
          forgot to update the strcmp output...

        * Boy, it has been a *long* time since I hacked this puppy.  Let's
          see, I'm about to add long-overdue support for case-insensitive
          string comparisons to gperf's generated output code.  We are
          going to employ the hitherto unused option -I to indicte this!

Thu Jun 28 16:17:27 1990  Doug Schmidt  (schmidt at brilliant)

        * Wow, first fix on the new job!  There was a dumb error
          in Key_List::output_lookup_function, where I printed the
          string "&wordlist[key]" instead of the correct "&wordlist[index]".

        * Added a couple of #ifdefs for USG support.

Sun Jun  3 17:16:36 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Updated the version number to 2.5 and sent to Doug Lea for release
          with the latest GNU libg++.

        * Changed the error handling when a keyword file cannot be opened
          (now calls perror).

Wed May 30 14:49:40 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Instrumented the source code with trace statements automagically
          inserted using my new automated trace instrumentation tool!

Wed May  9 11:47:41 1990  Doug Schmidt  (schmidt at siam.ics.uci.edu)

        * Really fixed the previous bug.  Turns out that a small amount
          of logic had to be duplicated to handle static links that occur
          as part of dynamic link chains.  What a pain!!!

Tue May  8 23:11:44 1990  Doug Schmidt  (schmidt at siam.ics.uci.edu)

        * Fixed a stupid bug in Key_List::output_lookup_array that was
          causing incorrect counts to be generated when there were both
          static and dynamic links occurring for the same hash value.
          Also simplified the code that performs the logic in this routine.

Mon Apr 30 17:37:24 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Fixed stupid bug in Key_List::output_lookup_array that was
          making the generated lookup[] array contain `chars' even
          when the values stored in the chars are greater than 127!

        * Changed the behavior of the -G (global table) option so that it
          will output the `length[]' array in the global scope along with
          the `word_list[]' array.

        * Fixed a stupid bug in Key_List::output_lookup_function that
          would always output the complicated `duplicate-handling' lookup
          logic, even when there were no duplicates in the input!

        * Yikes, had to modify a bunch of stuff in key-list.cc to correctly
          handle duplicate entries.  Changed the generated code so that
          the MIN_HASH_VALUE is no longer subtracted off when calculating
          the hash value for a keyword.  This required changing some other
          code by substituting MAX_HASH_VALUE for TOTAL_KEYS in several places.
          Finally, this means that the generated tables may contain leading
          null entries, but I suppose it is better to trade-off space to get
          faster performance...

Mon Mar 26 13:08:43 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Updated version number to 2.4 to reflect the latest changes.

        * Changed the main program so that it always prints out gperf's
          execution timings to the generated output file.

Sun Mar 25 12:39:30 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Added the -Z option so that users can specify the name of the
          generated class explicitly.  Updated documentation to reflect
          this change.

        * Modified the generated C++ class interface so that the functions
          are declared static (to remove the overhead of passing the `this'
          pointer).  This means that operator()() can no longer be used,
          since it only works on non-static member functions.
          Also changed things so that there is no constructor (why waste
          the extra call, when it doesn't do anything, eh?)

        * Modified the behavior of Key_List::output when the -L C++ option
          is enabled.  Previously the code generated use const data members
          to record MIN_WORD_LENGTH, MIN_HASH_VALUE, etc.  However, as
          pointed out by James Clark this may result in suboptimal behavior
          on the part of C++ compilers that can't inline these values.
          Therefore, the new behavior is identical to what happens with
          -L C, i.e., either #defines or function-specific enums are used.
          Why sacrifice speed for some abstract notion of `code purity?' ;-)

Tue Mar  6 18:17:42 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Added the -E option that defines constant values using an enum
          local to the lookup function rather than with #defines.  This
          also means that different lookup functions can reside in the
          same file.  Thanks to James Clark (jjc@ai.mit.edu).

Sat Mar  3 20:19:00 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Added a special case to key_list::output_switch that doesn't
          generate extra comparisons when the `-S' is given an argument
          of 1 (the normal case).  This should speed up the generated
          code output a tad...

Fri Feb 23 14:21:28 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Renamed all instances of member function get_keysig_size
          to get_max_keysig_size, since this is more precise...

        * Changed all occurrences of charset to keysig (stands for ``key
          signature'') to reflect the new naming convention used in the
          USENIX paper.

Thu Feb 22 11:28:36 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Changed the name of the generated associated values table from
          asso_value to asso_values to reflect conventions in the USENIX
          C++ paper.

Thu Feb 15 23:29:03 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Updated the gperf.texinfo file to fix some formatting problems
          that had crept in since last time.

Wed Feb 14 23:27:24 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Fixed stupid bug in key-list.cc (get_special_input), wher
          gperf replaced each '%' with the succeeding character.

        * Added support for multiple target language generation.  Currently
          handled languages are C and C++, with C as the default.  Updated
          documentation and option handler to reflect the changes.

        * Added a global destructor to new.cc and removed the #ifdef, since
          the bloody thing now works with libg++.

Mon Feb 14 13:00:00 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Found out that my gperf paper was accepted at the upcoming
          USENIX C++ Conference in San Francisco.  Yow!

Tue Jan 30 09:00:29 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * #ifdef'd out the new.cc memory allocator, since there are
          problems with this and the libg++ stuff.

        * Changed key-list.h so that class Vectors is a public (rather
          than private) base class for class Key_List.  The previous
          form was illegal C++, but wasn't being caught by the old
          g++ compiler.  Should work now... ;-)

Sun Dec 10 14:08:23 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added several changes from rfg@ics.uci.edu.  These changes
          help to automate the build process.

Wed Nov 15 15:49:33 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Removed conditional compilation for GATHER_STATISTICS.  There's
          really no good reason to avoid collecting this info at run-time,
          since that section of code is *hardly* the bottleneck... ;-)

        * Simplified the C output routines in Key_List::set_output_types
          and Key_List::output_keyword_table a bit in order to
          speed-up and clean up the code generation.

        * Modified function Key_List::get_special_input so that it does
          not try to `delete' a buffer that turned out to be too short.
          This is important since the new memory management scheme
          does not handle deletions.  However, adding a small amount of
          garbage won't hurt anything, since we generally don't do this
          operation more than a couple times *at most*!

        * Created a new file (new.cc) which includes my own overloaded
          operator new.  This function should dramatically reduce the
          number of calls to malloc since it grabs large chunks and
          doles them out in small pieces.  As a result of this change
          the class-specific `operator new' was removed from class List_Node.

Tue Nov 14 21:45:30 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Continued to refine the great hack.  The latest trick is to
          try and replace most uses of dynamic memory (i.e., calls to
          new) with uses of gcc dynamic arrays (i.e., an alloca solution).
          This makes life much easier for the overall process-size, since
          it reduces the amount of overhead for memory management.  As a
          side-effect from this change there is no reason to have the
          Bool_Array::dispose member function, so it's outta here!

        * Fixed a stupid bug that was an disaster waiting to happen...
          Instead of making the boolean array large enough to index
          max_hash_value it was only large enough to index max_hash_value
          - 1.  Once again, an off-by-one mistake in C/C++!!!!

Mon Nov 13 19:38:27 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added the final great hack!  This allows us to generate hash tables
          for near-perfect hash functions that contain duplicates, *without*
          having to use switch statements!  Since many compilers die on large
          switch statements this feature is essential.  Furthermore, it appears
          that the generated code is often *smaller* than that put out by
          compilers, even though a large, sparse array must be created.
          Here's the general idea:

             a. Generate the wordlist as a contiguous block of keywords,
                just as before when using a switch statement.  This
                wordlist *must* be sorted by hash value.

             b. Generate the lookup array, which is an array of signed
                {chars,shorts,ints}, (which ever allows full coverage of
                the wordlist dimensions).  If the value v, where v =
                lookup[hash(str,len)], is >= 0 and < TOTAL_KEYWORDS, then we
                simply use this result as a direct access into the wordlist
                array to snag the keyword for comparison.

             c. Otherwise, if v is < -TOTAL_KEYWORDS or > TOTAL_KEYWORDS
                this is an indication that we'll need to search through
                some number of duplicates hash values.  Using a hash
                linking scheme we'd then index into a different part of
                the hash table that provides the starting index and total
                length of the duplicate entries to find via linear search!

Sun Nov 12 13:48:10 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Simplified Key_List::output_min_max considerably by recognizing
          that since the keyword list was already sorted by hash value finding
          the min and max values is trivial!

        * Improved the debugging diagnostics considerably in classes Key_List,
          Hash_Table, and Gen_Perf.

        * Modified the `-s' option so that a negative argument is now
          interpreted to mean `allow the maximum associated value to be
          about x times *smaller* than the number of input keys.'  This
          should help prevent massive explosion of generated hash table
          size for large keysets.

Sat Nov 11 11:31:13 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added a field in class Key_List that counts the total number
          of duplicate keywords, both static and dynamic.

        * Added a new member function Bool_Array that deletes the dynamic
          memory allocated to Bool_Array::storage_array.  This space may
          be needed for subsequent options, so it made sense to free it as
          soon as possible...

        * Renamed file/class Alpha_Vectors to Vectors, to avoid problems
          with 14 character length filenames on SYSV.  Also changed file
          adapredefined.gperf to adadefs.gperf in the ./tests directory.

        * Modified class Options by changing the member function
          Options::total_positions to Options::get_charset_size and
          Options::set_charset_size.  These two routines now either return
          the total charset size *or* the length of the largest keyword
          if the user specifies the -k'*' (ALLCHARS) option.  This change
          cleans up client code.

        * Merged all the cperf changes into gperf.

        * Made sure to explicitly initialize perfect.fewest_collisions to
          0.

        * Cleaned up some loose ends noticed by Nels Olson.
          1.  Removed `if (collisions <= perfect.fewest_collisions)'
              from Gen_Perf::affects_prev since it was superfluous.
          2.  Removed the fields best_char_value and best_asso_value
              from Gen_Perf.  There were also unnecessary.
          3.  Fixed a braino in the Bool_Array::bool_array_reset
              function.  Since iteration numbers can never be zero
              the `if (bool_array.iteration_number++ == 0)' must be
              `if (++bool_array.iteration_number == 0).'
          4.  Modified Std_Err::report_error so that it correctly handles
              "%%".

        * It is important to note that -D no longer enables -S.
          There is a good reason for this change, which will become
          manifested in the next release... (suspense!).

        * Made some subtle changes to Key_List::print_switch so that if finally
          seems to work correctly.  Needs more stress testing, however...

        * Made a major change to the Key_List::print_switch function.
          The user can now specify the number of switch statements to generate
          via an argument to the -S option, i.e., -S1 means `generate 1
          switch statement with all keywords in it,' -S2 means generate
          2 switch statements with 1/2 the elements in each one, etc.
          Hopefully this will fix the problem with C compilers not being
          able to generate code for giant switch statements (but don't
          hold your breath!)

        * Changed Key_List::length function to Key_List::keyword_list_length.

        * Added a feature to main.c that prints out the starting wall-clock
          time before the program begins and prints out the ending wall-clock
          time when the program is finished.

        * Added the GATHER_STATISTICS code in hash-table.c so we can
          keep track of how well double hashing is doing.  Eventually,
          GATHER_STATISTICS will be added so that all instrumentation
          code can be conditionally compiled in.

        * Fixed a stupid bug in Key_List::print_switch routine.  This
          was necessary to make sure the generated switch statement worked
          correctly when *both* `natural,' i.e., static links and dynamic
          links, i.e., unresolved duplicates, hash to the same value.

        * Modified Bool_Array::~Bool_Array destructor so that
          it now frees the bool_array.storage_array when it is no longer
          needed.  Since this array is generally very large it makes sense
          to return the memory to the freelist when it is no longer in use.

        * Changed the interface to constructor Hash_Table::Hash_Table.  This
          constructor now passed a pointer to a power-of-two sized buffer that
          serve as storage for the hash table.  Although this weakens information
          hiding a little bit it greatly reduces dynamic memory fragmentation,
          since we can now obtain the memory via a call to alloca, rather
          than malloc.  This change modified Key_List::read_keys calling
          interface.

        * Since alloca is now being used more aggressively a conditional
          compilation section was added in main.c. Taken from GNU GCC,
          this code gets rid of any avoidable limit on stack size so that
          alloca does not fail.  It is only used if the -DRLIMIT_STACK
          symbol is defined when gperf is compiled.

        * Added warnings in option.c so that user's would be informed
          that -r superceeds -i on the command-line.

        * Rewrote Gen_Perf::affects_prev.  First, the code structure
          was cleaned up considerably (removing the need for a dreaded
          goto!).  Secondly, a major change occurred so that Gen_Perf::affects_prev
          returns FALSE (success) when fewest_hits gets down to whatever
          it was after inserting the previous key (instead of waiting for
          it to reach 0).  In other words, it stops trying if it can
          resolve the new collisions added by a key, even if there are
          still other old, unresolved collisions.  This modification was
          suggested by Nels Olson and seems to *greatly* increase the
          speed of gperf for large keyfiles.  Thanks Nels!

        * In a similar vein, inside the Gen_Perf::change routine
          the variable `perfect.fewest_collisions is no longer initialized
          with the length of the keyword list.  Instead it starts out at
          0 and is incremented by 1 every time change () is called.
          The rationale for this behavior is that there are times when a
          collision causes the number of duplicates (collisions) to
          increase by a large amount when it would presumably just have
          gone up by 1 if none of the asso_values were changed.  That is,
          at the beginning of change(), you could initialize fewest_hits
          to 1+(previous value of fewest_hits) instead of to the number of
          keys.  Thanks again, Nels.

        * Replaced alloca with new in the Gen_Perf::change function.
          This should eliminate some overhead at the expense of a little
          extra memory that is never reclaimed.

        * Renamed Gen_Perf::merge_sets to Gen_Perf::compute_disjoint_union
          to reflect the change in behavior.

        * Added the -e option so users can supply a string containing
          the characters used to separate keywords from their attributes.
          The default behavior is ",\n".

        * Removed the char *uniq_set field from LIST_NODE and modified
          uses of uniq_set in perfect.c and keylist.c.  Due to changes
          to Gen_Perf::compute_disjoint_sets this field was no longer
          necessary, and its removal makes the program smaller and
          potentially faster.

        * Added lots of changes/fixes suggested by Nels Olson
          (umls.UUCP!olson@mis.ucsf.edu).  In particular:
          1.  Changed Bool_Array so that it would dynamically create
              an array of unsigned shorts rather than ints if the
              LO_CAL symbol was defined during program compilation.
              This cuts the amount of dynamic memory usage in half,
              which is important for large keyfile input.
          2.  Added some additional debugging statements that print extra
              info to stderr when the -d option is enabled.
          3.  Fixed a really stupid bug in Key_List::print_switch
              A right paren was placed at the wrong location, which broke
              strlen ().
          4.  Fixed a subtle problem with printing case values when keylinks
              appear.  The logic failed to account for the fact that there
              can be keylinks *and* regular node info also!
          5.  Changed the behavior of Key_List::read_keys so that it would
              honor -D unequivocally, i.e., it doesn't try to turn off dup
              handling if the user requests it, even if there are no
              immediate links in the keyfile input.
          6.  Modified the -j option so that -j 0 means `try random values
              when searching for a way to resolve collisions.'
          7.  Added a field `num_done' to the Gen_Perf struct.  This is used
              to report information collected when trying to resolve
              hash collisions.
          8.  Modified the merge_sets algorithm to perform a disjoint
              union of two multisets.  This ensures that subsequent
              processing in Gen_Perf::affect_prev doesn't
              waste time trying to change an associated value that is
              shared between two conflicting keywords.
          9.  Modified Gen_Perf::affects_prev so that it doesn't try
              random jump values unless the -j 0 option is enabled.
          10. Fixed a silly bug in Gen_Perf::change.  This problem caused
              gperf to seg fault when the -k* option was given and the
              keyfile file had long keywords.

Sun Oct 29 00:18:55 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)

        * Modified class-specific new operations for Read_Line and
          List_Node so they don't fail if SIZE is larger than twice
          the previous buffer size.  Note we double buffer size
          everytime the previous buffer runs out, as a heuristic
          to reduce future calls to malloc.

Sun Oct 22 13:49:43 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Updated gperf version number to 2.0.  Send to Doug Lea for
          incorporation into the long-awaited `official' libg++ 1.36
          release!

        * Thanks to Nels Olson a silly bug in Gen_Perf::change ()
          was fixed.  This problem caused gperf to seg fault when
          the -k* option was given and the keyfile file had long
          keywords.

        * Modified Key_List::print_hash_function so that it output
          max_hash_value + 1 (rather than just max_hash_value) for
          any associated value entries that don't correspond to
          keyword charset characters.  This should speed up rejection
          of non-keyword strings a little in some cases.

Sat Oct 21 19:28:36 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Fixed Key_List::print_hash_function so that it no longer output
          things like `return 0 + ...'  Although this probably gets
          optimized away by even the worst C compilers there isn't any
          point tempting fate... ;-)

        * Fixed class List_Node's constructor so that it wouldn't a priori
          refuse to consider trying to hash keys whose length is less
          than the smallest user-specified key position.  It turns out
          this is not a problem unless the user also specifies the -n
          (NOLENGTH) option, in which case such keys most likely
          don't have a prayer of being hashed correctly!

        * Changed the name of the generated lookup table from `Hash_Table'
          to `asso_value' to be consistent with the gperf paper.

Tue Oct 17 14:19:48 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added a flag GATHER_STATISTICS in the Makefile.  If defined
          during compilation this turns on certain collection facilities
          that track the performance of gperf during its execution.  In
          particular, I want to see how many collisions occur for the
          double hashing Hash_Table.

        * Added a safety check so that we don't screw up if the total
          number of `resets' of the Bool_Array exceeds MAX_INT.  Since
          this number is around 2^31 it is unlikely that this would ever
          occur for most input, but why take the risk?

        * Changed the behavior for the -a (ANSI) option so that the
          generated prototypes use int rather than size_t for the LEN
          parameter.  It was too ugly having to #include <stddef.h> all
          over the place...

Mon Oct 16 11:00:35 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Continued to work on the gperf paper for the USENIX C++
          conference.  At some point this will be merged back into
          the gperf documentation...

Sat Oct 14 20:29:43 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)

        * Added a majorly neat hack to Bool_Array, suggested by rfg.
          The basic idea was to throw away the Ullman array technique.
          The Ullman array was used to remove the need to reinitialize all
          the Bool_Array elements to zero everytime we needed to determine
          whether there were duplicate hash values in the keyword list.
          The current trick uses an `iteration number' scheme, which takes
          about 1/3 the space and reduces the overall program running a
          time by about 20 percent for large input!  The hack works as
          follows:

          1. Dynamically allocation 1 boolean array of size k.
          2. Initialize the boolean array to zeros, and consider the first
             iteration to be iteration 1.
          2. Then on all subsequent iterations we `reset' the bool array by
             kicking the iteration count by 1.
          3. When it comes time to check whether a hash value is currently
             in the boolean array we simply check its index location.  If
             the value stored there is *not* equal to the current iteration
             number then the item is clearly *not* in the set.  In that
             case we assign the iteration number to that array's index
             location for future reference.  Otherwise, if the item at
             the index location *is* equal to the iteration number we've
             found a duplicate.  No muss, no fuss!

Mon Oct  2 12:30:54 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Changed some consts in options.h to enumerals, since g++
          doesn't seem to like them at the moment!

Sat Sep 30 12:55:24 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Fixed a stupid bug in Key_List::print_hash_function that manifested
          itself if the `-k$' option was given (i.e., only use the key[length]
          character in the hash function).

        * Added support for the -C option.  This makes the contents of
          all generated tables `readonly'.

        * Changed the handling of generated switches so that there is
          only one call to str[n]?cmp.  This *greatly* reduces the size of
          the generated assembly code on all compilers I've seen.

        * Fixed a subtle bug that occurred when the -l and -S option
          was given.  Code produced looked something like:

          if (len != key_len || !strcmp (s1, resword->name)) return resword;

          which doesn't make any sense.  Clearly, this should be:

          if (len == key_len && !strcmp (s1, resword->name)) return resword;

Tue Sep 26 10:36:50 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Changed class Read_Line's definition so that it no longer
          needs to know about the buffering scheme used to speed up
          dynamic memory allocation of input keywords and their
          associated attributes.  This means that operator new is no longer
          a friend of Read_Line.

Mon Sep 25 23:17:10 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Decided that Obstacks had too much overhead, so they were
          removed in favor of super-efficient, low-overhead buffered
          storage allocation hacks in Read_Line and List_Node.

        * No longer try to inline functions that g++ complains about
          (Key_List::Merge and Key_List::Merge_Sort).

Sun Sep 24 13:11:24 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Changed classes Read_Line and List_Node to use Obstacks in order
          to cache memory allocation for keyword strings and List_Nodes.

        * Continued to experiment with inheritance schemes.

        * Added a new file `alpha.h', that declares static data shared
          (i.e., inherited) between classes List_Node and Key_List.

Tue Sep 12 16:14:41 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Made numerous changes to incorporate multiple inheritance in
          gperf.

Wed Aug 16 23:04:08 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added the -DCOMPILER_FIXED flag to the ./src/Makefile.  This
          implies that people trying to compile gperf need to have a
          working version of the new g++ compiler (1.36.0).

        * Removed some extra spaces that were being added in the generated
          C code.

Mon Jul 24 17:09:46 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Fixed PRINT_HASH_FUNCTION and PRINT_LOOKUP_FUNCTION in keylist.c
          so that the generated functions take an unsigned int length argument.
          If -a is enabled the prototype is (const char *str, size_t len).

Fri Jul 21 13:06:15 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Fixed a typo in PRINT_KEYWORD_TABLE in keylist.cc that prevented
          the indentation from working correctly.

        * Fixed a horrible typo in PRINT_KEYWORD_TABLE in keylist.cc
          that prevented links from being printed correctly.

Tue Jul 18 16:04:31 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Fixed up readline.cc and readline.h so that they work OK
          with g++ compilers that aren't completely up-to-date.
          If symbol COMPILER_FIXED is defined then the behavior
          that works on my more recent version of g++ is enabled.

Sun Jul  9 17:53:28 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Changed the ./tests subdirectory Makefile so that it
          uses $(CC) instead of gcc.

Sun Jul  2 21:52:15 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Fixed a number of subtle bugs that occurred when -S was
          combined with various and sundry options.

        * Added the -G option, that makes the generated keyword table
          a global static variable, rather than hiding it inside
          the lookup function.  This allows other functions to directly
          access the contents in this table.

        * Added the "#" feature, that allows comments inside the keyword
          list from the input file. Comment handling takes place in readline.c.
          This simplifies the code and reduces the number of malloc calls.

        * Also added the -H option (user can give the name of the hash
          function) and the -T option (prevents the transfer of the type decl
          to the output file, which is useful if the type is already defined
          elsewhere).

Thu Jun 22 20:39:39 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Modified many classes so that they would inherit Std_Err as
          a base class.  This makes things more abstract...

Fri Jun 16 14:23:00 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Modified the -f (FAST) option.  This now takes an argument.
          The argument corresponds to the number of iterations used
          to resolve collisions.  -f 0 uses the length of the
          keyword list (which is what -f did before).  This makes
          life much easier when dealing with large keyword files.

Tue Jun  6 17:53:27 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added the -c (comparison) option.  Enabling this
          will use the strncmp function for string comparisons.
          The default is to use strcmp.

        * Fixed a typo in key_list.cc (PRINT_SWITCH).  This caused
          faulty C code to be generated when the -D, -p, and -t
          options were all enabled.

Thu May 25 14:07:21 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)

        * Once again, changed class Read_Line to overload global operator
          new.  Hopefully, this will work...!

Sun May 21 01:51:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Modified Key_List::print_hash_function () so that it properly
          formats the associated values in the hash table according to
          the maximum number of digits required to represent the largest
          value.

        * Removed the named return value from class Hash_Table's
          operator (), since this causes a seg fault when -O is enabled.
          No sense tripping subtle g++ bugs if we don't have to.... ;-)

        * Removed the operator new hack from Read_Line, since this seemed
          to create horrible bus error problems.

        * Changed many class member functions and data members to be `static',
          if they don't manipulate this!

Fri May 12 23:06:56 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Changed class Std_Err to use static member functions, a la
          Ada or Modula 2.  This eliminates the need for an explicit
          error-handler class object.

        * Added the ``named return value'' feature to Hash_Table::operator ()
          and Bool_Array::operator [], just for the heck of it.... ;-)

        * Changed the previous hack in Read_Line so that we now use
          the overloaded global `new' instead of NEW_STRING!

Wed May  3 17:36:55 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Updated to version 1.7.  This reflects the recent major changes
          and the new C port.

        * Modified the GNU getopt.cc routine to have a class-based interface.

        * Fixed a typo in Perfect.cc ~Perfect that prevented the actual maximum
          hash table size from being printed (maybe the stream classes
          weren't so bad after all.... ;-).

        * Added support for the -f option.  This generates the perfect
          hash function ``fast.''  It reduces the execution time of
          gperf, at the cost of minimizing the range of hash values.

Tue May  2 16:23:29 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Added an efficiency hack to Read_Line.  Instead of making
          a call to operator NEW (a.k.a. malloc) for each input string
          a new member function NEW_STRING stores a large buffer from
          which new strings are carved out, growing the buffer if
          necessary.  It might be useful to add this throughout the
          program....

        * Removed all unnecessary calls to DELETE.  If the program is about
          to exit it is silly to waste time freeing memory.

        * Added the GNU getopt program to the distribution.  This makes
          GPERF portable to systems that don't include getopt in libc.

        * Added a strcspn member to class Key_List.  This also increases
          portability.

        * Added the get_include_src function from keylist.c as a member
          function in class Key_List.  Hopefully every function is
          now associated with a class.  This aids abstraction and
          modularity.

        * Ported gperf to C.  From now on both K&R C and GNU G++ versions
          will be supported.  There will be two ChangeLog files, one
          for each version of the program.

Mon May  1 16:41:45 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Fixed a bug with -k'*'.  This now prints out *all* the cases
          up to the length of the longest word in the keyword set.

Sun Apr 30 12:15:25 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Removed all use of the stream classes.  Too ugly, slow, and
          not handled by the c++-mode formatter....

        * Modified the handling of links (i.e., keywords that have
          identical hash values as other keywords).  This should
          speed up hash function generation for keyword sets with
          many duplicate entries.  The trick is to treat duplicate
          values as equivalence classes, so that each set of duplicate
          values is represented only once in the main list processing.

        * Fixed some capitialization typos and indentations mistakes in
          Key_List::print_hash_function.

Sat Apr 29 12:04:03 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Fixed a typo/logico in Key_List::print_switch that prevented
          the last keyword in the keyword list to be print out.  This
          requires further examination.....

        * Fixed a stupid bug in List_Node::List_node.  If the -k'*' option
          was enabled the KEY_SET string wasn't getting terminated with
          '\0'!

Fri Apr 28 12:38:35 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Renamed strexp.h and strexp.cc to iterator.h and iterator.cc.
          Also changed the strexp class to iterator.  Continued to work
          on style...

        * Updated the version number to 1.6.  This reflects all the
          recent changes.

Thu Apr 27 00:14:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added the -D option that properly handles keyword sets that
          contain duplicate hash values.

        * Continued the stylistic changes.  Added the #pragma once
          directive to all the *.h files.  Removed all #defines and
          replaced them with static consts.  Also moved the key_sort
          routine from options.cc into the options class as a
          member function.

Mon Apr  3 13:26:55 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)

        * Made massive stylistic changes to bring source code into
          conformance with GNU style guidelines.

Thu Mar 30 23:28:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Fixed up the output routines so that they generate code
          corresponding to the GNU style guidelines.

Sat Mar 11 13:12:37 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Fixed Stderr constructors so that they wouldn't try to
          use the base class initializer syntax for the static
          class variable Program_Name.  G++ 1.34 is stricter in
          enforcing the rules!

Fri Mar 10 11:24:14 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Removed -v and ``| more'' from the Makefile to keep rfg happy...

Thu Mar  2 12:37:30 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Sent latest GNU gperf version 1.5 to Doug Lea for inclusion
          into libg++ 1.34.  Note that there is a small bug with
          the new %{ ... %} source inclusion facility, since it doesn't
          understand comments and will barf if %{ or %} appear nested
          inside the outermost delimiters.  This is too trivial of
          a defect to fix at the moment...

Tue Feb 28 11:19:58 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added the -K option, which allows the user to provide a
          alternative name for the keyword structure component.
          The default is still ``name.''

        * Added the LEX and YACC-like ability to include arbitrary
          text at the beginning of the generated C source code output.
          This required two new functions Get_Special_Input,
          Key_List::Save_Include_Src;

        * Fixed memory allocation bug in Key_List::Set_Types.
          Variable Return_Type needs 1 additional location
          to store the "*" if the -p option is used.

        * Added code to NULL terminate both Struct_Tag and Return_Type,
          *after* the strncpy (stupid mistake).

Mon Feb 27 14:39:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added a new option -N.  This allows the user to specify the
          name to be used for the generated lookup function.  The
          default name is still ``in_word_set.''  This makes it
          possible to completely automate the perfect hash function
          generation process!

Mon Feb 20 23:33:14 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Corrected the Hash_Table::operator () function so that
          *it* is responsible for deciding when a new key has the
          same signature as a previously seen key.  The key length
          information is now used internally to this function to
          decide whether to add to the hash table those keys with
          the same key sets, but different lengths.  Before, this
          was handled by the Key_List::Read_Keys function.  However,
          this failed to work for certain duplicate keys, since
          they weren't being entered into the hash table properly.

Sun Feb 19 16:02:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Modified class Options by moving the enum Option_Type out
          of the class.  This is to satisfy the new enumeration
          scope rules in C++.

Sun Jan 15 15:12:09 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Incremented the version number upto 1.4 to reflect the new
          options that affect the generated code.  Send the new
          distribution off to Michael for use with g++ 1.33.

        * Added a fix to Key_List::Read_Keys so that it checks for links
          properly when the -n option is used.  Previously, it didn't
          catch obvious links, which caused it to spend large amount
          of time searching for a solution that could never occur!

        * Modified the Key_List data structure to record *both* the
          minimum and the maximum key lengths.  This information
          is now computed in Key_List::Read_Keys, and thus
          Key_List::Print_Min_Max doesn't need to bother.

        * Modifed the key position iterator scheme in options.cc to
          eliminate the need for member function Options::Advance.
          Now, the Options::Get function performs the advancement
          automatically, obviating the need for an extra function call.

        * Added the new function Options::Print_Options, to print out
          the user-specified command line options to generated C
          output file.

        * Added a new function, Key_List::Print_Keylength_Table,
          which creates a table of lengths for use in speeding
          up the keyword search.  This also meant that a new
          option, -l (LENTABLE) is recognized.  It controls
          whether the length table is printed and the comparison
          made in the generated function ``in_word_set.''

        * Added a comment at the top of the generated C code
          output file that tells what version of gperf was used.
          Next, I'll also dump out the command line options
          as a comment too.  Thanks to Michael Tiemann for the
          feedback on this.

        * Fixed the -n option to make it work correctly with
          other parts of the program (most notably the Perfect::Hash
          function and the computation of minimum and maximum lengths.

Fri Jan 13 21:25:27 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)

        * Realized the the need to add a test that will enable
          optimziation of the generated C code in the ``hash'' function
          by checking whether all the requested key positions are
          guaranteed to exist due to the comparison in `in_word_set.''
          I'll put this in soon....

Thu Jan 12 20:09:21 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Added pascal, modula3, and modula2 tests inputs to the
          Makefile

        * Recognised that there is a bug with the -n option.  However
          I'm too busy to fix it properly, right now.  The problem
          is that the generated #define end up being 0, since that's
          my hack to make -n work.  This needs complete rethinking!

Tue Jan 10 00:08:16 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Added a new option, -n, that instructs gperf to not use the
          length of an identifier when computing the hash functions.
          I'm not sure how useful this is!

        * Retransmitted the distribution to rocky.oswego.edu.  Hopefully,
          this will work!

        * Began fixing the indentation and capitalization to conform
          to the GNU coding guidelines.

Mon Jan  9 22:23:18 1989  Doug Schmidt  (schmidt at pompe.ics.uci.edu)

        * Fixed horrible bug in Read_Line::Readln_Aux.  This was
          a subtle and pernicous off-by-1 error, that overwrote
          past the last character of the input string buffer.  I
          think this fault was killing the vax!

        * Yow, fixed an oversight in List_Node::List_Node, where the
          pointer field Next was uninitialized.  Luckily, the new routine
          seems to return 0 filled objects the first time through!

Sun Jan  8 13:43:14 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Modified the ``key linked'' diagnostic in Key_List::Read_Keys
          to be more helpful and easy to read.

        * Fixed the List_Node::List_Node so that it would ignore trailing
          fields if the -t option was not enabled.

        * Moved the List_Node declarations out of keylist.h and
          into a file of its own, called listnode.cc and listnode.h
          Made Set_Sort a member function of class List_Node.

        * Massively updated the documentation in the gperf.texinfo file.

        * Polished off the major revision to the print functions,
          added a few new tests in the Makefile to check for the
          validity of the program and ftp'ed the entire distribution
          off to Doug Lea for libg++. ( changed it to
          1.3 to reflect the major changes with the generated
          C code ).

        * Fixed Key_List::Print_Switch to deal with the -p and -t options.
          This meant that the ``still-born'' function Key_List::
          Print_Type_Switch was superflous, so I removed it.
          Also, removed the restriction in Option that the -p and
          -t options couldn't be used simultaneously.

        * Modified List_Node::List_Node, to perform only 1 call to
          ``new'' when dynamically allocating memory for the Key_Set
          and the Uniq_Set.

Sat Jan  7 14:10:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)

        * Fixed a big bug with the new policy of nesting the
          wordlist inside of generated function ``in_word_set.''
          I'd forgotten to declare the wordlist array as static!
          ( arrgh ).

        * Added a new function Key_List::Set_Types, that figures out
          the return type for generated function ``in_word_set,''
          the user-defined ``struct tag,'' if one is used, and also
          formates the array type for the static local array.

        * Changed the print routines to take advantage of the
          new -p option.

        * Began adding the hooks to allow the return of a pointer
          to a user defined struct location from the generated
          ``in_word_set'' function instead of the current 0 or 1
          return value.  Created function Key_List::Print_Type_Switch
          and added option -p to class Option, allowing the user to
          request generation of the aforementioned pointers returned
          instead of booleans.

        * Put in checks in class Option to make sure that -S and -t
          options are not used simultaneously.  This restriction
          will be removed in subsequent releases, once I decide on
          a clean way to implement it.

        * Sent version 1.2 to Doug Lea for possible inclusion into
          the libg++ distribution.

        * Moved the static word_list array inside the generated function
          in_word_set.  This supports better data hiding.

        * Added a texinfo file, gperf.texinfo

        * Revised the Makefile to cleanup the droppings from texinfo
          and changed the name of gperf.cc and gperf.h to perfect.cc
          and perfect.h.

Fri Jan  6 13:04:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)

        * Implemented the switch statement output format.  Much better
          for large datasets in terms of space used.

        * Added new functions to break up the Key_List::Output function.
          Functions added were Key_List::Print_Switch,
          Key_List::Print_Min_Max, Key_List::Print_Keyword_Table,
          Key_List::Print_Hash_Function, and
          Key_List::Print_Lookup_Function.  This simplifies the big mess
          in Key_List::Output considerably!

        * Added switch statement option to Options, which potentially
          trades time for space in the generated lookup code.

Thu Jan  5 22:46:34 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)

        * Released version 1.1

        * Fixed a bug with Gperf::Merge_Set, it was skipping letters
          shared between the Set_1 and Set_2.

        * Added the optimal min/max algorithm in Key_List::Output.  This
          runs in O (3n/2), rather than O (2n) time.

        * Changed Gperf::Sort_Set to use insertion sort, rather than
          bubble sort.

        * Added a check in Key_List::Output for the special case where
          the keys used are 1,$.  It is possible to generate more
          efficient C code in this case.