Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

   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
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
2007-04-30  Brendan Kehoe  <brendan@zen.org>

	* gperf-3.0.3 released.
	* src/version.cc: Bump to 3.0.3.
	* tests/*.exp: Bump to 3.0.3 in header.
	* doc/gperf.1: Regenerate with gperf 3.0.3.

2007-04-06  Bruno Haible  <bruno@clisp.org>

	Improve support for mingw.
	* tests/Makefile.in (check-c, check-ada, check-modula3, check-pascal,
	check-lang-utf8, check-lang-ucs2): Remove '\r' from output before diff.
	(POSTPROCESS_FOR_MINGW): New variable.
	(check-test): Use it to postprocess output before diff.

2007-04-04  Bruno Haible  <bruno@clisp.org>

	Support for newer GNU standards.
	* doc/configure.ac (mandir): Remove assignment.
	* doc/Makefile.in (datarootdir): New variable.
	(docdir, dvidir, psdir, pdfdir, htmldir): Use value determined by
	autoconf.
	* configure.ac: Require autoconf >= 2.60.
	* doc/configure.ac: Likewise.
	* lib/configure.ac: Likewise.
	* src/configure.ac: Likewise.
	* tests/configure.ac: Likewise.
	* configure: Regenerated with autoconf-2.61.
	* doc/configure: Likewise.
	* lib/configure: Likewise.
	* src/configure: Likewise.
	* tests/configure: Likewise.
	* src/config.h.in: Likewise.
	* src/config.h.msvc: Likewise.
	* src/config.h_vms: Likewise.

2007-04-04  Bruno Haible  <bruno@clisp.org>

	* doc/Makefile.in (MAKEINFO): Disable also the LC_MESSAGES and LC_ALL
	environment variables.

2007-04-04  Bruno Haible  <bruno@clisp.org>

	* configure.ac: Renamed from configure.in.
	* doc/configure.ac: Renamed from doc/configure.in.
	* lib/configure.ac: Renamed from lib/configure.in.
	* src/configure.ac: Renamed from src/configure.in.
	* tests/configure.ac: Renamed from tests/configure.in.
	* Makefile.devel: Update.
	* INSTALL: Update.

2007-03-31  Bruno Haible  <bruno@clisp.org>

	* tests/test.c (in_word_set): New declaration.
	* tests/test2.c (in_word_set): Likewise.

2007-03-31  Bruno Haible  <bruno@clisp.org>

	* src/options.cc (Options::parse_options): Bump copyright year.

2007-03-31  Bruno Haible  <bruno@clisp.org>

	* doc/gperf.texi: Fix typo.

2007-03-31  Bruno Haible  <bruno@clisp.org>

	Change generated code after the meaning of __inline is changed in
	GCC 4.3.
	* src/output.cc (Output::output_lookup_function): Emit an inline
	marker that also works with gcc-4.3 in c99 or gnu99 mode.
	* tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
	tests/cplusplus.exp, tests/gpc.exp, tests/incomplete.exp,
	tests/java.exp, tests/languages.exp, tests/modula2.exp,
	tests/objc.exp, tests/permut2.exp, tests/permut3.exp,
	tests/permutc2.exp, tests/test-4.exp: Update.
	Reported by Bruce Korb <Bruce.Korb@gmail.com>.

2006-06-29  Brendan Kehoe  <brendan@zen.org>

	* gperf-3.0.2 released.

	* doc/Makefile.in (all): No longer depend on dvi.

2006-01-22  Brendan Kehoe  <brendan@zen.org>

	* doc/gperf.texi: Update copyright to be 1989-2006.
	(UPDATED): Change to 22 January 2006.
	* doc/gperf.1 (TH): Fix date.
	* configure.in: Update copyright years.
	* configure: Regenerate.
	* src/Makefile.in: Update copyright years.

	* doc/gperf.{dvi,ps,pdf}: Regenerated by manually invoking tex
	instead of trying to use texi2dvi, whose run of etex ends up
	actually always running pdfetex, thus always recreating gperf.pdf.

2006-01-13  Brendan Kehoe  <brendan@zen.org>

	* NEWS: Add note about #line directive fix.
	* doc/gperf.1: Regenerate with Makefile.devel.

	* doc/gperf.texi (UPDATED): Correct to be today.
	* doc: Regenerated by doing make in a configured tree.
	Requires makeinfo, texi2dvi, texi2pdf, and texi2html.

	* configure.in: Add AC_OBJEXT and AC_EXEEXT.
	* lib/Makefile.in (OBJEXT): Define for subst.
	(OBJECTS): Use $(OBJEXT) instead of '.o'.
	* src/Makefile.in: Make dependencies use $(OBJEXT).
	(OBJEXT, EXEEXT): Define for subst.
	(TARGETPROG): Add $(EXEEXT).
	(OBJECTS): Use $(OBJEXT) instead of '.o'.
	(clean): Remove *.$(OBJEXT) instead of *.o.

2006-01-13  Bruno Haible  <bruno@clisp.org>

	Fix #line directives for filenames containing backslashes.
	* src/output.cc (output_line_directive): New function.
	(output_keyword_entry, Output::output): Use it.
	Reported by Alexander <alexander.me@gmail.com>.

	* src/options.cc (Options::parse_options): Update years in --version
	output.

2005-08-29  Brendan Kehoe  <brendan@zen.org>

	* src/keyword.cc: Tweak comment to avoid nesting.

2005-08-27  Bruno Haible  <bruno@clisp.org>

	Fix missing ranlib detection when cross-compiling.
	* aclocal.m4 (CL_PROG_RANLIB): Remove macro.
	* lib/configure.in: Use AC_PROG_RANLIB instead of CL_PROG_RANLIB.

2005-07-30  Bruno Haible  <bruno@clisp.org>

	* src/version.cc: Bump version number to 3.0.2.
	* doc/gperf.texi: Likewise.
	* tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
	tests/cplusplus.exp, tests/gpc.exp, tests/incomplete.exp,
	tests/java.exp, tests/languages.exp, tests/modula2.exp,
	tests/objc.exp, tests/permut2.exp, tests/permut3.exp,
	tests/permutc2.exp, tests/test-4.exp: Update.

2005-07-30  Bruno Haible  <bruno@clisp.org>

	* src/positions.h: Add forward declarations of friend classes.
	Needed for compilation with g++ 4.0.

2004-08-22  Bruno Haible  <bruno@clisp.org>

	* tests/Makefile.in (check-lang-syntax): Add test for the
	--length-table-name option.
	* tests/test-6.exp: Update.

2004-08-21  Bruce Lilly <blilly@erols.com>

	* src/input.cc (Input::read_input): Accept length-table-name
	declaration.
	* src/options.h (Options::get_lengthtable_name,
	Options::set_lengthtable_name): New declarations.
	(Options): Add field _lengthtable_name.
	* src/options.icc (Options::get_lengthtable_name): New inline method.
	* src/options.cc (DEFAULT_LENGTHTABLE_NAME): New constant.
	(Options::long_usage): Document --length-table-name option.
	(Options::Options): Initialize _lengthtable_name field.
	(Options::~Options): Update.
	(Options::set_lengthtable_name): New method.
	(long_options): Add option --length-table-name.
	(Options::parse_options): Implement --length-table-name option.
	* src/output.cc (Output::output_keylength_table, output_switch_case,
	Output::output_lookup_function_body): Use option.get_lengthtable_name.
	* doc/gperf.texi (Gperf Declarations): Document %define
	length-table-name.
	(Output Details): Document --length-table-name option.

2003-06-12  Bruno Haible  <bruno@clisp.org>

	* gperf-3.0.1 released.

	* src/version.cc: Bump version number to 3.0.1.
	* doc/gperf.texi: Likewise.
	* tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
	tests/cplusplus.exp, tests/gpc.exp, tests/incomplete.exp,
	tests/java.exp, tests/languages.exp, tests/modula2.exp,
	tests/objc.exp, tests/permut2.exp, tests/permut3.exp,
	tests/permutc2.exp, tests/test-4.exp: Update.

2003-05-31  Bruno Haible  <bruno@clisp.org>

	* doc/gperf.texi (User-supplied Struct): Mention the possibility of an
	abbreviated struct declaration.
	* src/input.cc (Input::read_input): Support struct declarations of the
	form "struct foo;".
	* tests/incomplete.gperf: New file.
	* tests/incomplete.exp: New file.
	* tests/Makefile.in (check-test): Check incomplete.gperf too.
	Reported by Rob Leslie <rob@mars.org>.

2003-05-20  Bruno Haible  <bruno@clisp.org>

	* doc/Makefile.in (gperf.ps): Don't use $< in a target rule.

2003-05-27  Bruno Haible  <bruno@clisp.org>

	* Makefile.vms (CC): Correct value.
	(getopt.obj, getopt1.obj, getline.obj, hash.obj): Don't set
	HAVE_CONFIG_H.

2003-05-17  Bruno Haible  <bruno@clisp.org>

	* Makefile.msvc (DEBUGFLAGS): New variable.
	(gperf.exe): Use it, and MFLAGS too.

2003-05-08  Bruno Haible  <bruno@clisp.org>

	* gperf-3.0 released.

2003-05-07  Bruno Haible  <bruno@clisp.org>

	* src/version.cc: Bump version number to 3.0.
	* doc/gperf.texi: Likewise.
	* tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
	tests/cplusplus.exp, tests/gpc.exp, tests/java.exp,
	tests/languages.exp, tests/modula2.exp, tests/objc.exp,
	tests/permut2.exp, tests/permut3.exp, tests/permutc2.exp,
	tests/test-4.exp: Update.

	* src/configure.in: Fix AC_INIT argument.

	* Makefile.devel (configure, lib/configure, src/configure,
	tests/configure, doc/configure): Use the newest autoconf.
	(src/config.h.in): Use the newest autoheader.

2003-05-03  Bruno Haible  <bruno@clisp.org>

	* doc/gperf.texi: Use two spaces as sentence separator, as recommended
	by the texinfo manual.

2003-04-12  Bruno Haible  <bruno@clisp.org>

	* doc/configure.in (mandir): Change default value.
	* doc/Makefile.in (docdir): Use datadir instead of prefix.
	* Makefile.msvc (datadir): New variable.
	(mandir, docdir): Use it instead of prefix.
	(install, installdirs): Update.
	* Makefile.vms (datadir): New variable.
	(mandir, docdir): Use it instead of prefix.
	(install, installdirs): Update.

2003-04-12  Bruno Haible  <bruno@clisp.org>

	* README.vms: New file.
	* Makefile.vms: New file.
	* Makefile.devel (src/config.h_vms): New rule.
	(all): Depend on it.

2003-03-19  Bruno Haible  <bruno@clisp.org>

	* src/input.cc (Input::read_input): Ignore comments at the beginning
	of the declarations section.
	* doc/gperf.texi (Controls for GNU indent): New section.
	Reported by Bruce Lilly <blilly@erols.com>.

2003-03-19  Bruno Haible  <bruno@clisp.org>

	* src/output.cc (Output::output_hash_function): Avoid lint warning if
	not all arguments of the hash function are used. Avoid lint warning
	for fallthrough in switch.
	* tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
	tests/cplusplus.exp, tests/java.exp, tests/languages.exp,
	tests/modula2.exp, tests/objc.exp: All /*FALLTHROUGH*/ to expected
	output.
	Reported by Bruce Lilly <blilly@erols.com>.

2003-03-01  Bruno Haible  <bruno@clisp.org>

	* src/options.h (Options::set_initializer_suffix): New declaration.
	* src/options.cc (Options::set_initializer_suffix): New method.
	* src/input.cc (Input::read_input): Recognize %define
	initializer-suffix.
	* doc/gperf.texi (Gperf Declarations): Document %define
	initializer-suffix.
	* NEWS: Update.

2003-02-26  Bruno Haible  <bruno@clisp.org>

	* Makefile.msvc: New file.
	* README.woe32: New file.
	* Makefile.devel (all): Depend on src/config.h.msvc.
	(src/config.h.msvc): New rule.

2003-01-07  Bruno Haible  <bruno@clisp.org>

	* src/input.h (Input::_charset_dependent): New field.
	* src/input.cc (Input::read_input): Also set _charset_dependent.
	* src/main.cc (main): Pass _charset_dependent from Input to Output.
	* src/output.h (Output::Output): Add charset_dependent argument.
	(Output::_charset_dependent): New field.
	* src/output.cc (Output::Output): Add charset_dependent argument.
	(Output::output): Provoke a compilation error if the execution
	character set doesn't match the expectations.
	* tests/c-parse.exp, tests/charsets.exp, tests/chill.exp,
	tests/cplusplus.exp, tests/gpc.exp, tests/java.exp,
	tests/languages.exp, tests/modula2.exp, tests/objc.exp,
	tests/permut2.exp, tests/permut3.exp, tests/permutc2.exp,
	tests/test-4.exp: Update.

	* src/options.cc (Options::long_usage): Change bug report address to
	<bug-gnu-gperf@gnu.org>.
	* tests/test-6.exp: Update.

	* src/output.cc (USE_DOWNCASE_TABLE): New macro.
	(output_upperlower_table): New function.
	(output_upperlower_strcmp, output_upperlower_strncmp,
	output_upperlower_memcmp): Emit gperf_downcase array accesses.
	(Output::output): Call output_upperlower_table.
	* tests/permutc2.exp: Update.

	* src/keyword-list.icc (KeywordExt_List::rest): Use a portable cast.
	(Only in GCC a cast of an lvalue is an lvalue.)

2003-01-01  Bruno Haible  <bruno@clisp.org>

	* src/options.cc (Options::parse_options): Update copyright year.

	* doc/gperf.texi (@author): Add me.

	* src/options.h (NULLSTRINGS): New enum value.
	(Options::get_stringpool_name, Options::set_stringpool_name): New
	method declarations.
	(Options::_stringpool_name): New field.
	* src/options.icc (Options::get_stringpool_name): New method.
	* src/options.cc (DEFAULT_STRINGPOOL_NAME): New variable.
	(Options::long_usage): Document -Q and --null-strings.
	(Options::Options): Initialize _stringpool_name.
	(Options::~Options): Output _stringpool_name, NULLSTRINGS values too.
	(Options::set_stringpool_name): New method.
	(long_options): Add options --string-pool-name, --null-strings.
	(Options::parse_options): Implement options -P, -Q and --null-strings.
	* src/input.cc (Input::read_input): Recognize declarations %pic,
	%define string-pool-name, %null-strings.
	* src/output.h (Output::output_string_pool,
	Output::output_lookup_pools): New method declarations.
	(Output::_wordlist_eltype): New field.
	* src/output.cc (Output::output_keylength_table): Trivial
	simplification.
	(Output::output_string_pool): New method.
	(output_keyword_entry): Add stringpool_index argument. For SHAREDLIB,
	use struct offsets.
	(output_keyword_blank_entries): For SHAREDLIB, use -1 instead of "".
	(Output::output_keyword_table): Use _wordlist_eltype instead of
	_struct_tag. Compute stringpool_index for output_keyword_entry.
	(Output::output_lookup_pools): New method.
	(Output::output_lookup_function_body): Use _wordlist_eltype instead of
	_struct_tag. For SHAREDLIB, use "+ stringpool" to convert offsets to
	strings. Use "o >= 0" to test for nonempty table entry.
	(Output::output_lookup_function): Call output_lookup_pools.
	(Output::output): Initialize _wordlist_eltype. Call
	output_lookup_pools.
	* tests/jstest4.gperf: New file.
	* tests/test-6.exp: Update.
	* tests/Makefile.in (check-lang-syntax): Drop test of -p. Add tests of
	-P and -Q.
	* doc/gperf.texi (User-supplied Struct): Mention that first field has
	to be of type 'int' if -P is given.
	(Gperf Declarations): Document %pic, %define string-pool-name,
	%null-strings.
	(Output Details): Update description of option -P. Document options -Q
	and --null-strings.

	* tests/Makefile.in (check-link-c, check-ada, check-pascal,
	check-test): Omit option -p.
	* tests/c-parse.exp: Regenerated.
	* tests/chill.exp: Regenerated.
	* tests/cplusplus.exp: Regenerated.
	* tests/gpc.exp: Regenerated.
	* tests/java.exp: Regenerated.
	* tests/objc.exp: Regenerated.
	* tests/test-4.exp: Regenerated.

	* src/output.cc (Output::output_lookup_function_body): Omit the
	multicompare code section and its variables when it is not used.
	* tests/chill.exp: Regenerated.

	* src/output.c (Output_Compare::output_firstchar_comparison): New
	method.
	(Output_Compare_Strcmp::output_comparison,
	Output_Compare_Strncmp::output_comparison,
	Output_Compare_Memcmp::output_comparison): Use it.
	* tests/permutc2.exp: Update.

	* tests/smtp.gperf: New file, based on a contribution by Bruce Lilly.
	* tests/Makefile.in (check-smtp): New rule.
	(check): Depend on it.
	(clean): Update.

2002-12-12  Bruno Haible  <bruno@clisp.org>

	* src/search.h (Search::init_selchars_tuple,
	Search::count_duplicates_tuple): Add alpha_unify argument.
	(Search::count_duplicates_tuple): New method declaration.
	* src/search.cc (Search::init_selchars_tuple,
	Search::count_duplicates_tuple): Add alpha_unify argument.
	(Search::find_positions): Update.
	(Search::count_duplicates_tuple): New method.
	(Search::count_duplicates_multiset): Free temp alpha_unify vector.
	(Search::find_alpha_inc): Call count_duplicates_tuple.

	* src/configure.in: Add test for stack-allocated variable-size arrays.
	* src/config.h.in: Regenerated.
	* src/search.cc: Include config.h.
	(DYNAMIC_ARRAY, FREE_DYNAMIC_ARRAY): New macros.
	(Search::find_alpha_inc, Search::count_possible_collisions,
	Search::find_asso_values): Use them.
	* src/Makefile.in (search.o): Depend on config.h.

	* src/search.h (Search::keyword_list_length, Search::max_key_length,
	Search::get_max_keysig_size, Search::prepare): Remove declarations.
	(Search::prepare): Renamed from Search::preprepare.
	(Search::_max_selchars_length): New field.
	* src/search.cc (Search::prepare): Renamed from Search::preprepare.
	(Search::prepare_asso_values): Merged with old Search::prepare.
	Initialize _max_selchars_length.
	(Search::keyword_list_length): Remove function. Use _list_len instead.
	(Search::max_key_length): Remove function. Use _max_key_len instead.
	(Search::get_max_keysig_size): Remove function. Use
	_max_selchars_length instead.
	(Search::count_possible_collisions, Search::find_asso_values): Update.
	(Search::find_good_asso_values): Call just prepare_asso_values.
	(Search::~Search): Update.

	* src/output.h (Output::output_asso_values_ref): New declaration.
	* src/output.cc (char_to_index): Remove variable.
	(Output::output_asso_values_ref): New function.
	(Output::output_hash_function): Use it.
	(Output::output): Update.

	* src/positions.h (Positions::is_useall, Positions::set_useall,
	Positions::iterator, Positions::reviterator): New method declarations.
	(Positions::_useall): New field.
	(PositionIterator): Make constructor private. Add a constructor and a
	copy constructor.
	(PositionIterator::remaining): New declaration.
	(PositionReverseIterator): Make constructor private. Add a constructor
	and a copy constructor.
	(PositionReverseIterator::remaining): New declaration.
	(PositionReverseIterator::_minindex): New field.
	* src/positions.icc (Positions::Positions): Initialize _useall.
	(Positions::operator=): Likewise.
	(Positions::is_useall, Positions::set_useall): New methods.
	(Positions::sort): Do nothing if _useall is set.
	(Positions::iterator, Positions::reviterator): New methods.
	(PositionIterator::PositionIterator): New constructor.
	(PositionIterator::remaining): New method.
	(PositionReverseIterator::PositionReverseIterator): New constructor.
	(PositionReverseIterator::next): Use _minindex as bound.
	(PositionReverseIterator::remaining): New method.
	* src/positions.cc (Positions::add, Positions::remove): Reset the
	useall flag.
	(Positions::print): Handle the useall case.
	* src/options.h (ALLCHARS): Remove.
	* src/options.cc (Options::~Options): Update.
	(Options::parse_options): Use Positions::set_useall().
	* src/keyword.h (KeywordExt::init_selchars_tuple,
	KeywordExt::init_selchars_multiset, KeywordExt::init_selchars_low):
	Remove use_all_chars argument.
	* src/keyword.cc (KeywordExt::init_selchars_low): Remove use_all_chars
	argument. Tell the position iterator to stop at _allchars_length.
	Remove special case code for -k'*'.
	(KeywordExt::init_selchars_tuple, KeywordExt::init_selchars_multiset):
	Remove use_all_chars argument.
	* src/search.h (Search::init_selchars_tuple): Remove use_all_chars
	argument.
	(Search::init_selchars_multiset): Likewise.
	* src/search.cc (Search::init_selchars_tuple): Remove use_all_chars
	argument.
	(Search::count_duplicates_tuple, Search::find_positions): Update.
	(Search::compute_alpha_unify): Remove special case code for -k'*'.
	(Search::init_selchars_multiset): Remove use_all_chars argument.
	(Search::count_duplicates_multiset): Update.
	(Search::find_alpha_inc): Remove special case code for -k'*'.
	(Search::prepare): Update.
	(Search::get_max_keysig_size): Update.
	* src/output.cc (Output::output_hash_function): Remove special case
	code for -k'*'.
	* tests/chill.exp: Regenerated.

2002-12-11  Bruno Haible  <bruno@clisp.org>

	Change the positions to be 0-based, instead of 1-based.
	* src/positions.h (Positions::LASTCHAR): Set to -1.
	(Positions::MAX_SIZE): New constant.
	(Positions::pointer): Change return type.
	(Positions::_positions): Change element type.
	(PositionIterator::EOS, PositionReverseIterator::EOS): Set to -2.
	* src/positions.icc (Positions::pointer): Change return type.
	(Positions::sort): Update.
	* src/positions.cc (Positions::contains, Positions::add,
	Positions::remove): Update.
	(Positions::print): Update. Fix off-by-one bug.
	* src/options.cc (Options::~Options): Update.
	(Options::parse_options): Set BAD_VALUE to -3. Update.
	* src/keyword.cc (KeywordExt::init_selchars_low): Update.
	* src/search.cc (Search::find_positions, Search::compute_alpha_unify,
	Search::find_alpha_inc): Update.
	* src/output.cc (Output::output_hash_function): Update. Don't emit
	a 'case' statement right after 'default:'.
	* tests/c-parse.exp: Regenerated.
	* tests/charsets.exp: Regenerated.
	* tests/cplusplus.exp: Regenerated.
	* tests/java.exp: Regenerated.
	* tests/languages.exp: Regenerated.
	* tests/modula2.exp: Regenerated.
	* tests/objc.exp: Regenerated.

2002-12-10  Bruno Haible  <bruno@clisp.org>

	* src/options.h: Reorder enum values.
	(Options::short_usage, Options::long_usage): Make static.
	* src/options.cc (Options::short_usage); No longer print a monster
	usage line.
	(Options::print_options): Improve output of options like
	--key-positions=1,2,$.
	(Options::~Options): Update.

	* src/options.h (UPPERLOWER): New enum value.
	* src/options.cc (Options::long_usage): Document option --ignore-case.
	(Options::~Options): Update.
	(long_options): Add option --ignore-case.
	(Options::parse_options): Handle option --ignore-case.
	* src/input.cc (Input::read_input): Recognize option %ignore-case.
	* src/keyword.h (KeywordExt::init_selchars_tuple,
	KeywordExt::init_selchars_multiset, KeywordExt::init_selchars_low):
	Add alpha_unify argument.
	* src/keyword.cc (KeywordExt::init_selchars_low): Add alpha_unify
	argument.
	(KeywordExt::init_selchars_tuple): Add alpha_unify argument.
	(KeywordExt::init_selchars_multiset): Add alpha_unify argument.
	* src/search.h (Search::compute_alpha_size,
	Search::compute_alpha_unify): New declarations.
	(Search::init_selchars_multiset): Add alpha_unify argument.
	(Search::_alpha_unify): New field.
	* src/search.cc (Search::compute_alpha_size,
	Search::compute_alpha_unify): New functions.
	(Search::init_selchars_tuple): Update.
	(Search::find_positions): Temporarily set _alpha_unify. Perform a
	case insensitive comparison if needed.
	(Search::init_selchars_multiset): Add alpha_unify argument.
	(Search::count_duplicates_multiset): Call compute_alpha_unify.
	(Search::find_alpha_inc): Temporarily set _alpha_unify. At the end,
	set _alpha_size and _alpha_unify.
	(Search::prepare): Update. Don't compute _alpga_size here.
	(Search::optimize): Propagate unified asso_values.
	(Search::~Search) Delete _alpha_unify.
	* src/output.cc (output_upperlower_strcmp, output_upperlower_strncmp,
	output_upperlower_memcmp): New functions.
	(Output_Compare_Strcmp::output_comparison,
	Output_Compare_Strncmp::output_comparison,
	Output_Compare_Memcmp::output_comparison): Use the case-insensitive
	comparison function if --ignore-case was given.
	(Output::output): Emit the auxiliary case-insensitive comparison
	function if needed.
	* tests/permutc2.gperf, tests/permutc2.exp: New files.
	* tests/Makefile.in (check-test): Also check permutc2.gperf.
	* tests/test-6.exp: Update.
	* doc/gperf.texi (Gperf Declarations): Document %ignore-case.
	(Input Details): Document option --ignore-case.
	* NEWS: Update.

	* src/search.cc (Search::optimize): Fill unused asso_values[] entries
	with a large value.
	* src/output.h (Output::Output): Remove occurrences argument.
	(Output::_occurrences): Remove field.
	* src/output.cc (Output::Output): Remove occurrences argument.
	(Output::output_hash_function): Ignore _occurrences.
	* src/main.cc (main): Don't pass the _occurrences to Output.

	* src/search.cc (Search::preprepare): Exit if keywords contain
	out-of-range characters.

	* src/search.cc (for): Define so as to avoid errors with old compilers.

	* src/options.h (SHAREDLIB): New enum value.
	* src/options.cc (Options::short_usage): Mention option -P.
	(Options::long_usage): Document option -P.
	(long_options): Add option --pic.
	(Options::parse_options): Handle option -P/--pic.
	* src/output.cc (output_keyword_blank_entries): When SHAREDLIB is
	specified, emit NULL pointers instead of "".
	(Output::output_lookup_function_body): When SHAREDLIB is specified
	and SWITCH and DUP and not specified, test the table entry against
	NULL before the string comparison.
	* tests/test-6.exp: Update.
	* doc/gperf.texi (Output Details): Document option -P.
	* NEWS: Update.
	Suggested by Ulrich Drepper.

2002-12-08  Bruno Haible  <bruno@clisp.org>

	* tests/permut2.gperf, tests/permut2.exp: New files.
	* tests/permut3.gperf, tests/permut3.exp: New files.
	* tests/charsets.gperf: New file, from Bruce Lilly.
	* tests/charsets.exp: New file.
	* tests/languages.gperf: New file, from Bruce Lilly.
	* tests/languages.exp: New file.
	* Makefile.in (check-test): Test them all.

	Completely new asso_values search algorithm.
	* src/search.h (Search::compute_occurrence, Search::clear_determined,
	Search::set_determined, Search::already_determined, Search::reorder):
	Remove functions.
	(Search::init_asso_values, Search::sort_by_occurrence,
	Search::compute_occurrence, Search::sort_by_occurrence,
	Search::has_collisions, Search::collision_prior_to): Remove functions.
	(Search::compute_partition, Search::count_possible_collisions,
	Search::unchanged_partition): New method declarations.
	(Search::_determined): Remove field.
	* src/search.cc (Search::prepare): Don't initialize _determined.
	(Search::compute_occurrence, greater_by_occurrence,
	Search::clear_determined, Search::set_determined,
	Search::already_determined, Search::reorder): Remove functions.
	(Search::init_asso_values, compute_disjoint_union,
	Search::sort_by_occurrence, Search::compute_occurrence,
	Search::sort_by_occurrence, Search::has_collisions,
	Search::collision_prior_to): Remove functions.
	(StackEntry): Remove class.
	(EquivalenceClass, Step): New classes.
	(equals, Search::compute_partition, delete_partition,
	Search::count_possible_collisions, Search::unchanged_partition): New
	functions.
	(Search::find_asso_values): Completely rewritten.
	(Search::find_good_asso_values): Don't call reorder().
	(Search::~Search): Don't free _determined.
	* src/keyword.h (KeywordExt::_occurrence): Remove field.
	* src/options.h (ORDER, FAST, OPT_CHOICE): Remove enum values.
	(Options::_iterations): Remove field.
	* src/options.icc (Options::get_iterations): Remove method.
	* src/options.cc (Options::long_usage): Remove mention of -f and -o.
	(Options::Options): Don't initialize _iterations.
	(Options::~Options): Update.
	(Options::parse_options): Do nothing for options -f, -o, -O.
	* doc/gperf.texi: (Contributors): Update.
	(Algorithmic Details): Remove options -f and -o. Update description
	of option -s.
	* tests/c-parse.exp, tests/chill.exp, tests/cplusplus.exp,
	tests/gpc.exp, tests/java.exp, tests/modula2.exp, tests/objc.exp,
	tests/test-4.exp): Regenerated, smaller than before.
	* tests/test-6.exp: Update.
	* NEWS: Update.

2002-12-08  Bruno Haible  <bruno@clisp.org>

	* src/search.h (Search::_alpha_size): Change type to 'unsigned int'.
	(Search::_asso_value_max): Likewise.
	* src/search.cc (Search::prepare_asso_values): Update.
	(Search::init_asso_values): Update.
	(Search::~Search): Update.
	* src/output.h (Output::Output): Change alpha_size type to
	'unsigned int'.
	(Output::_alpha_size): Change type to 'unsigned int'.
	* src/output.cc (Output::Output): Change alpha_size type to
	'unsigned int'.
	(Output::output_hash_function): Update.

2002-12-07  Bruno Haible  <bruno@clisp.org>

	* src/options.h (OPT_CHOICE): New enum value.
	* src/options.cc (Options::~Options): Update.
	(long_options): New option --optimized-collision-resolution.
	(Options::parse_options): Accept option -O.
	* src/search.h (Search::sort_by_occurrence): Change argument to
	'unsigned int'.
	(Search::compute_occurrence, Search::sort_by_occurrence): New method
	declarations.
	* src/search.cc (Search::sort_by_occurrence): Change argument to
	'unsigned int'.
	(Search::compute_occurrence, Search::sort_by_occurrence): New methods.
	(Search::find_asso_values): Implement OPT_CHOICE. More debugging
	output.

	* src/search.cc (Search::prepare_asso_values) [DEBUG]: Also print
	the keyword list in order.
	(Search::find_asso_values) [DEBUG]: Upon failure, print the union_set.

	* src/options.h (Options::get_size_multiple): Change return type to
	float.
	(Options::_size_multiple): Change type to float.
	* src/options.icc (Options::get_size_multiple): Change return type to
	float.
	* src/options.cc (Options::long_usage): Update description of option
	-s.
	(Options::~Options): Update.
	(Options::parse_options): For option -s, accept a fraction.
	* src/search.cc (Search::prepare_asso_values): Use get_size_multiple
	as it is.
	* tests/test-6.exp: Update.
	* doc/gperf.texi (Algorithmic Details): Update description of option
	-s.

2002-12-04  Bruno Haible  <bruno@clisp.org>

	Improve debugging output.
	* src/hash-table.h (Hash_Table::dump): New method.
	* src/hash-table.cc (Hash_Table::dump): New method, extracted from
	destructor.
	(Hash_Table::~Hash_Table): No longer print the contents.
	* src/positions.h (PositionReverseIterator): New class.
	* src/positions.icc (PositionReverseIterator::PositionReverseIterator,
	PositionReverseIterator::next): New methods.
	* src/search.cc (Search::find_positions): If debugging, print the
	result.
	(Search::find_alpha_inc): If debugging, print the result.
	(Search::prepare): Explicitly dump the hash table's contents here.

	Portability fixes.
	* src/positions.h (Positions::LASTCHAR, Positions::MAX_KEY_POS,
	PositionIterator::EOS): Define as compile-time constants using enum.
	* src/bool-array.cc (Bool_Array::~Bool_Array): Remove const qualifier
	of pointer to be deleted.
	* src/input.cc (Input::~Input): Likewise.
	* src/keyword.cc (KeywordExt::delete_selchars): Likewise.
	* src/main.cc (main): Likewise.
	* src/hash-table.cc (Hash_Table::~Hash_Table): Limit scope of 'for'
	variables.
	* src/search.cc (Search::prepare_asso_values): Use a static_cast to
	convert from time_t to long. This is possible because ISO C 99 says
	time_t is a numeric type.

2002-11-20  Bruno Haible  <bruno@clisp.org>

	* src/search.cc (Search::find_asso_values): Avoid gcc warnings about
	uninitialized variables.

	Implement backtracking.
	* src/search.h (Search::has_collisions): Renamed from
	Search::less_collisions. Return a boolean.
	* src/search.cc (Search::has_collisions): Renamed from
	Search::less_collisions. Return a boolean.
	(StackEntry): Remove field _collisions_so_far.
	(Search::find_asso_values): Backtrack when encountering an unresolved
	collision. Assume collisions_so_far is always zero.
	(Search::optimize): Exit if there are accidental duplicates at the end.
	* src/output.cc (Output::num_hash_values): Simply return the list
	length.
	(Output::output_keylength_table): Remove handling of accidental
	duplicates.
	(Output::output_keyword_table, Output::output_lookup_array): Likewise.
	(output_switch_case, output_switches): Likewise.
	* doc/gperf.texi (Algorithmic Details): Adjust description of options
	-D, -f, -o, -r.
	(Bugs): Remove note about missing backtracking.
	(Projects): Likewise.

2002-11-19  Bruno Haible  <bruno@clisp.org>

	Prepare for backtracking.
	* src/search.h (Search::try_asso_value, Search::change_some_asso_value):
	Remove declarations.
	(Search::less_collisions, Search::collision_prior_to): New declarations.
	(Search::_fewest_collisions, Search::_union_set, Search::_num_done):
	Remove fields.
	* src/search.cc (Search::prepare_asso_values): Don't initialize
	_union_set.
	(Search::try_asso_value, Search::change_some_asso_value): Remove
	methods.
	(Search::less_collisions, Search::collision_prior_to): New methods.
	(StackEntry): New class.
	(Search::find_asso_values): Reorganized to use pseudo-recursion.
	(Search::~Search): Don't free _union_set.

	* src/search.h (Search::find_good_asso_values): New declaration.
	* src/search.cc: Add comments about the basic structure of the
	algorithm.
	(Search::find_positions): Move the option[POSITIONS] test to here.
	(Search::find_good_asso_values): New method, extracted from
	Search::optimize.
	(Search::optimize): Remove option[POSITIONS] test. Call
	find_good_asso_values.

2002-11-17  Bruno Haible  <bruno@clisp.org>

	* src/options.cc (Options::parse_options): Include copyright notice
	and authors in --version output.

	Avoid artificial duplicates.
	* src/keyword.h (KeywordExt::init_selchars_tuple): New declaration.
	(KeywordExt::init_selchars_multiset): Renamed from
	KeywordExt::init_selchars.
	(KeywordExt::init_selchars_low): New declaration.
	* src/keyword.cc (KeywordExt::init_selchars_low): Renamed from
	KeywordExt::init_selchars. Add alpha_inc argument. Remove sorting.
	(KeywordExt::init_selchars_tuple): New method.
	(KeywordExt::init_selchars_multiset): New method, replaces
	KeywordExt::init_selchars.
	* src/search.h (Search::init_selchars_tuple): Renamed from
	Search::init_selchars.
	(Search::count_duplicates_tuple): Renamed from Search::count_duplicates.
	(Search::init_selchars_multiset, Search::count_duplicates_multiset,
	Search::find_alpha_inc): New declarations.
	(Search::_alpha_inc): New field.
	(Search::_alpha_size, Search::_occurrences, Search::_asso_values,
	Search::_determined): Make non-const.
	* src/search.cc (Search::Search): Don't initialize _key_positions,
	_alpha_size, _occurrences, _asso_values, _determined here.
	(Search::init_selchars_tuple): Renamed from Search::init_selchars.
	(Search::count_duplicates_tuple): Renamed from Search::count_duplicates.
	(Search::find_positions): Update.
	(Search::init_selchars_multiset, Search::count_duplicates_multiset,
	Search::find_alpha_inc): New methods.
	(Search::prepare): Move preprepare, find_positions calls away.
	Initialize _alpha_size, _occurrences, _asso_values, _determined here.
	(Search::optimize): Call preprepare, find_positions here. Initialize
	_key_positions here.
	(Search::~Search): Deallocate _alpha_inc.
	* src/output.cc (Output::Output): Add alpha_inc argument.
	(Output::output_hash_function): Use _alpha_inc.
	* src/output.h (Output::Output): Add alpha_inc argument.
	(Output::_alpha_inc): New field.
	* src/main.cc (main): Pass _alpha_inc from Search to Output.
	* tests/chill.exp: Update.
	* doc/gperf.texi (Algorithmic Details): Remove description of
	artificial duplicates.

	* src/keyword.h (KeywordExt::_selchars): Change type to
	'const unsigned int *'.
	* src/keyword.cc (sort_char_set): Change argument type to
	'unsigned int *'.
	(KeywordExt::init_selchars): Update.
	* src/search.h (Search::sort_by_occurrence): Change argument type to
	'unsigned int *'.
	(Search::try_asso_value): Change argument type to 'unsigned int'.
	(Search::_union_set): Change type to 'unsigned int *'.
	* src/search.cc (Search::prepare, Search::compute_occurrence,
	Search::set_determined, Search::already_determined,
	Search::prepare_asso_values, Search::compute_hash): Update.
	(compute_disjoint_union): Change argument types to 'unsigned int *'.
	(Search::sort_by_occurrence): Likewise.
	(Search::try_asso_value): Change argument type to 'unsigned int'.
	(Search::change_some_asso_value, Search::~Search): Update.
	* src/hash-table.cc (Hash_Table::~Hash_Table, Hash_Table::equal,
	Hash_Table::insert): Update.

	* src/positions.h: New file, extracted from options.h.
	* src/positions.icc: New file, extracted from options.icc.
	* src/positions.cc: New file, extracted from options.cc.
	* src/options.h: Include positions.h. Move classes Positions and
	PositionsIterator away.
	* src/options.icc: Move classes Positions and PositionsIterator away.
	* src/options.cc: Move class Positions away.
	* src/keyword.cc: Include positions.h instead of options.h.
	* src/output.h: Include positions.h instead of options.h.
	* src/search.h: Include positions.h instead of options.h.
	* src/Makefile.in (OBJECTS): Add positions.o.
	(POSITIONS_H): New variable.
	(OPTIONS_H, SEARCH_H, OUTPUT_H, keyword.o): Use it.
	(positions.o): New rule.

	* src/options.h (POSITIONS): New enum value.
	(Positions::Positions): New copy constructor.
	(Positions::operator=, Positions::contains, Position::add,
	Positions::remove, Positions::print): New method declaration.
	(Options::get_max_keysig_size): Remove method.
	* src/options.icc (Positions::Positions): New copy constructor.
	(Positions::operator=): New method.
	(Options::get_max_keysig_size): Remove method.
	* src/options.cc (Options::Options): Initialize _key_positions
	trivially.
	(Options::parse_options): Option -k sets POSITIONS.
	(Positions::contains, Positions::add, Positions::remove,
	Positions::print): New methods.
	* src/hash-table.cc (Hash_Table::~Hash_Table): Compute the field
	width explicitly, instead of using Options::get_max_keysig_size.
	* src/keyword.h (KeywordExt::init_selchars): Add arguments
	use_all_chars, positions.
	(KeywordExt::delete_selchars): New declaration.
	* src/keyword.cc (KeywordExt::init_selchars): Add arguments
	use_all_chars, positions. Remove error message if there are no key
	positions.
	(KeywordExt::delete_selchars): New method.
	* src/search.h: Include options.h.
	(Search::preprepare, Search::init_selchars, Search::delete_selchars,
	Search::count_duplicates, Search::find_positions): New declarations.
	(Search::_key_positions): New field.
	* src/search.cc (Search::Search): Initialize _key_positions.
	(Search::preprepare, Search::init_selchars, Search::delete_selchars,
	Search::count_duplicates, Search::find_positions): New functions.
	(Search::prepare): Call preprepare and find_positions. Tweak error
	message.
	(Search::get_max_keysig_size): Use _key_positions instead of
	option.get_key_positions().
	(Search::optimize): Tweak error message.
	* src/output.h: Include options.h.
	(Output::Output): Add Positions argument.
	(Output::_key_positions): New field.
	* src/output.cc (Output::Output): Add Positions argument.
	(Output::output_hash_function): Omit the table if there are no
	positions at all. Use _key_positions instead of
	option.get_key_positions().
	(Output::output): Output the computed positions as a comment.
	* src/main.cc (main): Pass the Positions from Searcher to Output.
	* src/Makefile.in (SEARCH_H, OUTPUT_H): Include OPTIONS_H.
	* tests/Makefile.in (check-test): Pass key positions explicitly.
	* tests/gpc.exp: Update.
	* tests/test-4.exp: Update.
	* doc/gperf.texi (Algorithmic Details): Mention that -k is not needed
	usually.

2002-11-16  Bruno Haible  <bruno@clisp.org>

	* src/options.h (Options::get_slot_name): Renamed from
	Options::get_key_name.
	(Options::set, Options::set_language, Options::set_total_switches,
	Options::set_function_name, Options::set_slot_name,
	Options::set_class_name, Options::set_hash_name,
	Options::set_wordlist_name, Options::set_delimiters): New method
	declarations.
	(Options::_language): New field.
	(Options::_slot_name): Renamed from Options::_key_name.
	* src/options.icc (Options::set): New method.
	(Options::get_slot_name): Renamed from Options::get_key_name.
	* src/options.cc (DEFAULT_FUNCTION_NAME): Renamed from DEFAULT_NAME.
	(DEFAULT_SLOT_NAME): Renamed from DEFAULT_NAME.
	(Options::Options): Initialize _language. Update.
	(Options::~Options): Update.
	(Options::set_language, Options::set_total_switches,
	Options::set_function_name, Options::set_slot_name,
	Options::set_class_name, Options::set_hash_name,
	Options::set_wordlist_name, Options::set_delimiters): New methods.
	(Options::parse_options): Call set_language. Update.
	* src/input.cc (is_declaration, is_declaration_with_arg,
	is_define_declaration): New functions.
	(Input::read_input): Accept %DECL declarations.
	* src/output.cc (Output::output_lookup_function_body): Update.
	* doc/gperf.texi (Declarations): Add new subnodes.
	(User-supplied Struct, Gperf Declarations, C Code Inclusion): New
	nodes.
	(Keywords, Output Format, Binary Strings, Options): Mention %
	declarations as being equivalent to the command line options.

	* src/options.cc (Options::long_usage): Rename options -H, -N, -l, -G.
	(long_options): Add --hash-function-name, --lookup-function-name,
	--compare-lengths.
	* doc/gperf.texi (Output Details): Rename options -H, -N, -l, -G.
	* tests/test-6.exp: Update.

	* src/options.cc (DEFAULT_DELIMITERS): Remove newline.
	* src/options.cc (Options::long_usage): Change default --delimiters.
	* doc/gperf.texi (Input Details): Likewise.
	* tests/test-6.exp: Update.

	* doc/gperf.texi: Move description of option -l from section
	Algorithmic Details to section Output Details.
	* src/options.cc (Options::long_usage): Likewise.
	* tests/test-6.exp: Update.

2002-11-12  Bruno Haible  <bruno@clisp.org>

	* src/options.h (Output::get_output_file_name): New method.
	(Output::_output_file_name): New field.
	* src/options.icc (Options::get_output_file_name): New method.
	* src/options.cc (Options::long_usage): Document option --output-file.
	(Options::Options): Initialize _output_file_name.
	(long_options): Add --output-file.
	(Options::parse_options): Handle it.
	* src/main.cc (main): Open the output file if given by name.
	* doc/gperf.texi (Output File): New section.
	* tests/test-6.exp: Update.

2002-11-10  Bruno Haible  <bruno@clisp.org>

	* src/input.cc (pretty_input_file_name): New function.
	(read_input): Use it in all error and warning messages.

	* src/keyword.h (Keyword::_lineno): New field.
	* src/input.h (Input::_struct_decl_lineno): New field.
	* src/input.cc (Input::read_input): Set _struct_decl_lineno. Fill
	each keyword's _lineno field.
	* src/main.cc (main): Pass _struct_decl_lineno from Input to Output.
	* src/output.h (Output::Output) Add struct_decl_lineno argument.
	(Output::_struct_decl_lineno): New field.
	* src/output.cc (Output::Output) Add struct_decl_lineno argument.
	(output_keyword_entry): Emit #line directive before table entry.
	(Output::output): Emit #line directive before _struct_decl.

	Fix memory leaks.
	* src/keyword.h (empty_string): New declaration.
	* src/keyword.cc (empty_string): New variable.
	* src/input.h (Input::_input): Make public.
	(Input::_input_end): New field.
	* src/input.cc (read_input): When removing leading whitespace from
	struct_decl, reallocate it. For rest, use empty_string instead of "".
	Set _input_end.
	(Input::~Input): Delete _struct_decl, _struct_tag, _return_type.
	* src/search.cc (Search::prepare): When removing an element from
	the keyword list, delete the list node.
	(Search::~Search): Delete _occurrences, _asso_values.
	* src/main.cc (main): Between Search::~Search and Input::~Input,
	destroy the keyword list.

	Rewrite the input routines.
	* src/input.h: Don't include read-line.h.
	(Input): Don't inherit from class Read_Line.
	(Input::read_keys, Input::strcspn, Input::set_output_types,
	Input::get_array_type, Input::save_include_src,
	Input::get_special_input): Remove declarations.
	(Input::read_input): New declaration.
	(Input::_struct_decl): Renamed from Input::_array_type.
	(Input::_verbatim_declarations): Renamed from Input::_include_src.
	(Input::_verbatim_code): Replaces Input::_additional_code.
	* src/input.cc: Completely rewritten.
	* src/output.h (Output::Output): Update the verbatim_* arguments.
	(Output::_struct_decl): Renamed from Output::_array_type.
	(Output::_verbatim_declarations): Renamed from Output::_include_src.
	(Output::_verbatim_code): Replaces Output::_additional_code.
	* src/output.cc (Output::Output): Update the verbatim_* arguments.
	(Output::output): Output the verbatim_* code pieces with #line.
	* src/main.cc (main): Call Input::read_input instead of
	Input::read_keys. Update Output::Output arguments.
	* src/read-line.h: Remove file.
	* src/read-line.cc, src/read-line.icc: Remove files.
	* src/Makefile.in (OBJECTS): Remove read-line.o.
	(READ_LINE_H): Remove variable.
	(INPUT_H): Update.
	(read-line.o): Remove rule.
	* doc/gperf.texi (Declarations): Correct the example.
	(Keywords): Mention that lines starting with % are forbidden here.
	* tests/c-parse.exp: Update.
	* tests/cplusplus.exp: Update.
	* tests/gpc.exp: Update.
	* tests/java.exp: Update.
	* tests/objc.exp: Update.
	* tests/test-4.exp: Update.

	* src/options.h (Options::get_input_file_name): New declaration.
	(Options::_input_file_name): New field.
	* src/options.icc (Options::get_input_file_name): New method.
	* src/options.cc (Options::Options): Initialize _input_file_name.
	(Options::parse_options): Don't open input file, only store it in
	_input_file_name.
	* src/main.cc (main): Open input file here.
	Print an error message upon write error on the output file.

	Upgrade to autoconf-2.52.
	* configure.in: Use AC_CONFIG_SUBDIRS instead of AC_OUTPUT_SUBDIRS.
	* Makefile.devel (configure, lib/configure, src/configure,
	tests/configure, doc/configure): Use autoconf-2.52.

2002-11-09  Bruno Haible  <bruno@clisp.org>

	* doc/gperf.texi: Talk about "bytes" instead of "characters". Talk
	about "keywords", not "keys". Talk about "input file", not "keyfile".
	(@menu): Fix a menu entry.
	(Contributors): Don't mention cperf.
	(Motivation): Fix an off-by-one error in the definition of "minimal".
	Mention GNU Java. Recommend http URL instead of anonymous ftp.
	(Search Structures): Mention GNU Java.
	(Output Format): Drop reference to node 'Implementation'.
	(Output Details): Talk about "slot-name" instead of "key name".
	(Algorithmic Details): Talk about "selected byte positons", not
	"key positions". Upper limit is now 255. Explain a third reason
	why duplicates can occur. Describe negative effects of
	--occurrence-sort.
	(Implementation): Remove chapter.

2002-11-07  Bruno Haible  <bruno@clisp.org>

	* src/bool-array.cc (Bool_Array::~Bool_Array): Free _storage_array.
	* src/search.cc (Search::~Search): Free _union_set, _determined.

	* tests/Makefile.in (check-test): Don't redirect stderr.

2002-11-05  Bruno Haible  <bruno@clisp.org>

	* src/keyword-list.h (mergesort_list): New declarations.
	* src/keyword-list.cc (Keyword_Comparison): New type.
	(merge, mergesort_list): New functions, moved here from search.cc.
	* src/search.h (Search::merge, Search::merge_sort): Remove methods.
	(Search::_occurrence_sort, Search::_hash_sort): Remove fields.
	* src/search.cc (Search::merge, Search::merge_sort): Remove methods.
	(greater_by_occurrence, less_by_hash_value): New functions.
	(Search::reorder, Search::sort): Use mergesort_list.

2002-11-04  Bruno Haible  <bruno@clisp.org>

	* src/options.h (Options::_asso_iterations): New field.
	(Options::get_asso_iterations): New method declaration.
	* src/options.icc (Options::get_asso_iterations): New method.
	* src/options.cc (Options::short_usage): Mention j<jump> and m<num>.
	(Options::long_usage): Document option -m.
	(Options::Options): Initialize _asso_iterations.
	(Options::~Options): Print _asso_iterations too.
	(long_options): Add --multiple-iterations.
	(Options::parse_options): Handle option -m.
	* src/keyword-list.h (copy_list, delete_list): New declarations.
	* src/keyword-list.cc (copy_list, delete_list): New functions.
	* src/search.h (Search::_initial_asso_value, Search::_jump): New fields.
	* src/search.cc (Search::prepare_asso_values): Initialize
	_initial_asso_value and _jump here.
	(Search::init_asso_values): Use _initial_asso_value.
	(Search::try_asso_value): Use _jump.
	(Search::optimize): If option -m was given, iterate over different
	values for _initial_asso_value and _jump.
	* doc/gperf.texi (Algorithmic Details): Document option -m.
	* tests/test-6.exp: Update.

2002-11-03  Bruno Haible  <bruno@clisp.org>

	Bug fix: When option -j 0 was used without option -r, the output was
	not random.
	* src/search.h (Search::prepare_asso_values): New method declaration.
	* src/search.cc (Search::prepare_asso_values): New method, extracted
	from Search::init_asso_values. Call srand also when "-j 0" was given.
	(Search::optimize): Call prepare_asso_values().

	* src/hash-table.h (Hash_Table::_ignore_length, Hash_Table::equal):
	Declare as const.
	* src/hash-table.cc (Hash_Table::equal): Declare as const.
	* src/input.h (Input::_factory): Declare as const.
	* src/keyword-list.h (Keyword_List::first, KeywordExt_List::first):
	Declare as const.
	* src/keyword-list.icc (Keyword_List::first, KeywordExt_List::first):
	Declare as const.
	* src/output.h (Output::num_hash_values, Output::output_constants,
	Output::output_hash_function, Output::output_keylength_table,
	Output::output_keyword_table, Output::output_lookup_array,
	Output::output_lookup_tables, Output::output_lookup_function_body,
	Output::output_lookup_function, Output::_array_type,
	Output::_additional_code, Output::_include_src, Output::_total_keys,
	Output::_total_duplicates, Output::_max_key_len, Output::_min_key_len):
	Declare as const.
	* src/output.cc (Output::num_hash_values, Output::output_constants,
	Output::output_hash_function, Output::output_keylength_table,
	Output::output_keyword_table, Output::output_lookup_array,
	Output::output_lookup_tables, Output::output_lookup_function_body,
	Output::output_lookup_function): Declare as const.
	* src/search.h (Search::merge, Search::merge_sort,
	Search::compute_occurrence, Search::already_determined,
	Search::keyword_list_length, Search::max_key_length,
	Search::get_max_keysig_size, Search::compute_hash,
	Search::sort_by_occurrence): Declare as const.
	* src/search.cc (Search::merge, Search::merge_sort,
	Search::compute_occurrence, Search::already_determined,
	Search::keyword_list_length, Search::max_key_length,
	Search::get_max_keysig_size, Search::compute_hash,
	Search::sort_by_occurrence): Declare as const.

	* src/output.cc (Output::output): Set char_to_index to a cast in all
	cases. Avoids gcc warnings on the generated code.

	* src/output.cc (Output_Enum): Prepend an underscore to field names.
	(Output_Expr1): Likewise.
	(Output::output_hash_function): Simplify the special case for "-k 1,$".

	* src/search.h (Search::init_asso_values, Search::find_asso_values):
	New declarations.
	(Search::try_asso_value): Renamed from Search::affects_prev.
	(Search::change_some_asso_value): Renamed from Search::change.
	(Search::set_asso_max, Search::get_asso_max): Remove methods.
	(Search::_union_set): New field.
	* src/search.cc (Search::init_asso_values): New method, extracted
	from Search::optimize.
	(Search::try_asso_value): Renamed from Search::affects_prev. Take the
	iteration count as argument.
	(Search::change_some_asso_value): Renamed from Search::change. Don't
	make union_set static. Don't increment _fewest_collisions here.
	(Search::find_asso_values): New method, extracted from
	Search::optimize.
	(Search::optimize); Update.

	* src/search.h (Search::compute_hash): Renamed from Search::hash.
	(Search::compute_disjoint_union): Remove declaration.
	(Search::sort_by_occurrence): Renamed from Search::sort_set.
	* src/search.cc (Search::compute_hash): Renamed from Search::hash.
	(compute_disjoint_union): Renamed from Search::compute_disjoint_union.
	(Search::sort_by_occurrence): Renamed from Search::sort_set.
	(Search::change): Simplify loop.

	* src/search.h (Search::clear_determined): New declaration.
	* src/search.cc (Search::clear_determined): New method.
	(Search::already_determined): Optimize.
	(Search::reorder): Even when the next keyword after the current one
	is completely determined, move all determined keywords after the
	current one.

	Compute the occurrences after removal of duplicates, not before.
	* src/keyword.h (KeywordExt::init_selchars): Remove occurrences
	argument.
	* src/keyword.cc (KeywordExt::init_selchars): Likewise.
	* src/search.cc (Search::prepare): Reorder the code. Compute the
	occurrences after removal of duplicates.
	(Search::merge_sort): Optimize the loop.
	(Search::compute_occurrence): Renamed from Search::get_occurrence.
	* src/search.h (Search::compute_occurrence): Renamed from
	Search::get_occurrence.
	* tests/chill.exp: Regenerated.

	Bug fix: The hash table could fail to detect duplicates, between
	keywords of different length, when option -n (option[NOLENGTH]) was
	given.
	* src/hash-table.h (Hash_Table::Hash_Table): Pass table size, not
	vector and vector size as arguments.
	(Hash_Table::_log_size): New field.
	(Hash_Table::equal): New declaration.
	* src/hash-table.cc (size_factor): New variable.
	(Hash_Table::Hash_Table): Pass table size, not vector and vector size
	as arguments. Allocate the vector here.
	(Hash_Table::~Hash_Table): Deallocate the vector here.
	(Hash_Table::equal): New function.
	(Hash_Table::insert): Use it. Don't use item->_allchars_length for the
	increment if _ignore_length is true.
	* src/search.cc (TABLE_MULTIPLE): Remove variable.
	(Search::prepare): Update.

2002-11-02  Bruno Haible  <bruno@clisp.org>

	Provide documentation also in PDF format.
	* doc/Makefile.in (pdfdir, TEXI2PDF): New variables.
	(all): Depend on pdf.
	(pdf, gperf.pdf): New rules.
	(maintainer-clean): Remove the PDF file.

	* src/keyword-list.icc: New file, extracted from keyword-list.h.
	* src/keyword-list.h: Include keyword-list.icc. Move inline methods
	to there.
	* src/keyword-list.cc: Include keyword-list.icc.
	* src/Makefile.in (KEYWORD_LIST_H): Add keyword-list.icc.

	* lib/hashpjw.h (hashpjw): Change argument type to 'unsigned char *'.
	* lib/hash.cc (hashpjw): Likewise.
	* src/keyword.icc: New file.
	* src/keyword.h: Include keyword.icc.
	(KeywordExt::_selchars): Change type to 'unsigned char *'.
	* src/keyword.cc: Include keyword.icc.
	(Keyword::Keyword, KeywordExt::KeywordExt): Move to keyword.icc.
	(sort_char_set): Change argument type to 'unsigned char *'.
	(KeywordExt::init_selchars): Update.
	* src/search.h (Search::compute_disjoint_union): Change argument types
	to 'unsigned char *'.
	(Search::sort_set): Likewise.
	(Search::affects_prev): Change argument type to 'unsigned char'.
	* src/search.cc (Search::prepare): Initialize _duplicate_link here.
	(Search::get_occurrence, Search::set_determined,
	Search::already_determined, Search::hash): Update.
	(Search::compute_disjoint_union): Change argument types to
	'unsigned char *'.
	(Search::sort_set): Likewise.
	(Search::affects_prev): Change argument type to 'unsigned char'.
	(Search::change): Update.
	* src/Makefile.in (KEYWORD_H): Add keyword.icc.

	* src/options.cc (Options::parse_options): Fix error message.

	* src/read-line.h (Read_Line::Read_Line): Make FILE* argument
	mandatory. Move body to read-line.icc.
	* src/read-line.icc (Read_Line::Read_Line): New constructor.
	* src/input.h (Input::Input): Add FILE* argument.
	* src/input.cc (Input::Input): Likewise.
	* src/main.cc (main): Pass stdin to Input constructor.

	* src/options.h (DEFAULTCHARS): Remove.
	(Positions::MAX_KEY_POS): Set to 255.
	(Positions::_positions): Increase array size.
	(PositionIterator::EOS): Set to -1.
	(PositionIterator::_index): Change type to 'unsigned int'.
	* src/options.icc (Positions::Positions): Don't store
	PositionIterator::EOS.
	(PositionIterator::next): Produce PositionIterator::EOS here.
	* src/options.cc (Options::long_usage): Use MAX_KEY_POS, not
	MAX_KEY_POS-1.
	(PositionStringParser): Rename field _size to _in_range. Rename
	field _curr_value to _range_curr_value. Rename field _upper_bound
	to _range_upper_bound.
	(PositionStringParser::nextPosition): Comments.
	(Options::Options): Update.
	(Options::~Options): Update.
	(long_options): Use NULL, not 0.
	(Options::parse_options): Set BAD_VALUE to -2; -1 is now EOS. Bug fix:
	Check against array overflow when more than MAX_KEY_POS positions are
	given. Don't store PositionIterator::EOS.
	Check against extra arguments before opening the input file.
	* src/output.cc (Output::output_hash_function): Change test which
	was for option[DEFAULTCHARS].
	* tests/test-6.exp: Update.

	* src/options.h (Options::get_delimiters): Renamed from
	Options::get_delimiter.
	* src/options.icc (Options::get_delimiters): Renamed from
	Options::get_delimiter.
	* src/input.cc (Input::read_keys): Update.

	Bug fix.
	* src/options.cc (Options::print_options): Escape backquote inside
	double-quoted strings.

	Bug fix.
	* src/keyword.cc (KeywordExt::init_selchars): Avoid comparison with
	uninitialized member variable. Found with 'valgrind'.

	* src/version.cc: Include version.h.
	* src/Makefile.in (OBJECTS): Reorder.
	(KEYWORD_H, KEYWORD_LIST_H, INPUT_H, SEARCH_H, OUTPUT_H): New
	variables.
	(HASH_TABLE_H): Update.
	(options.o, read-line.o, keyword.o, keyword-list.o, input.o, search.o,
	output.o, main.o): Update dependencies.

	* src/vectors.h: Remove file.
	* src/vectors.cc: Remove file.
	* src/search.h: Don't include vectors.h.
	(Search): Don't inherit from Vectors. New fields _alpha_size,
	_occurrences, _asso_values.
	(Search::_determined, Search::get_occurrence, Search::set_determined,
	Search::already_determined, Search::hash, Search::sort_set): Make
	nonstatic.
	* src/search.cc (Search::Search): Initialize _alpha_size, _occurrences,
	_asso_values, _determined.
	(Search::optimize, Search::~Search): Update.
	* src/output.h: Don't include vectors.h.
	(Output): Remove field _v. New fields _alpha_size, _occurrences,
	_asso_values.
	(Output::Output): Replace Vectors* argument with alpha_size,
	occurrences, asso_values.
	* src/output.cc (Output::Output): Replace Vectors* argument with
	alpha_size, occurrences, asso_values.
	(Output::output_hash_function): Update.
	* src/main.cc (main): Don't set Vectors::ALPHA_SIZE.
	Pass _alpha_size, _occurrences, _asso_values from Search to Output.
	* src/keyword.h: Don't include vectors.h.
	* src/Makefile.in (OBJECTS): Remove vectors.o.
	(VECTORS_H): Remove variable.
	(vectors.o): Remove rule.

	* src/search.h: New file, combines src/key-list.h, src/gen-perf.h.
	* src/search,cc: New file, combines src/key-list.cc, src/gen-perf.cc.
	* src/key-list.h: Remove file.
	* src/key-list.cc: Remove file.
	* src/gen-perf.h: Remove file.
	* src/gen-perf.cc: Remove file.
	* src/main.cc (KeywordExt_Factory): Moved here from gen-perf.cc.
	(main): Inline some code from gen-perf.cc.
	* src/keyword.h (KeywordExt::init_selchars): Take the occurrences
	vector as argument.
	* src/keyword.cc (KeywordExt::init_selchars): Take the occurrences
	vector as argument.
	* src/input.cc (Input::set_output_types): Initialize _array_type,
	_return_type, _struct_tag.
	(Input::read_keys): Initialize _additional_code.
	* src/Makefile.in (OBJECTS): Add search.o.
	Remove key-list.o, gen-perf.o.
	(KEY_LIST_H, GEN_PERF_H): Remove variables.
	(gen-perf.o, key-list.o): Remove rules.
	(search.o): New rule.

	* *, */*: Update copyright notice to GPL version 2.

	* src/keyword-list.h (Keyword_List): New class.
	(KeywordExt_List): Inherit from it.
	* src/keyword-list.cc (Keyword_List::Keyword_List): New constructor.
	(KeywordExt_List::KeywordExt_List): Update.
	* src/input.h (Input::Input): Add Keyword_Factory argument.
	(Input::_factory): New field.
	(Input::_head): Change type to Keyword_List*.
	(Input::parse_line): New declaration.
	* src/input.cc (Input::Input): New constructor.
	(Input::parse_line): Renamed from parse_line. Use the _factory.
	(Input::read_keys): Update.
	* src/key-list.cc (KeywordExt_Factory): New class.
	(Key_List::read_keys): Pass a KeywordExt_Factory as Input constructor
	argument.

	Avoid g++ -Wold-style-cast warnings.
	* src/bool-array.icc: Use new-style casts.
	* src/gen-perf.cc: Likewise.
	* src/input.cc: Likewise.
	* src/key-list.cc: Likewise.
	* src/keyword.cc: Likewise.
	* src/options.cc: Likewise.
	* src/output.cc: Likewise.
	* src/hash-table.cc: Likewise. Remove (char *) cast in memset argument.

	* src/keyword-list.h (KeywordExt_List): Don't inherit from KeywordExt.
	(KeywordExt_List::KeywordExt_List): Take a KeywordExt* as argument.
	(KeywordExt_List::_car): New field.
	(KeywordExt_List::first): Use it.
	* src/keyword-list.cc (KeywordExt_List::KeywordExt_List): Take a
	KeywordExt* as argument.
	* src/input.cc (parse_line): Create the KeywordExt separately.

	Start using bool.
	* src/bool-array.h (Bool_Array::set_bit): Change return type to bool.
	* src/bool-array.icc (Bool_Array::set_bit): Likewise.
	* src/gen-perf.h (Gen_Perf::affects_prev): Likewise.
	* src/gen-perf.cc (Gen_Perf::affects_prev): Likewise.
	* src/hash-table.h (Hash_Table::_ignore_length): Change type to bool.
	(Hash_Table::Hash_Table): Change 3rd argument type to bool.
	* src/hash-table.cc (Hash_Table::Hash_Table): Likewise.
	* src/input.h (Input::_additional_code): Change type to bool.
	* src/input.cc (Input::read_keys): Update.
	* src/key-list.h (Key_List::_occurrence_sort, Key_List::_hash_sort,
	Key_List::_additional_code): Change type to bool.
	(Key_List::_determined): Change element type to bool.
	(Key_List::already_determined): Change return type to bool.
	* src/key-list.cc (Key_List::_determined): Change element type to bool.
	(Key_List::set_determined): Update.
	(Key_List::already_determined): Change return type to bool.
	(Key_List::reorder, Key_List::sort, Key_List::Key_List): Update.
	* src/options.h (Positions::sort): Change return type to bool.
	(Options::operator[]): Likewise.
	* src/options.icc (Positions::sort): Change return type to bool.
	(Options::operator[]): Likewise.
	* src/output.h (Output::Output): Change 5th argument type to bool.
	(Output::_additional_code): Change type to bool.
	* src/output.cc (Output::Output): Change 5th argument type to bool.

2002-10-16  Bruno Haible  <bruno@clisp.org>

	* src/*.h: Align all member names at column 24.

2002-10-15  Bruno Haible  <bruno@clisp.org>

	* src/input.h: New file.
	* src/input.cc: New file, extracted from key-list.cc.
	* src/key-list.h (Key_List): Don't inherit from Read_Line.
	(Key_List::get_special_input,
	Key_List::save_include_src, Key_List::get_array_type,
	Key_List::strcspn, Key_List::set_output_types): Remove methods.
	* src/key-list.cc (Key_List::get_special_input,
	Key_List::save_include_src, Key_List::get_array_type,
	Key_List::strcspn, Key_List::set_output_types, parse_line): Move to
	src/input.cc.
	(Key_List::read_keys): Use Input::read_keys.
	(Key_List::Key_List): Update.
	* src/gen-perf.cc: Update.
	* src/Makefile.in (OBJECTS): Add input.o.
	(input.o): New rule.

2002-10-14  Bruno Haible  <bruno@clisp.org>

	* src/options.cc: Don't include "vector.h".
	(Options::parse_options): Don't initialize Vectors::ALPHA_SIZE here.
	* src/vectors.cc (Vectors::ALPHA_SIZE): Don't initialize here.
	* src/gen-perf.cc (Gen_Perf::Gen_Perf): Initialize Vectors::ALPHA_SIZE.

	* src/options.h (Positions): New class.
	(PositionIterator): New class.
	(Options::parse_options): Renamed from Options::operator().
	(Options::get_asso_max, Options::set_asso_max): Move to class Key_List.
	(Options::reset, Options::get): Remove, replaced by class
	PositionIterator.
	(Options::get_initial_asso_value): Renamed from Options::initial_value.
	(Options::key_sort): Remove, replaced by Positions::sort.
	(Options): Make all fields and methods non-static.
	* src/options.icc (Positions::Positions, Positions::operator[],
	Positions::get_size, Positions::pointer, Positions::set_size,
	Positions::sort, PositionIterator::PositionIterator,
	PositionIterator::next): New methods.
	(Options::get_initial_asso_value): Renamed from Options::initial_value.
	(Options::get_size_multiple): New method.
	(Options::get_key_positions): New method.
	(Options::get_max_keysig_size): Implement using _key_positions.
	* src/options.cc (Options::long_usage): Split big string into small
	pieces.
	(PositionStringParser): Prefix field names with _.
	(Options::Options): Update.
	(Options::~Options): Fix explanation of of _size_multiple. Don't print
	_key_positions if it is effectively ignored.
	(Options::parse_options): Renamed from Options::operator(). Update.
	* src/key-list.h (Key_List): New field _size. New methods get_asso_max,
	set_asso_max, get_max_keysig_size.
	* src/key-list.cc (Key_List::read_keys): Don't make side effects on
	options.
	(Key_List::dump): Use Key_List::get_max_keysig_size() instead of
	Options::get_max_keysig_size().
	(Key_List::get_max_keysig_size): New function.
	* src/hash-table.cc (Hash_Table::~Hash_Table): Compute the field
	width on the fly if option[ALLCHARS].
	* src/gen-perf.cc (Gen_Perf::Gen_Perf): Update,
	Use Options::get_size_multiple() instead of Options::get_asso_max().
	Use Key_List::get_asso_max() instead of Options::get_asso_max(). Use
	Key_List::get_max_keysig_size() instead of
	Options::get_max_keysig_size().
	(Gen_Perf::affects_prev): Likewise.
	(Gen_Perf::change): Likewise.
	* src/keyword.cc: Update.
	* src/main.cc: Update.
	* src/output.cc: Update.
	* tests/test-6.exp: Update.

2002-10-13  Bruno Haible  <bruno@clisp.org>

	* src/bool-array.*: Some polishing.

	* src/options.h (Options::operator=, Options::operator!=): Remove
	unused methods.
	* src/options.icc (Options::operator=, Options::operator!=): Remove.

	* src/*.h: Prefix all field names with _.
	* src/*.cc, src/*.icc: Update.

	* src/*: Simplify declarations of functions without arguments.

2002-10-04  Bruno Haible  <bruno@clisp.org>

	* src/output.h: New file, extracted from key-list.h.
	* src/output.cc: New file, extracted from key-list.cc.
	* src/key-list.h (Key_List): Make some fields protected. Move output
	routines to src/output.h.
	* src/key-list.cc: Move output routines to src/output.cc.
	* src/gen-perf.cc (Gen_Perf::doit_all): Use class Output.
	* src/Makefile.in (OBJECTS): Add output.o.
	(output.o): New rule.

2002-10-03  Bruno Haible  <bruno@clisp.org>

	* src/iterator.h: Remove file.
	* src/iterator.cc: Remove file.
	* src/options.cc: (PositionStringParser): New class, taken from old
	iterator.cc.
	* src/Makefile.in (OBJECTS): Remove iterator.o.
	(ITERATOR_H): Remove variable.
	(iterator.o): Remove rule.

	* src/keyword-list.h: New file.
	* src/keyword-list.cc: New file.
	* src/list-node.h: Remove file.
	* src/list-node.cc: Remove file.
	* src/keyword.h (KeywordExt::init_selchars): New declaration.
	* src/keyword.cc (sort_char_set, KeywordExt::init_selchars): New, from
	old list-node.cc.
	* src/gen-perf.cc: Replace List_Node by KeywordExt or KeywordExt_List,
	as appropriate.
	* src/hash-table.h: Likewise.
	* src/key-list.h: Likewise.
	* src/key-list.cc: Likewise.
	* src/Makefile.in (OBJECTS): Remove list-node.o, add keyword-list.o.
	(LIST_NODE_H): Remove macro.
	(list-node.o): Remove rule.
	(keyword-list.o): New rule.

	* src/keyword.h (KeywordExt): New class.
	* src/keyword.cc (KeywordExt): New constructor.
	* src/list-node.h (List_Node): Inherit from KeywordExt.
	* src/list-node.cc: Update.
	* src/gen-perf.cc: Update.
	* src/hash-table.cc: Update.
	* src/key-list.cc: Update.
	(output_keyword_entry): Change argument type to KeywordExt*.

	* src/keyword.h: New file.
	* src/keyword.cc: New file.
	* src/list-node.h (List_Node): Extend Keyword.
	* src/list-node.cc: Update.
	* src/gen-perf.cc: Update.
	* src/hash-table.cc: Update.
	* src/key-list.cc: Update.
	* src/Makefile.in (OBJECTS): Add keyword.o.
	(keyword.o): New rule.

	* src/key-list.cc (Key_List::read_keys): Allocate the memory for the
	hash table using 'new'.
	(Key_List::output_lookup_array): Allocate the memory for the duplicates
	array using 'new'.
	* src/options.h (LARGE_STACK_ARRAYS): Remove definition.
	* src/main.cc (main): Remove setrlimit call.
	* src/configure.in: Don't test for unistd.h, sys/time.h,
	sys/resource.h, getrlimit, setrlimit.

	* src/bool-array.h (Bool_Array): Make all members non-static.
	Add an argument to the constructor. Remove init(), rename reset() to
	clear(), rename find() to set_bit().
	* src/bool-array.icc: Move init() code into the constructor.
	Rename reset() to clear(), rename find() to set_bit().
	* src/gen-perf.h (Gen_Perf): Add collision_detector member.
	* src/gen-perf.cc: Update.

	* src/gen-perf.h (Gen_Perf::doit_all): Renamed from
	Gen_Perf::operator ().
	* src/gen-perf.cc (Gen_Perf::doit_all): Renamed from
	Gen_Perf::operator ().
	* src/main.cc: Update.

	* src/read-line.h (Read_Line::read_next_line): Renamed from
	Read_Line::get_line.
	* src/read-line.icc: Likewise.
	* src/read-line.cc: Update.
	* src/key-list.cc: Update.

	* lib/getline.h: New file.
	* lib/getline.cc: New file.
	* lib/Makefile.in (OBJECTS): Add getline.o.
	(getline.o): New rule.
	* src/read-line.h (Read_Line::readln_aux): Remove declaration.
	* src/read-line.cc (Read_Line::readln_aux): Remove function.
	* src/read-line.icc (Read_Line::get_line): Use ::get_line.
	* src/options.h (LARGE_STACK): Remove macro.

	* src/bool-array.h (STORAGE_TYPE): Remove type.
	Use 'unsigned int' instead of STORAGE_TYPE.
	* src/bool-array.cc: Likewise.
	* src/bool-array.icc: Likewise.
	* src/gen-perf.cc: Likewise.

	* src/new.cc: Remove file.
	* src/Makefile.in (OBJECTS): Remove new.o.
	(new.o): Remove rule.
	* src/configure.in: Remove test for HAVE_THROW_DECL.
	* acconfig.h: Remove file.

	* src/trace.h: Remove file.
	* src/trace.cc: Remove file.
	* src/Makefile.in (OBJECTS): Remove trace.o.
	(TRACE_H): Remove variable.
	(trace.o): Remove rule.
	Update all dependencies.
	* src/bool-array.h, src/bool-array.cc, src/bool-array.icc: Don't use T.
	* src/gen-perf.cc: Likewise.
	* src/hash-table.cc: Likewise.
	* src/iterator.cc: Likewise.
	* src/key-list.cc: Likewise.
	* src/list-node.cc: Likewise.
	* src/main.cc: Likewise.
	* src/new.cc: Likewise.
	* src/options.h, src/options.cc, src/options.icc: Likewise.
	* src/read-line.h, src/read-line.cc, src/read-line.icc: Likewise.

	* tests/Makefile.in: Use gperf option -I, to avoid gcc-3.x warnings.
	* tests/test.c: Don't use gets(), to avoid warnings.

2001-08-02  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>

	* doc/gperf.texi: Change bug report address to <bug-gnu-gperf@gnu.org>.
	* README: Updated.

2000-12-18  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>

        * src/configure.in: Add check for rand() in libm. Needed for BeOS.
        * src/Makefile.in (LIBS): Use @GPERF_LIBM@ instead of hardwiring -lm.

2000-11-20  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>

        * doc/help2man: Update to version 1.23.

2000-09-26  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>

        * gperf-2.7.2 released.

        * doc/gperf.texi: Add a second bug report address
          <gperf-bugs@lists.sourceforge.net>.
        * README: Updated.

2000-08-28  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>

        * lib/getopt.h (struct option): Use "const" also when compiling in
          C++ mode. Avoids warnings from Sun CC and HP-UX aCC.

        * doc/Makefile.in (docdir): Change from $(datadir)/doc/@PACKAGE@ to
          $(prefix)/doc/@PACKAGE@, following the newest GNU standards.

2000-08-20  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>

        * src/version.cc: Bump version number to 2.7.2.
        * doc/gperf.texi: Likewise.

        * doc/texinfo.tex: Update to post-texinfo-4.0 version. @code in the
          title page now chooses a larger font. The overall layout of the
          text is denser.

        * AUTHORS: New file.

        * tests/Makefile.in (all): Add check-lang-utf8 and check-lang-ucs2.
          (check-lang-utf8, check-lang-ucs2): New targets.
          (clean): Remove lu8out and lu2out.
        * tests/lang-utf8.gperf, tests/lang-utf8.exp: New files.
        * tests/lang-ucs2.gperf, tests/test2.c, tests/lang-ucs2.in,
          tests/lang-ucs2.exp: New files.

        Allow the use of embedded NULs in keys.
        * lib/hash.h (hashpjw): Add a length argument.
        * lib/hash.cc (hashpjw): Likewise. Don't stop when encountering a NUL
          character.
        * src/hash-table.h (Hash_Table constructor): Add ignore_len argument.
          (Hash_Table::ignore_length): New field.
          (Hash_Table::insert): Renamed from Hash_Table::operator(). Remove
          ignore_length argument.
        * src/hash-table.cc (NIL): Remove macro.
          (Hash_Table constructor): Add ignore_len argument. Use it to
          initialize ignore_length.
          (Hash_Table destructor): Specify explicit length of char_set and
          key.
          (Hash_Table::insert): Renamed from Hash_Table::operator(). Remove
          ignore_length argument. Pass explicit length to hashpjw. Compare
          char_set using memcmp, not strcmp.
        * src/list-node.h (List_Node): Rename field length to key_length.
          New field char_set_length.
          (List_Node constructor): Accept key and rest, not the entire line.
        * src/list-node.cc (List_Node constructor): Accept key and rest, not
          the entire line. Don't NUL terminate key and char_set. Specify
          explicit length of key. Initialize char_set_length field.
        * src/key-list.cc: Include <ctype.h>.
          (parse_line): New function.
          (Key_List::read_keys): Call parse_line instead of new List_Node.
          Pass option[NOLENGTH] to Hash_Table constructor, not
          Hash_Table::insert. Specify explicit length of key and char_set.
          (Key_List::get_occurrence): Use explicit length of char_set.
          (Key_List::set_determined): Likewise.
          (Key_List::already_determined): Likewise.
          (output_string): Add length argument. Output unprintable characters
          using octal escape sequence.
          (output_keyword_entry): Use explicit length of key.
          (Key_List::output_lookup_array): Specify explicit length of key.
          (output_switch_case): Likewise.
          (Key_List::dump): Likewise.
        * src/gen-perf.h (Gen_Perf::compute_disjoint_union): Add two length
          arguments.
        * src/gen-perf.cc (Gen_Perf::compute_disjoint_union): Likewise. Don't
          stop when encountering NUL characters. Don't NUL terminate the
          result.
          (Gen_Perf::hash): Use explicit length of char_set.
          (Gen_Perf::change): Specify explicit length of key.
        * doc/gperf.texi: Document it.

        * doc/help2man: New file, help2man version 1.022.
        * Makefile.devel (all): Add doc/gperf.1.
          (doc/gperf.1): New target.
        * doc/gperf.1: Automatically generated.

        * mkinstalldirs: New file, from automake-1.4, grep-2.4.1, guile-1.4,
          libtool-1.3.3, make-3.79.1, tar-1.13.
        * src/Makefile.in (MKINSTALLDIRS): New variable.
          (install, installdirs): Use it instead of mkdir.
        * doc/Makefile.in (MKINSTALLDIRS): New variable.
          (install, installdirs): Use it instead of mkdir.

        * INSTALL: Update.

2000-08-19  Bruno Haible  <bruno@linuix.math.u-bordeaux.fr>

        * src/key-list.cc (Output_Compare_Memcmp): New class.
          (Key_List::output_lookup_function): When option -l is given, use
          memcmp instead of strcmp or strncmp.

        * doc/gperf.texi: The bug report address is <bug-gnu-utils@gnu.org>.
          The download address is ftp.gnu.org. Remove mention of -a and -g
          options (now nops). Explain effect of -c option.

        * doc/configure.in (PACKAGE): New variable.
        * doc/Makefile.in (datadir, docdir): New variables.
          (dvidir, htmldir): Change values.
          (install, installdirs): Update.

        * src/configure.in: Rename cache variable gp_cxx_throw_decl to
          gp_cv_cxx_throw_decl.

        * src/key-list.cc (Key_List::output_hash_function): When outputting
          __inline, take advantage of C++ compilers which have inline.

        * src/key-list.cc (Output_Compare_Strncmp::output_comparison):
          After the call to strncmp, verify that expr2 is not longer than
          `len'.
          Reported by Carlo Wood <carlo@runaway.xs4all.nl>.

        * src/key-list.cc (Key_List::output_lookup_function_body): Avoid
          emitting the loop for dealing with duplicates if
          total_duplicates == 0.

        * src/key-list.cc (Key_List::read_keys): Don't accept an empty key.

        * src/Makefile.in (install, installdirs, uninstall): Respect
          $(DESTDIR).
        * doc/Makefile.in (install, installdirs, uninstall): Likewise.

        * src/options.cc (Options::print_options): Escape the arguments which
          contain special characters.

        * tests/c-parse.gperf: Updated from gcc-2.95.2/gcc/c-parse.gperf.
        * tests/objc.gperf: New file, from gcc-2.95.2/gcc/objc/objc.gperf.
        * tests/chill.gperf: New file, from gcc-2.95.2/gcc/ch/gperf.
        * tests/cplusplus.gperf: New file, from gcc-2.95.2/gcc/cp/gxx.gperf.
        * tests/gplus.gperf: Remove file.
        * tests/java.gperf: New file, from gcc-2.95.2/gcc/java/keyword.gperf.
        * tests/Makefile: Check them all.
        * tests/c-parse.exp: Renamed from tests/test-1.exp.
        * tests/modula2.exp: Renamed from tests/test-2.exp.
        * tests/cplusplus.exp: Renamed from tests/test-3.exp.
        * tests/gpc.exp: Renamed from tests/test-5.exp.

        * src/key-list.cc (output_switch_case): Add trailing semicolon to
          lengthptr assignment line. Fixes bug with -D and -S.
          From Reini Urban <rurban@sbox.tu-graz.ac.at>. Also reported by
          David Hunter.
        * tests/Makefile.in (check-lang-syntax): Perform each test with -D
          once without and once with duplicates.

        * src/key-list.cc (output_keyword_entry): Avoid outputting a struct
          initializer of the form {"key",}.

        * src/iterator.cc: Don't include <stream.h>.
          From Michael Deutschmann <ldeutsch@mail.netshop.net>.

        * tests/Makefile.in (VALIDATE, check-lang-syntax): Use $(srcdir) where
          appropriate.
          Reported by Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>.

        * tests/validate: Don't run -traditional tests by default.

        * src/main.cc (main): Check for write error on stdout before returning.

        * src/Makefile.in (LDFLAGS): New definition, to catch the value given
          at configure time.

        Make the structure initializers customizable. Based on a patch by
        Kaveh R. Ghazi <ghazi@caip.rutgers.edu>.
        * src/options.h (Options::get_initializer_suffix,
          Options::initializer_suffix): New declarations.
        * src/options.icc (Options::get_initializer_suffix): New function.
        * src/options.cc (DEFAULT_INITIALIZER_SUFFIX): New constant.
          (Options::initializer_suffix): New variable.
          (Options::short_usage): Document option "-F".
          (Options::long_usage): Document option "-F".
          (Options constructor): Initialize initializer_suffix.
          (Options destructor): Dump initializer_suffix.
          (long_options): Add option "-F".
          (Options::operator()): Accept option "-F". Sets initializer_suffix.
        * src/key-list.cc (output_keyword_blank_entries): Output
          initializer_suffix.
        * doc/gperf.texi: Document option "-F".

        * COPYING: Replace with GPL version 2 (with new FSF address and Y2K
          safe year format).

        * doc/gpl.texinfo: New file.
        * doc/gperf.texi: Document it.
        * doc/Makefile.in (gperf.info, gperf.dvi, gperf.html, gperf_toc.html):
          Update dependencies.

        * doc/Makefile.in (MAKEINFO): Unset LANG while running makeinfo.

1998-05-20  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * doc/Makefile.in (gperf.dvi, clean): Remove gperf.cps.
          (install, installdirs, uninstall): Don't install gperf.dvi. The
          info and HTML documentations are sufficient for on-line use, and
          users who wish to print the documentation (in PS or DVI format)
          can do this directly off the source distribution.
          (DVIPS): Use "-D600" instead of "-Pljfour", for portability.

1998-05-20  Akim Demaille  <demaille@inf.enst.fr>

        * doc/gperf.texi: Many modifications:
          (Output Format): Declare `hash' and `in_word_set' as functions.
          (Concept Index): New section.
          (Title page): Use standard presentation.
          (Top): Use @top instead of @unnumbered so that automatic master
          update works.
          (Motivation): Avoid spaces in @var.
          (Options): Use the standard name ``Invoking ...''.
          (Options): Declare also the long form of the options.
          (Options): Remove redundant @itemize when @table is used.

1998-05-08  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

        * aclocal.m4 (CL_PROG_INSTALL): Set cl_cv_path_install, not
          ac_cv_path_install.

Sat May  2 13:20:54 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * gperf-2.7 released.

Sat May  2 12:31:51 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * src/version.cc (version_string): Remove the "(C++ version)" suffix.
          It's redundant: the early C versions of gperf are called cperf.
          Reported by Karl Berry.
        * src/option.cc (Options::operator()): Trim the output of "gperf -v".

Thu Apr 16 13:22:16 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * lib/Makefile.in, src/Makefile.in: Don't use $(TARGET_ARCH).
          Solaris "make" sets it to a value not understood by "cc".

Wed Apr 15 23:52:14 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * lib/Makefile.in, src/Makefile.in: Don't use implicit rules. Don't
          use $<. AIX "make" and OSF/1 "make" have problems with both.
        * src/gen-perf.cc, src/key-list.cc: Cast free() argument to char*,
          otherwise it doesn't compile on SunOS 4.
        * src/key-list.h: Declare structs outside of other declarations,
          needed for OSF/1 cxx 5.5.
        * lib/getopt.h: Use prototypes if __STDC__ || __cplusplus.
          Don't give a prototype for getopt(), to avoid error on SunOS 4.
        * lib/getopt.c: Declare strncmp, to avoid warnings.

Tue Apr 14 23:24:07 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * lib/GetOpt.{h,cc}: Remove files.
        * lib/getopt.{h,c}, lib/getopt1.c: New files, from GNU libc.
        * lib/configure.in (AC_INIT): Search for hash.cc, not GetOpt.cc.
        * lib/Makefile.in (OBJECTS): Remove GetOpt.o, add getopt.o, getopt1.o.
          (getopt.o, getopt1.o, hash.o): Use explicit building rules. Some
          "make"s don't support to have both implicit rules for "%.o : %.c"
          and "%.o : %.cc" in the same Makefile.
        * lib/hash.{h,cc}: Remove #pragma; there are no templates here.
        * src/option.h (Options::usage): Remove.
          (Options::short_usage, Options::long_usage): Declare.
        * src/option.cc (Options::usage): Remove.
          (Options::short_usage, Options::long_usage): New functions.
          (long_options): New array.
          (Options::operator()): Use getopt_long instead of GetOpt::operator(),
          change all references to GetOpt members.

        * src/std-err.{h,cc}: Remove files.
        * src/gen-perf.cc, src/key-list.cc, list-node.cc, new.cc, options.cc:
          Call fprintf(stderr) instead of Std_Err::report_error().
        * src/key-list.h, src/list-node.h, src/options.h: Don't use class
          Std_Err any more.
        * src/option.cc (program_name): New variable.
        * src/Makefile.in: Remove STD_ERR_H.
          (OBJECTS): Remove std-err.o.

Mon Mar 23 01:03:35 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * aclocal.m4, {lib,src,tests}/configure.in: Remove CL_CC_WORKS and
          CL_CXX_WORKS, already contained in autoconf 2.12.

        * src/gen-perf.cc, src/key-list.cc: Move some code from
          Gen_Perf::Gen_Perf() to Key_List::output().
        * src/Makefile.in: Update dependencies.

        * src/options.{h,cc}: Remove option "-p".
        * src/key-list.cc (Key_List::set_output_types): Rewrite.
          (default_array_type, default_return_type): Remove.
        * src/key-list.cc: Adjust "const" handling.
          + With option "-t" [TYPE], don't emit wrong code if there is no
            space before the struct's opening brace.

Sun Mar 22 16:59:15 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * src/key-list.{h,cc}: Completely reorganized the output routines.
          Rewrote from scratch the output_switch() function. Use classes
          (Output_Constants, Output_Expr, Output_Compare) for abstraction.
          In particular:
          + Don't emit trailing whitespace and spurious blank lines.
          + Adjust indentation of the arrays.
          + Don't emit commas at the end of array initializers and
            struct initializers.
          + With option "-l" [LENTABLE], compare the length before
            fetching the word from memory.
          + With option "-S" [SWITCH], emit the comparison code just once,
            not once in every switch statement.
          + With option "-S" [SWITCH], choose the right switch statement
            through a binary search, not a linear search.
          + With option "-S" [SWITCH], emit straightforward comparisons
            instead of switch statements with just one "case" label.
          + With options "-S -p -t" [SWITCH, POINTER, TYPE], don't emit
            spurious empty elements at the beginning of the wordlist array.
          + With option "-D" [DUP] and not option "-S" [SWITCH], if there
            is no more room for duplicate entries in the lookup array,
            don't call `assert (i != 0)'. Instead, make the array larger :-)
          + With option "-D" [DUP], if there are no duplicates, don't
            automatically fall back to the non-"-D" algorithm. If the user
            wants the non-"-D" algorithm, he can just not specify "-D".
          + With option "-D" [DUP] and either options "-p -t" [POINTER, TYPE]
            or not option "-S" [SWITCH], don't emit spurious empty elements
            at the beginning of the wordlist array.
          + With option "-D" [DUP], simplify the detection and processing
            of duplicate entries in the lookup array.
          + With options "-D -l" [DUP, LENTABLE] and not option "-S" [SWITCH],
            don't forget to emit the lengthtable array.
          + With options "-D -l -S" [DUP, LENTABLE, SWITCH], don't forget to
            compare the lengths before comparing the strings.

        * src/gen-perf.cc: No need to include <assert.h>.
        * src/options.cc: Likewise.

        * src/options.cc: Don't use `errno' after freopen failed.
        * src/std-err.cc: `report_error' doesn't call strerror(errno) any
          more. No need to include <string.h> and <errno.h>.

        * tests/Makefile.in (check-*): Any difference between .exp and .out
          is a failure. Don't ignore whitespace differences.

        * tests/Makefile.in (check-lang-syntax): Add some more checks.

Fri Mar 20 00:54:54 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * tests/jscript.gperf: Renamed from tests/javascript.gperf, because
          of Minix and SVR2 14-character filename limit.
        * src/key-list.cc (output_string): New function.
          (Key_List::output_switch, Key_List::output_keyword_table): Call it.

        * src/options.{h,icc,cc} (get_wordlist_name): New function. Add
          option -W.
        * src/key-list.cc (Key_List::output_switch,
          Key_List::output_keyword_table, Key_List::output_lookup_function):
          Use it.
        Patch from William Bader <wbader@CSEE.Lehigh.Edu>.

        * src/version.cc: Bump version number directly from 2.5 to 2.7,
          because Schmidt's last release from 1991 carries version number 2.6.

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

        * 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!

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...

Mon Mar  9 02:19:04 1998  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * Moved the documentation to doc/, put the stuff borrowed from
          libg++ into lib/.
        * Rewrote all Makefile.in's for better compliance with GNU standards.
        * Autoconf based configuration. Rewrote all configure.in's. Added
          aclocal.m4, with macros from CLISP and CLN. Added Makefile.devel.
        * src/depend: Removed. Dependencies are now in src/Makefile.in.

        * src/bool-array.icc: New file, contains inline functions, from both
          src/bool-array.h and src/bool-array.cc.
        * src/options.icc: New file, contains inline functions, from both
          src/options.h and src/options.cc.
        * src/read-line.icc: New file, contains inline functions, from both
          src/read-line.h and src/read-line.cc.

        * src/bool-array.h: Don't include <std.h>.
        * src/bool-array.cc: Include <string.h>.
        * src/gen-perf.cc: No need to include <ctype.h>. Don't include
          <_G_config.h>.
        * src/hash-table.cc: Don't include <std.h> and <builtin.h>. Include
          <string.h> and lib/hash.h instead.
        * src/iterator.cc: Don't include <std.h>.
        * src/key-list.cc: Don't include <builtin.h>. Include <string.h> and
          <stdlib.h> instead.
        * src/list-node.cc: Don't include <std.h>. Include <stdlib.h> instead.
          Remove `index' hack.
        * src/main.cc: Don't include <_G_config.h>.
        * src/new.cc: Don't include <std.h>. Include <stdlib.h> instead.
        * src/options.cc: Don't include <builtin.h>. Include <string.h> and
          <stdlib.h> instead.
        * src/read-line.cc: Don't include <builtin.h>. Include <stdlib.h>
          instead.
        * src/std-err.cc: Don't include <std.h>. Include <string.h> (for Irix).
        * src/vectors.h: No need to include <stdio.h>.
        * src/version.cc: No need to include <stdio.h>.

        * src/bool-array.h: Change `STORAGE_TYPE' from int to unsigned int.
        * src/bool-array.{h,cc}: Change type of `Bool_Array::size' from int
          to unsigned int.
        * src/bool-array.{h,cc}: Change type of `Bool_Array::init' argument
          from STORAGE_TYPE to unsigned int.
        * src/gen-perf.{h,cc}: Change two `Gen_Perf::compute_disjoint_union'
          argument types from `char *' to `const char *'.
        * src/iterator.h: Change type of `Iterator::str' and argument of
          `Iterator::Iterator' from `char *' to `const char *'.
        * src/iterator.cc: Cast to `unsigned char' before calling `isdigit'.
        * src/key-list.{h,cc}: Change type of `Key_List::array_type',
          `Key_List::return_type', `Key_List::struct_tag',
          `Key_List::include_src', `default_array_type', `default_return_type'
          and return type of `Key_List::get_array_type',
          `Key_List::get_special_input', `Key_List::save_include_src' from
          `char *' to `const char *'.
        * src/key-list.cc: Change "pretty gross" assignment.
        * src/key-list.cc: Don't use `alloca', HP-UX CC lacks it.
        * lib/GetOpt.cc: Likewise.
        * src/key-list.cc (merge): Use iteration instead of recursion.
        * src/list-node.{h,cc}: Change type of `List_Node::key',
          `List_Node::rest', `List_Node::char_set' from `char *' to
          `const char *'.
        * src/new.cc: Don't use BUFSIZ. Conditionalize the throw() declaration.
        * src/read-line.h: Don't use BUFSIZ.
        * src/read-line.cc: Make CHUNK_SIZE a constant, and use allocate the
          buffers on the stack by default. Use memcpy for copying buffers.
          Include <string.h>.
        * src/read-line.icc (get_line): Use iteration instead of tail recursion.
          Don't call ungetc(EOF,stdin).
        * src/std-err.{h,cc}: Change type of `Std_Err::program_name' and of
          argument `Std_Err::report_error' from `char *' to `const char *'.
        * src/std-err.cc: `report_error' doesn't call `exit' any more. All
          callers changed to do that themselves.
        * src/trace.h: Make constructor/destructor calls non-inline.

        * src/key-list.cc (output_hash_function): If option[CPLUSPLUS],
          always make the hash function inline.
          (output): Declare the hash function inline, with the right name.
        * src/options.{h,cc}, src/gen-perf.cc, src/key-list.cc: Remove
          options -g, making it on by default. Remove option -a. Instead,
          introduce "-L KR-C", "-L C", "-L ANSI-C", "-L C++".
        * src/options.{h,cc}, src/key-list.cc: Add option -I.
        * src/key-list.cc: Don't emit "const" if compiling in mode "-L KR-C".
        * src/key-list.cc: Don't emit a comma at the end of an enum list.
        * src/main.cc: Remove COUNT_TIME code.
        * src/vectors.h, src/key-list.cc, src/options.cc, src/list-node.cc:
          ALPHA_SIZE defaults to 256 now. Add option -7.

        * tests/javascript.gperf: New file.
        * tests/jstest*.gperf, tests/validate: New tests.

Sat Jan 31 01:38:11 1998  Alexandre Oliva <oliva@dcc.unicamp.br>

	* src/Makefile.in ($(TARGETPROG)): Add $(CFLAGS).

Wed Jan 28 01:56:00 1998  Manfred Hollstein  <manfred@s-direktnet.de>

	* configure.in (package_makefile_rules_frag): New and
	redirect stderr from ${srcdir}/config.shared to
	${package_makefile_rules_frag}.
	* src/configure.in: Ditto.
	* tests/configure.in: Ditto.

Fri Jan 23 08:00:41 1998  H.J. Lu  (hjl@gnu.org)

	* gperf.texi (@ichapter): Changed to @chapter.

Wed Jan 14 09:16:48 1998  H.J. Lu  (hjl@gnu.org)

	* src/key-list.cc, src/key-list.h (Key_List::strcspn): Don't
	define if strcspn is defined.

Fri Jan 24 13:23:47 1997  Mike Stump  <mrs@cygnus.com>

	* src/new.cc (operator delete): Add the exception specification.

Mon Feb  5 19:29:16 1996  Per Bothner  <bothner@kalessin.cygnus.com>

	* src/read-line.cc (Read_Line::readln_aux):  Handle EOF if last	line
	has a length which is an exact multiple of CHUNK_SIZE.  (Used to throw
	away the line's contents.)  From Bruno Haible <haible@ilog.ilog.fr>.
	* src/Makefile.in ($(TARGETPROG)):  Add -lm to link line.

Tue Jun 11 13:43:50 1996  Brendan Kehoe  <brendan@lisa.cygnus.com>

	* src/list-node.cc (List_Node): Reorder init of nodes to
	match declaration order.
	* src/hash-table.cc (Hash_Table): Likewise.

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.

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.