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
|
$OpenBSD: ChangeLog.0,v 1.5 2013/11/28 10:33:37 sobrado Exp $
Thu Jun 15 11:02:06 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-5.2.3 distribution
* c_ksh.c(c_whence): search keyword table if vflag set.
* tree.h(DOVACHECK): new define.
* eval.c(expand): check DOVACHECK flag.
* exec.c(execute): when calling eval(), or in t->evalflags.
* syn.c(get_command): set evalflags to DOVACHECK instead of DOASNTILDE.
Wed Jun 14 09:27:19 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* c_ksh.c(c_cd): two argument format: use current_wd, not path
when appending elen bytes.
(fix from Gabor Zahemszky).
Tue Jun 13 15:54:11 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* history.c(c_fc): if last not specified and !-l, use first as last.
* eval.c(maybe_expand_tilde): allow CSUBST to end tilde word.
* misc.c(gmatch): made sc and pc unsigned.
Fri Jun 2 11:55:40 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* configure.in: added flock to AC_CHECK_FUNCS call.
* conf-end.h: undef COMPLEX_HISTORY if !HAVE_FLOCK.
Tue May 30 20:38:47 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* sh.h(SEEK_SET,SEEK_CUR,SEEK_END): define if not defined.
* history.c: change L_XTND to SEEK_END.
Tue May 30 17:01:34 NDT 1995 John Rochester (jr@panda.cs.mun.ca)
* shf.c(shf_seek): new function.
* shf.h(shf_seek): new prototype.
Tue May 30 16:42:41 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* aclocal.m4(KSH_DEV_FD): new test.
* acconfig.h(HAVE_DEV_FD): new define.
* configure.in: call KSH_DEV_FD.
* c_test.h(TO_FILAXST): new enum.
* c_test.c(test_stat,test_eaccess): new functions for /dev/fd/n
handling.
* c_test.c(test_evalop): call test_stat() and test_eaccess()
instead of stat() and eaccess() in most places; added case
for TO_FILAXST.
Tue May 30 16:06:21 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* aclocal.m4(KSH_MEMMOVE): fixed test so copies overlap.
Sun May 28 11:11:03 NDT 1995 John Rochester (jr@panda.cs.mun.ca)
* sh.h(safe_prompt): new variable.
* main.c(initsubs): removed PS1.
* main.c(main): initialize safe_prompt; initialize PS1 from
safe_prompt.
* lex.c(set_prompt): create new env while expanding PS1 - if expansion
fails, use safe_prompt.
Sat May 27 20:59:02 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* exec.c: put comments around token after #endif.
Thu May 25 10:10:45 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* c_test.c(test_eval): case TO_OPTION: negate test if option starts
with a !, always fail if option doesn't exist.
* sh.h(FNOHUP): new define.
* misc.c(options[]): "nohup" new option.
* jobs.c(j_stopped,j_stopped_running): name of j_stopped changed
to j_stopped_running; changed all calls; check for/warn about
running jobs if appropriate.
* jobs.c(j_exit): check for/kill running jobs if appropriate.
* main.c(shell),c_sh.c(c_exit): un-ifdef JOBS the j_stopped_running()
call and really_exit initialization/clearing.
Wed May 24 10:06:14 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* options.h(DEFAULT_ENV): new define.
* main.c(main): if ENV isn't set and DEFAULT_ENV is defined, include
the later.
(based on patches from Dave Kinchlea).
* sh.h(LAEXPR): new define.
* expr.c(evaluate): changed return type to error indicator; added
rval and error_ok arguments; changed all calls (c_sh.c(c_shift),
c_ulimit.c(c_ulimit),eval.c(expand),var.c(global,local)).
* expr.c(v_evaluate): added error_ok argument; changed return value
to error indicator; call unwind() if !error_ok.
* expr.c(evalerr): changed errorf() to warningf(); call unwind(LAEXPR).
* c_test.c(test_eval): merged code for integer operations to have
two calls to evaluate().
* io.c(warningf): print trailing newline; changed all calls.
* history.c(hist_get): string search: use histptr, not histptr - 1.
Tue May 23 11:07:50 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* sh.h(GI_NONAME): new define.
* misc.c(ksh_getopts): honour GI_NONAME flag.
* c_ksh.c(getopts_reset): set GI_NONAME flag.
* exec.c(comexec): don't change $0 if FPOSIX flag set.
* misc.c(ksh_getopt): don't use GI_DONE to allow parsing past
bad options.
* sh.h(GI_DONE): deleted define.
* var.c(unset): added array_ref parameter; unset/free whole array
if not an array_reference; changed all calls.
* c_sh.c(c_unset): set array_ref parameter if there is a [ in the name.
Mon May 22 10:33:14 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* history.c(hist_init): complex version: initialize hist_source
(fix from Simon J. Gerraty).
Sat May 20 11:06:15 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-5.2.2 distribution
* Makefile.in: added c_test.h to HDRS.
Fri May 19 12:35:18 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-5.2.1 distribution
* emacs.c(v_version): ignore typed character if it is a space.
* emacs.c(x_emacs_keys): bind <ESC>erase-char to delete-back-word
(was delete-back-char).
* emacs.c(x_defkeybindings[]): bound list-file to ^X^Y and
newline-and-next to ^O, as per man page.
* c_ksh.c(c_whence): changed "is a keyword" to "is a reserved word".
* sh.h: changed SVSV_PGRP to SYSV_PGRP.
* vi.c(vi_cmd): uncommented case for ^[ to make it easy to enable
completion.
Mon May 15 15:25:22 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* history.c(c_fc): accept -40 as -- -40.
* main.c(initcoms[]): take -- out of history alias.
* vi.c(print_expansions): handle trailing slash correctly (don't
print empty strings).
* c_ksh.c(c_cd): put back ksh_get_wd() call for os/2.
* misc.c(ksh_get_wd): changed buf to b in call to getcwd().
Tue May 9 13:57:31 NDT 1995 Michael Rendell (michael@dragon.cs.mun.ca)
* c_test.h: new file.
* c_test.c: major code restructuring: common parsing/evaluation
routines call/called-by three sets of routines: one for
normal test (and [..]), one for parsing [[ .. ]] one for
evaluating [[ .. ]].
* c_test.c(oexpr,aexpr,nexpr,primary,is_op): renamed to test_oexpr,
test_aexpr, test_nexpr, test_primary, test_isop.
* c_test.c(eval_unop,eval_binop): combined into new test_eval function.
* c_test.c(syntax): renamed to ptest_error,
* c_test.c(ptest_isa,ptest_getopnd,ptest_eval): new functions.
* syn.c(syntaxerr): added extra arg; changed all calls.
* syn.c(db_parse,db_oaexpr,db_nexpr,db_primary): deleted.
* syn.c(dbtestp_isa,dbtestp_getopnd,dbtestp_eval,dbtestp_error): added.
* syn.c(get_command): case DBRACKET: changed to call new routines.
* tree.c(ptree): case DBRACKET: changed.
* exec.c(execute): case DBRACKET: changed.
* exec.c(dbteste_isa,dbteste_getopnd,dbteste_eval,dbteste_error): added.
Fri May 5 17:10:23 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* emacs.c(compl_file,compl_command): fixed buffer growing code.
Thu May 4 22:44:01 NDT 1995 Michael Rendell (michael@garfield.cs.mun.ca)
* aclocal.m4(KSH_UNISTD_H): include <sys/types.h> and only include
<dirent.h> if HAVE_DIRENT_H is defined.
Thu May 4 21:19:15 NDT 1995 Michael Rendell (michael@garfield.cs.mun.ca)
* c_ksh.c: include "ksh_stat.h".
* c_ksh.c(c_cd): don't do physical chdir if S_ISLNK not defined.
Wed May 3 10:08:32 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-5.2.0 distribution
* misc.c: include <ctype.h>.
* misc.c(gmatch): added isfile argument; changed all calls.
* sh.h(FILECHCONV): (os2 version) - use isupper.
* emacs.c(strmatch): don't increment in FILECHCONV.
* aclocal.m4(KSH_HEADER_SYS_WAIT): new macro.
* configure.in: use KSH_HEADER_SYS_WAIT instead of AC_HEADER_SYS_WAIT.
* ksh_wait.h: if POSIX_SYS_WAIT not defined, undef W* macros.
Tue May 2 12:10:39 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* emacs.c,emacs-gen.sh,emacs-c.in,emacs.out,Makefile.in: changed emacs
source munging to create emacs.out which is included by emacs.c
rather then munging emacs.c itself.
* lex.c(pprompt): flush shl_out.
* vi.c(glob_word): if path has *?[, don't add * (was if last component).
* emacs.c(x_search_char): renamed to x_search_char_forw.
* emacs.c(x_search_char_back): new function; bound to ^[^].
* sh.h: changed SVR3_PGRP to SYSV_PGRP.
(fixes from Gabor Zahemszky).
Tue May 2 10:09:57 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* c_ksh.c(c_cd): deleted OS2 ifdefs.
* path.c(make_path): use ISRELPATH instead of ISABSPATH
* path.c(simplify_path): use ISROOTEDPATH instead of ISABSPATH.
* sh.h(ISABSPATH,ISROOTEDPATH,ISRELPATH): changed/new defines.
* aclocal.m4(AC_LANG_C,AC_LANG_CPLUSPLUS,AC_TRY_RUN): copied
from autoconf's acgeneral.m4, changed to handle .exe suffix.
* aclocal.m4(KSH_OS_TYPE): os2 case: set $ac_exe_suffix.
* configure.in: substitute ac_exe_suffix.
* Makefile.in: changed references to E to exe_suffix, set to
ac_exe_suffix
* c_ksh.c(c_cd): ifdef S_ISLNK second use of get_phys_path().
* edit.c(x_mode): removed ifndef OS2.
(fixes from Dale DePriest)
* exec.c(search_access1): add .sh to suffix lists.
* vi.c(vi_insert,vi_hook): OS2: changes to allow arrow keys work
in insert mode.
Mon May 1 16:28:44 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* path.c(ksh_get_wd): getcwd() case, return alloc'd buffer, not
a malloc'd one.
Mon May 1 09:41:56 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* aclocal.m4: changed HAVE_SYS_RESOURCES_H to HAVE_SYS_RESOURCE_H.
* aclocal.m4(KSH_OS_TYPE): new macro.
* aclocal.m4(KSH_OS2_EMX): deleted.
* configure.in: deleted calls to AC_AIX,AC_MINIX,AC_ISC_POSIX,
KSH_OS2_EMX; replaced with KSH_OS_TYPE.
* acconfig.h(OS_ISC,OS_SCO): new undefs.
* sh.h: changed use of isc386 to OS_ISC
* edit.c: changed use of M_UNIX to OS_SCO.
Sat Apr 29 21:10:54 NDT 1995 Michael Rendell (michael@garfield.cs.mun.ca)
* vi.c(glob_word): don't append * if there are unescaped globing
characters in the last component of the filename; some redundant
code eliminated.
(based on fix from Michael Jetzer).
Fri Apr 28 16:10:22 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* eval.c(globit): save/restore actual DIRSEP char - don't use DIRSEP.
* c_ulimit.c: removed ARGS from declaration of ulimit to avoid
portability problems (osf/1 has ulimit(int,...), os2 has
ulimit(int,long)).
* tty.c(tty_init): added __SCO__ defines to avoid opening /dev/tty.
* configure.in,aclocal.m4,acconfig.h: added KSH_OS2_EMX test.
* os2/config.h, os2/configure.cmd, os2/make.sed: updated for new
autoconf.
Tue Apr 25 12:20:45 NDT 1995 Michael Rendell (michael@dragon.cs.mun.ca)
* configure.in: added sys/param.h test; changed getcwd test to getwd.
* c_ksh.c(c_pwd): new function.
* sh.h(current_wd, current_wd_size): new variables.
* c_ksh.c(c_cd): changed to handle -L, -P.
* main.c(main): use set_current_wd when setting $PWD;
instead of changing to / when can't get pwd, print warning;
deleted pwd alias; don't make PWD and OLDPWD reaedonly.
* path.c(simplify_path): changed to handle relative paths.
* path.c(make_path): added phys_path argument to support cd -P.
* path.c(set_current_wd,get_phys_path,do_phys_path): new functions.
* misc.c(ksh_get_wd): new function.
* missing.c(getcwd): deleted.
* misc.c(options[]),sh.h: added "physical", FPHYSICAL.
Mon Apr 24 14:33:03 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* shf.c(shf_smprintf): new function.
* expand.h(Xsize): new define.
Fri Apr 21 21:22:44 NDT 1995 Michael Rendell (michael@garfield.cs.mun.ca)
* sh.h: changed SIZEOF_long to SIZEOF_LONG.
* exec.c(scriptexec): if OS2 ifdefed code, changed ISDIRSEP to
explicit /.
Thu Apr 20 21:18:12 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* history.c(hist_get) if n < 0, use n + 1 to account for histbackup().
* lex.c(set_prompt): added source argument; changed all calls;
changed to do ! and !! substitutions when setting PS1.
* lex.c(pprompt): ifdef'd out code to deal with ! and !!.
* shf.c(shf_puts): new routine.
* exec.c(herein), lex.c(getsc_): changed to use shf_puts.
Thu Apr 20 15:50:35 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* siglist.sh: clear traps in subshell to cover for bug in bash 1.4.3
(based on fix from Fritz Heinrichmeyer).
Wed Apr 19 12:04:59 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* vi.c(classify): cleaned up table; filled in U_ flag for commands
that don't modify things.
* vi.c(first_insert, saved_inslen): new variables.
* vi.c(vi_reset): don't reset yanklen, inslen, lastcmd, lastac;
set first_insert, saved_inslen.
* vi.c(vi_insert): added code to handle first insertion to allow
redoing commands from last edit.
(based on fixes from Michael Jetzer).
* vi.c(VVERSION): new state.
* vi.c(classify): cleared C_ flag for 032 (^Z); set it for ^V.
* vi.c(nextstate): added VVERSION.
* vi.c(vi_hook): cases for VVERSION.
* sh.h(ksh_version): new declaration; removed declaration from
all other files.
* Makefile.in: removed rcs-ci, rcs-diff targets; put RCSFILES
into DISTFILES and removed former.
* var.c(newblock): copy argc/argv from previous env if it exists.
Tue Apr 18 23:10:32 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* jobs.c(exchild): report internal error if execute() returns in child.
* exec.c(execute): case TASYNC: clear exec flag in call to execute().
Tue Apr 18 12:05:23 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* emacs.c(x_bind): added list argument.
* c_ksh.c(c_bind): added -l (list) option.
* emacs.c,emacs-c.in: moved emacs.c to emacs-c.in.
* Makefile: add rule to create emacs.c from emacs-c.in.
* emacs-gen.sh: new file.
* emacs.c(struct x_defbindings, x_defbindings[]): new struct/array.
* emacs.c(struct x_ftab, x_ftab[]): removed x_db_tab, x_db_char;
initialize x_ftab[] via script.
* emacs.c(x_init_emacs): changed to load key bindings from
x_defbindings.
* emacs.c(Findex): added typedef.
* emacs.c(x_tab[]): changed to index into x_ftab; changed all refernces.
* emacs.c(xft_*): changed to XFUNC_*.
* emacs.c(XF_PREFIX): new flag, used for x_meta1, 2, 3.
* emacs.c(KPREF,KNULL): deleted (no functional use), changed
references to KSTD.
* emacs.c(x_last_command): changed type to Findex.
* emacs.c(x_emacs): set x_last_command to 0 at start; removed
same from case KEOL.
* emacs.c(XF_ARG): new flag for struct ftab.
* emacs.c(x_ftab[]): filled in XF_ARG for appropriate commands.
* emacs.c(x_arg_defaulted): new variable.
* emacs.c(x_emacs,x_set_arg): set x_arg_defaulted.
* emacs.c(x_bword, x_fword,x_fold_case): removed use of x_last_command.
* emacs.c(x_fold_upper,x_fold_lower,x_fold_capitailze): trivial
functions that call x_fold_case; changed x_ftab[] to use these
instead of x_fold_case so arbitrary keys can be bound to them.
* emacs.c(x_fold_case): changed to assume argument is 'L', 'U', or 'C'.
* emacs.c(x_del_back,x_del_char,x_prev_histword,x_prev_com,x_next_com,
x_kill,x_insert): use x_arg and x_arg_defaulted.
* emacs.c(x_delete): don't change mark point (xmp) if <= cp; added
force_push argument; changed all calls.
Mon Apr 17 10:30:12 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* emacs.c(x_e_getc): changed to handle macroptr, ungetting characters.
* emacs.c(x_e_ungetc): new function.
* emacs.c(x_emacs): let x_e_getc() take care of macroptr.
* emacs.c(x_version,x_search_hist): use x_e_ungetc() instead of
macroptr.
* emacs.c(x_set_arg): handle string of digits.
* emacs.c(x_search_hist): handle deleting chars from search string.
(fix from Dale DePriest)
* emacs.c(x_search): added sameline paramater.
* emacs.c(x_search_list): changes x_zots() to x_e_puts(); make
deleting in empty pattern break out of search.
* vi.c(domove): case '%': adjust ncursor forward only if matching
opening bracket (so when cursor is on the B in "(fooBar)", c%
changes the openbracket as well.
* vi.c(vi_cmd): case y/d/c: special case to move end point ahead
if move cmd is % and match was to the left of the cursor.
Thu Apr 13 10:34:26 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* vi.c(complete_word): no bell on ambiguous matches (user can
tell its ambiguous 'cause there is not space or slash appended)
* configure.in,aclocal.m4: added KSH_MEMMOVE, KSH_MEMSET tests
to fix problems with compiler builtins.
* misc.c(blocking_read, reset_nonblock) new routines.
* sh.h: deleted O_NONBLOCK ifdefs/defines.
* main.c(main),lex.c(getsc_),edit.c(x_getc),shf.c(shf_fillbuf):
use reset_nonblock().
(fix based on code from John Rochester)
Tue Apr 11 14:36:22 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* history.c(c_fc): mostly POSIXized.
* history.c(hist_execute,hist_get_newest,hist_get_oldest): new routines.
* history.c(hist_get,histget): changed histget to hist_get.
* history.c(hist_replace,histrpl): changed histrpl to hist_replace.
* lex.h(SHIST,histpush): deleted; deleted all references.
* history.c(histget): add approx check for history that hasn't
happened yet.
* misc.c(getn): allow leading plus (eg, +3).
* main.c(initcoms[]): defined history as "fc -l --".
* conf-end.h(JOBS): don't define if no posix or bsd process groups
(was if SIGCONT not defined).
Mon Apr 10 14:51:54 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* exec.c(comexec),c_ksh.c(c_getopts),c_sh.c(c_read): use FEXPORT flag.
* ksh_wait.h: changed to work with autoconf 2.x AC_HEADER_SYS_WAIT -
if sys/wait.h uses union wait, don't include it.
Thu Apr 6 12:19:58 NDT 1995 Michael Rendell (michael@panda.cs.mun.ca)
* tty.c(tty_init): print warning if open of /dev/tty fails.
Sat Mar 4 01:20:03 NST 1995 Michael Rendell (michael@garfield.cs.mun.ca)
* io.c(maketemp): create valid dos filenames.
Mon Feb 27 11:04:32 NST 1995 Michael Rendell (michael@panda.cs.mun.ca)
* Changed from autoconf 1.x to autoconf 2.x.
* acconfig.h: included old config.h.top and config.h.bot.
* config.h.top, config.h.bot: deleted; deleted all references.
* install.sh: changed to install-sh; changed all references.
* Makefile.in: use @CPPFLAGS@, @CFLAGS@, @LDFLAGS@;
use @configure_input@; remove config.log and config.cache in
distclean; use @prefix@ and @exec_prefix@.
* ksh_dir.h: changed to use new autoconf defines; changed NLENGTH()
to NAMLEN(); changed all references.
Mon Feb 27 9:31:02 NST 1995 Michael Rendell (michael@panda.cs.mun.ca)
* sh.h(ISABSPATH): new macro.
* var.c(setspec): use ISABSPATH() when setting tmpdir.
* emacs.c(compl_file): added OS2 ifdefs.
* exec.c(scriptexec): OS2: ignore path specified in #! scripts.
* sh.h(ksh_dupbase): OS2: now same as unix.
* trap.c(sigtraps[],inittraps): remove OS2 defines.
* trap.c(alarm_catcher): V7_SIGNALS: use sig, not i.
(Fixes from Dale DePriest)
Mon Feb 27 10:06:00 NST 1995 Michael Rendell (michael@panda.cs.mun.ca)
* configure.in: test for resource.h.
* c_ulimit.c: include ksh_time.h instead of sys/time.h; use
HAVE_SYS_RESOURCE_H when including sys/resource.h
(was HAVE_SETRLIMIT).
* aclocal.m4(KSH_RLIM_T): check sys/resources.h for rlim_t.
Fri Feb 24 17:30:16 NST 1995 Michael Rendell (michael@panda.cs.mun.ca)
* vi.c(struct macro_state, macro): new structure/variable.
* vi.c(vi_hook, vi_cmd): use macro state info to allow nested macros,
detect recursive macros.
Wed Feb 22 21:20:43 NST 1995 Michael Rendell (michael@panda.cs.mun.ca)
* c_ksh.c(c_whence): "an export" instead of "a export".
* vi.c(classify[]): added @<char>.
* vi.c(vi_hook,vi_cmd): added support for @<char> (macros).
(fixes from Frank Edwards).
Sun Feb 19 11:57:20 NST 1995 Michael Rendell (michael@panda.cs.mun.ca)
* exec.c(comexec): case CFUNC: use cp (not tp->name) when checking if
an autoloaded function was defined; save/restore kshname before/after
function call.
* var.c(popblock): don't set kshname to e->loc->argv[0] - it isn't
always right.
Fri Feb 10 12:36:16 NST 1995 Michael Rendell (michael@panda.cs.mun.ca)
* misc.c(parse_args): check OF_SET when building set_opts (was
checking OF_CMDLINE).
* conf-end.h(JOBS): don't define if SIGCONT not defined.
* sh.h(FLOGIN) new enum.
* misc.c(options[],parse_args): added login option; set FLOGIN if
name in argv[0] starts with -.
* main.c(main): use FLOGIN flag; changed the way OS2 code looks
for profile.
Wed Feb 1 09:55:40 NST 1995 Michael Rendell (michael@panda.cs.mun.ca)
* expr.c(varsub): in FUNSET test, don't always fail # and %
substitutions (test for unset variable).
Wed Jan 25 09:22:15 NST 1995 Michael Rendell (michael@panda.cs.mun.ca)
* sh.h(MIN_COLS): new define.
* sh.h(MIN_EDIT_SPACE): new define.
* vi.c(prompt_trunc): new variable.
* vi.c(edit_resize): calculate how much of prompt to truncate.
* lex.c(pprompt): added new argument; changed all calls.
* lex.c(yylex),emacs.c(x_emacs),vi.c(x_vi): move pprompt() inside
x_emacs(), x_vi() or just before read in yylex().
Tue Jan 24 12:35:18 NST 1995 Michael Rendell (michael@panda.cs.mun.ca)
* misc.c(parse_args): changed arrayname variable to array.
* var.c(basename): changed name of function to arrayname();
changed all references (Based on fix from Dan Quinlan).
Fri Dec 30 10:34:50 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* ksh.1: modifications to generate two man pages: sh and ksh
(Fixes from Michael Harrdt).
Wed Dec 28 16:55:13 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* vi.c(complete_word): don't check for globing characters.
Wed Dec 28 10:32:18 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* exec.c(search_access1): don't use ret variable; move "." to end
of xsuffixes/rsuffixes.
* os2.c(_execve): OS2: fixed typo.
* sh.h(FILENCMP): changed stricmp to strnicmp.
* os2/config.h: added define for rlim_t.
* os2/make.sed: changed > null to > nul.
* Makefile.in(dist): generate os2/makefile after running Dist-fixup.
(Fixes from Dale DePriest)
Thu Dec 22 15:06:06 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-5.1.3 distribution
* *.c: removed RCSids.
Wed Dec 21 11:55:01 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* table.h(struct tbl): changed array field to union of array/fname;
changed all references.
* c_ksh.c(c_whence): print undefined function path.
* exec.c(comexec): do autoloading of undefined functions; print
error if function can't be found.
* exec.c(findcom): fill in tp->u.fname for undefined functions;
search FPATH if search of PATH fails.
* table.h(FC_NOAUTOLOAD): deleted define; removed all references.
Tue Dec 20 14:16:16 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* exec.c(herein): check if name is null.
* lex.h(HEREDELIM,SHEREDELIM,SHEREDQUOTE): new defines.
* lex.c(yylex): added code for HEREDELIM.
* syn.c(synio): use HEREDELIM.
* lex.c(readhere): changed to allow \n in here-delimiter.
* tree.c(tputS): quote ", ` and $ inside "-quotes.
* tree.c(ptree,pioact): made static.
* tree.c(ptree,fptreef,vfptreef): added indent argument; changed to
use indent argument; changed all calls.
* tree.h(struct ioword): added delim field.
* tree.c(iocopy),syn.c(synio,syntaxerr): deal with delim field.
* tree.c(pioact): print contents of here documents.
* c_ksh.c(c_typeset): typeset -f foo: set exit code to 1 if function
not found.
Mon Dec 19 15:14:02 NST 1994 Michael Rendell (michael@garfield.cs.mun.ca)
* history.c(histinit): increment line number for each history line.
* exec.c(iosetup): OS2: if open /dev/null fails, try nul instead.
* Makefile.in(debugtools,install,uninstall): make check-pgrp last;
use $E.
* eval.c(eval,expand): OS2: added DODIRSWP code.
* main.c(main): OS2: only include $HOME/kshrc.ksh if interactive.
* sh.h(FILENCMP,FILECMP,FILECHCONV): new defines.
* misc.c(gmatch),vi.c(grabsearch,complete_word),emacs.c(compl_file):
OS2: case insensitive compares.
(fixes from Dale DePriest).
Mon Dec 19 09:54:42 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* vi.c(vi_cmd): make ~ honour argcnt (fix from Troy Bollinger).
* vi.c(complete_word): don't add trailing / if there is already one.
* vi.c(glob_word): return rval, not 0.
Thu Dec 15 11:06:01 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* vi.c(vi_cmd): call complete_word() with argument of 1 not 0.
Tue Dec 13 12:07:50 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* history.c(histget): made static; added approx argument; changed
all calls.
Tue Dec 13 10:58:14 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* Makefile.in(mandir): use $(manext), not 1 (fix from Mike Long).
Mon Dec 12 20:55:53 NST 1994 John Rochester (jr@panda.cs.mun.ca)
* tree.c(ptree): print TELIF part of if statements
Fri Dec 9 15:21:36 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* trap.c(inittraps): OS2: don't trap SIGTERM (temporary fix).
* exec.c(search_access1): OS2: fixed to check for valid suffix
and change mode from X_OK to R_OK if appropriate.
* edit.c: include <sys/stream.h>, <sys/ptem.h> for SCO unix
(fix from William Bader).
* c_ulimit.c(c_ulimit): changed type of val from long to rlim_t
(fix from Thomas Gellekum and J.T.Conklin).
* aclocal.m4(KSH_RLIM_T): new test for rlim_t.
* configure.in: use KSH_RLIM_T.
* acconfig.h: added rlim_t.
Thu Dec 8 12:20:25 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* expr.c(evalexpr): changed div-by-zero test to only derefernce vr
if operation is a divide.
Mon Dec 5 14:42:52 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* exec.c(search): OS2: typo - changed namlen to namelen.
* exec.c(search_access): OS2: check execute bit explicitly.
* main.c(main): OS2: don't include ./profile.ksh.
* options.h(DEFAULT_PATH): OS2: added /os2 to path.
* sh.h(ksh_getdup): OS2: define to getdup(); prototype for getdup().
* Makefile.in(dist): create os2 Makefile based on distribution
Makefile.in.
Mon Dec 5 12:17:14 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-5.1.2 distribution
* eval.c(globit): when searching directory, re-calculate end of
string based on prefix length.
Fri Dec 2 11:07:48 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* syn.c(wordlist): if token isn't 'in', don't reject ;.
* eval.c(expand): leading non-white-space IFS chars no cause initial
empty field.
Thu Dec 1 12:04:00 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-5.1.1 distribution
Thu Dec 1 10:50:38 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* sh.h(TF_FATAL,fatal_trap): new define,variable.
* trap.c(inittraps,trapsig,fatal_trap_check,trap_pending,runtrap,
settrap): use TF_FATAL, fatal_trap.
* trap.c(runtraps): changed argument from bool to TF_* flag; changed
all calls.
* jobs.c(j_waitj): check fatal_trap flag.
Wed Nov 30 11:20:03 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* conf-end.h: new file.
* config.h.bot: moved guts to conf-end.h.
* emacs.c(struct x_ftab): changed type of xf_db_char from char to int.
* emacs.c(x_emacs): changed type of c from char to int.
* emacs.c(X_NTAB): new define.
* emacs.c(x_bind,x_init_eamcs): new X_NTAB, X_TABSZ.
* emacs.c(x_prefix3, x_meta3): ifdef OS2.
* emacs.c(x_bind): ifdef OS2; mask *a1 with CHARMASK.
* exec.c(search_access): new function.
* exec.c(search): use search_access() instead of duplicating test.
* exec.c(search,search_access1): ifdef OS2.
* Makefile.in(OS2FILES): new macro.
* Makefile.in(dist): add OS2FILES to distribution.
* options.h(DEFAULT_PATH): ifdef OS2.
* edit.c(x_getc,x_mode): ifdef OS2.
* path.c(make_path): ifdef OS2.
Tue Nov 29 16:51:35 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* sh.h(EXECSHELL,EXECSHELL_STR): ifdef OS2.
* exec.c(scriptexec): use EXECSHELL_STR (was "EXECSHELL").
* trap.c(sigtraps[]): ifdef OS2.
* lex.c(yylex): ifdef OS2.
* misc.c(change_flag): ifdef OS2.
* history.c(HISTFILE): ifdef OS2.
* eval.c(homedir): ifdef OS2.
* c_sh.c(shbuiltins[]): ifdef OS2.
* sh.h(ksh_execve,ksh_dupbase): new defines.
* jobs.c(exchild): ifdef use of nice.
Tue Nov 29 12:32:26 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* eval.c(globit,copy_non_glob): changed to pass/use &xp it can change
(memory can be re-allocated).
* ksh_dir.h(NLENGTH): new macro.
* eval.c(globit): use NLENGTH macro.
* alloc.c(aresize): removed redundant np and optr variables.
Mon Nov 28 14:55:49 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* config.h.bot(HISTORY): new define.
* lex.c(getsc_): ifdef HISTORY.
* history.c: ifdef HISTORY (dummy histsave, init_histvec and
hist_finish routines).
* c_ksh.c(kshbuiltins): c_fc: ifdef KSH
* lex.h(HISTORY): changed to HISTORYSIZE; changed all references.
* options.h(KSH): new define.
* config.h.bot: changed to deal with KSH define.
* exec.c(do_select,pr_menu): ifdef KSH.
* exec.c(execute): case TSELECT: ifdef KSH.
* c_ksh.c(c_whence,c_command,kshbuiltins[]): ifdef KSH.
* main.c(initcoms[],main): ifdef some aliases, SECONDS/RANDOM/TMOUT.
* syn.c(get_command): case TDBRACKET: ifdef KSH.
* syn.c(db_parse,db_aoexpr,db_nexpr,dp_primary): ifdef KSH.
* syn.c(tokentab[]): "select", "[[" ifdef KSH.
* var.c(special,getspec,setspec,unsetspec): ifdef KSH.
* ksh.1: ifdef KSH; misc fixups.
(changes mostly from Michael Haardt).
Mon Nov 28 14:27:34 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* var.c(skip_varname,special,global,local), table.c(hash,tsearch,
tenter): made argument and return value const.
* main.c(version_param[]): new variable.
* main.c(initcoms[],main): use version_param instead of "KSH_VERSION".
* history.c(histsave): EASY_HISTORY: changed to take same arguments
as COMPLEX_HISTORY histsave(); changed all calls, removing
unneeded ifdefs.
* vi.c(x_vi), emacs.c(x_emacs): changed unwind() call from LINTR
to LSHELL so newline isn't printed twice - also lets runtrap()
set the exit code.
* vi.c(vi_cmd): increment source line if saving to history.
Fri Nov 25 14:43:57 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* syn.c(get_command): don't generate a syntax error if EOF is read.
* configure.in: add LDSTATIC to LDFALGS if the former is set.
* history.c(hist_skip_back): start at the end of the buffer, not
one past the end (fix from Simon J. Gerraty).
Thu Nov 24 09:53:49 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* syn.c(get_command,dogroup): allow { ...;} to be used instead
of do ...;done in for/select loops.
Wed Nov 23 09:09:43 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-5.1.0 distribution
* var.c(setspec): set seconds to current time - assigned value,
not just current time.
* emacs.c(x_copy_arg): deleted ifdef'd out code (x_prev_histword()
does what it was supposed to do).
* emacs.c(compl_command): don't call list_stash() twice (happened
if type == 2 and multi set).
Tue Nov 22 10:26:13 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* c_test.c(eval_unop): don't assume S_ISBLK, S_ISCHR, S_ISUID,
S_ISGID are defined.
* path.c(make_path): avoid addeding extra /'s in paths; avoid
infinate loop if result buffer not big enough.
* main.c(main): setting PWD: avoid calling setstr() with the
current value of PWD.
* var.c(typeset): set free_me to 0 if t is integer.
* emacs.c(x_search_hist): added overflow checking to fixed sized
buffers.
* emacs.c(compl_file,compl_command): removed fixed sized buffers.
* vi.c(x_vi), emacs.c(x_emacs): on interrupt, unwind instead of
calling runtraps().
* vi.c(vi_cmd): added 'g' command to goto the most recent command.
* c_sh.c(c_read), c_ksh.c(c_print): always increment source->line when
saving history.
Mon Nov 21 10:45:34 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* exec.c(do_selectargs): removed use of pmenu variable (redundant)
use isspace() instead of IFS chars; include <ctype.h>.
* aclocal.m4(KSH_TERM_CHECK): do not allow HAVE_TERMIOS_H check to
succeed on ultrix (avoid type-ahead loss).
* emacs.c(x_fword): cahnged loop to skip non word chars, then word
chars (was the opposite).
* main.c(shell): after error/interrupt/etc, reset an EOF if ignoreeof
option is set.
* vi.c(classify[]): changed space (040) from C_|U_ to M_
(got broken in 5.0.10).
* ksh_wait.h(ksh_waitpid): new define.
* jobs.c(waitpid): moved define to ksh_wait.h; changed use of
waitpid() to ksh_waitpid().
* history.c(hist_skip_back),io.c(maketemp): use procpid instead of
getpid().
Fri Nov 18 16:08:09 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* vi.c(FSHOW8): inverted meaning: now if set, do the M- stuff
(done so 8 bit char sets work by default).
* main.c(main): set exstat to 127 if command file can't be opened.
* main.c(main): use argv[0] instead of kshname when deciding
whether to include profiles.
Fri Nov 18 14:25:11 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-5.0.10.1 distribution
* tty.h: deleted KSH_VDISABLE; moved _POSIX_VDISABLE stuff to edit.c.
* edit.c(x_init): calculate value for vdisable_c.
* edit.c(x_mode): use vdisable_c instead of KSH_VDISABLE.
Thu Nov 17 12:09:13 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-5.0.10 distribution
* lex.c(getsc_),edit.c(x_getc): call runtraps(FALSE) if read is
interrupted.
* vi.c(x_vi),emacs.c(x_emacs): call runtraps(FALSE) (was TRUE).
Wed Nov 16 09:48:54 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* exec.c(execute,scriptexec): call __setostype(0)/(1) before/after
execve() on ISC machines.
* trap.c(trap_pending): new fuction.
* jobs.c(j_waitj): use trap_pending(); return -<signal-number> if
interrupted.
* jobs.c(waitfor): added sigp argument; changed all calls.
* c_sh.c(c_wait): use signal number set by waitfor() to set exit status.
* shf.c(SHF_INTERRUPT): no longer calls intrcheck() - now sets
error flag and returns EOF.
* c_sh.c(c_read): re-arranged to have single shf_getc() call; if read
interrupted and signal is fatal (fatal_trap_check()), make read
return with appropriate exit code.
* trap.c(fatal_trap_check()): new function.
* trap.c(inittraps()): catch and cleanup on SIGHUP; don't force the
setting of SIGINT,SIGQUIT,SIGTERM,SIGHUP.
* table.c(tenter): changed to use strlen()/memcpy() instead of loops.
* var.c(initvar): new function.
* main.c(main): call initvar().
* var.c(special): changed to use hash table for lookup.
* main.c(main),syn.c(initkeywords): moved table initialization
from main() to initkeywords().
Tue Nov 15 10:01:20 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* eval.c(copy_non_glob): new routine.
* eval.c(globit): changed to use copy_non_glob() instead of strchr().
* misc.c(cclass): if [..] pattern has no closing ], do literal
compare of character with [ (used to always fail).
* eval.c(globit): handle symbolic links in the check code.
* configure.in: added check for lstat().
* ksh_stat.h: defined lstat to be stat if lstat is not available.
* exec.c(search): return Xclose() instead of Xstring().
Mon Nov 14 16:28:41 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* ksh_times.h: changed BROKEN_TIMES to TIMES_BROKEN.
* c_test.c(syntax): removed \n from error messages.
* eval.c(glob,globit): changed to use dynamicly allocated string
instead of a fixed sized buffer.
Thu Nov 10 10:47:55 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* history.c(sethistsize): don't set size if new size is < 0; fixed
offset calculation so histptr is not way beyond the end of array;
if history is shrinking, save newest history back.
* vi.c(vi_hook): case VSEARCH: call restore_cbuf() after \n or \r.
* main.c(quitenv): call restfd() even if fd < 0 to re-close fd.
* exec.c(execute): commented out code that set savefd[0/1] to -1
if input/output was a pipeline.
* missing.c(dup2_fixup): deleted function.
* sh.h(dup2->dup2_fixup): deleted define.
* io.c(ksh_dup2): new function; changed all dup2() calls to ksh_dup2().
Wed Nov 9 11:11:31 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* edit.h(struct edchars): added eof field.
* edit.c(x_init): initialize eof fields.
* vi.c(x_vi): changed ^D to edchars.eof.
* vi.c(vi_cmd): make I/cc/S skip blanks.
* history.c(histsave): EASY_HISTORY: use memmove() to copy pointers
back one.
* vi.c(vi_cmd): make G act the same as at&t ksh.
* vi.c(ismeta,O_): deleted macros; removed all references to O_.
* vi.c(classify[]): add ^X and ^F to command mode.
Tue Nov 8 11:15:01 NST 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* main.c(initsubs[]): don't set SHELL.
* vi.c(vi_cmd): added v command (start up vi).
* vi.c(vi_hook): added case for vi_cmd() returning 2.
* vi.c(grabsearch): set anchored flag if pattern starts with ^.
(based on fixes from Michael Jetzer).
* history.c(findhist): added anchored argument; changed all calls.
* history.c(histget): start searching from histptr-1; changed to
call findhist() to do searching.
* history.c(c_fc): changed to print multiline commands correctly.
(based on fixes from Michael Jetzer).
Fri Nov 4 10:30:14 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* lex.c(yylex): when pushing alias sources, allocate from existing
source's area.
* lex.c(struct source): added areap field.
* lex.c(pushs): added area argument; changed all calls.
* history.c(histrpl): changed constant sized hline[] to expandable
string; removed hline/hsize parameters; changed all calls; put
newline at end of string.
* history.c(c_fc): changed to use dynamically sized buffer when reading
commands; strip nulls after read.
* history.c(histbackup): made static.
* trap.c(block_pipe): if handler is SIG_DFL, change it to SIG_IGN.
* lex.c(readhere): changed to allow eof after end-of-file marker
(bug report from Andrew Moore).
Thu Nov 3 09:09:39 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* io.c(coproc_read_close,coproc_write_close): new functions.
* c_sh.c(c_read): call coproc_read_close() when eof is read.
* c_ksh.c(c_print): set PO_COPROC if fd is coproc.write; call
coproc_write_close() if write fails due to EPIPE.
* exec.c(iosetup): call coproc_write_close() after #>&p.
* sh.h(EF_COPROC_DUPED): deleted.
* sh.h(struct coproc): deleted isopen field.
* io.c(cleanup_coproc): do not use isopen field.
* c_sh.c(c_exec): deleted EF_COPROC_DUPED code.
* exec.c(TCOPROC): don't set isopen; don't start new coprocess if
old job exists and write pipe hasn't been closed.
* misc.c(str_zcpy): new function.
* lex.c(getsc_): made line[] buffer local/static; use str_zcpy()
to fill line[].
* history.c(c_fc): use local hline buffer instead of global line[];
use str_zcpy() to fill hline[];
* history.c(histrpl): added hline and hsize parameters; changed all
calls.
* history.c(hist_init): EASY_HISTORY: use local hilne buffer instead
of global line[].
* lex.h(line[]): deleted.
* syn.c(compile): do not set s->str to null for STTY and SHIST.
Wed Nov 2 11:48:36 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* lex.c(getsc_): case SDDPAREN: set csstate before going to
SPAREN state.
* Makefile.in(RCSFILES): removed POSIX from list (now covered in
man page).
Tue Nov 1 09:27:46 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* eval.c(comsub): save/restore source before/after compile().
* c_ulimit.c(c_ulimit): allow value to be arithmetic expression
(as per Korn book).
* c_sh.c(c_read): call set_prompt() before printing prompt.
* expr.c(v_evaluate): treat an empty expression as 0.
Mon Oct 31 09:23:57 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* vi.c(grabhist,grabsearch): check that history line doesn't overflow
edit buffer.
* history.c(hist_finish): (EASY_HISTORY) changed for-loop condition to
prevent passing the end of history.
* eval.c(expand): when stuffing MAGIC, cast c to char.
* misc.c(strip_nuls): new function.
* lex.c(getsc_): case STTY/SFILE/SSTDIN: call strip_nuls() after
reading commands.
* edit.c(set_editmode): reversed strstr() arguments - check for
vi/emacs in $EDITOR/$VISUAL string.
* syn.c(yyparse): allow EOF as well as newline after a command.
* lex.c(getsc_): case SSTRING: don't fake newline
Sun Oct 30 10:55:20 NST 1994 Michael Rendell (michael@panda.cs.mun.ca)
* c_ksh.c(c_print): echo: check for -n, -e and -E options.
* exec.c(comexec): don't allow command -p if restricted.
Fri Oct 28 10:24:48 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* var.c(typeset): in fake_assign code, was freeing t->val.s + t->type
instead of t->val.s - now uses free_me variable instead of aflag.
* Makefile.in(depend): change blank lines in depend output to sh.h
so dumb make(1)s won't die.
* mail.c: changed checking to use atime/mtime instead of size; changed
struct mbox mb_size field to mb_mtime, changed all references.
* main.c(shell): do not execute (or set the exit status for) a null
command.
* lex.c(readhere): read the newline after the eof marker.
Wed Oct 26 09:11:08 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* eval.c(globit): added FMARKDIRS support.
* emacs.c(x_ftab[]): added entries for ansi arrow key bindings.
* exec.c(execute,iosetup): move tracing of redirections from
execute() to iosetup() so expanded name can be printed.
* exec.c(execute): case TDBRACKET: read was being called instead of
test.
* ksh_stat.h(S_ISCDF): new define.
* c_test.c: added -H for context dependent files (HP bizarreness).
* main.c(initcoms[]): added alias local=typeset.
* Makefile.in(stamp-h,config.status): added double quotes CONFIG_FILES
and LDSTATIC assignments for dmake.
* aclocal.m4(KSH_SYS_SIGLIST): do something with sys_siglist so it
isn't optimized away.
* aclocal.m4(KSH_CLOCK_T): do extra check for clock_t in sys/times.h.
* acconfig.h(CLOCK_T_IN_SYS_TIMES_H): new define.
* sh.h(SIGNALS): use _SIGMAX if NSIG, _MINIX not defined.
(fixes from Brian Campbell <brianc@qnx.com>)
* emacs.c(x_transpose): changed behavior if FGMACS flag set
(fix from <guy@netapp.com>).
Tue Oct 25 17:11:58 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* tty.c(KSH_VDISABLE): new define.
* edit.c(x_init): use KSH_VDISABLE.
Tue Oct 25 09:55:09 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-5.0.9 distribution
* c_ulimit.c(c_ulimit): changed SOFT, HARD from enum to defines
to avoid problems with ancient compilers.
* vi.c(CHAR_LEN,char_len): changed macro to function; added FVISHOW8
support.
* misc.c(options[]), sh.h(FVISHOW8): added FVISHOW8 option.
Sun Oct 23 11:02:26 NDT 1994 Michael Rendell (michael@maple.cs.mun.ca)
* main.c(shell): keep unwinding if LINTR and not interactive.
* lex.c(yylex): do redumentery quote parsing for $(..).
Thu Oct 20 11:02:27 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* exec.c(execute): case TSELECT: set rv to 1 if eof is read.
* exec.c(execute): case TFOR/TSELECT/TWHILE/TUNTIL: set rv to 0 before
entering loop, but after setjmp incase of a continue; rv to 0
after a break.
* exec.c(execute): case TFOR/TSELECT: do readonly check before
assigning value.
* c_ksh.c(c_getopts): do readonly check before assigning value.
* misc.c(print_columns),c_ksh.c(kill_fmt_entry),
misc.c(options_fmt_entry),exec.c(select_fmt_entry): new functions.
* c_ksh.c(c_kill),misc.c(printoptions),exec.c(pr_menu): use
print_columns() call a call-back routine to format information
in columns.
Wed Oct 19 10:26:25 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* misc.c(cclass): require MAGIC before - and ].
* eval.c(expand): prefix - and ] with MAGIC if appropriate.
* var.c(typeset): don't allow export flag of readonly variables
to be cleared.
* eval.c(globit): added call to intrcheck().
Mon Oct 17 11:48:05 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* lex.c(readhere): check for and report write errors.
Sun Oct 16 16:10:59 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* c_ksh.c(c_cd): don't allow cd if restricted.
* exec.c(comexec): if restricted and command contains /, print error.
* exec.c(ioestup): if restricted, don't allow file creations.
* main.c(is_restricted): new function.
* main.c(main): save and reset FRESTRICTED during .profile/ENV reading;
set FRESTRICTED if argv[0] or SHELL refers to restricted shell;
make PATH, ENV, SHELL readonly if restricted.
* var.c(typeset): check for restricted shell and PATH/ENV/SHELL.
Thu Oct 13 21:01:14 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* main.c(shell): only call j_notify() for interactive shells.
* c_sh.c(c_read): check if variable is readonly before assigning
value.
Wed Oct 12 14:08:46 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* lex.h(COPROC),tree.h(TCOPROC,XCOPROC): added defines.
* lex.c(yylex): return COPROC for |& token.
* syn.c(tokentab): added COPROC.
* syn.c(c_list): accept COPROC, create TCOPROC node.
* tree.c(ptree): added case for TCOPROC.
* exec.c(execute): added case for TCOPROC.
* io.c(check_fd,get_coproc_fd): new functions.
* c_sh.c(c_read),c_ksh.c(c_print): changed to use check_fd();
added -p option; for c_print() ensure SIGPIPE doesn't kill shell.
* exec.c(iosetup): changed to use check_fd() for IODUP; when
checking fore close, require exactly the string '-', not any
string starting with '-'; added strerror() to error message.
* jobs.c(exchild): don't open /dev/null if XCOPROC; close
coproc.read/write/childread in child if XCOPROC; don't pass
XCOPROC flag on to execute(); set coproc.job to job in parent
if XCOPROC.
* jobs.c(check_job): clear coproc.job if said job dies.
* trap.c(block_pipe,restore_pipe): new functions.
* sh.h(struct coproc, EF_COPROC_DUPED): new structure and define.
* c_sh.c(c_exec): if EF_COPROC_DUPED set, clean up co-process stuff.
* main.c(cleanup_parents_env): new function.
* jobs.c(exchild): call cleanup_parents_env() after fork().
* tree.h(IORDUP): new define.
* lex.c(yylex): changed redirection parsing to not accept & only after
a single < or >; set IORDUP flag for x<&y; fixed <</<>/>> check to
not allow >< (again).
* tree.c(pioact): use IORDUP flag to print <& or >&.
* jobs.c(exchild): set JF_ORIGFG flag if job started in foreground.
* jobs.c(j_waitj): don't get default tty settings if JF_ORIGFG not
set.
* misc.c(parse_args): treat -A as a flag that is handled later
(used to require argument); do array setting after argument
sorting.
* var.c(set_array): changed second argument from 0/1 flag to
-1/1 flag; changed all calls.
Thu Oct 6 11:55:27 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* table.c(tinit): added initial table size argument; call texpand
if size isn't 0; changed all calls.
* main.c(main): try to make sure table size is big enough for
builtins and keywords (cut down on amount of re-hashing).
* eval.c(expand): added next and prev fields to struct SubType;
removed fixed length subtype array, changed code to allocate
SubTypes as needed.
Wed Oct 5 09:25:06 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* main.c(main): moved initio() above inittraps() as later can print
stuff.
* table.h(IMPORT): new flag.
* var.c(typeset): if IMPORT flag set, don't allow array references,
insist on assignment.
* var.c(import): deleted function.
* main.c(main): use typeset() instead of import().
* sh.h: include expand.h.
* expand.h(Xnleft): new define.
* expand.h(struct XString, Xinit): added areap field; added area
argument to Xinit; changed all calls.
* lex.h(struct source): added xs field.
* shf.c(shf_gets,shf_getse): changed name fromshf_gets to shf_getse;
return pointer to null byte instead of start of buffer.
* lex.c(pushs): if type is SFILE or SSTDIN, initialize s->xs.
* lex.c(getsc_): case SFILE/SSTDIN: use s->xs instead of fixed
size line buffer.
* syn.c(compile): don't change s->str if SFILE.
* main.c(main): call pushs() explicitly for each of SSTRING,
SFILE, SSTDIN, STTY.
* aclocal.m4(KSH_GCC_FUNC_ATTR): changed GCC_FUNC_ATTR to
HAVE_GCC_FUNC_ATTR.
* config.h.bot: changed use of GCC_FUNC_ATTR; deleted
GCC_FA_NORETURN, GCC_FA_CONST, GCC_FA_FORMAT defines, created
generic GCC_FUNC_ATTR define; changed all uses of GCC_FA_*.
* main.c(main): set s->file for SSTDIN input.
* main.c(shell): pass LERROR on if not interactive.
* expand.h(Xcheck,XcheckN): added XcheckN define, changed Xcheck
to use XcheckN; made XcheckN call Xcheck_grow_() do do any real work
(to cut down on code size).
* misc.c(Xcheck_grow_): new function.
* exec.c(search),c_sh.c(c_read): changed to use Xstring() routines
(used to use the fixed size buffer line[]).
* exec.c(findcom): avoid re-saving search() result in ATEMP.
Tue Oct 4 15:32:37 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* jobs.c(j_jobs): return int value indicating error/ok; changed
all calls.
* misc.c(getn): added int * argument to hold result; changed
return value to indicate success/failure; changed all calls.
* misc.c(bi_getn): new function.
* misc.c(getn_): deleted function.
* io.c(internal_error,error_prefix,warningf): new functions.
* *.c: changed errorf() calls reporting internal errors to
use internal_error() function; changed many shellf()s to
warningf().
* io.c(errorf),lex.c(yyerror): changed to use error_prefix().
* alloc.c(aprint): ifdef'd out.
* tree.c(phash): deleted function.
Mon Oct 3 15:08:24 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* sh.h(kshname): new variable
* main.c(main): changed name to kshname, deleted local variable.
* exec.c(comsub): update kshname.
* var.c(popblock): restore kshname.
* io.c(errorf,bi_errorf): print shell name before error message.
* c_ksh.c(c_cd): print new directory on stdout, not stderr.
* sh.h(GI_MINUS): new define.
* misc.c(ksh_getopts): changed so once - or + introduces option,
all options must start with same character.
* sh.h(builtin_argv0): new variable.
* exec.c(call_builtin): set/clear builtin_argv0, builtin_flag; changed
argument to a struct tbl *; changed all calls.
* io.c(bi_errorf): new function.
* c_ksh.c,c_sh.c,c_ulimit.c,emacs.c,history.c,jobs.c: changed all uses
of errorf() to bi_errorf().
* emacs.c(x_bind): changed return value to int; changed all calls.
* history.c(histrpl): return 0 if there is an error; changed all calls.
* misc.c(parse_args): use bi_errorf(); return -1 for error; changed all
calls.
* misc.c(ksh_getopts): call bi_errorf instead of errorf which means
ksh_getopts() may return after an error, so changed all calls to
check for '?' return.
* exec.c(iosetup): use shellf() to report errors and return value
indicating success or failure.
* exec.c(execute): if iosetup fails, cause fatal error for special
builtins, return otherwise; print PS4 and redirections.
Fri Sep 30 15:17:37 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* c_ulimit.c(c_ulimit): accept unlimited as a valid value.
* c_test.c(c_test): changed posix special case code to use
while loop.
* c_ksh.c(c_whence): for whence -p, don't look for built-ins or
fuctions.
Thu Sep 29 10:34:59 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* c_ksh.c(c_alias): added -r option so the sysv-bounre shell
hash -r will work.
* eval.c(debunk): use strchr() to find first MAGIC, if any.
Wed Sep 28 15:34:32 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* sh.h(O_NONBLOCK): define to O_NDELAY or FNDELAY if not defined.
* main.c(main): if stdin is O_NONBLOCK'd, clear O_NONBLOCK.
* misc.c(options[], parse_args): make -c a normal flag, not an option
with an argument (POSIX); deleted cargp argument to parse_args().
* main.c(main): print error if -c and no arguments left.
* lex.h(SSTDIN): new define.
* lex.c(yylex): added case for SSTDIN.
* main.c(main): if -s flag used, set source type to SSTDIN.
Tue Sep 27 08:52:11 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* lex.c(get_brace_var): new function.
* lex.c(yylex): removed most ${..} parsing - leave it to expand();
use get_brace_var() to read the variable part of a ${..} expression.
* tree.c(tputs,wdscan): case OSUBST: delete code that understood
partially compiled ${..}.
* sh.h(C_SUBOP,C_SUBOP1,C_SUBOP2): changed C_SUBOP to C_SUBOP1,
added C_SUBOP2.
* misc.c(initctypes): removed # and % from C_SUBOP; changed C_SUBOP to
C_SUBOP1; added C_SUBOP2.
* eval.c(varsub): look at word part of substitution to figure out
type of substitution; check for bad substitutions; check for unset
variables for #/% substitutions.
* eval.c(struct SubType): changed type field to stype; changed quote
field to short; added f field.
* tree.h(DOTEMP_): new define.
* eval.c(expand): case CSUBST: case '=': deleted bad substitution
error (now handled in varsub); case OSUBST: removed special handling
of trimming - varsub() does it now; when pushing/poping state (st),
save/restore value of f; set f to DOPAT when trimming; case CSUBST:
case '=': restore original position in string, substitute the value
of the variable (as opposed to the value that was assigned to the
variable); case OSUBST: if '?' qualifier, turn off DOBLANK when
expandined word part; define DOTEMP_ when expanding word part
of ${..[#%=?]..}; deleted first_eq and tstart - replaced with
tilde_ok and saw_eq.
* eval.c(expand): tilde expansion: use tstart variable instead of cp;
changed '?' error message to be like at&t ksh; don't test if strval()
returns NULL - it doesn't.
* var.c(strval): if !ISSET, instead of returning null, set s to null.
* exec.c(comexec): case TDBRACKET: don't pass DOASNTILDE to evalstr().
* exec.c(scriptexec): changed line[] to buf[] so it doesn't get
confused with global the line[].
* main.c(initsubs): initialize PS4.
* edit.c(x_getc): cast char to unsigned before returning.
Mon Sep 26 11:06:55 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* eval.c(globit): call strnsave instead of strsave; if file has
trailing /, use stat() to check that it is a directory.
* eval.c(expand): case CSUBST: case #/%: deleted duplicate *dp = 0;
case CSUBST: case =: copy string and call debunk() to oust MAGICs.
* misc.c(print_value_quoted): deleted bogus shf_shlout argument to
shprintf(); deleted unneeded test (p != s).
* main.c(main): turn on FBRACEEXPAND.
* misc.c(change_flag): turn FBRACEEXPAND off if turning FPOSIX on.
* vi.c(x_vi): use x_vi_zotc() to print ^D.
* vi.c(CHAR_LEN): new define.
* vi.c(vi_hook): use CHAR_LEN() instead of inline tests for
c < ' ' || c== 0x7f; search editing: display M- if necessary.
* vi.c(display): changed to deal tiwh meta-characters.
* vi.c(x_vi_zotc): print M- for meta chars.
* emacs.c(x_e_getc): new function; changed all x_getc() calls to
x_e_getc() calls.
* edit.c(x_getc): don't and out upper bit.
* sh.h(OPAREN,CPAREN,OBRACK,CBRACK,OBRACE,CBRACE): new defines
* expr.c(OPAREN,CPAREN): re-named to OPEN_PAREN, CLOSE_PAREN.
* eval.c(debunk): changed to convert MAGIC MAGIC -> MAGIC.
* eval.c(expand): removed ismagic_bracket stuff - not needed.
* eval.c(expand): always restore value of quote when CSUBST
reached; don't set DOGLOB in fdo if trimming.
Sat Sep 24 11:46:03 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* tree.h(DOBRACE_): new define.
* eval.c(expand): changed check for leading ! in [..] to be more
robust (old test could have looked before start of string).
* eval.c(expand,maybe_expand_tilde): case ~: moved code into a function
(maybe_expand_tilde).
* eval.c(expand): expand alternations after macros, before globing
(was before macros).
* eval.c(alt_expand): changed to be called after macro expansion.
* eval.c(alt_scan,alt_count): deleted (no longer needed).
* misc.c(cclass): return NULL (no match) if first char in a range
is greater than the second.
* eval.c(expand): when building strings, stuff literal MAGIC chars.
Thu Sep 22 15:05:48 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* exec.c(comexec): re-arranged handling of builtin and exec;
handle command (and command -p, etc.); deleted comexec_flags
variable; made function static again; removed fcflags argument.
* table.h(FC_NOBLOCK): deleted define.
* c_sh.c(c_exec): changed empty function to deal with preserving I/O
redirects (code taken from comexec()).
* c_ksh.c(c_command): new function - calls c_whence.
* c_ksh.c(c_whence): removed code to deal with command -p.
* Makefile.in: changed [ to test.
* shf.h: changed errno structure member to errno_; changed all uses
(fixes for QNX from Brian Campbell).
* c_test.c(enum Op): deleted trailing comma (some compilers complain).
* proto.h: added volatile to tp arg of comexec() prototype.
Thu Sep 22 11:08:31 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-5.0.8 distribution
* Makefile.in(install): added missing dollar (fix from Thomas Gellekum).
* emacs.c: changed CMASK to CHARMASK to avoid conflicts with some
system headers (eg, HP-UX 9.01 <sys/param.h>). Reported by Sean
Hogan.
* history.c(c_fc): wp not being incremented; -e strcmp() test reversed
(reported by Sean Hogan).
Thu Sep 21 21:12:03 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-5.0.7 distribution
Tue Sep 20 09:56:54 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* history.c(c_fc): use ksh_getopt() to parse arguments.
* c_ksh.c(c_bind): use ksh_getopt() to parse arguments.
* main.c(initcoms[]): changed hash alias from alias -t - to alias -t --.
* misc.c(print_value_quoted): don't use quotes if no special
characters.
* c_ksh.c(c_whence): added POSIX command command.
* c_sh.c(c_label): removed check for null wp.
* exec.c(comexec): added new flags argument (FC_*);
don't call newblock() if FC_NOBLOCK set; pass flags on to
findcom(); changed all calls; made comexc() a non-static
function.
* table.h:(FC_SPECBI,FC_FUNC,FC_REGBI,FC_UNREGBI,FC_PATH,FC_DEFPATH,
FC_NOAUTOLOAD,FC_NOBLOCK): new defines.
* exec.c(findcom): merged insert/justsearch/autoload arguments
into one flags argument; changed code to check various flags;
changed all calls.
Sat Sep 17 20:17:59 NDT 1994 Michael Rendell (michael@garfield.cs.mun.ca)
* exec.c(comexec): print error if builtin has no command.
* exec.c(execute): before doing redirections, check for TCOM and
evaluate arguments and determine if it is a special builtin;
print arguments (using PS4) if FXTRACE set; case TCOM: simply call
comexec().
* exec.c(comexec): deleted vp argument; only call newblock() if
needed (ie, !special, !empty); evaluate assignments and put
in environment one at a time; print environment (using PS4) if
FXTRACE set; removed code to turn empty command into :;
removed environment setting code in switch statement.
* exec.c(echo): deleted function.
* lex.c(yylex): only honour CMDWORD if FPOSIX set.
* c_sh.c(shbuiltins): removed = attribute from false/true commands.
* sh.h(E_TCOM): delete define - not used.
* sh.h(null),var.c: use EXTERN for initialization of null.
* sh.h(space,newline,slash): new variables (" ", "\n", "/")
use these everwhere instead of "", " ", "\n", "/".
* path.c: include sh.h.
* exec.c(execute): combined TFOR/TSELECT cases.
Fri Sep 16 11:32:01 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* lex.h(CMDWORD): new define to prevent continued alias expansion in
non-command contexts.
* lex.c(yylex): only set ALIAS if SF_ALIAS and CMDWORD are set.
* syn.c(get_command): case LWORD/REDIR: pass CMDWORD if argc is 0.
* exec.c(comexec): if there is no command, do assignments and set
the return value to subst_exstat (used to fake a : command).
* sh.h(subst_exstat): new variable.
* exec.c(execute): case TCOM: clear subst_exstat before doing eval()s.
* eval.c(expand): set subst_exstat to return value of waitlast().
* c_sh.c(c_set): if !FPOSIX, return subst_exstat instead of 0.
* exec.c(execute): removed redundant "exstat = rv;" near if FERREXIT.
* exec.c(comexec): case CFUNC: for normal function completion, set
i to 0 and rv to return value of execute() (was i=LRETURN,exstat=..).
* main.c(include): return -1 if file could not be found/opened,
otherwise, the exit status of the last command is returned;
changed all calls.
* c_sh.c(c_dot): print error if include() returns < 0.
* var.c(setspec): ifdef EDIT'd V_VISUAL, V_EDITOR cases.
* misc.c(parse_args): no longer accept set -o alternations as
a substitute for set -o braceexpand.
* jobs.c(j_exit): when restoring tty process group, also restore
our process group.
* config.h.bot: define JOB_SIGS iff we have modern signal and wait
routines.
* jobs.c: use ifdef JOB_SIGS instead of ifdef JOBS when setting
signal masks and routines or using waitpid; define TTY_PGRP and
NEED_PGRP_SYNC separately from JOBS.
* jobs.c(j_kill): only send SIGCONT if job is stopped.
* jobs.c(j_jobs): remove exited/signaled jobs even if !FMONITOR,
un-ifdef JOBS same.
* jobs.c(check_job): ifdef FNOTIFY with JOBS (noted by
Michael Haardt <u31b3hs@POOL.Informatik.RWTH-Aachen.DE>).
* jobs.c(j_notify,j_waitj): put ifdef JOBS around use of FMONITOR.
* main.c(shell): removed ifdef JOBS from declaration of interactive.
* ksh_limval.h,sh.h: moved include of <limits.h> from ksh_limval.h
to sh.h since some machines define CLK_TCK there.
Thu Sep 15 09:58:14 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* vi.c(vi_cmd): took out ESC as file completion char in command mode
(too annoying).
* jobs.c(exchild): if starting a job in the background and FBGNICE
is set, call nice().
* Makefile.in: changed maxext to manext (fix from Thomas Gellekum
<thomas@ghpc8.ihf.rwth-aachen.de>); in the install target, check
if the path of the installed shell is in /etc/shells and
complain if it isn't; added depend target, removed old $(OBJS)
and trap.o dependencies.
Wed Sep 14 09:39:55 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* misc.c(options[]): changed position of vi-tabcomplete option.
* lex.c(yylex): ifdef use of FVI/FEMACS/FGMACES with VI/EMACS
(fix from Gordan Larson <hoh@approve.se>).
* ksh.1(DESCRIPTION): added missing P in \fP
(fix from Gordan Larson <hoh@approve.se>).
Tue Sep 13 11:01:47 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-5.0.6 distribution
Mon Sep 12 11:39:07 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* exec.c(scriptexec): changed so it will compile if SHARPBANG is
defined; fixed error message; shell argument is everything up to
a newline; don't listen to #! line unless it ends in a newline.
* syn.c(get_command): case FOR: changed VARASN to ARRAYVAR.
* jobs.c(waitfor): restore signal mask before returning if named job
isn't own own; when waiting for unspecified jobs, only consider
running jobs; don't pass JW_STOPPEDWAIT flag to j_wait.
* table.h(V_TMPDIR,tmpdir): new define/variable.
* var.c(setspec, unsetspec): added case for V_TMPDIR.
* io.c(maketemp): use tmpdir variable if it is set, else use /tmp.
* var.c(popblock): if poping a variable that wasn't set in the old
environment, call unsetspec().
Fri Sep 9 10:37:18 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* sh.h(PATHMAX): increased value from 256 to 1024.
* main.c(main): moved initialization of name to start of main;
if getcwd() fails, use name in error message and call shf_flush().
* io.c(maketemp): check/use TMPDIR variable instead of /tmp; allocate
temp structure and path in one chunk.
* c_ksh.c(c_cd): when checking for no home directory, compare
against null, not (char *) 0.
Thu Sep 8 10:52:59 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* lex.c(yylex): case SHIST: flush shl_out after printing command.
* jobs.c(check_job): when notifing, do not remove job if it is stopped.
Wed Sep 7 10:55:35 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-5.0.5 distribution
* main.c(shell): commented out shf_flush(shl_out) - shouldn't be
needed since -v flushes itself.
Tue Sep 6 09:30:57 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* sh.h(LSHELL,really_exit): new define/variable.
* c_sh.c(c_exitreturn): if how is LEXIT, check if there are stopped
jobs and, if so, unwind with LSHELL (also check/set really_exit).
* main.c(shell): added case for LSHELL - stop unwinding if shell
is interactive; changed local reallyquit to global really_exit.
* main.c(include),exec.c(comexec): added case for LSHELL.
* c_sh.c(c_exitreturn): quitenv() for LRETURN as well as LEXIT.
* sh.h(TF_CHANGED): new define.
* trap.c(runtrap): default EXIT/ERR trap during execution and restore
original if TF_CHANGED not set.
* trap.c(settrap): set TF_CHANGED when setting trap.
* jobs.c(j_stopped): check that job created by current process; print
"You have stopped jobs" message.
* main.c(shell): don't print you have stopped jobs message.
* main.c(initcoms): removed echo alias.
* c_ksh.c(kshbuiltins): added echo as a builtin.
* c_ksh.c(c_print): if wp[0] is echo, act like strict sysv echo;
added \a (BEL) escape sequence.
* syn.c(function_body): new function; calls get_command() to get
the body of a function (old code did nested { } block which
caused problems with how redirections after the block were
handled).
* syn.c(get_command): call function body to deal with foo() and
function foo.
* jobs.c(restore_ttypgrp): new variable.
* jobs.c(j_change): set restore_ttypgrp if process group is set.
* jobs.c(j_exit): if necessary, restore tty process group for main
shell.
Fri Sep 2 21:32:03 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* main.c(main): set FPRIVILEGED if uid (gid) doesn't match euid (egid);
don't include $HOME/.profile if FPRIVILEGED; include
/etc/suid_profile instead of $ENV if FPRIVILEGED.
* misc.c(change_flag): if clearing FPRIVILEGED flag, set euid (egid)
to uid (gid).
Fri Sep 2 21:10:23 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* main.c(main): don't include $ENV if uid (gid) doesn't match
euid (egid) (from J.T.Conklin).
Fri Sep 2 12:07:14 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* syn.c(get_command): removed MPAREN case, taken care of in '(' case,
as per POSIX.2 which says () is two operators, not one.
* lex.c(yylex): don't check for/return MPAREN.
* lex.h(MPAREN): deleted define.
* configure.in: add test for library routine confstr(); add
header test for paths.h.
* sh.h: include paths.h if available; define DEFAULT__PATH.
* table.h(def_path): new variable.
* options.h(DEFAULT_PATH): new define.
* main.c(main): initialize value of def_path; set path to def_path;
remove PATH initalization from initsubs; do not set value of HOME
variable (POSIX); allow SHELL, PS1, PS2, PS3 to have empty values
(at&t ksh).
* var.c(unsetspec): when unsetting PATH, set path to def_path.
* jobs.c(j_waitj): restore proc mask before calling error if
1st tcsetpgrp() fails.
Thu Sep 1 10:28:03 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* Makefile.in: added check-sig.c, check-fd.c and check-pgrp.c
to RCSFILES; added rules for compiling the above; added debugtools
target to compile them all.
* c_test.c(arg0,t_error,T_ERR_EXIT): new variables/defines.
* c_test.c(c_test): set arg0 to wp[0], t_error to 0; after
calling eval_binop() or oexpr() check t_error and if set,
return T_ERR_EXIT.
* c_test.c(syntax): set t_error exit; use shellf() instead of
errorf(); use arg0 instead of "test"; delete GCC_FA_NORETURN
attribute; changed all calls to return after calling.
* c_test.c(oexpr,aexpr,primary): check terror after calling
oexpr(), aexpr(), nexpr().
* c_test.c(primary): if unary operator is -t and there is no
argument, don't increment t_wp; if missing closing parenthesis,
show next operand (if any) in error message.
* c_test.c(eval_unop): default case, print t_wp[-2] (was -1).
* c_test.c(c_test): set t_wp before calling eval_binop() incase
there is an erorr.
* c_test.c(syntax): print first message even if op is an empty string.
Wed Aug 31 11:48:51 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* expr.c(O_LT, O_GT): reverse order of enums to match opinfo table.
* c_test.c(nexpr): always call !nexpr() (never !primary()).
* c_test.c(c_test): switch on argc-1 to make code match POSIX
description; make 4 arg case fall into 3 arg case, and 3 arg case
fall into 2 arg case.
* c_test.c(is_not,is_and,is_or): new defines.
* c_test.c(c_test,oexpr,aexpr,nexpr): use is_not,is_and and is_or.
* c_test.c(primary): don't decrement t_wp in final string case.
* c_test.c(eval_unop): change S_ISIFO to S_ISFIFO and S_ISFITO
to S_ISFIFO.
* misc.c(parse_args): use OF_SET when initializing set_opts.
Wed Aug 31 09:32:39 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* made pdksh-5.0.4 distribution
* jobs.c(j_change): do not restore tty process group when turning
off job control; no need to save original tty process group;
deleted orig_ttypgrp variable. (fixes bug in which turning off
job control causes an interactive shell to exit)
Tue Aug 30 14:43:48 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* aclocal.m4(KSH_OPENDIR_CHECK): always include sys/types.h;
set return value according to what failed.
Tue Aug 30 11:17:09 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* missing.c(strerror): for systems without sys_errlist[], report
error number if unknown.
* Makefile.in: added BUG-REPORTS to DISTFILES.
* jobs.c(exchild): do tcsetpgrp() in both parent and child after
the first process is created (may need to change to every child).
* aclocal.m4(KSH_PGRP_SYNC): new test - defines NEED_PGRP_SYNC.
* acconfig.h: added define for NEED_PGRP_SYNC.
* configure.in: use KSH_PGRP_SYNC test.
* jobs.c(exchild,j_startjob,j_sync_open,j_sync_pipe): if NEED_PGRP_SYNC
is defined, use a pipe to block the first process in a pipeline
until the whole pipeline is set up.
Mon Aug 29 09:15:00 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* jobs.c(exchild): for background, unmonitored jobs, don't open
/dev/null if input is a pipe.
* jobs.c(exchild): for background, unmonitored jobs, use setsig()
instead of setexecsig() to set up SIGQUIT and SIGINT; changed
restoration of SIGTSTP,SIGTTIN,SIGTTOU - set them to DFL if
monitoring and not a `..` command, otherwise leave them alone.
* jobs.c(j_init): only use SIGTSTP,SIGTTIN,SIGTTOU if talking
or monitoring - if just talking leave signals ignored.
* jobs.c(j_change): if going into job control, set TF_SHELL_USES
flag for sigtraps[SIGTSTP,SIGTTIN,SIGTTOU]; if leaving job control
ignore signals if interactive, else restore original signals.
* table.h(SPEC_BI, REG_BI): new defines.
* exec.c(builtin): check for * or + in front of builtin names and set
SPEC_BI or REG_BI if found.
* exec.c(findcom): search for special builtins first, then functions,
then regular builtins, then PATH search.
* c_sh.c(shbuiltins[]),c_ksh(kshbuiltins[]): add */+ in front of POSIX
special/regular builtins; add = infront of unset;
remove = from alias.
* c_sh.c(c_label): set exit value according to name (for true/false).
* c_sh.c(shbuiltins[]): add entries for true and false.
* main.c(initcoms[]): deleted true/false aliases.
* aclocal.m4(KSH_OPENDIR_CHECK): new test - see if opendir() will
open non-directories.
* configure.in,acconfig.h: added KSH_OPENDIR_CHECK.
* missing.c,ksh_dir.h(ksh_opendir): new define/function.
* eval.c(globit),emacs.c(compl_file): use ksh_opendir() instead of
opendir().
* main.c(include): save source filename since search() uses line[]
for the filename and shell() trashes line[].
* table.h(FINUSE,FDELETE) new defines.
* exec.c(execute): case CFUNC: re-arranged code so normal return goes
through setjmp() switch; use FDELETE/FINUSE flags to avoid problems
with a function being undefined or redefined during its execution.
* exec.c(define): if FINUSE is set, set FDELETED and find a new table
entry.
Fri Aug 26 21:58:25 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* lex.c(getsc_): flush output after write when echoing.
* Makefile.in(dist): after creating distrubution, use pathchk -p
to check file names.
Fri Aug 26 10:28:20 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* made pdksh-5.0.3 distribution
* expr.c(IS_ASSIGNOP): new define.
* expr.c(evalexpr): use IS_ASSIGNOP (bug fix).
* exec.c(execute): case TFOR,TSELECT: change e->type just
before setjmp() to avoid problems with bad jmpbufs.
* jobs.c(startlast): new function.
* jobs.c(waitlast): print error if job not started.
* eval.c(comsub): call startlast() after execute().
* jobs.c(exchild,j_startjob,j_sync_pipe): when starting a pipeline
use a pipe to ensure the first process doesn't die before
the last process is started.
* exec.c(execute): case TFUNC: set/clear FXTRACE according to
tp->flag & TRACE, and restore old value when function completes.
* c_test.c,exec.c,io.c,mail.c,vi.c: changed all uses of
(x&S_IFMT) == S_IF* to the equivilent S_IS* (for ISC unix).
* c_test.c(eval_unop): if system doesn't have symlinks or sockets
(S_ISLNK,S_ISSOCK), return 0 (used to cause internal error).
* ksh_stat.h(S_ISVTX): define if sys/stat.h doesn't.
* sigaction.c(Signal,signal): ifdef'd Signal() and signal() out as
they cause header file conflicts on some systems (eg, signal()
in ISC unix); also ifdef'd out other routines not used by ksh
(ie, sigdelset, sigfillset, sigismember, sigpending).
Thu Aug 25 11:50:03 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* c_test.c(primary): always check that *t_wp isn't 0 before using it.
* eval.c(homedir): cache home directory values.
* exec.c(findcom): search builtins before tracked aliases.
* table.h(commands,taliases): changed name of commands to taliases.
* c_ksh.c(c_unalias): changed to use ksh_getopt(); added -t and -a
options; exit with non-zero value if non-alias name unaliased
(POSIX).
* main.c(initcoms[]): alias hash to 'alias -t -'; added autoload alias
as well; set selected comands to be tracked aliases (eg, grep,
ls, who, vi, emacs, etc.).
* c_ksh.c(c_alias): when printing aliases, check ISSET, not DEFINED
flag (so unset tracked aliases won't cause problems); changed
to use ksh_getopt(); added -t flag; added -x flag (does nothing).
* c_ksh.c(c_hash): deleted function; removed all references.
* table.h(CTALIAS): new define.
* exec.c(findcom): added search argument for whence -p; fixed
introduced bug preventing tracking of commands when insert set;
changed all calls; when creating tracked aliases, set type to CTALIAS
(was CEXEC).
* exec.c(findcom,flushcom): when freeing old tracked aliases, use
APERM, not commands.areap.
* c_ksh.c(c_whence): changed to use ksh_getopt(); assume findcom()
never returns 0 and never returns tp->type == CNONE; made output
closer to at&t ksh output; combined vflag/!vflag switch statements;
added case for CTALIAS.
* exec.c(findcom): set tracked alias type to CTALIAS.
* c_ksh.c(c_print): added -s option; changed to use Xstring() routines
and write() instead of shf routines; returns non-zero if there
was a write error.
* jobs.c(struct job): changed pid_t lpid field to Proc *last_proc;
changed all uses.
* jobs.c(check_job): use j->last_proc instead of lp.
* jobs.c(j_waitj): when checking for fake ^C, test j->last_proc
status to see if it was signaled and use WTERMSIG to get signal.
* main.c: initialize integer TMOUT parameter to 0; call alarm_init()
if FTALKING.
* trap.c(alarm_init,alarm_catcher): new functions.
* trap.c(runtraps): if ksh_tmout_leave is set, exit.
* sh.h(TMOUT_EXECUTING,TMOUT_READING,TMOUT_LEAVING,ksh_tmout,
ksh_tmout_state): new enum values/variables.
* table.h(V_TMOUT): new define.
* var.c(special,setspec,unsetspec): added V_TMOUT entry.
* edit.c(x_getc): call intrcheck() if read interrupted.
Thu Aug 25 09:36:54 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* c_test.c(c_test): for argc cases 4 and 5, return the complement
of the expressioin result; for [[ .. ]] expressions, don't parse
based on argc; deleted struct t_op.op_flags field and related
defines UNOP,BINOP,ACCEPT_BE,ISTEST,ISDBRACKET,ISBOTH - changed all
uses to test the value of isdbracket.
* c_test.c(filstat): moved body of filstat() into eval_unop(), deleted
filstat().
* c_test.c: incorperated changes from J.T. Conlin (jtc@cygnus.com)
for POSIXization of test builtin.
Wed Aug 24 12:16:25 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* new-version.sh: new file - updates date in version.c
* Makefile.in: added new-version.sh to RCSFILES; call new-version.sh
in dist: target.
Tue Aug 23 09:28:10 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* made pdksh-5.0.2 distribution
* jobs.c(exchild): don't call restoresigs().
* exec.c(execute): do call restoresigs() (just before execve()).
* c_sh.c(c_trap): ifdef'd out code to print default traps. Too ugly
and it isn't clear POSIX needs it.
* c_ksh.c(c_print): put -e option back in for echo emulation (-R).
* c_sh.c(c_shift): generate error if n < 0.
* c_sh.c(c_trap): use shellf instead of errorf to report errors
(so we can return a value instead of unwinding - POSIX).
* exec.c(execute): if command fails and !FERREXIT, call
trapsig(SIGERR_).
* c_sh.c(c_exit,c_return,c_exitreturn): combined c_exit and c_return
functions.
Mon Aug 22 09:39:54 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* eval.c(expand): case XARG: set word to IFS_WORD to force null
words to be created.
* lex.c(yylex): added indquotes flag and code for `...` parsing
(to deal with "`...`" the way sh/at&t-ksh does).
* trap.c(runtrap): don't reset ERR trap.
* sh.h: combnied SS_USER/SS_FORCE flags with RESTORE_CURR et. al.
flags; changed RESTORE_* to SS_RESTORE_*.
* trap.c(setsig): combined restore, force and user flags; changed
all calls.
* trap.c(setexecsig): use SS_RESTORE_* values as argument.
* table.h: changed LCASE to LCASEV (and UCASE_AL to UCASEV_AL) to
avoid problems with ioctl/tty LCASE define.
* sh.h(struct env): deleted interactive field.
* main.c(shell),exec.c(iopsetup): deleted e->interactive assignment.
* sh.h: made e a struct env * (was struct env); changed all references.
* main.c(newenv): copy loc, flags and interactive fields explicitly.
* var.c(newblock): allocate block structure, don't assume already
exists.
* var.c(popblock): free old block structure.
* main.c(main): set e->loc to 0 before calling newblock().
* exec.c(comexec): let newblock() allocate new structure; deleted
l variable (changed references to e->loc).
* table.h: deleted globals variable.
* c_ksh.c(c_print): treat a lone - like --.
* main.c(main),trap.c(inittraps): move SIGINT,SIGQUIT,SIGTERM signal
initialization to inittraps() and do it regardless of FTALKING.
* trap.c(settrap): deleted force trap since probably will never
add -f flag to trap.
* main.c(unwind): if we are dieing of SIGINT or SIGTERM, kill
ourselves with a signal.
* vi.c(x_vi),emacs(x_emacs): if ^C read, call trapsig()/runtraps();
don't return -2.
* edit.c(x_read): don't check for -2 return value.
* vi.c(x_vi): check for quit char (^\) and fake SIGQUIT.
* exec.c(comexec): made flags argument volatile.
* misc.c(getn_): new function.
* c_sh.c(c_exit,c_return): call quitenv() before unwind()ing;
moved c_exit() next to c_return(); use getn_() instead of getn().
* main.c(shell): added exit_atend argument to deal with POSIX trap exit
semantics; changed all calls.
* sh.h: added STOP_RETURN macro.
* c_sh.c(c_return): determine if we are returning or exiting before
unwind()ing so POSIX trap exit semantics are honored.
* jobs.c(j_sigchld): call trapsig() instead of messing with sigtraps[].
* trap.c(trapsig): don't restore signal handler if it wasn't set to
trapsig.
* sh.h: added TF_TTY_INTR flag.
* trap.c(inittrap): set TF_TTY_INTR for SIGINT.
* jobs.c(j_waitj): if
* jobs.c,sh.h: deleted SA_RESTART ifdefs; moved SIGCLD->SIGCHLD ifdefs
from jobs.c to sh.h.
Sat Aug 20 15:26:24 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* sh.h: added KSH_SA_FLAGS define.
* trap.c(inittrap,setsig): set sa_flags field to KSH_SA_FLAGS.
* sigact.c(sigaction): if using BSD42_SIGNALS, set the SV_INTERRUPT
flag.
* configure.in: deleted AC_RESTARTABLE_SYSCALLS.
* config.h.bot: add error message to prevent compilation if using
BSD41 signals.
* shf.h: added SHF_INTERRUPT flag.
* shf.c(shf_fillbuf,shf_putchar,shf_write,shf_emptybuf): call
intrcheck() if read()/write() interrupted and SHF_INTERRUPT set.
* c_sh.c(c_read): use SHF_INTERRUPT flag.
* lex.c(getsc_): call intrcheck() if read() interrupted.
* main.c(main),trap.c(inittrap): moved Sigact* initialization
from main() to inittrap(); made Sigact_trap/Sigact_ign static;
deleted Sigact and Sigact_dfl.
* sh.h: deleted declarations of Sigact*.
* main.c(shell): deleted sigaction call - no longer needed.
* sh.h: added RESTORE_CURR, RESTORE_ORIG, RESTORE_DFL and RESTORE_IGN
defines.
* trap.c(intrcheck): new function.
* trap.c(runtraps): added intr argument; clear trap/intrsig
before running traps; changed all calls.
* trap.c(runtrap): save/restore exstat when running trap.
* jobs.c(j_waitj): changed interrupt test to check intrsig
and return -1.
* jobs.c(waitfor): if j_waitj() returns -1, call intrcheck().
* jobs.c(j_change): use setsig() instead of sigaction() to
set up SIGTTIN,SIGTTOU,SIGTSTP.
* trap.c(inittraps): initialize flags for INT/QUIT/TERM.
* sh.h(intrsig): new variable.
* trap.c(trapsig): set intrsig if signal has TF_DFL_INTR flag set;
deleted longjmp().
* trap.c(runtraps): clear intrsig.
* trap.c(runtrap): if signal is defaulted and TF_DFL_INTR is
set, set exstat and call unwind(); return if signal ignored;
reset an ERR trap before executing it.
* trap.c(cleartraps): deleted special case for EXIT; reset
command traps using settrap(); clear intrsig.
* trap.c(restoresigs): only deal with traps that have the TF_EXEC_IGN
flag set (others take care of themselves).
* trap.c(sigtraps[]): added ERR trap.
* trap.c(gettrap): deleted #if 0'd ERR/EXIT check.
* trap.c(gettrap,runtrap,cleartraps,restoresigs): use SIGNAL+1 to
go through trap table.
* sh.h(SIGEXIT_,SIGERR_): new defines.
* c_kill.c(c_kill): test for signals > 128 (was >= 128)
* c_sh.c(c_trap): when printing traps, use SIGNALS+1.
* sh.h(struct trap): replaced ourtrap and sig_dfl fields with
flags field; defined TF_SHELL_USES, etc. for flags field; added
cursig field.
* sh.h(struct env): replaced func_parse field with
flags field; defined EF_FUNC_PARSE, EF_BRKCONT_PASS for flags
field; defined STOP_BRKCONT(); changed uses of func_parse
(get_command()/readhere()).
* c_sh.c(c_brkcont): use STOP_BRKCONT(), EF_BRKCONT_PASS; call
unwind() to do the work.
Fri Aug 19 09:59:43 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* trap.c(settrap): new function - does most of what c_trap did.
* c_sh.c(c_trap): changed to use settrap(); print out default
actions as well as caught/ignored actions.
* trap.c,c_sh.c(setsig): moved setsig from c_sh.c to trap.c and
made it static; added force and user arguments; don't do anything
for EXIT and ERR.
* main.c(main): use sigtrap() instead of ignoresig().
* trap.c(ignoresig): deleted function.
* exec.c(execute): case TSELECT: don't change SIGINT signal handler.
* proto.h: use GCC_FA_NORETURN on aerror().
* syn.c(yyparse): made function static and void.
* exec.c(herein): changed error() calls to errorf()s; use error()
in error handler; call shf_close() instead of shf_fdclose().
* tree.h,sh.h: moved LBREAK/LCONTIN from tree.h to sh.h;
added LEXIT, LRETURN, LERROR, and LINTR defines; changed values
of LBREAK/LCONTIN; changed all calls to longjmp() and setjmp().
* exec.c(execute): put Break: label after main switch, changed
goto Break[0-9] to Break; deleted Break[0-9] labels.
* exec.c(execute): changed FOR, SELECT, WHILE, DO loop setjmps
to explicitly check for LBREAK/LCONTIN, otherwise call unwind().
* exec.c(execute): case TFUNC: added setjmp switch statement to take
care of various L* values.
* main.c(include,shell): added setjmp switch statement to take care of
various L* values.
* main.c(unwind): added L* parameter to pass on to longjmp();
changed all calls.
* c_sh.c(c_return): just call unwind(LRETURN);
* main.c(unwind): put code from leave() in E_NONE case.
* main.c(error,leave): deleted functions; replace all calls with
unwind(LLEAVE or LERROR).
* *.c(longjmp): replaced all calls with unwind(L..) (except the
call in unwind()).
* shf.h: add areap field to struct shf.
* shf.c(shf_fdopen,shf_sopen): initialize areap
* shf.c(shf_emptybuf,shf_close,shf_sclose,shf_finish): use areap
instead of ATEMP.
* shf.c(shf_sopen): if buf is 0 and writing and DYNMAIC, allocate
a buffer; if writing, save room for a trailing null.
* shf.c(shf_sclose): new function.
* shf.c(shf_snprintf),tree.c(snptreef): use shf_sclose().
* tree.c(snptreef): changed return type to char *; if buffer
is null, pass SHF_DYNAMIC to shf_sopen(); return (possibly
allocated) string.
* syn.c(syntaxerr): use snptreef() instead of ident.
* tree.h: new define TDBRACKET; new defines DB_NORM,DB_OR,DB_AND,
DB_BE,DB_PAT.
* tree.c(ptree): added case for TDBRACKET.
* syn.c(get_command): case DBRACKET: make TDBRACKET command;
at end of function, null terminate args/vars if TDBRACKET.
* c_test.c(is_db_patop): new function.
* syn.c(db_primary): set type of arg to DB_PAT if is_db_patop()
returns true.
* exec.c(execute): added case for TDBRACKET.
* syn.c(get_command): case MDPAREN: make arg[0] an allocated stuffed
string (was a literal string).
Thu Aug 18 11:06:49 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* c_test.c(is_op,is_binop,is_unop): new functions to test for
unary/binary operators.
* c_test.c(oexpr,aexpr,nexpr,primary): no longer take argument -
call is_unop/is_binop directly.
* c_test.c(ISDBRACKET,ISTEST,ISBOTH,ACCEPT_BE): new defines.
* c_test.c(struct t_op): changed op_type field to op_flags.
* c_test.c(ops[]): broke into two arrays: u_ops and b_ops;
set flag field to ISDBRACKET/ISTEST/ISBOTH as appropriate.
* c_test.c(t_lex): deleted function.
* c_test.c(primary): before checking for unary operator, check
for -BE (binary expression next) if appropriate.
* c_test.c: made operator type an enum to make it easier to add
operators; changed oexpr/aexpr/nexpr/primary/filstat/t_lex
operand/return types.
* c_test.c(struct t_op): changed op_text from char * to char [4].
* c_test.c(primary): case FILTT: using digit(**t_wp) causes core dump
when there is no arg - just test if *t_wp is 0; move test into
filstat().
* c_test.c(primary): use *opnd1 != 0 instead of strlen(opnd1) (3
instances).
* tree.c(wdscan,wdcopy): changed string argument to const; changed
return type of wdscan to const.
* eval.c(expand): case CSUBST: case '?': use st->var->anme instead
of cp to allow proper nesting.
* eval.c(expand): case OSUBST: don't change cp - declare local
variable.
* eval.c(expand): case COMSUB: deleted Xsavepos() call; XCOM: deleted
Xrestpos() call.
* eval.c(expand): save the position of the first unquoted = for tilde
expansion.
* eval.c(expand): case '~': use sp == (cp+2) instead of dp == Xstring
so we aren't fooled by ''~ or ${foo}~; sp[-1]/sp[-2] and firsteq
for the DOASNTILDE after first = or unquoted : test.
* tree.h(struct op): changed noexpand field to evalflags; changed
all uses.
* exec.c(execute): if t->evalflags is non-zero, pass them to eval().
* lex.h: added DBRACKET define for [[ keyword.
* syn.c(get_command): added case for DBRACKET.
* syn.c(db_parse,db_oaexpr,db_nexpr,db_primary): new functions
to parse [[ .. ]] expressions.
* syn.c(tokentab[]): added [[/DBRACKET keyword.
* c_test.c(is_db_unop,is_db_binop): new functions to test if arg
is [[ .. ]] unary/binary operator.
* syn.c(syntaxerr): call REJECT; before token; removed REJECT
before all calls to syntaxerr().
* syn.c(get_command): removed syntax error kludge.
Wed Aug 17 11:07:40 NDT 1994 Michael Rendell (michael@arlene.cs.mun.ca)
* c_test.c(struct ops): changed -U to -O.
* tree.h: added new defined DOASNTILDE.
* eval.c(expand): case '~': changed !(f&DOBLANK) to f&DOASNTILDE.
* exec.c(execute): case TCOM: pass DOASNTILDE when evaluating vars
and when expanding args when t->noexpand is set.
* exec.c(execute): case TCASE: pass DOTILDE to both evalstr() calls
(POSIX).
* syn.c(get_command): don't check for redirections before determining
command type; handle REDIR where LWORD are handled; default case
always returns; pass ARRAYVAR flag to tpeek() if t->noexpand;
don't allow redirections before "x()" function; don't allow
redirection before keywords; allow a '(' in the case LWORD/REDIR:
if no variables or arguments (POSIX doesn't allow this, but
at&t ksh/bourne sh do).
* lex.h(ARRAYVAR): new define.
* lex.c(yylex): parse x[1 & 2] as one word if VARASN|ARRAYVAR.
* var.c(is_wdvarname): added aok argument; changed all calls.
* syn.c(get_command): case FOR/SELECT: check identifier is valid.
* c_sh.c(c_trap): use print_value_quoted() to print traps;
use ksh_getopt() to skip possible --.
* trap.c(gettrap): allow digits only if signal numbers match
POSIX values (ie, HUP=1,INT=2,QUIT=3,ABRT=6,KILL=9,ALRM=14,TERM=15).
* misc.c(print_value_quoted): new function to print strings with
appropriate quoting.
* c_ksh.c(c_typeset,c_alias): use print_value_quoted() when printing
values.
* lex.h: added new ESACONLY flag - only accept ESAC keyword.
* lex.c(yylex): check for ESACONLY flag when doing keyword search.
* syn.c(caselist): pass ESACONLY flag to tpeek().
Tue Aug 16 10:17:47 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* lex.h(struct source); changed echo field to generic flags field;
defined SF_ECHO and SF_ALIASEND.
* lex.c(_getsc): case SALIAS: use isspace() to check for trailing
space in alias; if alias does not end in a space, return a fake
space to keep the current alias in the source list - this allows
recursive alias detection; set SF_ALIAS in next source if alias
does end if space.
* lex.c(yylex): deleted expanding_alias, rec_alias_cnt and
rec_alias_table variables; check for recursive aliases by checking
the source list; don't use EXPALIAS flag; if SF_ALIAS is set in
current source, set ALIAS flag and clear SF_ALAIS; deleted global
alias variable.
* table.h: deleted EXPALIAS define.
* main.c(shell): changed s->echo to set/clr of SF_ECHO in s->flags.
* table.h: added aliases and keywords tables; deleted lexicals table
(POSIX says they are separate).
* syn.c(keywords,initkeywords): changed name of keywords() function
to initkeywords(); changed all calls; add to keywords table instead
of lexicals table.
* main.c(main): initialized aliases/keywords tables; deleted
initialization of lexicals table.
* c_ksh.c(c_whence,c_alias,c_unalias),lex.c(yylex): use
keywords/aliases tables instead of lexicals table; removed unneeded
type == CALIAS checks.
* var.c(getint): new function, largely take from strint().
* var.c(strint): call getint() to do most of the work; if vq
was an allocated string, free the string and clear the alloc
flag.
* var.c(intval): call getint() instead of strint().
* mail.c(mcheck): use getint() instead of strint() when getting
value of MAILCHECK.
* var.c(skip_varname): added argument to allow array references;
changed all calls.
* var.c(set_array): remove valid variable name check - done in
parse_args().
* var.c(strint): check if getspec()/setspec() need to be called.
* var.c(intval): remove getspec()/INTEGER checks - let strint() do it.
* var.c(skip_wdvarname,is_wdvarname,is_wdvarassign): new
functions.
* lex.h(VARASN): new define indicating variable assignment expected,
currently used to parse "x[1 & 2]" as one token - may be used
in future in returning AWORD (assignment word) to the parser.
* lex.c(yylex): Subst: case '[': use is_wdvarname() in determining
whether to parse an array dereference; do not require an = after the
dereference (typeset -r x[1 & 2] is legal).
* syn.c(many functions): pass VARASN to token/musthave/tpeek/synio
when ever the next token might be the first word of a simple
command.
* syn.c(get_command): case LWORD: use is_wdvarassign() to distinguish
variable assignments from normal arguments; allow aliases after
redirections and variable assignments; generate syntax error
for "foo=bar bogusfunction()"; allow array variables in for
and select statements.
* lex.c: make global alias variable static (no longer used by
get_command()).
* syn.c(get_command): put MDPAREN into its own case.
* lex.c(yylex): deleted place holder for tilde expansion.
* tree.h(struct tree): added noexpand field for
alias/export/readonly/typeset.
* syn.c(newtp),tree.c(tcopy): initialize/copy noexpand field.
* syn.c(get_command): case LWORD: set noexpand if assign_command()
returns true.
* syn.c(assign_command): new function - returns true if command
is alias, export, readonly or typeset.
* exec.c(execute): case TCOM: don't pass DOTILDE flag when
expanding t->vars; don't do field splitting/globbing/tilde expansion
of t->args if t->noexpand is set.
* table.h: re-grouped the struct tbl flags into common, variable,
funtion, builtin/alias, etc (some values overlap); new flag
names: KEEPASN (was overloaded with TRACE) and NOEXPAND.
* exec.c(comexec,builtin): changed TRACE to KEEPASN.
* tree.c(tcopy): when copying t->str, use strsave(), not wdcopy()
if not copying a TCASE.
* c_ksh.c(c_typeset): added -p flag for POSIX export/readonly.
* eval.c(expand): expand tilde in place; don't do tilde expansion
on results of substitution (POSIX); only do tilde expansion
if login name is unquoted (POSIX); don't check for fdo&DOTILDE
when a word is completed.
* eval.c(tilde): changed to return home directory of a given login name
(taking care of null/+/-) (old version copied string, scanning
for, and replacing, magic tildes).
* exec.c(findcom): don't create commands table entries when
not inserting; when doing access test of tracked alias,
check for ISSET, not ALLOC (but test ALLOC before calling afree).
* exec.c(search): use strcpy() instead of loop.
Mon Aug 15 14:46:58 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* c_ksh.c(c_print): added at&t ksh -R flag; deleted -e flag;
changed to use ksh_getopt().
* main.c(initcoms[]): changed echo alias from 'print -' to 'print -R'.
* sh.h: new variable procpid; added pid field to struct temp.
* jobs.c: changed references to my_pid to procpid; deleted my_pid
variable.
* io.c(maketemp): initialize pid field from procpid.
* main.c(remove_temps): only remove temporary files created by
the current process.
Sun Aug 14 11:47:05 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* var.c: added var field to struct Expand and struct SubType; deleted
struct SubType.name field.
* var.c(expand): case OSUBST: use x.var/st->var field to save result
of global() for use in case CSUBST - this avoids problems with
x[i+=1] being evaluated twice; check to see if value is being
assigned to non-variable (eg, ${*:=aja}) or read-only variable.
* var.c(varsub): set value of xp->var; possibly generate error if
FNOUNSET set when expanding ${#*}, ${#var}, or ${#array[*]}.
* table.h: added struct tbl.areap field to get rid of lastarea
problems; deleted lastarea variable; changted all refernces
to lastarea to var->areap.
* table.c(tenter): initialize areap field.
* var.c(arraysearch): deleted area parameter; initialize areap field.
* var.c(global,local,intval,setint): initialize areap field of vtemp.
Fri Aug 12 10:54:51 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* expr.c: re-wrote e*() functions using single function and table;
token() now does table lookup; added full C expressions (sans
pre/post increment, sizeof).
* table.h(INT_U,INT_L): new flags.
* var.c(strval): handle INT_U.
* c_ksh.c(c_typeset): add exclusions for INT_U/INT_L;
add -U option for unsigned (non-at&t ksh).
* var.c(set_array): use global() instead of local();
* var.c(global): when parsing $123, don't limit number to 1000.
* expr.c(v_evaluate): like old evaluate, but assigns result to
specified variable.
* expr.c(evaluate): changed to use v_evaluate().
* expr.c(e0): when parsing literals, use strint() instead of setstr().
* var.c(setstr): when assigning to integers, use v_evaluate() instead
of strint().
Thu Aug 11 11:33:17 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* var.c(strint): don't change anything until number completely
parsed; don't clear ISSET flag if parsing fails; fail parse
if non-integer/non-letter found; default base if copying from
integer variable; set ISSET if parsing succeeds.
* expr.c(tempvar): set vp->val.i to 0.
* expr.c(token): when skipping a literal number, don't allow _;
use isspace() to skip.
* expr.c(asn): use strint()/setstr() instead of setint().
* expr.c(e0): added unary ~ and + (posix).
* var.c(global,local): always call substitute on contents of [..];
free sub when finished eval.
* ksh_limval.h: new file.
* shf.c: use ksh_limval.h.
* Makefile.in: added ksh_limval.h to HDRS.
Wed Aug 10 10:57:01 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* c_ksh.c(c_whence): case CFUNC: print exported/traced/undefined,
do not print function definition.
* exec.c(findcom): new argument indicated if functions to be
autoloaded; changed all calls.
* misc.c(ksh_getopt): added # option modifier for typeset.
* c_ksh.c(c_typeset): changed to use ksh_getopt(); added
-L, -R, -Z, -l, -u flags; quote variable values when printing;
generally re-arranged function.
* table.h: added LJUST,RJUST,ZEROFIL,LCASE,RCASE; deleted FUNCT.
* exec.c(findfunc): new function.
* exec.c(define,findcom): use findfunc(); skeleton autoload code.
* var.c(typeset): added two arguments for initial field width and
base; changed all calls; deal with LJUST,.. flags; re-arrange to
have one loop iterating over array; do readonly check before
changing attributes.
* var.c(strval): deal with LJUST,.. flags when getting integers.
* var.c(setstr): deal with LJUST,.. flags when setting strings.
* var.c(setstr): deal with LJUST,.. flags when setting strings.
* var.c(arraysearch,tenter): initialize {new,p}->field to 0.
* table.h: added struct tbl.field.
* siglist.in: changed signal messages to be more or less the
same as sys_siglist[]; moved SIGUNUSED before SIGBUS.
* jobs.c(j_print): assume sigtrap[].mess always valid; use
sigtrap[].mess directly for stopped processes.
* aclocal.m4(KSH_SYS_SIGLIST): new macro like KSH_SYS_ERRLIST.
* configure.in: use KSH_SYS_SIGLIST instead of AC_SYS_SIGLIST_DECLARED.
Tue Aug 9 10:28:45 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* version.c: removed RCS logs since version numbers don't match
release numbers.
* configure.in: added AC_PROG_CPP
* Makefile.in: added rules for generating siglist.out
* siglist.in,siglist.sh: new files.
* trap.c(inittraps,deftraps[]): deleted deftraps[]; initialize
sigtraps[] directly by including siglist.out.
* tree.h: added EXPRSUB for $((..)), re-numbered defines.
* tree.c(tputS,wdscan): added case for EXPRSUB.
* eval.c(expand,alt_count,alt_scan): added case for EXPRSUB.
* lex.h: added SDDPAREN for $((..)).
* lex.c(yylex): added case for SDDPAREN.
* lex.c(yylex): case SPAREN: match parenthesis using counter instead
of pushing/poping states.
* lex.h: re-numbered S* defines to be sequential; added SREREAD.
* lex.c(yyerror): pop SREREADs.
* lex.c(getsc_): added case for SREREAD.
* lex.c(arraysub): changed to save whatever is read and return a value
indicating if brackets matched; changed all calls.
* lex.c(yylex): if brackets in array reference are not balanced,
or if array reference not followed by an =, re-read the input.
Mon Aug 8 21:20:08 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* sh.h: fix lseek prototype (from sjg@zen.void.oz.au)
* configure.in,jobs.c: added HAVE_SYSCONF; don't use sysconf() unless
HAVE_SYSCONF defined (for NetBSD-Feb12 from sjg@zen.void.oz.au).
* jobs.c(put_job): removed PJ_ON_END case and define (not used).
Wed Jul 27 10:19:42 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-5.0.1 distribution
* exec.c(comexec): when doing exec has no command, fall through
and do variable assignments.
* c_ksh.c(c_let): complain if there are no arguments.
* exec.c(comexec): if XEXEC is set, exit after executing
(builtin/function) command; deleted FERREXIT code; don't set
exstat.
* exec.c(execute): handle FERREXIT; set exstat to rv for all
cases.
* lex.c,syn.c: changed calls to errorf to yyerror (except the
on in yyerror()).
* lex.h(struct source): added errline field.
* lex.c(yyerror): now a varargs function; if source->errline field is
non-zero, print it instead of source->line.
* syn.c(syntaxerr): set source->errline if read EOF in a multiline
command.
Tue Jul 26 11:22:06 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* lex.h(SYNTAXERR,INP): deleted macros.
* lex.h(HISTORY): upped to 128 as per POSIX.
* lex.h,syn.c(multiline): moved from lex.h to syn.c.
* tree.c(vfptreef): added %R to format I/O redirections.
* tree.c(pioact): don't output unit more than once; print unit
only if it isn't the default for the action; print only
one opening quote for quoted here documents; print <> for
read-write (was ><).
* syn.c(zzerr, syntaxerr): replaced zzerr function with new syntaxerr
function; changed uses of SYNTAXERR to syntaxerr() calls; print
out the last unused token; if in a multiline command when EOF
encountered, print token that was unmatched.
* tree.h(TBANG),lex.h(BANG): for POSIX ! keyword
* tree.c(ptree),exec.c(execute): added case for TBANG.
* syn.c(restab[]): added ! keyword.
* syn.c(get_command): added case for BANG (!).
* tree.h(XERROK): new define to allow non-zero exits to be
ignored in certian circumstances (set -e).
* exec.c(execute): pass XERROK to recursive execute() calls; set
XERROK when evaluating conditional part of if/while/until/&&/||.
* exec.c(comexec): pass XERROK on to functions; don't exit if
XERROK is set.
* jobs.c(async_pid): new variable needed since async_job may go
away, but $! should still be expanded.
* jobs.c(j_async): return async_pid.
* jobs.c(j_set_async): set async_pid.
Mon Jul 25 14:15:25 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* misc.c(parse_args): changed to use ksh_getopt().
* c_sh(c_set): deleted call to resetopts() - neither POSIX nor
at&t ksh touch OPTIND when positional parameters are changed.
* exec.c(comexec): changed resetopts() call to getopts_reset(1) - this
is not a proper fix - should declare a local optind.
* misc.c(builtin_getopt,ksh_getopt): renamed builtin_getopt to
ksh_getopt (shorter); changed to use state structure instead
of static variables; changed all calls; optionally allow + to
introduce an option; don't skip lone - (or +) in arguments - set
optind to point to it.
* misc.c(ksh_getopt_reset): changed to use state structure instead
of static variables.
* sh.h(Getopt): new structure for ksh_getopt() state.
* exec.c(call_builtin): call ksh_getopt_reset().
* c_ksh.c(c_getopts,getopts_reset): new getopts implementation that is
POSIX complient and uses ksh_getopt() routine.
* var.c(setspec): call getopts_reset() when OPTIND set.
* getopts.c: deleted file.
* Makefile.in: deleted getopts.c and getopts.o.
* options.h(FASCIST): deleted option.
Thu Jul 21 09:52:03 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-4.9+mun.5 distribution
* syn.c(get_command),shf.c(shf_fdopen,shf_sopen,shf_emptybuf):
added cast to alloc()/aresize() calls.
* sh.h: changed enum flags_enum to enum flags.
* misc.c(change_flag): changed type of first argument to enum flag.
* edit.c(set_editmode): change type of static array to enum flag.
* edit.c(x_init): initialize tty chars to -1, except for werase,
which is set to ^W.
* edit(x_mode): split oldedchars structure declaration and
initalization (some old compilers don't like them combined).
* c_test.c: made -h work like -L.
Wed Jul 20 11:12:52 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* config.h.top: moved compile options into options.h; include
options.h.
* options.h: new file.
* c_ksh.c(c_fgbg): if !FPOSIX, set return job exit status.
* jobs.c(j_jobs,j_notify): use JF_REMOVE to flag jobs to delete
after all notification done (to prevent multiple + or - jobs).
* jobs.c(put_job): new funtion, takes argument to specify where
to put job; changed all calls to put_job_on_front and
put_job_on_end to use this; put background processes just
after stopped jobs (instead of at end) (POSIX).
* jobs.c(put_job_on_front,put_job_on_end): deleted.
Tue Jul 19 10:33:55 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* aclocal.m4(AC_MMAP): copied from autoconf's acspecific.m4 and
modified to use the MAP_FILE flag if available.
* misc.c(change_flag): ifdef use of FVI/FEMACS/FGMACS.
Mon Jul 18 13:19:29 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* sh.h(async): deleted.
* var.c(global): call j_async() instead of using async global.
* jobs.c(j_async,j_set_async()): new functions.
* jobs.c(j_startjob): new function.
* jobs.c(exchild,j_waitlast): call j_startjob() to start job.
* jobs.c(j_sigchld): if any jobs aren't started, note signal
occured and return without calling wait.
* jobs.c(j_resume): allow un-reported dead jobs to be fg'd/bg'd;
if backgrounding, set async job.
* jobs.c(j_jobs,j_notify,j_waitj,check_job,remove_job): re-wrote to
deal with posix `known processes'.
* jobs.c(j_lookup()): if number specified, see if it is a lpid first,
then check for pgrp.
* jobs.c(new_job): added functionality of j_newjob().
* jobs.c(j_newjob): deleted function and all calls.
* tty.c(tty_init,tty_close): new functions which initialize
tty_fd, tty_state and tty_devtty.
* jobs.c(j_init,j_change): use tty_init()/tty_close(); changed
references of ttyfd to tty_fd; moved tty_fd, tty_state and
tty_devtty to tty.h; call tty_init() if !FMONITOR; save/restore
tty modes on foreground job completion if FTALKING (was FMONITOR).
* edit.h(X_chars): new structure for tty driver characters (replaces
ed_erase, ed_kill, ed_werase, ed_intr, ed_quit); moved prototypes
for emacs.c and vi.c from proto.h to edit.h; changed all references
to ed_* to edchars.*.
* edit.c(x_mode): use tty_state instead of cborig; re-initialize
tty state from tty_state whenever entering xmode; save tty characters
in edchars structure.
* edit.c(x_init): now called from main(); initializes edchars, x_cols,
and calls x_init_emacs.
* emacs.c(x_init_emacs): changed erase,kill,werase,intr,quit arguments
to X_chars argument.
Fri Jul 15 10:35:13 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* io.c(restfd): only flush if fd is 2; use dup2() instead of
fcntl(F_DUPFD) (2 system calls instead of 3).
* ksh_wait.h(WEXITSTATUS): changed mask from 0x7f to 0xff.
* tty.h: added TTY_state structure.
* tty.c: new file - contains get_tty() and set_tty().
* edit.c(x_init,x_mode): use get_tty() and set_tty().
* jobs.c(j_waitj,j_resume): save/restore tty modes of stopped
jobs, as per POSIX.1, B.2, job control; for foreground jobs,
save tty state after successful completion, restore tty state
after non-successful completion (signaled, non-0 exit, stopped).
* misc.c(options): changed "alternations" to "braceexpand" (this
is what bash uses - no need to invent new option names); changed
ALTERNATIONS define to BRACEEXPAND, same for FALTERNATIONS to
FBRACEEXPAND.
* jobs.c(check_job): if process died of SIGINT or SIGPIPE, leave
job state as PEXITED (not PSIGNALLED).
* jobs.c(j_print): if printing short notice, ignore SIGPIPE the
way SIGINT is ignored.
* exec.c(comexec): flush shl_out after 'not found' message.
* c_ksh(c_kill): re-wrote function (again) to handle posix
options (-s, --, etc.) and posix -l output.
* configure.in: added strcasecmp function check.
* missing.c(strcasecmp): define strcasecmp function if not available.
* trap.c(gettrap): use strcasecmp when comparing signal names.
* var.c(global): expand $! to nothing if there haven't been any
asynchronous processes started yet.
* misc.c(options): added posix option (set automatically if
POSIXLY_CORRECT env variable is set or if POSIXLY_CORRECT config
define is defined)
* var.c(special,setspec): added POSIXLY_CORRECT.
* config.h.top: added POSIXLY_CORRECT define.
* main.c(main): set FPOSIX if POSIXLY_CORRECT is defined.
* POSIX: new file describing what the posix flag controls.
Thu Jul 14 10:53:15 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* jobs.c,sh.h(killpg): moved killpg define to sh.h.
* jobs.c(exchild): set async variable when starting background
processes.
* jobs.c(j_resume): print [job-num] before command when backgrounding;
print to stdout instead of stderr.
* c_ksh.c(c_fgbg): call builtin_getopt to skip possible --, complain
about unknown options.
* jobs.c(held_sigchld): new global variable.
* jobs.c(j_sigchld): if any jobs aren't started, set held_sigchld and
return.
* jobs.c(exchild,waitlast): after setting JF_START, if held_sigchld
set, call j_sigchld().
* jobs.c(exchild): added/initialized ppid field to struct job; deleted
global is_child.
* jobs.c(waitfor): don't wait for a process that isn't a child of
the current process.
* jobs.c(j_exit): kill stopped jobs owned by current process only.
* jobs.c(check_job): don't do monitor stuff for XXCOM jobs, but do
set up notification.
* jobs.c(j_waitj): added JW_NOTIFY flag to print job notification
messages.
* jobs.c(exchild): remove !XPIPEI condition - we now close pipe so
pipeline doesn't have to call waitlast().
* exec.c(execute): case TPIPE: no need to restore 0 or call waitlast()
since exchild() handles everything.
* jobs.c(remove_job): set last_job to 0 if we are removing it.
* jobs.c(waitlast): check if last_job is 0.
* jobs.c(struct job): combined started, waiting, interactive
field into flags field; added JF_* flags; changed JW_NONOTIFY
to JW_NOTIFY and changed all calls to j_waitj() to reverse
this flag.
* jobs.c(exchild): ignore SIGTSTP, TTIN, TTOU for `command` jobs.
Wed Jul 13 09:28:34 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* main.c(main): when checking if FMONITOR set on command line,
use 127 instead of -1 (signed vs unsigned char problem).
* tree.h: renumbered, XEXEC, XFORK, ... and DOBLANK, DOGLOB, ...
to use bits in order (instead of 0 5 2 4...).
* jobs.c(j_init): don't set sigtrap[SIGCHLD].sig_dfl = 1 as a
forked child may be a shell that needs to trap SIGCHLD.
* tree.h(XPCLOSE,XCCLOSE): flags for close in parent, close in child.
* jobs.c(exchild): added third argument - a file descriptor - if
flags has XPCLOSE, close fd in parent, if flags has XCCLOSE, close
in child.
* exec.c(execute): pass input side of pipe to exchild() so it can
be closed in the child.
Tue Jul 12 10:21:57 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* main.c(main): let ignoresig() handle SIGTERM.
* jobs.c(exchild): let restoresigs handle SIGTERM.
* lex.c(yylex): don't parse array references inside double quotes
(partial fix).
* emacs.c(x_print): use shprintf instead of shellf so the output
of bind can be redirected.
* trap.c(deftraps): added SIGINFO (from jconklin@netcom.com).
Fri Jul 8 09:37:51 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-4.9+mun.4 distribution
* Makefine.in: added $(LDSTATIC) to LDFALGS to make static
linking easier (suggested by sjg); use cp -p when creating
distributions to preserve file dates.
* configure.in: set LDSTATIC in Makefile if present in environ
when configure is run.
* sigact.c(sigsuspend): when calling 4.2bsd sigpause, pass *mask,
not mask.
* main.c(main): fixed up initialization of PWD (free memory, print
more informative message).
* misc.c(getcwd): range check backwards.
* c_sh.c(setsig): set sa_flags/sa_mask.
* edit.c(init_editmode),main.c,proto.h: deleted function - not needed
since VISUAL/EDITOR are special.
* lex.c(set_prompt),table.h: take out PS3.
* c_sh.c(c_umask): handle multiple actions in symbolic mode clauses
(eg, u+r-w); handle X (eg, o+X); ignore s (eg, u+s).
* shf.c(shf_fillbuf): continue reading if we get an EINTR.
* shf.c(shf_emptybuf,shf_write,shf_putchar): continue writing if we
get an EINTR.
Thu Jul 7 10:19:24 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* sigaction,sigprocmask: changed NULL third argument to
(struct sigaction *) 0.
* sh.h(kshpid): changed type from int to pid_t.
* proto.h(do_ulimit): removed do_ulimit() declaration.
* vi.c(complete_word): removed unused variable pos.
* syn.c(pipeline,elsepart): removed unused variable c.
* jobs.c(exchild): deleted variable s (assigned but not used).
* history(hist_init),shf.c(shf_gets): changed variable e to end
because there is a global e.
* exec.c(do_selectargs): removed secondarg argument; changed return
(char *) 1 to (char *) 0; changed all calls.
* io.c(canseek): use fd argument instead of 0.
* lex.c(readhere): don't use fixed sized buffer (line).
* expand.h: changed multi-statement macros to use do {..} while (0);
changed temporary variable vp to vp__ to avoid lint complaints.
* aclocal.m4(KSH_DUP2_CHECK): define F_GETFD/F_SETFD if not
already defined.
* etc/profile, etc/ksh.kshrc: replaced with new versions from
Simon J. Gerraty (sjg@zen.void.oz.au).
Wed Jul 6 10:09:55 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* jobs.c(killpg),configure.in: restored use of killpg() - some
systems don't understand kill(-pgrp, signal) (ultrix 2.2);
added test for killpg() in configure.in.
* trap.c(inittraps): changed initialization of sigtraps - was
using -1 in deftraps[] as end of table marker but some systems
(eg, ultrix 2.2) define signals with -1 values (SIGPWR).
* Makefile.in(mandir,install): fixed mandir value; added /
in man installation; prefixed ksh.1 with $(srcdir).
* jobs.c(j_init): Ignore failure of TIOCSETD.
* misc.c(options[]): changed "vicomplete" to "vitabcomplete".
* emacs.c(x_e_putc,x_e_puts,x_debug_info): x_e_putc()/x_e_puts() are
the x_putc()/x_puts() functions from ksh4.9 edit.c (they got lost
in the merge); same for x_debug_info(); changed x_e_putc/x_e_puts
to call x_putc/x_puts.
Mon Jul 4 09:29:05 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-4.9+mun.3 distribution
* main.c(remove_temps): use unlink() instead of remove(); delete
remove() define.
* sh.h(func_heredocs, struct env): added func_heredocs for here
documents in functions; added func_parse field to struct env
- set when a function is being parsed.
* lex.c(readhere): if e.func_parse, save temp file in func_heredocs.
* syn.c(get_command): increment/decrement func_parse when parsing
functions.
* main.c(remove_temps,reclaim,leave): added remove_temps(); make
reclaim() call remove_temps(); make leave() clean up function
here documents.
* aclocal.m4(KSH_TIMES_CHECK): new test - define TIMES_BROKEN
if times() doesn't exist or if it always returns 0.
* acconfig.h(TIMES_BROKEN): new define.
* missing.c(ksh_times): new function.
* ksh_times.h: new file.
* c_sh.c,jobs.c: changed <sys/times.h> to "ksh_times.h"
* c_sh.c,ksh_time.h(CLK_TCK): moved CLK_TCK define from c_sh.c
to ksh_time.h (needed in missing.c).
* syn.c(get_command): case TIME: don't call pipeline() with CONTIN
flag.
* c_sh.c(c_times): combined some printfs().
* jobs.c(j_jobs,j_kill,j_resume,waitfor): block SIGCHLD before
calling j_lookup() or looking at jobs list - avoids potential
problems with remove_job() being called in signal handler.
Sun Jul 3 11:09:01 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* exec.c(do_selectargs, selread, pr_menu): re-wrote do_selectargs to
let c_read() to most of the work; deleted selread; make pr_menu
calculate width/ncolumns each call so select can be used recursively.
* configure.in, aclocal.m4(KSH_TERMIOS_H, KSH_TERM_CHECK): replaced
KSH_TERMIOS_H with KSH_TERM_CHECK; removed calls to
tcgetpgrp/tcsetpgrp - there is a separate test for this.
* main.c(main), sh.h: move getcwd() declaration to sh.h.
* eval.c(expand,varsub): added XNULLSUB case to deal with "$@"
(and "${foo[@]}") when $# (or ${#foo}) is 0.
* eval.c(expand,varsub): removed free_me field - let reclaim() take
care of it.
Wed Mar 9 00:50:12 1994 Simon J. Gerraty (sjg@zen.void.oz.au)
* var.c (setstr): don't set ALLOC flag if vp.s is NULL.
Thu Jun 30 10:16:44 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* c_sh.c(c_read): ignore null characters; use builtin_getopt()
instead of explicit parsing; removed -e option (neither at&t ksh
nor POSIX have this); added -s option (put line in history, at&t ksh);
if no variable specified, use REPLY (at&t ksh).
* exec.c(do_selectargs): use Xstring macros to deal with saving
input (was static, growing, buffers); flush shl_out after
shellf().
* vi.c(expand_word,complete_word): deleted call to free_edstate
since already done by restore_edstate().
* var.c(global): in 'if !letter(c)' block, deleted !c from
'if (!c || !n[1])' - don't know why it was added since it makes
no difference to what is returned.
* syn.c(dogroup): removed onlydone argument since it is only
used in the while/until statements, where "while command; done"
is not allowed anyway; Changed all calls.
* misc.c(options[]): allow -i to be specified on the command
line.
* exec.c(iosetup): if stderr (fd 2) is being re-directed,
re-open shl_out to clear any errors.
* main.c(quitenv): if restoring fd 2, clear any write errors
* io.c(initio): initialize shl_out, shl_spare for writing
(was SHF_GETFL).
* main.c(main): ignore SIGQUIT if talking.
Wed Jun 29 11:11:34 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* c_sh.c(c_exit): removed jobs/really quit stuff - exit should
always exit.
* main.c(shell): made reallyquit a local variable.
* sh.h(reallyquit): deleted reallyquit
* exec.c(comexec), main.c(main), misc.c(change_flag), jobs.c:
ifdef'd use of FMONITOR.
* sh.h, misc.c: define FMONITOR option only if JOBS defined.
* c_sh.c(c_wait): POSIXized: option parsing (of no options);
return 0 if not given any arguments; deal with multiple arguments.
* jobs.c(j_lookup): changed second argument to return an integer
error code, added defines for error codes, added error message
array; changed all calls to use new conventions.
* jobs.c(waitfor): returns -1 if job not found; added argument
to specify if notification messages should be suppressed.
* jobs.c(j_waitj): added flags argument instead of intr argument;
added JW_STOPPEDWAIT flag to wait for stopped jobs to complete;
added JW_NONOTIFY flag to suppress notification of normal
job termination.
Tue Jun 28 16:13:10 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* c_ksh.c(c_jobs): added -n and -p options, allow job ids to be
specified for -l option.
* jobs.c(j_jobs): added new arguments to deal with -n and -p options.
* shf.h(SHF_BSIZE): reduced size to 512 to reduce memory requirements
(I/O is used mostly for one line messages).
* config.h.bot: removed necessity for tty process groups to define
JOBS, added necessity of signal blocking/pausing.
Mon Jun 27 21:49:52 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* jobs.c(exchild,j_print,j_waitj,j_jobs,check_job): exchild() - removed
commented out shf_flush() calls; j_print() - print a space between
status reports when lflag < 0, changed flag argument to use
long/medium/short defines; Changed Job.notify field to use
long/medium/short defines; j_waitj() - instead of calling j_print(),
set j->notify to print the job; j_jobs() - clear j->notify so user
won't be notified twice if a job finishes before a jobs command;
check_job() - put job on front of list only if it is stopped.
* main.c(main): pass flag to j_init() indicating if -m flag set/cleared
on command line; don't initialize ttyfd.
* sh.h: delete ttyfd.
* jobs.c(j_init,ttyfd,check_job): made ttyfd static; re-worked j_init()
to initialize ttyfd, initialize FMONITOR if not set by command line,
initialize shl_j for asynchronous job notification;
check_job() - use shl_j, look through saved fds to find real
standard-error.
* jobs.c(TTY_PGRP, ttypgrps_ok): modified conditions so job control
is useful without tty process groups; added ttypgrps_ok flag that
indicates if tty process groups should be set up; modifications so
job control useful if ttypgrps_ok not set.
* main.c(main): set FTALKING if 0 and 2 are tty as specified in POSIX
(was 0 and 1).
* misc.c(parse_args): do POSIX option processing for -A, -c and -o
(allow -onoglob, -ctrue).
* main.c(main): don't set up shl_stdout before/after parse_args() since
lone -o on command line no longer accepted; remove code to allow
-c with no options to read from stdin (at&t khs does this but POSIX
requires an option to -c).
Thu Jun 23 17:46:54 NDT 1994 John Rochester (jr@panda.cs.mun.ca)
* trap.c(cleartraps): added special case for clearing trap 0 from
ksh-4.9 sources.
Thu Jun 23 10:17:03 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* misc.c(builtin_getopt): print error messages for unknown option,
missing option; reset state if argv is 0.
* c_ulimit.c(c_ulimit): let builtin_getopt() print error messages.
* exec.c(call_builtin): call builtin_getopt() with 0 argv.
* c_sh.c(c_unset): added -v option (POSIX); use builtin_getopt() to
parse arguments; removed bogus comment about global() and special
variables; don't allow read-only variables to be unset (POSIX).
* var.c(unset, unsetspec): when unsetting a special variable, call
unsetspec(); unsetspec() new function.
* mail.c(mbset, mcheck): check that path is not 0 before calling stat
(so mbset() can be called with 0 when MAIL is unset); deleted #if 0'd
declarations of munset, mballoc and maddmsg.
* misc.c(parse_args): pass argv+i+1 to set_array (not argv+i); when
skipping arguments, leave i just before the NULL.
* exec.c(echo): flush shl_out when done.
* shf.c(shf_close): always used to return EOF.
* trap.c(trapsig): skip error handlers when checking for PARSE or LOOP.
Wed Jun 22 10:24:09 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* sh.h(C_IFSWS), misc.c(initctypes): added and initialized C_IFSWS
(IFS white space).
* c_sh.c(c_read): print continuation prompt if line ends in backslash;
multiple non-white-space IFS chars delimit fields; strip trailing
IFS-white-space from last variable; watch out for backslash followed
by EOF.
* eval.c(expand): only do field splitting on the results of
parameter/command substition (POSIX, !v7-sh); multiple
non-white-space IFS chars delimit fields.
* eval.c(expand,alt_expand): removed NOALT tests since it could
never be set; added return after call to alt_expand() in expand().
Mon Jun 6 10:12:41 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* misc.c(setctypes, initctypes): setctypes - don't allow leading null
in IFS (IFS="" could cause problems, 0 is already added);
initctypes - don't use a leading null.
* sh.h, eval.c: move definition of ifs0 from eval.c to sh.h; handle
null ifs0.
* var.c(setspec): set ifs0 to first character of IFS.
* lex.c(yylex): when parsing ${..}, array references were not being
null terminated.
Fri Jun 3 12:28:06 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* var.c(export): changed to use memcpy() instead of loops.
* eval.c(varsub, expand): check for #foo[@] in addition to #foo[*];
handle ${foo[*]} and ${foo[@]} - added free_me field to struct Expand
so pointer vector can get freed.
* c_sh.c(c_dot), main.c(include): set up positional parameters if
any are specified; Added argc,argv args to include(); changed all
calls to include(); change include() to return 0 or 1 - caller
can check exstat if desired; c_dot() should return 1 if can't open
file (was -1).
* c_sh.c(c_brkcont): warning message could call getn() with NULL - save
original number and print it.
* main.c(main): set $0 to first argument when -c used, ie,
"sh -c cmd-string this-is-$0 argumernts..."
* exec.c(iosetup): print "cannot open" if IOHERE fails.
* io.c(errorf): set exstat to 1.
* exec.c(search): assume mode is R_OK or X_OK (not 0/1 - 0 is F_OK, we
want R_OK); changed all calls to pass R_OK/X_OK.
sh.h: define R_OK,W_OK,X_OK,F_OK if not defined.
eaccess(): changed all calls to use [RWXF]_OK.
* sh.h(flag[], shell_flags[], Flag()): Renamed flag[] array to
shell_flags[] to avoid conflicts with other uses of flag; Changed
all references to flag[] to Flag(); defined Flag() to cast its arg
to an int (for old pcc based C compilers).
* vi.c(iswordch): use letnum() instead of isalnum || _.
* misc.c(parse_args): call set_array() to deal with -A flag.
* var.c(set_array): new function.
Fri Jun 3 10:22:26 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* eval.c(substitute): afree(s).
* var.c(global,local), sh.h: ARRAYMAX: new define - max index of an
array; changed 511 constants to this; changed global() and local()
to use array_ref_len() instead of arraysub().
* expr.c(token): deleted unneeded arraysub() decl.
* lex.c(arraysub), proto.h: made static, removed unused arguments,
changed callers; removed prototype from proto.h.
* ChangeLog: changed descriptions from func(file) to file(func).
Wed Jun 1 09:17:50 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* made pdksh-4.9+mun.2 distribution
* Makefile.in: added RCSFILES macro and rcs-ci target.
* configure.in: add termio.h to the AC_HAVE_HEADERS() call.
* sh.h, main.c, edit.c, misc.c: use EXTERN for aperm, x_cols,
builtin_optind and builtin_optarg in sh.h, delete definitions
in main.c, edit.c and misc.c.
* io.c(maketemp): changed sizeof(PATH) to sizeof(path).
* aclocal.m4(KSH_VOID,KSH_DUP2_CHECK): test that a void * variable
can be used (Ultrix 2.2 compiler doesn't do this); added ifdef
HAVE_FCNTL_H to dup2 test.
* aclocal.m4, configure.in, sh.h, tree.c, io.c, shf.c: added
new config test KSH_PROTOTYPES to check for function prototypes
(MIPS RICS/os 5.0 C compiler isn't STDC and it can't mix <stddef.h>
with <varargs.h>). Removed stdarg.h test (now redundant). Changed
all varargs functions to use HAVE_PROTOTYPES instead of
HAVE_STDARG_H && STDC.
* eval.c(alt_scan): changed type of endc param from char to int to
avoid problems with mixing prototype declarations and K&R
definitions.
* main.c(main), sh.h: added plain getcwd() decl to main(), removed
ARGS() version from sh.h (some systems have getcwd() but don't
declare it, some have getcwd() with a size_t arg 2, some have
an int arg 2).
* misc.c(memset,memmove): changed the second memset() to memmove().
* c_sh.c(clocktos): changed #if CLK_TCK ... to if (CLK_TCK.. since
CLK_TCK is not always defined to a number (may be a _sysconf())).
Tue May 31 10:49:16 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* configure.in, Makefile.in: added code to set GCC_WARNFLAGS from
$(srcdir)/Warn-flags if gcc is being used; Took -Wall, etc.
out of CFLAGS, took -Dno_RCSids out of DEFS. Added install.sh to
DISTFILES, grabbed copy of install.sh from autoconf (who grabbed
it from X11R5).
* io.c(errorf,shellf,shprintf),shf.c(shf_fprintf,shf_snprintf),
tree.c(fptreef,snptreef): don't use ansi decls with old style
varargs; changed ifdef __STDC__ to ifdef HAVE_STDARG_H.
* jobs.c(j_init): changed getpgrp() call to getpgID(), defined getpgID()
appropriately for BSD vs POSIX/SYSV getpgrp.
* expand.h, ksh_dir.h, ksh_stat.h, ksh_time.h, ksh_wait.h, shf.h,
tty.h: added RCS Id's.
* acconfig.h: updated SIGSET_T comment: unisgned int -> unsigned.
* aclocal.m4(KSH_CLOCK_T,KSH_TIME_T,KSH_SIGSET_T): make sure
type is a word (same fix as was done for more_t, et.al.).
* aclocal.m4(KSH_VOLATILE): check that the compiler can deal with
volatile pointers (dec/pmax ultrix 4.2 compiler can't).
* misc.c(parse_args): added skelatal code for dealing with -A.
* var.c,proto.h(skip_varname): new function; deleted isassign()
function, which is no longer called. Changed typeset(var.c)
to use skip_varname().
* var.c(strint): fail if base is not in the range 2..36; set variable
base according to first base seen; generate an error if a non-alnum
char is seen (1^A was the same as 11).
* var.c(strval): for integer variables, output base if != 10.
* sh.h: fixed typo in x_cols define (#defined -> #define).
Fri May 27 16:49:29 NDT 1994 Micharl Rendell (michael@panda.cs.mun.ca)
* made pdksh-4.9+mun.1 distribution
* finished autoconf'ing source code.
Fri May 20 16:47:06 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* c_ulimit.c(c_ulimit) (was do_ulimit.c(do_ulimit)): major rework;
deal with combinations of getrusage and ulimit, use options at&t
ksh uses (-SHa..).
* misc.c(builtin_getopt): yet another getopt routine for builtin
commands
* misc.c(parse_args), c_sh.c(c_set), main.c(main): custom option
parsing routine for command line/set options. Lots of changes
to main() to incorporate this (easier to follow).
* c_test.c(c_test): added -e (file exists) test.
Fri May 5 12:16:46 NDT 1994 Michael Rendell (michael@panda.cs.mun.ca)
* numerous changes from old Notes.4-9 file:
- c_ksh.c:
- calls to errorf identify what function the error is in
(eg, errorf("print: bad -u option");)
- added array stuff (lots of places)
- table.c
- lex.c
- var.c: +arraysearch(), +basename()
- c_sh.c(c_exit), main.c(shell), sh.h:
- added reallyquit flag to deal with stopped jobs at exit time;
only two exit commands (or eofs) in a row will work. in
shell(), set exstat from execute value.
- c_ksh.c(c_print):
- handle \\ at end of string better (don't skip the null)
- c_ksh.c(c_whence):
- stop looking as soon as we get a failure
- pass flag[FTRACKALL] to findcom() instead of 0
- c_ksh.c(c_alias):
- print '%s alias not found' if not found
- c_ksh.c(c_jobs):
- handle -l option (list pid)
- c_ksh.c(c_kill):
- two column -l output to try to keep it on one screen
- c_sh.c(c_read):
- skip IFS at start of line "echo ' a b' |(read a b; echo $a)"
should print a, not nothing.
- changed EOF check to set all vars to null (same way \n is
handled)
- eval.c(comsub):
- after compile(), return if t is NULL
- use setfileno() instead of fileno(x) = .. (see sh.h changes);
- exec.c(iosetup):
- set exstat if redirect fails
- exec.c(fd_clexec):
- check that fd >= 0
- exec.c:
- change SHARPBANG ifdef code - everyone uses scriptexec().
ifdef is put around open/read/parse code in scriptexec().
[code cleanup]
- exec.c(search):
- eaccess test out side of loop: must be regular file to exec it
(like test in loop)
- eval.c(expand):
- added while getc() == 0 in XCOM
[a null in the output of a file would be treated as eof and
waitlast would not be called]
- eval.c(trimsub):
- '%' subst: use ATEMP, not APERM
- eval.c(tilde): use Xinit et. al., instead of fixed length buffer
- getopts.c(getopt): rename getopt() to ksh_getopt() to avoid
problems with prototypes in system #include files.
- io.c(fopenshf):
- call clearerr(fd) if already open
- use F_GETFL to determine appropriate mode for fdopen() call
instead of opening everything for read/write
- use ifdef _FSTDIO instead of ifdef _BSDI (_FSTDIO is used in
4.4bsd, NetBSD, FreeBSD and other non BSDI environs)
- lex.c(ungetsc): don't decrement if str == null, remove nullstr hack
- lex.c(yylex):
- \ at eol: call Xfree before goto Again
- use memset() to clear ident, instead of while loop
- syn.c(get_command): renamed from command() to get_command() to
avoid conflicts with command(main.c).
- sym.c(get_command):
- allow A=B <alias-name> to work (alias was not being expanded)
- allow `if .. if .. fi fi' to work (no ; after group terminator
(fi , esac, done, ), })
- allow `alias FI=fi ; if .. if .. fi FI' to work (alias
expansion after group terminator)
- do not assume resize returns same pointer
- tree.c(pioact):
- handle IORDWR case
- added leading quote for file in IOHERE case
- var.c(special):
- add MAILCHECK check
- var.c(setspec):
- add MAILCHECK case (doesn't do anything yet)
- var.c(strint):
- handle null vp->val.s
- eval.c(sh.h, expand), misc.c(options[]):
- enable alternations only if alternations flag set
(set -o alternations). This is so (att ksh) scripts that don't
expect alternations won't break.
- added notify option (asynchronous job completion notification)
- added vicomplete to enable tab char as file name completion
char in vi (this is likely to go away - exits for historical
reasons)
- jobs.c, main.c, sh.c, trap.c:
- define/use SIG_HDLR instead of void
- eval.c(expand): alt_expand() does not return a value so don't test
it, just return. Also changed decl of alt_expand() to reflect
reality.
- emacs.c(x_emacs): first return returns random value (i); change to
return 0. Also changed the way interrupts are returned to called
(return -2 means interrupt).
- c_sh.c(c_brkcont): at&t ksh allows breaks/continues outside of
loops, 4.9 prints an error and breaks out of all env's (if, case,
etc.). Fixed to act like at&t (ie, allow bogus continues), except
a warning message is printed. (Some HP-UX shell scripts actually
have continues outside of loops...)
- main.c(shell): parameter s should be volatile as it is used after a
setjmp.
- edit.c(promptlen): handle tabs, backspaces...
- cleaner fix to the ^C/source->line problem: in pprompt(lex.c),
convert ! to source->line+1 (same in promptlen(edit.c)), increment
source->line after a (non-empty, non-eof) line has been read
(before call to histsave()). To be pedantic, also adjust
position of source->line++ in SHIST in case PS9 is ever used.
Remove code in shell(main.c) that does the source->line--,
remove the source->line-- for eof and empty line in from
getsc_(lex.c).
- trap.c(sigtrap[]): do not depend on signal number matching position
in initialization array. Use second table in which order does not
matter to initialize sigtrap[] array. Easier to read/port, and
generally less fragile. requires call to inittraps() in main.c.
- trap.c(cleartraps): need to clear Sigact flags/mask after use
(actually, declare a local struct sigact and use that instead of
Sigact)
- exec.c(execute): case TSELECT: no USE_SIGACT code for call to
signal(); case TPIPE: don't call waitlast() if XXCOM since
waitlast() will be called in expand(); 4.9 code that set and
then cleared the XEXEC flag in the TPIPE case not added since
it was ifdef'd out, also the code to not exit if XPIPEI flag
set was not added; 4.9 XXWHL flag not added (don't flush stdin
if in a while loop) since this problem fixed (I hope) by shf stuff.
- ttyfd{sh.h/lex.c}: use EXTERN/_I_ to initialize ttyfd. Remove from
lex.c
- interrupted reads: instead of testing sigchld_caught after reads
fail, continue them if errno == EINTR.
- edit.c(x_getc): check for EINTR, and continue reading if so.
- lex.c(getsc_): check for EINTR, and continue reading if so.
(don't check return of x_read() - check has already been done)
- exec.c(selread): check for EINTR, and continue reading if so.
- history changes:
- history.c:
- histrpl(): bounds check doesn't take global flag into
account - move check into loop and past loop.
- c_fc(): if pattern is the empty string, histrpl()
goes into infinate loop. Start searching for = after first
char (this is what at&t ksh seems to do).
- c_fc(): `fc -l first' should list at most 16
commands according to at&t manual.
- findhist(): re-wrote: shorter, easier to follow. Now
returns an int. (used only by vi code)
- use COMPLEX_HISTORY's allocated history array in
EASY_HISTORY: common init_histvec(), sethistfile() and
sethistsize() functions.
In the process, hist_open() went away. Use histsize
instead of HISTORY in hist_init() and hist_finish()
#ifdefs in lex.h, table.h,
var.c disappear, history variable definitions in lex.c
disappear.
- hist_init(COMPLEX_HISTORY): move hstarted = 1 to after the
FTALKING test.
- hist_finish(): don't open hname if its null
- histrpl(): made static, use ARGS in decl
- made current and curpos static
- changes to allow embedded newlines in commands:
- histsave(): trash only trailing newline
- hist_init(): read in null terminated lines instead of
newline terminated
- hist_finish(): write null terminated lines
- make multiple line command appear in single history line
(EASY_HISTORY only):
- added histappend() to append new command to last
command
- added call to histappend() in getsc_(lex.c) (also: only
adjust source->line if not multiline).
- lex.h:
- remove second decl of history if !EASY_HISTORY
- tree.c(ptree): case TCOM: check if t->vars or t->args is 0
- vi.c(x_vi): ^D anywhere in command line is eof ($ foobar^D exits).
at&t ksh ignores ^D in middle of line
- edit.c:
- don't need to include string.h - included in stdh.h
- init_editmode(): in at&t ksh, VISUAL takes precenence over
EDITOR, so put it first. Also, at&t ksh doesn't use FCEDIT so
trash it.
- moved initialization of ed_* from x_read() to x_init() since
thats where they are set from tty structs.
- x_init(): set ed_intrc, ed_quitc for _BSD & _POSIX_TERM ifdefs
- send output to shlout (instead of stdout - at&t ksh writes to
stderr)
- made x_do_init static.
- exit.c(x_getc), lex.c(yylex): restart interrupted reads in
x_getc(), changed read-restart in yylex() to only effect call
to read().
- syn.c(thenpart): then THEN is not optional - generate a syntax
error if no THEN. (ie, `if true ; fi' is not legal).
- syn.c(get_command): don't accept keywords after re-directory (eg,
`> /dev/null if true ; then echo hi ; fi' is not legal).
- vi.c: handle \ and ^[ in command mode ala at&t ksh (filename
completion)
- syn.c(thenpart), syn.c(elsepart): calling token(0) when they want a
keyword (always worked 'cause tpeek() is always called before, with
the keyword flag). Fix: call token(KEYWORD|ALIAS) (at&t ksh does
alias expansion here). Question: pass CONTIN as well?
- syn.c(get_command): LWORD/MPAREN case: do alias expansion when
getting open brace ({). CASE case: ditto for `in' and `esac'.
IF case: ditto for `fi'. FUNCTION case: dito for open brace ({).
- syn.c(dogroup): alias expansion when getting `do' and `done'.
- syn.c(wordlist): alias expansion when getting `in'.
- syn.c(nested): alias expansion when getting `)', `}'
- syn.c(casepart): alias expansion when getting `esac' or `;;'.
Also removed use of cf variable - it does nothing.
- eval.c(expand): case CSUBST: '#'/'%' - increment st so nested
substitutions work.
- var.c(typeset): INTEGER && no assignment: memory was being freed
and then used (there was even a comment saying it was being
done...)
- lex.c, lex.h, exec.c, main.c:
added shf_{open,fdopen,close,gets}() routines so stdio wasn't
used. When reading a command file under osf/1, stdio would
mess up the read pointer when a child exited: the exit flushed
all open files and flushing a file open for reading changes the
current read position (does a seek to where the next char would
be read). This position is then used by the parent process,
who thinks the read position is still at the end of the buffer
it read.
- c_sh.c:
use shf_*() routines avoids two bugs in read:
- on sunos 4.1.3, a read would gobble up a stdio buffer and
never put it back (ie, lseek backwards). Neither a
fflush() nor a fseek(x, 0L, 1) fixed the problem.
(see Bug 26)
- on linux, stdio knows its current offset and seeks there
before reading a buffer. This causes grief when the shell
replaces file descriptors behind stdio's back (ie, all the
time).
$ read x << EOF
hi
EOF
$ cat > /dev/tty << EOF
1:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
2:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
3:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
EOF
$
the cat picks up reading at the offset where the read
command left off (ie, at bcdefg... - the 1:a are skipped).
- exec.c(comexec): built-in c_exec && no args: close the saved fd's
(were thrown away). Also, set close-on-exec flag for fd's > 2,
as per at&t manual.
- lex.c(yylex): only accept 1 digit before a redirection (eg, 1> is
ok, 1abc> is not)
- exec.c(iosetup): only accept 1 digit after a dup-redirection
(eg, >&1 is ok, >&1abc is not)
- exec.c(iosetup): use O_APPEND flag for >> redirections; use O_CREAT
flag for <> redirections. (re-organized to accumulate open() flags
and do one open() call); changed error message to know about dup
failing.
- c_sh.c(c_umask): umask should have leading 0 - doesn't when umask
has 3 digits (eg, `umask 222; umask' prints 222 instead of 0222)
- c_sh.c(setsig): declare local struct sigaction and use it so
sa_flags doesn't have to be cleared (also to try to keep away from
global vars).
- main.c(main):
- don't go set TALKING if name starts with -.
- read $HOME/.profile (not .profile)
- main.c(main): re-wrote option parsing code
- edit.c(init_editmode): don't check FCEDIT
- if set -o vi/emacs/gmacs on command line, don't set edit mode from
FCEDIT/EDITOR/etc.
- var.c(setspec): FCEDIT should not magicly change edit mode; VISUAL
and EDITOR should (EDITOR only if VISUAL is not set)
- changed noclobber char from ! to | (this is what at&t ksh uses)
- exec.c(iosetup): use O_EXCL flag if FNOCLOBBER set and >| not used
- c_sh.c(c_set): don't clear FERREXIT if FTALKING is set; although
some ksh manuals say -e is ignored for interactive shells, they
all seem to honour the -e flag for interactive shells.
- vi.c: reset history position to the end after a line is modified
- `(( 1 + 2 ))' no longer prints `+: bad expression'!
- lex.c(yylex): added parenthesis counting so `(( ((1+2)) ))' no
longer generates a syntax error
- expr.c(intvar): if strint() fails, give bad number error
(`let 1+foo' should fail)
- `echo hi 1abc123> /dev/tty' no longer interpreted as
`echo hi 1> /dev/tty' (is `echo hi 1abc123 > /dev/tty')
- `echo hi 1<> /tmp/does-not-exist' now works (used to say cannot
open)
- c_sh.c(c_umask): umask now takes symbolic arguments (g-r, +w, etc.)
- c_ksh.c(c_whence): pass flag[FTRACKALL] to findcom() instead of 1.
- `echo hi >< bar' now produces an error
- jobs.c(j_lookup): now checks for ambiguous job specifications;
callers now get an error message.
- c_ksh.c(c_fgbg): multiple jobs can be specified
- emacs.c(x_transpose): move past transposed chars like (gnu) emacs
does
- main.c(main): don't copy initcoms (messes up memory allocated for
shf_iob[] in initio(), should not be necessary)
- main.c(main), var.c(import), var.c(typeset), c_ksh.c(c_alias),
expr.c(token), misc.c(strnsave): added strnsave() function; use it
instead of writing nulls in the middle of strings; main() no longer
copies startup commands before executing them.
- vi.c: wbuf[] no longer a fixed size (was hard coded to 80 chars).
- alloc.c(aresize): if passed a null pointer, don't free it
- expand.h: restored usage description and NOTE from previous version
- alloc.c, table.h, table.c:
- changed struct fields named `free' to nfree (struct table) and
freelist (struct Block) to allow memory debugging
(involves #defining free)
- main.c(main): smart initialization of PWD (ensures it is always
valid).
- lex.h, table.h, tree.h: removed redundant function declarations
(were also in proto.h)
- sh.h: increased LINE from 256 to 1024
- main.c(include), sh.h(E_INC), c_sh.c(c_return): added hack so a
return in a included file returns to the includer instead of
exiting the shell. Very useful in $ENV scripts and profiles,
eg, so the whole script does not have to be parsed for
non-interactive shells.
This is not compatible with the at&t ksh, whose man page says
return is the same as exit outside of functions. May be modified
in the future. (note that at&t ksh parses a .'ed file before
executing anything, so a premature return would not speed its
parsing, which is why the return hack was added to pdksh)
- exec.c(iosetup): don't save fd if already saved (and don't
generate an error)
- exec.c(findcom): in if (..ALLOC && eaccess), test for
ALLOC redundant - always call afree()
|