Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: output-javascr…
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 3742 lines (3024 sloc) 163.753 kb
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 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741
2012-07-01 Bruno Haible <bruno@clisp.org>

Fix "make clean" with MSVC.
With MSVC 9, a program is created together with a .manifest file.
* src/Makefile.in (clean): Remove also the .manifest file.
* tests/Makefile.in (clean): Remove also the .manifest files.

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

Update expected test results.
* tests/test-6.exp: Expect to see --constants-prefix option.

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

Fix compilation error with MSVC.
* src/output.cc: Include config.h.
(DYNAMIC_ARRAY, FREE_DYNAMIC_ARRAY): New macros, copied from
src/search.cc.
(output_constant): Use them.

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

Remove old infrastructure for building with MSVC.
* autogen.sh: Don't remove src/config.h.msvc.
* Makefile.devel (src/config.h.msvc): Remove rule.
(all): Don't depend on it.
* src/Makefile.in (GENERATED_FILES): Remove config.h.msvc.
* src/.gitignore: Remove config.h.msvc.
* Makefile.msvc: Remove file.
* Makefile.in (SOURCE_FILES): Remove Makefile.msvc.

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

Support for building with MSVC much like for Unix.
* autogen.sh: Fetch also 'compile' and 'ar-lib'.
* Makefile.in (IMPORTED_FILES): Add build-aux/compile, build-aux/ar-lib.
* build-aux/.gitignore: Ignore also 'compile' and 'ar-lib'.
* lib/Makefile.in: Use $(OBJEXT) where suitable.
* README.woe32: Change instructions for compiling with MSVC.

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

Move build infrastructure files to build-aux/.
* autogen.sh: Copy install-sh and mkinstalldirst into build-aux/.
* configure.ac: Invoke AC_CONFIG_AUX_DIR.
* Makefile.in (IMPORTED_FILES): Update.
(distdir): Create subdirectories as needed.
* doc/Makefile.in (MKINSTALLDIRS): Update.
* src/Makefile.in (MKINSTALLDIRS): Update.
* .gitgnore: Remove install-sh, mkinstalldirs.
* build-aux/.gitignore: New file.

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

Distribute install-sh.
* autogen.sh: Fetch also install-sh.
* Makefile.in (IMPORTED_FILES): Add install-sh.
* configure.ac: Remove hack with AC_CONFIG_AUX_DIR_DEFAULT.
* .gitignore: Add install-sh.

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

Remove files distributed via gnulib from version control.
* autogen.sh: Fetch mkinstalldirs from the gnulib repository.
* mkinstalldirs: Remove file.
* .gitignore: Add mkinstalldirs.

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

Remove autotools generated files from version control.
* autogen.sh: New file.
* configure: Remove file.
* lib/configure: Remove file.
* src/configure: Remove file.
* tests/configure: Remove file.
* doc/configure: Remove file.
* src/config.h.in: Remove file.
* src/config.h.msvc: Remove file.
* src/config.h_vms: Remove file.
* .gitignore: Ignore configure.
* lib/.gitignore: New file.
* src/.gitignore: New file.
* tests/.gitignore: New file.
* doc/.gitignore: Ignore configure.

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

Turn doc/gperf.1 into a distributed built file.
* doc/gperf.1: Remove file.
* Makefile.devel (doc/gperf.1): Remove rule.
(all): Don't depend on it.
* doc/Makefile.in (man, gperf.1, gperf.1-update): New rules.
(all): Depend on man.
(distdir): Depend on gperf.1-update.
(GENERATED_FILES): Remove gperf.1.
(DISTRIBUTED_BUILT_FILES): Add gperf.1.
* doc/.gitignore: Add gperf.1.
* configure (AC_INIT): Rely on doc/gperf.texi, not doc/gperf.1.
* doc/configure (AC_INIT): Rely on gperf.texi, not gperf.1.

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

Remove distributed built files from version control.
* doc/.gitignore: New file.
* doc/gperf.info: Remove file.
* doc/gperf.dvi: Remove file.
* doc/gperf.ps: Remove file.
* doc/gperf.pdf: Remove file.
* doc/gperf.html: Remove file.
* doc/gperf_toc.html, doc/gperf_[0-9].html, doc/gperf_[0-9][0-9].html:
Remove files.

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

Allow editor backup files in git checkouts.
* .gitignore: New file.

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

Create tarballs through an Automake-like "make dist" command.
* Makefile.in (SOURCE_FILES, IMPORTED_FILES, GENERATED_FILES,
DISTRIBUTED_BUILT_FILES, DISTFILES): New macros.
(distdir): New rule.
(PACKAGE, VERSION, TAR, GZIP): New macros.
(dist): New rule.
* doc/Makefile.in (SOURCE_FILES, IMPORTED_FILES, GENERATED_FILES,
DISTRIBUTED_BUILT_FILES, DISTFILES): New macros.
(distdir): New rule.
* lib/Makefile.in (SOURCE_FILES, IMPORTED_FILES, GENERATED_FILES,
DISTRIBUTED_BUILT_FILES, DISTFILES): New macros.
(distdir): New rule.
* src/Makefile.in (SOURCE_FILES, IMPORTED_FILES, GENERATED_FILES,
DISTRIBUTED_BUILT_FILES, DISTFILES): New macros.
(distdir): New rule.
* tests/Makefile.in (SOURCE_FILES, IMPORTED_FILES, GENERATED_FILES,
DISTRIBUTED_BUILT_FILES, DISTFILES): New macros.
(distdir): New rule.

2012-04-28 Bruno Haible <bruno@clisp.org>

* configure: Regenerated with autoconf-2.69.
* doc/configure: Likewise.
* lib/configure: Likewise.
* src/configure: Likewise.
* tests/configure: Likewise.

2011-01-16 Bruno Haible <bruno@clisp.org>

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

New option --constants-prefix.
* src/options.h (Options): Add member functions get_constants_prefix,
set_constants_prefix. Add member _constants_prefix.
* src/options.icc (Options::get_constants_prefix): New functions.
* src/options.cc (DEFAULT_CONSTANTS_PREFIX): New constant.
(Options::long_usage): Document --constants-prefix option.
(Options::Options): Initialize _constants_prefix member.
(Options::set_constants_prefix): New function.
(long_options): Add --constants-prefix option.
(Options::parse_options): Handle --constants-prefix option.
* src/input.cc (Input::read_input): Handle %define constants-prefix
declaration.
* src/output.cc (output_constant): New function.
(Output::output_constants): Invoke it.
(Output::output_lookup_function_body): Prefix each reference to a
constant with the constants prefix.
* doc/gperf.texi: Bump copyright year.
(Gperf Declarations): Document %define constants-prefix.
(Controlling Identifiers): New section.
(Output Details): Document --constants-prefix option.
* NEWS: Mention the changes.
Reported by Julian Zubek <zubekj@gmail.com>.

2011-01-16 Bruno Haible <bruno@clisp.org>

* configure: Regenerated with autoconf-2.68.
* doc/configure: Likewise.
* lib/configure: Likewise.
* src/configure: Likewise.
* tests/configure: Likewise.

2010-07-31 Bruno Haible <bruno@clisp.org>

* configure: Regenerated with autoconf-2.67.
* doc/configure: Likewise.
* lib/configure: Likewise.
* src/configure: Likewise.
* tests/configure: Likewise.

2010-07-04 Bruno Haible <bruno@clisp.org>

* configure: Regenerated with autoconf-2.66.
* 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.

2010-03-30 Bruno Haible <bruno@clisp.org>

Modernize README.woe32.
* README.woe32: Mention the mingw and Cygwin environments.

2009-12-22 Eric Blake <ebb9@byu.net> (tiny change)

Avoid gcc warnings on Cygwin.
* lib/getopt.c (_getopt_internal): Add braces. Fix indentation.
* tests/smtp.gperf: Cast arguments of <ctype.h> functions.
* tests/test2.c: Include <io.h>.

2009-12-22 Bruno Haible <bruno@clisp.org>

Avoid g++ warnings.
* src/options.cc (Options::print_options): Add parentheses.
* src/output.cc (Output::output_lookup_array): Cast fprintf argument.

2009-12-22 Bruno Haible <bruno@clisp.org>

Support CPPFLAGS as mandated by GNU standards.
* lib/Makefile.in (CPPFLAGS): Use autoconf determined value.
* src/Makefile.in (CPPFLAGS): Likewise.
* tests/Makefile.in (CPPFLAGS): Likewise.
(check-c, check-ada, check-modula3, check-pascal, check-lang-utf8,
test.$(OBJEXT), check-lang-ucs2, test2.$(OBJEXT), check-smtp): Use
CPPFLAGS when compiling a .c file.
(VALIDATE): Pass also CPPFLAGS.
* tests/validate: Use CPPFLAGS when compiling a C or C++ file.

2009-12-20 Bruno Haible <bruno@clisp.org>

* doc/gperf.info: Regenerated.
* doc/gperf*.html: Likewise.
* doc/gperf.dvi: Likewise.
* doc/gperf.ps: Likewise.
* doc/gperf.pdf: Likewise.
* tests/*.exp: Update.

Change the default language to ANSI-C.
* src/options.cc (Options::long_usage): Mention new default language.
(Options::Options): Change default of _option_word.
(Options::set_language): Change fallback.
* doc/gperf.texi (Gperf Declarations, Output Language): Mention new
default language.
* NEWS: Mention the change.
Reported by Albert Cahalan <acahalan@gmail.com>.

* src/version.cc (version_string): Bump to 3.1.
* doc/gperf.texi: Bump version.

2009-12-20 Bruno Haible <bruno@clisp.org>

Allow processing the tests with parallel make.
* tests/Makefile.in (check-link-c, check-link-c++): Remove rules.
(test.$(OBJEXT), test2.$(OBJEXT)): New rules.
(check-c): Add commands for building cout. Depend on test.$(OBJEXT).
(check-ada, check-modula3, check-pascal, check-lang-utf8): Depend on
test.$(OBJEXT).
(check-lang-ucs2): Depend on test2.$(OBJEXT).
Reported by Bryan Østergaard <kloeri@exherbo.org>.

2009-02-01 Brendan Kehoe <brendan@zen.org>

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

* doc/texinfo.tex: Update to copy from texinfo-4.13.

2009-02-01 Bruno Haible <bruno@clisp.org>

* tests/Makefile.in (LDFLAGS, OBJEXT, EXEEXT): New variables.
(check-link-c, check-ada, check-modula3, check-pascal, check-lang-utf8,
check-lang-ucs2): Use OBJEXT and LDFLAGS.
(check-smtp): Use LDFLAGS.
(clean): Use EXEEXT as suffix of programs to be removed.

* aclocal.m4 (CL_PROG_INSTALL): Fix detection of broken AIX installbsd
program.

* tests/Makefile.in (clean): Remove *.dSYM directories left over by gcc
on MacOS X 10.5.

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

2009-01-19 Bruno Haible <bruno@clisp.org>

Don't include the length in the hash function if all keywords have the
same length.
* src/search.h (Search): Add _hash_includes_len field.
* src/search.cc (Search::prepare): Initialize it.
(Search::count_duplicates_tuple, Search::count_duplicates_multiset,
Search::prepare_asso_values, Search::find_asso_values,
Search::compute_hash): Use it instead of !option[NOLENGTH].
* src/output.h (Output): New field _hash_includes_len. Add it as
constructor argument.
* src/output.cc (Output::Output): Add hash_includes_len argument.
(Output::output_hash_function): Use _hash_includes_len instead of
!option[NOLENGTH].
* src/main.cc (main): Pass _hash_includes_len from Search to Output.
* tests/permut2.exp: Updated expected test result.
* tests/permut3.exp: Likewise.
* tests/permutc2.exp: Likewise.
Reported by Behdad Esfahbod <behdad@behdad.org>.

2009-01-14 Bruno Haible <bruno@clisp.org>

* configure.ac: More consistent m4 quoting.
* src/configure.ac: Likewise.
* lib/configure.ac: Likewise.
* tests/configure.ac: Likewise.
* doc/configure.ac: Likewise.

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

* doc/gperf.texi (Gperf Declarations): Mention the C99 standard.

2008-08-23 Bruno Haible <bruno@clisp.org>

* doc/gperf.texi (Output Copyright): Reword more carefully.
Suggested by Paul Jarc <prj@po.cwru.edu>.

2008-08-23 Bruno Haible <bruno@clisp.org>

* doc/gperf.texi (Output Copyright): Adjust for GPLv3.

2008-08-23 Bruno Haible <bruno@clisp.org>

All source files are now under GPLv3+.
* COPYING: Replace with GPLv3.
* **/configure.ac, **/Makefile.*, **/*.h, **/*.c, **/*.cc, **/*.icc:
Change copyright notice to GPLv3+.
* src/options.cc (Options::parse_options): Update --version output
accordingly.
* doc/gperf.texi: Reference the GPLv3.
* doc/gpl-3.0.texi: New file, copied from the gnulib git repository.
* doc/gpl.texinfo: Remove file.
* doc/Makefile.in: Update.

2008-05-06 Bruno Haible <bruno@clisp.org>

* doc/gperf.texi: Set @firstparagraphindent.
(Bibliography): Don't indent the entries.

2008-05-06 Bruno Haible <bruno@clisp.org>

* doc/gperf.texi (Output Copyright): New section.
Reported by Mike Ingrassia <michael.ingrassia@motorola.com> and
Karice McIntyre <Karice_McIntyre@ca.ibm.com>.

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

* tests/Makefile.in: Use "LC_ALL=C tr" instead of "tr".

2007-09-08 Bruno Haible <bruno@clisp.org>

Change generated code to avoid a warning by GCC 4.2 that the meaning
of __inline will be changed (!).
* src/output.cc (Output::output_lookup_function): Emit the inline
marker also for gcc-4.2 in c99 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 Jim Meyering <jim@meyering.net>.

2007-09-08 Bruno Haible <bruno@clisp.org>

Allow creating the HTML documentation with texi2html or makeinfo.
* doc/texi2html: New file, from GNU gettext.
* doc/Makefile.in (TEXI2HTML): Invoke it.
(gperf.html, gperf_toc.html): Don't pass option -expandinfo.
* doc/gperf.texi (makeinfo): New variable.
(dircategory, direntry): Enclose in @ifinfo.
(Table of Contents): Move to the beginning except in TeX mode.

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.
Something went wrong with that request. Please try again.