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
|
PACKET editor paket DEFINES (* EDITOR 121 *)
(**********) (* 19.07.85 -bk- *)
(* 10.09.85 -ws- *)
(* 25.04.86 -sh- *)
edit, editget, (* 06.06.86 -wk- *)
quit, quit last, (* 04.06.86 -jl- *)
push, type,
word wrap, margin,
write permission,
set busy indicator,
two bytes,
is kanji esc,
within kanji,
rubin mode,
is editget,
getchar, nichts neu,
getcharety, satznr neu,
is incharety, ueberschrift neu,
get window, zeile neu,
get editcursor, abschnitt neu,
get editline, bildabschnitt neu,
put editline, bild neu,
aktueller editor, alles neu,
groesster editor, satznr zeigen,
open editor, ueberschrift zeigen,
editfile, bild zeigen:
LET hop = ""1"", right = ""2"",
up char = ""3"", clear eop = ""4"",
clear eol = ""5"", cursor pos = ""6"",
piep = ""7"", left = ""8"",
down char = ""10"", rubin = ""11"",
rubout = ""12"", cr = ""13"",
mark key = ""16"", abscr = ""17"",
inscr = ""18"", dezimal = ""19"",
backcr = ""20"", esc = ""27"",
dach = ""94"", blank = " ";
LET no output = 0, out zeichen = 1,
out feldrest = 2, out feld = 3,
clear feldrest = 4;
LET FELDSTATUS = STRUCT (INT stelle, alte stelle, rand, limit,
anfang, marke, laenge, verschoben,
BOOL einfuegen, fliesstext, write access,
TEXT tabulator);
FELDSTATUS VAR feldstatus;
TEXT VAR begin mark := ""15"",
end mark := ""14"";
TEXT VAR separator := "", kommando := "", audit := "", zeichen := "",
satzrest := "", merksatz := "", alter editsatz := "";
INT VAR kommando zeiger := 1, umbruchstelle, umbruch verschoben,
zeile, spalte, output mode := no output, postblanks := 0,
min schreibpos, max schreibpos, cpos, absatz ausgleich;
BOOL VAR lernmodus := FALSE, separator eingestellt := FALSE,
invertierte darstellung := FALSE, absatzmarke steht,
cursor diff := FALSE, editget modus := FALSE,
two byte mode := FALSE, std fliesstext := TRUE;.
schirmbreite : x size - 1 .
schirmhoehe : y size .
maxbreite : schirmbreite - 2 .
maxlaenge : schirmhoehe - 1 .
marklength : mark size .;
initialisiere editor;
.initialisiere editor :
anfang := 1; zeile := 0; verschoben := 0; tabulator := "";
einfuegen := FALSE; fliesstext := TRUE; zeileneinfuegen := FALSE;
marke := 0; bildmarke := 0; feldmarke := 0.;
(******************************** editget ********************************)
PROC editget (TEXT VAR editsatz, INT CONST editlimit, editlaenge,
TEXT CONST sep, res, TEXT VAR exit char) :
IF editlaenge < 1 THEN errorstop ("Fenster zu klein") FI;
separator := ""13""; separator CAT sep;
separator eingestellt := TRUE;
TEXT VAR reservierte editget tasten := ""11""12"" ;
reservierte editget tasten CAT res ;
disable stop;
absatz ausgleich := 0; exit char := ""; get cursor;
FELDSTATUS CONST alter feldstatus := feldstatus;
feldstatus := FELDSTATUS : (1, 1, spalte - 1, editlimit,
1, 0, editlaenge, 0,
FALSE, FALSE, TRUE, "");
konstanten neu berechnen;
output mode := out feld;
feld editieren;
zeile verlassen;
feldstatus := alter feldstatus;
konstanten neu berechnen;
separator := "";
separator eingestellt := FALSE .
feld editieren :
REP
feldeditor (editsatz, reservierte editget tasten);
IF is error
THEN kommando zeiger := 1; kommando := ""; LEAVE feld editieren
FI ;
TEXT VAR t, zeichen; getchar (zeichen);
IF zeichen ist separator
THEN exit char := zeichen; LEAVE feld editieren
ELIF zeichen = hop
THEN feldout (editsatz, stelle); getchar (zeichen)
ELIF zeichen = mark key
THEN output mode := out feld
ELIF zeichen = abscr
THEN exit char := cr; LEAVE feld editieren
ELIF zeichen = esc
THEN getchar (zeichen); auf exit pruefen;
IF zeichen = rubout (*sh*)
THEN IF marke > 0
THEN merksatz := subtext (editsatz, marke, stelle - 1);
change (editsatz, marke, stelle - 1, "");
stelle := marke; marke := 0; konstanten neu berechnen
FI
ELIF zeichen = rubin
THEN t := subtext (editsatz, 1, stelle - 1);
t CAT merksatz;
satzrest := subtext (editsatz, stelle);
t CAT satzrest;
stelle INCR LENGTH merksatz;
merksatz := ""; editsatz := t
ELIF zeichen ist kein esc kommando (*wk*)
AND
kommando auf taste (zeichen) <> ""
THEN editget kommando ausfuehren
FI ;
output mode := out feld
FI
PER .
zeichen ist kein esc kommando : (*wk*)
pos (hop + left + right, zeichen) = 0 .
zeile verlassen :
IF marke > 0 OR verschoben <> 0
THEN stelle DECR verschoben; verschoben := 0; feldout (editsatz, 0)
ELSE cursor (rand + 1 + min (LENGTH editsatz, editlaenge), zeile)
FI .
zeichen ist separator : pos (separator, zeichen) > 0 .
auf exit pruefen :
IF pos (res, zeichen) > 0
THEN exit char := esc + zeichen; LEAVE feld editieren
FI .
editget kommando ausfuehren :
editget zustaende sichern ;
do (kommando auf taste (zeichen)) ;
alte editget zustaende wieder herstellen ;
IF stelle < marke THEN stelle := marke FI;
konstanten neu berechnen .
editget zustaende sichern : (*wk*)
BOOL VAR alter editget modus := editget modus;
FELDSTATUS VAR feldstatus vor do kommando := feldstatus ;
INT VAR zeile vor do kommando := zeile ;
TEXT VAR separator vor do kommando := separator ;
BOOL VAR separator eingestellt vor do kommando := separator eingestellt ;
editget modus := TRUE ;
alter editsatz := editsatz .
alte editget zustaende wieder herstellen :
editget modus := alter editget modus ;
editsatz := alter editsatz;
feldstatus := feldstatus vor do kommando ;
zeile := zeile vor do kommando ;
separator := separator vor do kommando ;
separator eingestellt := separator eingestellt vor do kommando .
END PROC editget;
PROC editget (TEXT VAR editsatz, INT CONST editlimit, TEXT VAR exit char) :
editget (editsatz, editlimit, x size - x cursor, "", "", exit char)
END PROC editget; (* 05.07.84 -bk- *)
PROC editget (TEXT VAR editsatz, TEXT CONST sep, res, TEXT VAR exit char) :
editget (editsatz, max text length, x size - x cursor, sep, res, exit char)
END PROC editget; (* 05.07.84 -bk- *)
PROC editget (TEXT VAR editsatz) :
TEXT VAR exit char; (* 05.07.84 -bk- *)
editget (editsatz, max text length, x size - x cursor, "", "", exit char)
END PROC editget;
PROC editget (TEXT VAR editsatz, INT CONST editlimit, editlaenge) :
TEXT VAR exit char;
editget (editsatz, editlimit, editlaenge, "", "", exit char)
ENDPROC editget;
(******************************* feldeditor ******************************)
TEXT VAR reservierte feldeditor tasten ; (*jl*)
PROC feldeditor (TEXT VAR satz, TEXT CONST res) :
enable stop;
reservierte feldeditor tasten := ""1""2""8"" ;
reservierte feldeditor tasten CAT res;
absatzmarke steht := (satz SUB LENGTH satz) = blank;
alte stelle merken;
cursor diff bestimmen und ggf ausgleichen;
feld editieren;
absatzmarke updaten .
alte stelle merken : alte stelle := stelle .
cursor diff bestimmen und ggf ausgleichen :
IF cursor diff
THEN stelle INCR 1; cursor diff := FALSE
FI ;
IF stelle auf zweitem halbzeichen
THEN stelle DECR 1; cursor diff := TRUE
FI .
feld editieren :
REP
feld optisch aufbereiten;
kommando annehmen und ausfuehren
PER .
absatzmarke updaten :
IF absatzmarke soll stehen
THEN IF NOT absatzmarke steht THEN absatzmarke schreiben (TRUE) FI
ELSE IF absatzmarke steht THEN absatzmarke schreiben (FALSE) FI
FI .
absatzmarke soll stehen : (satz SUB LENGTH satz) = blank .
feld optisch aufbereiten :
stelle korrigieren;
verschieben wenn erforderlich;
randausgleich fuer doppelzeichen;
output mode behandeln;
ausgabe verhindern .
randausgleich fuer doppelzeichen :
IF stelle = max schreibpos CAND stelle auf erstem halbzeichen
THEN verschiebe (1)
FI .
stelle korrigieren :
IF stelle auf zweitem halbzeichen THEN stelle DECR 1 FI .
stelle auf erstem halbzeichen : within kanji (satz, stelle + 1) .
stelle auf zweitem halbzeichen : within kanji (satz, stelle) .
output mode behandeln :
SELECT output mode OF
CASE no output : im markiermode markierung anpassen
CASE out zeichen : zeichen ausgeben; LEAVE output mode behandeln
CASE out feldrest : feldrest neu schreiben
CASE out feld : feldout (satz, stelle)
CASE clear feldrest : feldrest loeschen
END SELECT;
schreibmarke positionieren (stelle) .
ausgabe verhindern : output mode := no output .
im markiermode markierung anpassen :
IF markiert THEN markierung anpassen FI .
markierung anpassen :
IF stelle > alte stelle
THEN markierung verlaengern
ELIF stelle < alte stelle
THEN markierung verkuerzen
FI .
markierung verlaengern :
invers out (satz, alte stelle, stelle, "", end mark) .
markierung verkuerzen :
invers out (satz, stelle, alte stelle, end mark, "") .
zeichen ausgeben :
IF NOT markiert
THEN out (zeichen)
ELIF mark refresh line mode
THEN feldout (satz, stelle); schreibmarke positionieren (stelle)
ELSE out (begin mark); markleft; out (zeichen); out (end mark); markleft
FI .
markleft :
marklength TIMESOUT left .
feldrest neu schreiben :
IF NOT markiert
THEN feldrest unmarkiert neu schreiben
ELSE feldrest markiert neu schreiben
FI ;
WHILE postblanks > 0 CAND x cursor <= rand + laenge REP
out (blank); postblanks DECR 1
PER ; postblanks := 0 .
feldrest unmarkiert neu schreiben :
schreibmarke positionieren (alte stelle);
out subtext mit randbehandlung (satz, alte stelle, stelle am ende) .
feldrest markiert neu schreiben :
markierung verlaengern; out subtext mit randbehandlung
(satz, stelle, stelle am ende - 2 * marklength) .
kommando annehmen und ausfuehren :
kommando annehmen; kommando ausfuehren .
kommando annehmen :
getchar (zeichen); kommando zurueckweisen falls noetig .
kommando zurueckweisen falls noetig :
IF NOT write access CAND zeichen ist druckbar
THEN benutzer warnen; kommando ignorieren
FI .
benutzer warnen : out (piep) .
kommando ignorieren :
zeichen := ""; LEAVE kommando annehmen und ausfuehren .
kommando ausfuehren :
neue satzlaenge bestimmen;
alte stelle merken;
IF zeichen ist separator
THEN feldeditor verlassen
ELIF zeichen ist druckbar
THEN fortschreiben
ELSE funktionstasten behandeln
FI .
neue satzlaenge bestimmen : INT VAR satzlaenge := LENGTH satz .
feldeditor verlassen :
IF NOT absatzmarke steht THEN blanks abschneiden FI; (*sh*)
push (zeichen); LEAVE feld editieren .
blanks abschneiden :
INT VAR letzte non blank pos := satzlaenge;
WHILE letzte non blank pos > 0 CAND (satz SUB letzte non blank pos) = blank REP
letzte non blank pos DECR 1
PER; satz := subtext (satz, 1, letzte non blank pos) .
zeichen ist druckbar : zeichen >= blank .
zeichen ist separator :
separator eingestellt CAND pos (separator, zeichen) > 0 .
fortschreiben :
zeichen in satz eintragen;
IF is kanji esc (zeichen) THEN kanji zeichen schreiben FI;
bei erreichen von limit ueberlauf behandeln .
zeichen in satz eintragen :
IF hinter dem satz
THEN satz mit leerzeichen auffuellen und zeichen anfuegen
ELIF einfuegen
THEN zeichen vor aktueller position einfuegen
ELSE altes zeichen ersetzen
FI .
hinter dem satz : stelle > satzlaenge .
satz mit leerzeichen auffuellen und zeichen anfuegen :
satz AUFFUELLENMIT blank;
zeichen anfuegen;
output mode := out zeichen .
zeichen anfuegen : satz CAT zeichen; neue satzlaenge bestimmen .
zeichen ignorieren : benutzer warnen; LEAVE kommando ausfuehren .
zeichen vor aktueller position einfuegen :
insert char (satz, zeichen, stelle);
neue satzlaenge bestimmen;
output mode := out feldrest .
altes zeichen ersetzen :
replace (satz, stelle, zeichen);
IF stelle auf erstem halbzeichen
THEN output mode := out feldrest; replace (satz, stelle + 1, blank)
ELSE output mode := out zeichen
FI .
kanji zeichen schreiben :
alte stelle merken;
stelle INCR 1; getchar (zeichen);
IF zeichen < ""64"" THEN zeichen := ""64"" FI;
IF hinter dem satz
THEN zeichen anfuegen
ELIF einfuegen
THEN zeichen vor aktueller position einfuegen
ELSE replace (satz, stelle, zeichen)
FI ;
output mode := out feldrest .
bei erreichen von limit ueberlauf behandeln : (*sh*)
IF satzlaenge kritisch
THEN in naechste zeile falls moeglich
ELSE stelle INCR 1
FI .
satzlaenge kritisch :
IF stelle >= satzlaenge
THEN satzlaenge = limit
ELSE satzlaenge = limit + 1
FI .
in naechste zeile falls moeglich :
IF fliesstext AND umbruch moeglich OR NOT fliesstext AND stelle >= satzlaenge
THEN in naechste zeile
ELSE stelle INCR 1
FI .
umbruch moeglich :
INT CONST st := stelle; stelle := limit;
INT CONST ltzt wortanf := letzter wortanfang (satz);
stelle := st; einrueckposition (satz) < ltzt wortanf .
in naechste zeile :
IF fliesstext
THEN ueberlauf und oder umbruch
ELSE ueberlauf ohne umbruch
FI .
ueberlauf und oder umbruch :
INT VAR umbruchpos := 1;
umbruchposition bestimmen;
loeschposition bestimmen;
IF stelle = satzlaenge
THEN ueberlauf mit oder ohne umbruch
ELSE umbruch mit oder ohne ueberlauf
FI .
umbruchposition bestimmen :
umbruchstelle := stelle;
stelle := satzlaenge;
umbruchpos := max (umbruchpos, letzter wortanfang (satz));
stelle := umbruchstelle .
loeschposition bestimmen :
INT VAR loeschpos := umbruchpos;
WHILE davor noch blank REP loeschpos DECR 1 PER .
davor noch blank :
loeschpos > ganz links CAND (satz SUB (loeschpos - 1)) = blank .
ganz links : max (1, marke) .
ueberlauf mit oder ohne umbruch :
IF zeichen = blank OR loeschpos = ganz links
THEN stelle := 1; ueberlauf ohne umbruch
ELSE ueberlauf mit umbruch
FI .
ueberlauf ohne umbruch : push (cr) .
ueberlauf mit umbruch :
ausgabe verhindern;
umbruchkommando aufbereiten;
auf loeschposition positionieren .
umbruchkommando aufbereiten :
zeichen := hop + rubout + inscr;
satzrest := subtext (satz, umbruchpos);
zeichen CAT satzrest;
IF stelle ist im umgebrochenen teil
THEN insert char (zeichen, backcr, max (stelle - umbruchpos + 1, 0) + 4);
zeichen CAT backcr
FI ;
push (zeichen) .
stelle ist im umgebrochenen teil : stelle >= loeschpos .
auf loeschposition positionieren : stelle := loeschpos .
umbruch mit oder ohne ueberlauf :
umbruchposition anpassen;
IF stelle ist im umgebrochenen teil
THEN umbruch mit ueberlauf
ELSE umbruch ohne ueberlauf
FI .
umbruchposition anpassen :
IF zeichen = blank
THEN umbruchpos := stelle + 1;
umbruchposition bestimmen;
neue loeschposition bestimmen
FI .
neue loeschposition bestimmen :
loeschpos := umbruchpos;
WHILE davor noch blank AND stelle noch nicht erreicht REP loeschpos DECR 1 PER .
stelle noch nicht erreicht : loeschpos > stelle + 1 .
umbruch mit ueberlauf : ueberlauf mit umbruch .
umbruch ohne ueberlauf :
zeichen := inscr;
satzrest := subtext (satz, umbruchpos);
zeichen CAT satzrest;
zeichen CAT up char + backcr;
umbruchstelle INCR 1; umbruch verschoben := verschoben;
satz := subtext (satz, 1, loeschpos - 1);
schreibmarke positionieren (loeschpos); feldrest loeschen;
output mode := out feldrest;
push (zeichen) .
funktionstasten behandeln :
SELECT pos (kommandos, zeichen) OF
CASE c hop : hop kommandos behandeln
CASE c esc : esc kommandos behandeln
CASE c right : nach rechts oder ueberlauf
CASE c left : wenn moeglich ein schritt nach links
CASE c tab : zur naechsten tabulator position
CASE c dezimal : dezimalen schreiben
CASE c rubin : einfuegen umschalten
CASE c rubout : ein zeichen loeschen
CASE c abscr, c inscr, c down : feldeditor verlassen
CASE c up : eine zeile nach oben (*sh*)
CASE c cr : ggf absatz erzeugen
CASE c mark : markieren umschalten
CASE c backcr : zurueck zur umbruchstelle
OTHERWISE : sondertaste behandeln
END SELECT .
kommandos :
LET c hop = 1, c right = 2,
c up = 3, c left = 4,
c tab = 5, c down = 6,
c rubin = 7, c rubout = 8,
c cr = 9, c mark = 10,
c abscr = 11, c inscr = 12,
c dezimal = 13, c esc = 14,
c backcr = 15;
""1""2""3""8""9""10""11""12""13""16""17""18""19""27""20"" .
dezimalen schreiben : IF write access THEN dezimaleditor (satz) FI .
zurueck zur umbruchstelle:
IF umbruch stelle > 0 THEN stelle := umbruch stelle FI;
IF verschoben <> umbruch verschoben
THEN verschoben := umbruch verschoben; output mode := out feld
FI .
hop kommandos behandeln :
TEXT VAR zweites zeichen; getchar (zweites zeichen);
zeichen CAT zweites zeichen;
SELECT pos (hop kommandos, zweites zeichen) OF
CASE h hop : nach links oben
CASE h right : nach rechts blaettern
CASE h left : nach links blaettern
CASE h tab : tab position definieren oder loeschen
CASE h rubin : zeile splitten
CASE h rubout : loeschen oder rekombinieren
CASE h cr, h up, h down : feldeditor verlassen
OTHERWISE : zeichen ignorieren
END SELECT .
hop kommandos :
LET h hop = 1, h right = 2,
h up = 3, h left = 4,
h tab = 5, h down = 6,
h rubin = 7, h rubout = 8,
h cr = 9;
""1""2""3""8""9""10""11""12""13"" .
nach links oben :
stelle := max (marke, anfang) + verschoben; feldeditor verlassen .
nach rechts blaettern :
INT CONST rechter rand := stelle am ende - markierausgleich;
IF stelle ist am rechten rand
THEN stelle INCR laenge - 2 * markierausgleich + ausgleich fuer doppelzeichen
ELSE stelle := rechter rand
FI ;
IF satzlaenge <= limit THEN stelle := min (stelle, limit) FI;
alte einrueckposition mitziehen .
stelle ist am rechten rand :
stelle auf erstem halbzeichen CAND stelle = rechter rand - 1
COR stelle = rechter rand .
ausgleich fuer doppelzeichen : stelle - rechter rand .
nach links blaettern :
INT CONST linker rand := stelle am anfang;
IF stelle = linker rand
THEN stelle DECR laenge - 2 * markierausgleich
ELSE stelle := linker rand
FI ;
stelle := max (ganz links, stelle);
alte einrueckposition mitziehen .
tab position definieren oder loeschen :
IF stelle > LENGTH tabulator
THEN tabulator AUFFUELLENMIT right; tabulator CAT dach
ELSE replace (tabulator, stelle, neues tab zeichen)
FI ;
feldeditor verlassen .
neues tab zeichen :
IF (tabulator SUB stelle) = right THEN dach ELSE right FI .
zeile splitten :
IF write access THEN feldeditor verlassen ELSE zeichen ignorieren FI .
loeschen oder rekombinieren :
IF NOT write access
THEN zeichen ignorieren
ELIF hinter dem satz
THEN zeilen rekombinieren
ELIF auf erstem zeichen
THEN ganze zeile loeschen
ELSE zeilenrest loeschen
FI .
zeilen rekombinieren : feldeditor verlassen .
auf erstem zeichen : stelle = 1 .
ganze zeile loeschen : satz := ""; feldeditor verlassen .
zeilenrest loeschen :
change (satz, stelle, satzlaenge, "");
output mode := clear feldrest .
esc kommandos behandeln :
getchar (zweites zeichen);
zeichen CAT zweites zeichen;
auf exit pruefen;
SELECT pos (esc kommandos, zweites zeichen) OF
CASE e hop : lernmodus umschalten
CASE e right : zum naechsten wort
CASE e left : zum vorigen wort
OTHERWISE : belegte taste ausfuehren
END SELECT .
auf exit pruefen :
IF pos (res, zweites zeichen) > 0 THEN feldeditor verlassen FI .
esc kommandos :
LET e hop = 1,
e right = 2,
e left = 3;
""1""2""8"" .
lernmodus umschalten :
IF lernmodus THEN lernmodus ausschalten ELSE lernmodus einschalten FI;
feldeditor verlassen .
lernmodus ausschalten :
lernmodus := FALSE;
belegbare taste erfragen;
audit := subtext (audit, 1, LENGTH audit - 2);
IF taste = hop
THEN (* lernsequenz nicht auf taste legen *) (* 16.08.85 -ws- *)
ELSE lernsequenz auf taste legen (taste, audit)
FI ;
audit := "" .
belegbare taste erfragen :
TEXT VAR taste; getchar (taste);
WHILE taste ist reserviert REP
benutzer warnen; getchar (taste)
PER .
taste ist reserviert : (* 16.08.85 -ws- *)
taste <> hop CAND pos (reservierte feldeditor tasten, taste) > 0 .
lernmodus einschalten : audit := ""; lernmodus := TRUE .
zum vorigen wort :
IF stelle > 1
THEN stelle DECR 1; stelle := letzter wortanfang (satz);
alte einrueckposition mitziehen;
IF (satz SUB stelle) <> blank THEN LEAVE zum vorigen wort FI
FI ;
feldeditor verlassen .
zum naechsten wort :
IF kein naechstes wort THEN feldeditor verlassen FI .
kein naechstes wort :
BOOL VAR im alten wort := TRUE;
INT VAR i;
FOR i FROM stelle UPTO satzlaenge REP
IF im alten wort
THEN im alten wort := (satz SUB i) <> blank
ELIF (satz SUB i) <> blank
THEN stelle := i; LEAVE kein naechstes wort WITH FALSE
FI
PER;
TRUE .
belegte taste ausfuehren :
IF ist kommando taste
THEN feldeditor verlassen
ELSE gelerntes ausfuehren
FI .
ist kommando taste : taste enthaelt kommando (zweites zeichen) .
gelerntes ausfuehren :
push (lernsequenz auf taste (zweites zeichen)) . (*sh*)
nach rechts oder ueberlauf :
IF fliesstext COR stelle < limit OR satzlaenge > limit
THEN nach rechts
ELSE auf anfang der naechsten zeile
FI .
nach rechts :
IF stelle auf erstem halbzeichen THEN stelle INCR 2 ELSE stelle INCR 1 FI;
alte einrueckposition mitziehen .
auf anfang der naechsten zeile : push (abscr) .
nach links : stelle DECR 1; alte einrueckposition mitziehen .
alte einrueckposition mitziehen :
IF satz ist leerzeile
THEN alte einrueckposition := stelle
ELSE alte einrueckposition := min (stelle, einrueckposition (satz))
FI .
satz ist leerzeile :
satz = "" OR satz = blank .
wenn moeglich ein schritt nach links :
IF stelle = ganz links
THEN zeichen ignorieren
ELSE nach links
FI .
zur naechsten tabulator position :
bestimme naechste explizite tabulator position;
IF tabulator gefunden
THEN explizit tabulieren
ELIF stelle <= satzlaenge
THEN implizit tabulieren
ELSE auf anfang der naechsten zeile
FI .
bestimme naechste explizite tabulator position :
INT VAR tab position := pos (tabulator, dach, stelle + 1);
IF tab position > limit AND satzlaenge <= limit
THEN tab position := 0
FI .
tabulator gefunden : tab position <> 0 .
explizit tabulieren : stelle := tab position; push (dezimal) .
implizit tabulieren :
tab position := einrueckposition (satz);
IF stelle < tab position
THEN stelle := tab position
ELSE stelle := satzlaenge + 1
FI .
einfuegen umschalten :
IF NOT write access THEN zeichen ignorieren FI; (*sh*)
einfuegen := NOT einfuegen;
IF einfuegen THEN einfuegen optisch anzeigen FI;
feldeditor verlassen .
einfuegen optisch anzeigen :
IF markiert
THEN out (begin mark); markleft; out (dach left); warten;
out (end mark); markleft
ELSE out (dach left); warten;
IF stelle auf erstem halbzeichen
THEN out text (satz, stelle, stelle + 1)
ELSE out text (satz, stelle, stelle)
FI
FI .
markiert : marke > 0 .
dach left : ""94""8"" .
warten :
TEXT VAR t := incharety (2);
kommando CAT t; IF lernmodus THEN audit CAT t FI .
ein zeichen loeschen :
IF NOT write access THEN zeichen ignorieren FI; (*sh*)
IF zeichen davor soll geloescht werden
THEN nach links oder ignorieren
FI ;
IF NOT hinter dem satz THEN aktuelles zeichen loeschen FI .
zeichen davor soll geloescht werden :
hinter dem satz COR markiert .
nach links oder ignorieren :
IF stelle > ganz links
THEN nach links (*sh*)
ELSE zeichen ignorieren
FI .
aktuelles zeichen loeschen :
stelle korrigieren; alte stelle merken;
IF stelle auf erstem halbzeichen
THEN delete char (satz, stelle);
postblanks INCR 1
FI ;
delete char (satz, stelle);
postblanks INCR 1;
neue satzlaenge bestimmen;
output mode := out feldrest .
eine zeile nach oben : (*sh*)
IF NOT absatzmarke steht CAND NOT ist teil eines umbruchkommandos
THEN blanks abschneiden
FI ;
push (zeichen); LEAVE feld editieren .
ist teil eines umbruchkommandos : (kommando SUB kommandozeiger) = backcr .
ggf absatz erzeugen : (*sh*)
IF write access
THEN IF NOT absatzmarke steht THEN blanks abschneiden FI;
IF stelle > LENGTH satz AND fliesstext AND NOT absatzmarke steht
THEN satz CAT blank
FI
FI ; push (zeichen); LEAVE feld editieren .
markieren umschalten :
IF markiert
THEN marke := 0; maxschreibpos INCR marklength; cpos DECR marklength
ELSE marke := stelle; maxschreibpos DECR marklength; cpos INCR marklength;
verschieben wenn erforderlich
FI ;
feldeditor verlassen .
sondertaste behandeln : push (esc + zeichen) .
END PROC feldeditor;
PROC dezimaleditor (TEXT VAR satz) :
INT VAR dezimalanfang := stelle;
zeichen einlesen;
IF dezimalstartzeichen CAND ueberschreibbar THEN dezimalen schreiben FI;
push (zeichen) .
zeichen einlesen : TEXT VAR zeichen; getchar (zeichen) .
dezimalzeichen : pos (dezimalen, zeichen) > 0 AND nicht separator .
dezimalstartzeichen : pos (startdezimalen, zeichen) > 0 AND nicht separator .
dezimalen : "0123456789" .
startdezimalen : "+-0123456789" .
nicht separator : pos (separator, zeichen) = 0 .
ueberschreibbar :
dezimalanfang > LENGTH satz OR
pos (ueberschreibbare zeichen, satz SUB dezimalanfang) > 0 .
ueberschreibbare zeichen : " ,.+-0123456789" .
dezimalen schreiben :
REP
dezimale in satz eintragen;
dezimalen zeigen;
zeichen einlesen;
dezimalanfang DECR 1
UNTIL dezimaleditor beendet PER;
stelle INCR 1 .
dezimale in satz eintragen :
IF dezimalanfang > LENGTH satz
THEN satz AUFFUELLENMIT blank; satz CAT zeichen
ELSE delete char (satz, dezimalanfang); insert char (satz, zeichen, stelle)
FI .
dezimalen zeigen :
INT VAR min dezimalschreibpos := max (min schreibpos, dezimalanfang);
IF markiert THEN markiert zeigen ELSE unmarkiert zeigen FI;
schreibmarke positionieren (stelle) .
markiert : marke > 0 .
markiert zeigen :
invers out (satz, min dezimalschreibpos, stelle, "", end mark);
out (zeichen) .
unmarkiert zeigen :
schreibmarke positionieren (min dezimalschreibpos);
out subtext (satz, min dezimalschreibpos, stelle) .
dezimaleditor beendet :
NOT dezimalzeichen OR
dezimalanfang < max (min schreibpos, marke) OR
NOT ueberschreibbar .
END PROC dezimaleditor;
BOOL PROC is editget :
editget modus
END PROC is editget ;
PROC get editline (TEXT VAR editline, INT VAR editpos, editmarke) :
IF editget modus
THEN editline := alter editsatz;
editpos := stelle
FI ;
editmarke := marke
END PROC get editline;
PROC put editline (TEXT CONST editline, INT CONST editpos, editmarke) :
IF editget modus
THEN alter editsatz := editline;
stelle := max (editpos, 1);
marke := max (editmarke, 0)
FI
END PROC put editline;
BOOL PROC within kanji (TEXT CONST satz, INT CONST stelle) :
count directly prefixing kanji esc bytes;
number of kanji esc bytes is odd .
count directly prefixing kanji esc bytes :
INT VAR pos := stelle - 1, kanji esc bytes := 0;
WHILE pos > 0 CAND is kanji esc (satz SUB pos) REP
kanji esc bytes INCR 1; pos DECR 1
PER .
number of kanji esc bytes is odd :
(kanji esc bytes AND 1) <> 0 .
END PROC within kanji;
BOOL PROC is kanji esc (TEXT CONST char) : (*sh*)
two byte mode CAND
(char >= ""129"" AND char <= ""159"" OR char >= ""224"" AND char <= ""239"")
END PROC is kanji esc;
BOOL PROC two bytes : two byte mode END PROC two bytes;
PROC two bytes (BOOL CONST new mode) :
two byte mode := new mode
END PROC two bytes;
PROC outtext (TEXT CONST source, INT CONST from, to) :
out subtext mit randbehandlung (source, from, to);
INT VAR trailing;
IF from <= LENGTH source
THEN trailing := to - LENGTH source
ELSE trailing := to - from + 1
FI ; trailing TIMESOUT blank
END PROC outtext;
PROC out subtext mit randbehandlung (TEXT CONST satz, INT CONST von, bis) :
IF von > bis
THEN
ELIF bis >= LENGTH satz COR NOT within kanji (satz, bis + 1)
THEN out subtext mit anfangsbehandlung (satz, von, bis)
ELSE out subtext mit anfangsbehandlung (satz, von, bis - 1); out (blank)
FI
END PROC out subtext mit randbehandlung;
PROC out subtext mit anfangsbehandlung (TEXT CONST satz, INT CONST von, bis) :
IF von > bis
THEN
ELIF von = 1 COR NOT within kanji (satz, von)
THEN out subtext (satz, von, bis)
ELSE out (blank); out subtext (satz, von + 1, bis)
FI
END PROC out subtext mit anfangsbehandlung;
PROC get cursor : get cursor (spalte, zeile) END PROC get cursor;
INT PROC x cursor : get cursor; spalte END PROC x cursor;
BOOL PROC write permission : write access END PROC write permission;
PROC push (TEXT CONST ausfuehrkommando) :
IF ausfuehrkommando = "" (*sh*)
THEN
ELIF kommando = ""
THEN kommando := ausfuehrkommando
ELIF (kommando SUB kommando zeiger - 1) = ausfuehrkommando
THEN kommando zeiger DECR 1
ELIF replace moeglich
THEN kommando zeiger DECR laenge des ausfuehrkommandos;
replace (kommando, kommando zeiger, ausfuehrkommando)
ELSE insert char (kommando, ausfuehrkommando, kommando zeiger)
FI .
replace moeglich :
INT CONST laenge des ausfuehrkommandos := LENGTH ausfuehrkommando;
kommando zeiger > laenge des ausfuehrkommandos .
END PROC push;
PROC type (TEXT CONST ausfuehrkommando) :
kommando CAT ausfuehrkommando
END PROC type;
INT PROC stelle am anfang : anfang + verschoben END PROC stelle am anfang;
INT PROC stelle am ende : stelle am anfang+laenge-1 END PROC stelle am ende;
INT PROC markierausgleich : SIGN marke * marklength END PROC markierausgleich;
PROC verschieben wenn erforderlich :
IF stelle > max schreibpos
THEN verschiebe (stelle - max schreibpos)
ELIF stelle < min schreibpos
THEN verschiebe (stelle - min schreibpos)
FI
END PROC verschieben wenn erforderlich;
PROC verschiebe (INT CONST i) :
verschoben INCR i;
min schreibpos INCR i;
max schreibpos INCR i;
cpos DECR i;
output mode := out feld;
schreibmarke positionieren (stelle) (* 11.05.85 -ws- *)
END PROC verschiebe;
PROC konstanten neu berechnen :
min schreibpos := anfang + verschoben;
IF min schreibpos < 0 (* 17.05.85 -ws- *)
THEN min schreibpos DECR verschoben; verschoben := 0
FI ;
max schreibpos := min schreibpos + laenge - 1 - markierausgleich;
cpos := rand + laenge - max schreibpos
END PROC konstanten neu berechnen;
PROC schreibmarke positionieren (INT CONST sstelle) :
cursor (cpos + sstelle, zeile)
END PROC schreibmarke positionieren;
PROC simple feldout (TEXT CONST satz, INT CONST dummy) :
(* PRECONDITION : NOT markiert AND verschoben = 0 *)
(* AND feldrest schon geloescht *)
schreibmarke an feldanfang positionieren;
out subtext mit randbehandlung (satz, anfang, anfang + laenge - 1);
IF (satz SUB LENGTH satz) = blank THEN absatzmarke schreiben (TRUE) FI .
schreibmarke an feldanfang positionieren : cursor (rand + 1, zeile) .
END PROC simple feldout;
PROC feldout (TEXT CONST satz, INT CONST sstelle) :
schreibmarke an feldanfang positionieren;
feld ausgeben;
feldrest loeschen;
IF (satz SUB LENGTH satz) = blank THEN absatzmarke schreiben (TRUE) FI .
schreibmarke an feldanfang positionieren : cursor (rand + 1, zeile) .
feld ausgeben :
INT VAR von := anfang + verschoben, bis := von + laenge - 1;
IF nicht markiert
THEN unmarkiert ausgeben
ELIF markiertes nicht sichtbar
THEN unmarkiert ausgeben
ELSE markiert ausgeben
FI .
nicht markiert : marke <= 0 .
markiertes nicht sichtbar :
bis DECR marklength * (1 + SIGN sstelle); marke > bis + 1 .
unmarkiert ausgeben :
out subtext mit randbehandlung (satz, von, bis) .
markiert ausgeben :
INT VAR smarke := max (von, marke);
out text (satz, von, smarke - 1); out (begin mark);
verschiedene feldout modes behandeln .
verschiedene feldout modes behandeln :
IF sstelle = 0
THEN out subtext mit randbehandlung (satz, smarke, bis); out (end mark)
ELSE out text (satz, smarke, zeilenrand); out (end mark); (*sh*)
out subtext mit randbehandlung (satz, sstelle, bis)
FI .
zeilenrand : min (bis, sstelle - 1) .
END PROC feldout;
PROC absatzmarke schreiben (BOOL CONST schreiben) :
IF fliesstext AND nicht markiert
THEN cursor (rand + 1 + laenge, zeile);
out (absatzmarke) ;
absatzmarke steht := TRUE
FI .
nicht markiert : marke <= 0 .
absatzmarke :
IF NOT schreiben
THEN " "
ELIF marklength > 0
THEN ""15""14""
ELSE ""15" "14" "
FI .
END PROC absatzmarke schreiben;
PROC invers out (TEXT CONST satz, INT CONST von, bis, TEXT CONST pre, post) :
IF mark refresh line mode
THEN feldout (satz, stelle)
ELSE schreibmarke positionieren (von);
out (begin mark); markleft; out (pre);
out text (satz, von, bis - 1); out (post)
FI .
markleft :
marklength TIMESOUT left .
END PROC invers out;
PROC feldrest loeschen :
IF rand + laenge < maxbreite COR invertierte darstellung
THEN INT VAR x; get cursor (x, zeile);
(rand + laenge - x + 1 + absatz ausgleich) TIMESOUT blank; (*sh*)
cursor (x, zeile)
ELSE out (clear eol); absatzmarke steht := FALSE
FI
END PROC feldrest loeschen;
OP AUFFUELLENMIT (TEXT VAR satz, TEXT CONST fuellzeichen) :
INT VAR i;
FOR i FROM stelle - LENGTH satz DOWNTO 2 REP
satz CAT fuellzeichen
PER
END OP AUFFUELLENMIT;
INT PROC einrueckposition (TEXT CONST satz) : (*sh*)
IF fliesstext AND satz = blank
THEN anfang
ELSE max (pos (satz, ""33"", ""254"", 1), 1)
FI
END PROC einrueckposition;
INT PROC letzter wortanfang (TEXT CONST satz) : (*sh*)
INT CONST ganz links := max (1, marke);
BOOL VAR noch nicht im neuen wort := TRUE;
INT VAR i;
FOR i FROM stelle DOWNTO ganz links REP
IF noch nicht im neuen wort
THEN noch nicht im neuen wort := char = blank
ELIF is kanji esc (char)
THEN LEAVE letzter wortanfang WITH i
ELIF nicht mehr im neuen wort
THEN LEAVE letzter wortanfang WITH i + 1
FI
PER ;
ganz links .
char : satz SUB i .
nicht mehr im neuen wort : char = blank COR within kanji (satz, i) .
END PROC letzter wortanfang;
PROC getchar (TEXT VAR zeichen) :
IF kommando = ""
THEN inchar (zeichen); IF lernmodus THEN audit CAT zeichen FI
ELSE zeichen := kommando SUB kommando zeiger;
kommando zeiger INCR 1;
IF kommando zeiger > LENGTH kommando
THEN kommando zeiger := 1; kommando := ""
FI ;
IF LENGTH kommando - kommando zeiger < 3
THEN kommando CAT inchety
FI
FI .
END PROC getchar;
TEXT PROC inchety :
IF lernmodus
THEN TEXT VAR t := incharety; audit CAT t; t
ELSE incharety
FI
END PROC inchety;
BOOL PROC is incharety (TEXT CONST muster) :
IF kommando = ""
THEN TEXT CONST t := inchety;
IF t = muster THEN TRUE ELSE kommando := t; FALSE FI
ELIF (kommando SUB kommando zeiger) = muster
THEN kommando zeiger INCR 1;
IF kommando zeiger > LENGTH kommando
THEN kommando zeiger := 1; kommando := ""
FI ;
TRUE
ELSE FALSE
FI
END PROC is incharety;
TEXT PROC getcharety :
IF kommando = ""
THEN inchety
ELSE TEXT CONST t := kommando SUB kommando zeiger;
kommando zeiger INCR 1;
IF kommando zeiger > LENGTH kommando
THEN kommando zeiger := 1; kommando := ""
FI ; t
FI
END PROC getcharety;
PROC get editcursor (INT VAR x, y) : (*sh*)
IF actual editor > 0 THEN aktualisiere bildparameter FI;
x := rand - (anfang + verschoben - 1 - markierausgleich) + stelle;
y := zeile .
aktualisiere bildparameter :
INT VAR old x, old y; get cursor (old x, old y);
dateizustand holen; bildausgabe steuern; satznr zeigen;
fenster zeigen; zeile := bildrand + zeilennr; cursor (old x, old y) .
END PROC get editcursor;
(************************* Zugriff auf Feldstatus *************************).
stelle : feldstatus.stelle .
alte stelle : feldstatus.alte stelle .
rand : feldstatus.rand .
limit : feldstatus.limit .
anfang : feldstatus.anfang .
marke : feldstatus.marke .
laenge : feldstatus.laenge .
verschoben : feldstatus.verschoben .
einfuegen : feldstatus.einfuegen .
fliesstext : feldstatus.fliesstext .
write access : feldstatus.write access .
tabulator : feldstatus.tabulator .
(***************************************************************************)
LET undefinierter bereich = 0, nix = 1,
bildzeile = 2, akt satznr = 2,
abschnitt = 3, ueberschrift = 3,
bild = 4, fehlermeldung = 4;
LET BILDSTATUS = STRUCT (INT feldlaenge, kurze feldlaenge,
bildrand, bildlaenge, kurze bildlaenge,
ueberschriftbereich, bildbereich,
erster neusatz, letzter neusatz,
old zeilennr, old lineno, old mark lineno,
BOOL zeileneinfuegen, old line update,
TEXT satznr pre, ueberschrift pre,
ueberschrift text, ueberschrift post, old satz,
FRANGE old range,
FILE file),
EDITSTATUS = STRUCT (FELDSTATUS feldstatus, BILDSTATUS bildstatus),
max editor = 10,
EDITSTACK = ROW max editor EDITSTATUS;
BILDSTATUS VAR bildstatus ;
EDITSTACK VAR editstack;
ROW max editor INT VAR einrueckstack;
BOOL VAR markiert;
TEXT VAR filename, tab, bildsatz, bildzeichen, fehlertext,
akt bildsatz ;
INT VAR zeilennr, satznr, bildanfang, bildmarke, feldmarke,
actual editor := 0, max used editor := 0,
letzer editor auf dieser datei,
alte einrueckposition := 1;
INT PROC aktueller editor : actual editor END PROC aktueller editor;
INT PROC groesster editor : max used editor END PROC groesster editor;
(****************************** bildeditor *******************************)
PROC bildeditor (TEXT CONST res, PROC (TEXT CONST) kommando interpreter) :
evtl fehler behandeln;
enable stop;
TEXT VAR reservierte tasten := ""11""12""27"bf" ;
reservierte tasten CAT res ;
INT CONST my highest editor := max used editor;
laenge := feldlaenge;
konstanten neu berechnen;
REP
markierung justieren;
altes feld nachbereiten;
feldlaenge einstellen;
ueberschrift zeigen;
fenster zeigen ;
zeile bereitstellen;
zeile editieren;
kommando ausfuehren
PER .
evtl fehler behandeln :
IF is error
THEN fehlertext := errormessage;
IF fehlertext <> "" THEN neu (fehlermeldung, nix) FI;
clear error
ELSE fehlertext := ""
FI .
markierung justieren :
IF bildmarke > 0
THEN IF satznr <= bildmarke
THEN bildmarke := satznr;
stelle := max (stelle, feldmarke);
marke := feldmarke
ELSE marke := 1
FI
FI .
zeile bereitstellen : IF hinter letztem satz THEN insert record (file) FI .
hinter letztem satz : lineno (file) > lines (file) .
altes feld nachbereiten :
IF old line update AND lineno (file) <> old lineno
THEN IF verschoben <> 0
THEN verschoben := 0; konstanten neu berechnen;
FI ;
INT CONST alte zeilennr := old lineno - bildanfang + 1;
IF alte zeilennr > 0 AND alte zeilennr <= aktuelle bildlaenge
THEN INT CONST m := marke;
IF lineno (file) < old lineno
THEN marke := 0
ELIF old lineno = bildmarke
THEN marke := min (feldmarke, LENGTH old satz + 1)
ELSE marke := min (marke, LENGTH old satz + 1)
FI ;
zeile := bildrand + alte zeilennr;
feldout (old satz, 0); marke := m
FI
FI ;
old line update := FALSE; old satz := "" .
feldlaenge einstellen :
INT CONST alte laenge := laenge;
IF zeilennr > kurze bildlaenge
THEN laenge := kurze feldlaenge
ELSE laenge := feldlaenge
FI ;
IF laenge <> alte laenge
THEN konstanten neu berechnen
FI .
zeile editieren :
zeile := bildrand + zeilennr;
exec (PROC (TEXT VAR, TEXT CONST) feldeditor, file, reservierte tasten);
old lineno := satznr;
IF markiert oder verschoben
THEN old line update := TRUE; read record (file, old satz)
FI .
markiert oder verschoben : markiert COR verschoben <> 0 .
kommando ausfuehren :
getchar (bildzeichen);
SELECT pos (kommandos, bildzeichen) OF
CASE x hop : hop kommando verarbeiten
CASE x esc : esc kommando verarbeiten
CASE x up : zum vorigen satz
CASE x down : zum folgenden satz
CASE x rubin : zeicheneinfuegen umschalten
CASE x mark : markierung umschalten
CASE x cr : eingerueckt mit cr (* 08.06.85 -ws- *)
CASE x inscr : eingerueckt zum folgenden satz
CASE x abscr : zum anfang des folgenden satzes
END SELECT .
kommandos :
LET x hop = 1, x up = 2,
x down = 3, x rubin = 4,
x cr = 5, x mark = 6,
x abscr = 7, x inscr = 8,
x esc = 9;
""1""3""10""11""13""16""17""18""27"" .
zeicheneinfuegen umschalten :
rubin segment in ueberschrift eintragen;
neu (ueberschrift, nix) .
rubin segment in ueberschrift eintragen :
replace (ueberschrift text, 9, rubin segment) .
rubin segment :
IF einfuegen THEN "RUBIN" ELSE "....." FI .
hop kommando verarbeiten :
getchar (bildzeichen);
read record (file, bildsatz);
SELECT pos (hop kommandos, bildzeichen) OF
CASE y hop : nach oben
CASE y cr : neue seite
CASE y up : zurueckblaettern
CASE y down : weiterblaettern
CASE y tab : put tabs (file, tabulator); neu (ueberschrift, nix)
CASE y rubout : zeile loeschen
CASE y rubin : zeileneinfuegen umschalten
END SELECT .
hop kommandos :
LET y hop = 1, y up = 2,
y tab = 3, y down = 4,
y rubin = 5, y rubout = 6,
y cr = 7;
""1""3""9""10""11""12""13"" .
zeileneinfuegen umschalten :
zeileneinfuegen := NOT zeileneinfuegen;
IF zeileneinfuegen
THEN zeile aufspalten; logisches eof setzen
ELSE leere zeile am ende loeschen; logisches eof loeschen
FI ; restbild zeigen .
zeile aufspalten :
IF stelle <= LENGTH bildsatz OR stelle = 1
THEN loesche ggf trennende blanks und spalte zeile
FI .
loesche ggf trennende blanks und spalte zeile: (* 26.06.84 -bk- *)
INT VAR first non blank pos := stelle;
WHILE first non blank pos <= length (bildsatz) CAND
(bildsatz SUB first non blank pos) = blank REP
first non blank pos INCR 1
PER ;
split line and indentation; (*sh*)
first non blank pos := stelle - 1;
WHILE first non blank pos >= 1 CAND
(bildsatz SUB first non blank pos) = blank REP
first non blank pos DECR 1
PER;
bildsatz := subtext (bildsatz, 1, first non blank pos);
write record (file, bildsatz) .
split line and indentation :
split line (file, first non blank pos, TRUE) .
logisches eof setzen :
down (file); col (file, 1);
set range (file, 1, 1, old range); up (file) .
leere zeile am ende loeschen :
to line (file, lines (file));
IF len (file) = 0 THEN delete record (file) FI;
to line (file, satznr) .
logisches eof loeschen :
col (file, stelle); set range (file, old range) .
restbild zeigen :
erster neusatz := satznr;
letzter neusatz := bildanfang + bildlaenge - 1;
rest segment in ueberschrift eintragen;
neu (ueberschrift, abschnitt) .
rest segment in ueberschrift eintragen :
replace (ueberschrift text, feldlaenge - 25, rest segment) .
rest segment :
IF zeileneinfuegen THEN "REST" ELSE "...." FI .
esc kommando verarbeiten :
getchar (bildzeichen);
eventuell zeichen zurueckweisen; (* 04.05.85 -ws- *)
IF taste ist reserviert
THEN belegte taste ausfuehren
ELSE fest vordefinierte esc funktion
FI ; ende nach quit .
eventuell zeichen zurueckweisen : (* 04.05.85 -ws- *)
IF NOT write access CAND NOT erlaubte taste
THEN benutzer warnen; LEAVE kommando ausfuehren
FI .
erlaubte taste : pos (zulaessige zeichen, bildzeichen) > 0 .
zulaessige zeichen : res + ""1""2""8""27"bfq" .
benutzer warnen : out (piep) .
ende nach quit :
IF max used editor < my highest editor THEN LEAVE bildeditor FI .
taste ist reserviert : pos (res, bildzeichen) > 0 .
fest vordefinierte esc funktion :
read record (file, bildsatz);
SELECT pos (esc kommandos, bildzeichen) OF
CASE z hop : lernmodus umschalten
CASE z esc : kommandodialog versuchen
CASE z left : zum vorigen wort
CASE z right : zum naechsten wort
CASE z b : bild an aktuelle zeile angleichen
CASE z f : belegte taste ausfuehren
CASE z rubout : markiertes vorsichtig loeschen
CASE z rubin : vorsichtig geloeschtes einfuegen
OTHERWISE : belegte taste ausfuehren
END SELECT .
esc kommandos :
LET z hop = 1, z right = 2,
z left = 3, z rubin = 4,
z rubout = 5, z esc = 6,
z b = 7, z f = 8;
""1""2""8""11""12""27"bf" .
zum vorigen wort :
IF vorgaenger erlaubt
THEN vorgaenger; read record (file, bildsatz);
stelle := LENGTH bildsatz + 1; push (esc + left)
FI .
vorgaenger erlaubt :
satznr > max (1, bildmarke) .
zum naechsten wort :
IF nicht auf letztem satz THEN weitersuchen wenn nicht gefunden FI .
nicht auf letztem satz : line no (file) < lines (file) .
weitersuchen wenn nicht gefunden :
nachfolgenden satz holen;
IF (nachfolgender satz SUB anfang) = blank
THEN push (abscr + esc + right)
ELSE push (abscr)
FI .
nachfolgenden satz holen :
down (file); read record (file, nachfolgender satz); up (file) .
bild an aktuelle zeile angleichen :
anfang INCR verschoben; verschoben := 0;
margin segment in ueberschrift eintragen;
neu (ueberschrift, bild) .
margin segment in ueberschrift eintragen :
replace (ueberschrift text, 2, margin segment) .
margin segment :
IF anfang <= 1
THEN "......"
ELSE TEXT VAR margin text := "M" + text (anfang);
(6 - LENGTH margin text) * "." + margin text
FI .
belegte taste ausfuehren :
kommando analysieren (bildzeichen, PROC(TEXT CONST) kommando interpreter) .
kommandodialog versuchen:
IF fenster ist zu schmal fuer dialog
THEN kommandodialog ablehnen
ELSE kommandodialog fuehren
FI .
fenster ist zu schmal fuer dialog : laenge < 20 .
kommandodialog ablehnen :
fehlertext := "zu schmal fuer ESC ESC"; neu (fehlermeldung, nix) .
kommandodialog fuehren:
INT VAR x0, x1, x2, x3, y;
get cursor (x0, y);
cursor (rand + 1, bildrand + zeilennr);
get cursor (x1, y);
out (begin mark); out (monitor meldung);
get cursor (x2, y);
(laenge - LENGTH monitor meldung - marklength) TIMESOUT blank;
get cursor (x3, y);
out (end mark); out (blank);
kommandozeile editieren;
ueberschrift zeigen;
absatz ausgleich := 2; (*sh*)
IF kommandotext = "" THEN LEAVE kommandodialog fuehren FI;
kommando auf taste legen ("f", kommandotext);
kommando analysieren ("f", PROC(TEXT CONST) kommando interpreter);
IF fehlertext <> ""
THEN push (esc + esc + esc + "k")
ELIF markiert
THEN zeile neu
FI .
kommandozeile editieren :
TEXT VAR kommandotext := "";
cursor (x1, y); out (begin mark);
disable stop;
darstellung invertieren;
editget schleife;
darstellung invertieren;
enable stop;
cursor (x3, y); out (end mark);
exec (PROC (TEXT CONST, INT CONST) feldout, file, stelle);
cursor (x0, y) .
darstellung invertieren :
TEXT VAR dummy := begin mark; begin mark := end mark; end mark := dummy;
invertierte darstellung := NOT invertierte darstellung .
editget schleife :
TEXT VAR exit char;
REP
cursor (x2, y);
editget (kommandotext, max textlength, rand + laenge - x cursor,
"", "k?!", exit char);
neu (ueberschrift, nix);
IF exit char = ""27"k"
THEN kommando text := kommando auf taste ("f")
ELIF exit char = ""27"?"
THEN TEXT VAR taste; getchar (taste);
kommando text := kommando auf taste (taste)
ELIF exit char = ""27"!"
THEN getchar (taste);
IF ist reservierte taste
THEN set busy indicator; (*sh*)
out ("FEHLER: """ + taste + """ ist reserviert"7"")
ELSE kommando auf taste legen (taste, kommandotext);
kommandotext := ""; LEAVE editget schleife
FI
ELSE LEAVE editget schleife
FI
PER .
ist reservierte taste : pos (res, taste) > 0 .
monitor meldung : "gib kommando : " .
neue seite : bildanfang := satznr; zeilennr := 1; neu (akt satznr, bild) .
weiterblaettern :
INT CONST akt bildlaenge := aktuelle bildlaenge;
IF nicht auf letztem satz
THEN erster neusatz := satznr;
IF zeilennr >= akt bildlaenge
THEN bildanfang INCR akt bildlaenge; neu (akt satznr, bild)
FI ;
satznr := min (lines (file), bildanfang + akt bildlaenge - 1);
letzter neusatz := satznr;
toline (file, satznr);
stelle DECR verschoben;
neu (akt satznr, nix);
zeilennr := satznr - bildanfang + 1;
IF markiert THEN neu (nix, abschnitt) FI;
einrueckposition bestimmen
FI .
zurueckblaettern :
IF vorgaenger erlaubt
THEN IF zeilennr <= 1
THEN bildanfang := max (1, bildanfang - aktuelle bildlaenge);
neu (akt satznr, bild)
FI ;
nach oben; einrueckposition bestimmen
FI .
zeile loeschen :
IF stelle = 1
THEN delete record (file);
erster neusatz := satznr;
letzter neusatz := bildanfang + bildlaenge - 1;
neu (nix, abschnitt)
ELSE zeilen rekombinieren
FI .
zeilen rekombinieren :
IF nicht auf letztem satz
THEN aktuellen satz mit blanks auffuellen;
delete record (file);
nachfolgenden satz lesen;
bildsatz CAT nachfolgender satz ohne fuehrende blanks;
write record (file, bildsatz);
erster neusatz := satznr;
letzter neusatz := bildanfang + bildlaenge - 1;
neu (nix, abschnitt)
FI .
aktuellen satz mit blanks auffuellen :
bildsatz AUFFUELLENMIT blank .
nachfolgenden satz lesen :
TEXT VAR nachfolgender satz;
read record (file, nachfolgender satz) .
nachfolgender satz ohne fuehrende blanks :
satzrest := subtext (nachfolgender satz,
einrueckposition (nachfolgender satz)); satzrest .
zeile aufsplitten :
nachfolgender satz := "";
INT VAR i;
FOR i FROM 2 UPTO min (stelle, einrueckposition (bildsatz)) REP
nachfolgender satz CAT blank
PER;
satzrest := subtext (bildsatz, naechste non blank position);
nachfolgender satz CAT satzrest;
bildsatz := subtext (bildsatz, 1, stelle - 1);
write record (file, bildsatz);
down (file); insert record (file);
write record (file, nachfolgender satz); up (file) .
naechste non blank position :
INT VAR non blank pos := stelle;
WHILE (bildsatz SUB non blank pos) = blank REP
non blank pos INCR 1
PER; non blank pos .
zum vorigen satz :
IF vorgaenger erlaubt THEN vorgaenger; einrueckposition bestimmen FI .
zum folgenden satz : (* 12.09.85 -ws- *)
IF nachfolger erlaubt THEN nachfolger; einrueckposition bestimmen
ELSE col (file, len (file) + 1); neu (nix, nix)
FI .
einrueckposition bestimmen : (* 27.08.85 -ws- *)
read record (file, akt bildsatz);
INT VAR neue einrueckposition := einrueckposition (akt bildsatz);
IF akt bildsatz ist leerzeile
THEN alte einrueckposition := max (stelle, neue einrueckposition)
ELSE alte einrueckposition := min (stelle, neue einrueckposition)
FI .
akt bildsatz ist leerzeile :
akt bildsatz = "" OR akt bildsatz = blank .
zum anfang des folgenden satzes :
IF nachfolger erlaubt THEN nachfolger; stelle := anfang FI .
nachfolger erlaubt :
write access COR nicht auf letztem satz .
eingerueckt mit cr :
IF NOT nachfolger erlaubt THEN LEAVE eingerueckt mit cr FI; (*sh*)
read record (file, bildsatz);
INT VAR epos := einrueckposition (bildsatz);
nachfolger; col (file, 1);
IF eof (file)
THEN IF LENGTH bildsatz <= epos
THEN stelle := alte einrueckposition
ELSE stelle := epos
FI
ELSE read record (file, bildsatz);
stelle := einrueckposition (bildsatz);
IF bildsatz ist leerzeile (* 29.08.85 -ws- *)
THEN stelle := alte einrueckposition;
aktuellen satz mit blanks auffuellen
FI
FI ;
alte einrueckposition := stelle .
bildsatz ist leerzeile :
bildsatz = "" OR bildsatz = blank .
eingerueckt zum folgenden satz : (*sh*)
IF NOT nachfolger erlaubt OR NOT write access
THEN LEAVE eingerueckt zum folgenden satz
FI;
alte einrueckposition merken;
naechsten satz holen;
neue einrueckposition bestimmen;
alte einrueckposition := stelle .
alte einrueckposition merken :
read record (file, bildsatz);
epos := einrueckposition (bildsatz);
auf aufzaehlung pruefen;
IF epos > LENGTH bildsatz THEN epos := anfang FI.
auf aufzaehlung pruefen :
BOOL CONST aufzaehlung gefunden :=
ist aufzaehlung CAND vorher absatzzeile CAND wort folgt;
IF aufzaehlung gefunden THEN epos := anfang des naechsten wortes FI .
ist aufzaehlung :
INT CONST wortende := pos (bildsatz, blank, epos, epos + 20) - 1;
SELECT pos ("-*).:" , bildsatz SUB wortende) OF
CASE 1,2 : wortende = epos
CASE 3,4 : wortende <= epos + 7
CASE 5 : TRUE
OTHERWISE: FALSE
ENDSELECT .
vorher absatzzeile :
IF satznr = 1
THEN TRUE
ELSE up (file);
INT CONST vorige satzlaenge := len (file);
BOOL CONST vorher war absatzzeile :=
subtext (file, vorige satzlaenge, vorige satzlaenge) = blank;
down (file); vorher war absatzzeile
FI .
wort folgt :
INT CONST anfang des naechsten wortes :=
pos (bildsatz, ""33"", ""254"", wortende + 1);
anfang des naechsten wortes > wortende .
naechsten satz holen :
nachfolger; col (file, 1);
IF eof (file)
THEN bildsatz := ""
ELSE IF neue zeile einfuegen erforderlich
THEN insert record (file); bildsatz := "";
letzter neusatz := bildanfang + bildlaenge - 1
ELSE read record (file, bildsatz);
letzter neusatz := satznr;
ggf trennungen zurueckwandeln und umbruch indikator einfuegen
FI ;
erster neusatz := satznr;
neu (nix, abschnitt)
FI .
neue zeile einfuegen erforderlich :
BOOL CONST war absatz := war absatzzeile;
war absatz COR neuer satz ist zu lang .
war absatzzeile :
INT VAR wl := pos (kommando, up backcr, kommando zeiger);
wl = 0 COR (kommando SUB (wl - 1)) = blank .
neuer satz ist zu lang : laenge des neuen satzes >= limit .
laenge des neuen satzes :
IF len (file) > 0
THEN len (file) + wl
ELSE wl + epos
FI .
up backcr : ""3""20"" .
ggf trennungen zurueckwandeln und umbruch indikator einfuegen :
LET trenn k = ""220"",
trenn strich = ""221"";
TEXT VAR umbruch indikator;
IF letztes zeichen ist trenn strich
THEN entferne trenn strich;
IF letztes zeichen = trenn k
THEN wandle trenn k um
FI ;
umbruch indikator := up backcr
ELIF letztes umgebrochenes zeichen ist kanji
THEN umbruch indikator := up backcr
ELSE umbruch indikator := blank + up backcr
FI ;
change (kommando, wl, wl+1, umbruch indikator) .
letztes umgebrochenes zeichen ist kanji : within kanji (kommando, wl-1) .
letztes zeichen ist trenn strich :
TEXT CONST last char := letztes zeichen;
last char = trenn strich COR
last char = "-" CAND wl > 2 CAND (kommando SUB (wl-2)) <> blank .
letztes zeichen : kommando SUB (wl-1) .
entferne trenn strich : delete char (kommando, wl-1); wl DECR 1 .
wandle trenn k um : replace (kommando, wl-1, "c") .
loesche indikator : delete char (kommando, wl) .
neue einrueckposition bestimmen :
IF aufzaehlung gefunden CAND bildsatz ist leerzeile
THEN stelle := epos
ELIF NOT bildsatz ist leerzeile
THEN stelle := einrueckposition (bildsatz)
ELIF war absatz COR auf letztem satz
THEN stelle := epos
ELSE down (file); read record (file, nachfolgender satz);
up (file); stelle := einrueckposition (nachfolgender satz)
FI ;
IF ist einfuegender aber nicht induzierter umbruch
THEN loesche indikator;
umbruchstelle := stelle + wl - kommando zeiger - anzahl der stz;
umbruchverschoben := 0
FI .
auf letztem satz : NOT nicht auf letztem satz .
ist einfuegender aber nicht induzierter umbruch :
wl := pos (kommando, backcr, kommando zeiger);
wl > 0 CAND (kommando SUB (wl - 1)) <> up char .
anzahl der stz :
TEXT CONST umgebrochener anfang := subtext (kommando, kommando zeiger, wl-1);
INT VAR anz := 0, anf := pos (umgebrochener anfang, ""1"", ""31"", 1);
WHILE anf > 0 REP
anz INCR 1; anf := pos (umgebrochener anfang, ""1"", ""31"", anf + 1)
PER; anz .
markiertes vorsichtig loeschen :
IF write access CAND markiert
THEN clear removed (file);
IF nur im satz markiert
THEN behandle einen satz
ELSE behandle mehrere saetze
FI
FI .
nur im satz markiert : line no (file) = bildmarke .
behandle einen satz :
insert record (file);
satzrest := subtext (bildsatz, marke, stelle - 1);
write record (file, satzrest);
remove (file, 1);
change (bildsatz, marke, stelle - 1, "");
stelle := marke;
marke := 0; bildmarke := 0; feldmarke := 0;
markiert := FALSE; mark (file, 0, 0);
konstanten neu berechnen;
IF bildsatz = ""
THEN delete record (file);
erster neusatz := satznr;
letzter neusatz := bildanfang + bildlaenge - 1;
neu (nix, abschnitt)
ELSE write record (file, bildsatz);
neu (nix, bildzeile)
FI .
behandle mehrere saetze :
erster neusatz := bildmarke;
letzter neusatz := bildanfang + bildlaenge - 1;
zeile an aktueller stelle auftrennen;
ersten markierten satz an markieranfang aufspalten;
markierten bereich entfernen;
bild anpassen .
zeile an aktueller stelle auftrennen :
INT VAR markierte saetze := line no (file) - bildmarke + 1;
IF nicht am ende der zeile
THEN IF nicht am anfang der zeile
THEN zeile aufsplitten
ELSE up (file); markierte saetze DECR 1
FI
FI .
nicht am anfang der zeile : stelle > 1 .
nicht am ende der zeile : stelle <= LENGTH bildsatz .
ersten markierten satz an markieranfang aufspalten :
to line (file, line no (file) - (markierte saetze - 1));
read record (file, bildsatz);
stelle := feldmarke;
IF nicht am anfang der zeile
THEN IF nicht am ende der zeile
THEN zeile aufsplitten
ELSE markierte saetze DECR 1
FI ;
to line (file, line no (file) + markierte saetze)
ELSE to line (file, line no (file) + markierte saetze - 1)
FI ;
read record (file, bildsatz) .
markierten bereich entfernen :
zeilen nr := line no (file) - markierte saetze - bildanfang + 2;
remove (file, markierte saetze);
marke := 0; bildmarke := 0; feldmarke := 0;
markiert := FALSE; mark (file, 0, 0);
konstanten neu berechnen;
stelle := 1 .
bild anpassen :
satz nr := line no (file);
IF zeilen nr <= 1
THEN bildanfang := line no (file); zeilen nr := 1;
neu (akt satznr, bild)
ELSE neu (akt satznr, abschnitt)
FI .
vorsichtig geloeschtes einfuegen :
IF NOT write access OR removed lines (file) = 0
THEN LEAVE vorsichtig geloeschtes einfuegen
FI ;
IF nur ein satz
THEN in aktuellen satz einfuegen
ELSE aktuellen satz aufbrechen und einfuegen
FI .
nur ein satz : removed lines (file) = 1 .
in aktuellen satz einfuegen :
reinsert (file);
read record (file, nachfolgender satz);
delete record (file);
TEXT VAR t := bildsatz;
bildsatz := subtext (t, 1, stelle - 1);
aktuellen satz mit blanks auffuellen; (*sh*)
bildsatz CAT nachfolgender satz;
satzrest := subtext (t, stelle);
bildsatz CAT satzrest;
write record (file, bildsatz);
stelle INCR LENGTH nachfolgender satz;
neu (nix, bildzeile) .
aktuellen satz aufbrechen und einfuegen :
INT CONST alter bildanfang := bildanfang;
old lineno := satznr;
IF stelle = 1
THEN reinsert (file);
read record (file, bildsatz)
ELIF stelle > LENGTH bildsatz
THEN down (file);
reinsert (file);
read record (file, bildsatz)
ELSE INT VAR von := stelle;
WHILE (bildsatz SUB von) = blank REP von INCR 1 PER;
satzrest := subtext (bildsatz, von, LENGTH bildsatz);
INT VAR bis := stelle - 1;
WHILE (bildsatz SUB bis) = blank REP bis DECR 1 PER;
bildsatz := subtext (bildsatz, 1, bis);
write record (file, bildsatz);
down (file);
reinsert (file);
read record (file, bildsatz);
nachfolgender satz := einrueckposition (bildsatz) * blank;
nachfolgender satz CAT satzrest;
down (file); insert record (file);
write record (file, nachfolgender satz); up (file)
FI ;
stelle := max (1, LENGTH bildsatz); (* 22.06.84 -bk- *)
satz nr := line no (file);
zeilennr INCR satznr - old lineno;
zeilennr := min (zeilennr, aktuelle bildlaenge);
bildanfang := satznr - zeilennr + 1;
IF bildanfang veraendert
THEN abschnitt neu (bildanfang, 9999)
ELSE abschnitt neu (old lineno, 9999)
FI ;
neu (akt satznr, nix).
bildanfang veraendert : bildanfang <> alter bildanfang .
lernmodus umschalten :
learn segment in ueberschrift eintragen; neu (ueberschrift, nix) .
learn segment in ueberschrift eintragen :
replace (ueberschrift text, feldlaenge - 19, learn segment) .
learn segment :
IF lernmodus THEN "LEARN" ELSE "....." FI .
markierung umschalten :
IF markiert THEN markierung ausschalten ELSE markierung einschalten FI .
markierung einschalten :
bildmarke := satznr; feldmarke := marke; markiert := TRUE;
mark (file, bildmarke, feldmarke);
neu (nix, bildzeile) .
markierung ausschalten :
erster neusatz := max (bildmarke, bildanfang);
letzter neusatz := satznr;
bildmarke := 0; feldmarke := 0; markiert := FALSE;
mark (file, 0, 0);
IF erster neusatz = letzter neusatz
THEN neu (nix, bildzeile)
ELSE neu (nix, abschnitt)
FI .
END PROC bildeditor;
PROC neu (INT CONST ue bereich, b bereich) :
ueberschriftbereich := max (ueberschriftbereich, ue bereich);
bildbereich := max (bildbereich, b bereich)
END PROC neu;
PROC nach oben :
letzter neusatz := satznr;
satznr := max (bildanfang, bildmarke);
toline (file, satznr);
stelle DECR verschoben;
zeilennr := satznr - bildanfang + 1;
erster neusatz := satznr;
IF markiert
THEN neu (akt satznr, abschnitt)
ELSE neu (akt satznr, nix)
FI
END PROC nach oben;
INT PROC aktuelle bildlaenge :
IF stelle - stelle am anfang < kurze feldlaenge
AND feldlaenge > 0
THEN bildlaenge (*wk*)
ELSE kurze bildlaenge
FI
END PROC aktuelle bildlaenge;
PROC vorgaenger :
up (file); satznr DECR 1;
marke := 0; stelle DECR verschoben;
IF zeilennr = 1
THEN bildanfang DECR 1; neu (ueberschrift, bild)
ELSE zeilennr DECR 1; neu (akt satznr, nix); (*sh*)
IF markiert THEN neu (nix, bildzeile) FI
FI
END PROC vorgaenger;
PROC nachfolger :
down (file); satznr INCR 1;
stelle DECR verschoben;
IF zeilennr = aktuelle bildlaenge
THEN bildanfang INCR 1;
IF rollup erlaubt
THEN rollup
ELSE neu (ueberschrift, bild)
FI
ELSE neu (akt satznr, nix); zeilennr INCR 1 (*sh*)
FI ;
IF markiert THEN neu (nix, bildzeile) FI .
rollup erlaubt :
kurze bildlaenge = maxlaenge AND kurze feldlaenge = maxbreite .
rollup :
out (down char);
IF bildzeichen = inscr
THEN neu (ueberschrift, nix)
ELIF is cr or down CAND (write access COR nicht auf letztem satz) (*sh*)
THEN neu (nix, bildzeile)
ELSE neu (ueberschrift, bildzeile)
FI .
is cr or down :
IF kommando = "" THEN kommando := inchety FI;
kommando char = down char COR kommando char = cr .
kommando char : kommando SUB kommando zeiger .
nicht auf letztem satz : line no (file) < lines (file) .
END PROC nachfolger;
BOOL PROC next incharety is (TEXT CONST muster) :
INT CONST klen := LENGTH kommando - kommando zeiger + 1,
mlen := LENGTH muster;
INT VAR i; FOR i FROM 1 UPTO mlen - klen REP kommando CAT inchety PER;
subtext (kommando, kommando zeiger, kommando zeiger + mlen - 1) = muster
END PROC next incharety is;
PROC quit last: (* 22.06.84 -bk- *)
IF actual editor > 0 AND actual editor < max used editor
THEN verlasse alle groesseren editoren
FI .
verlasse alle groesseren editoren :
open editor (actual editor + 1); quit .
END PROC quit last;
PROC quit :
IF actual editor > 0 THEN verlasse aktuellen editor FI .
verlasse aktuellen editor :
disable stop;
INT CONST aktueller editor := actual editor;
in innersten editor gehen;
REP
IF zeileneinfuegen THEN hop rubin simulieren FI;
ggf bildschirmdarstellung korrigieren;
innersten editor schliessen
UNTIL aktueller editor > max used editor PER;
actual editor := max used editor .
in innersten editor gehen : open editor (max used editor) .
hop rubin simulieren :
zeileneinfuegen := FALSE;
leere zeilen am dateiende loeschen; (*sh*)
ggf bildschirmdarstellung korrigieren;
logisches eof loeschen .
innersten editor schliessen :
max used editor DECR 1;
IF max used editor > 0
THEN open editor (max used editor);
bildeinschraenkung aufheben
FI .
logisches eof loeschen :
col (file, stelle); set range (file, old range) .
leere zeilen am dateiende loeschen : (* 15.08.85 -ws- *)
satz nr := line no (file) ;
to line (file, lines (file)) ;
WHILE lines (file) > 1 AND bildsatz ist leerzeile REP
delete record (file);
to line (file, lines (file))
PER;
toline (file, satznr) .
bildsatz ist leerzeile :
TEXT VAR bildsatz;
read record (file, bildsatz);
ist leerzeile .
ist leerzeile :
bildsatz = "" OR bildsatz = blank .
ggf bildschirmdarstellung korrigieren :
satz nr DECR 1; (* für Bildschirmkorrektur *)
IF satznr > lines (file)
THEN zeilen nr DECR satz nr - lines (file);
satz nr := lines (file);
dateizustand retten
FI .
bildeinschraenkung aufheben :
laenge := feldlaenge;
kurze feldlaenge := feldlaenge;
kurze bildlaenge := bildlaenge;
neu (nix, bild) .
END PROC quit;
PROC nichts neu : neu (nix, nix) END PROC nichts neu;
PROC satznr neu : neu (akt satznr, nix) END PROC satznr neu;
PROC ueberschrift neu : neu (ueberschrift, nix) END PROC ueberschrift neu;
PROC zeile neu :
INT CONST zeile := line no (file);
abschnitt neu (zeile, zeile)
END PROC zeile neu;
PROC abschnitt neu (INT CONST von satznr, bis satznr) :
IF von satznr <= bis satznr
THEN erster neusatz := min (erster neusatz, von satznr);
letzter neusatz := max (letzter neusatz, bis satznr);
neu (nix, abschnitt)
ELSE abschnitt neu (bis satznr, von satznr)
FI
END PROC abschnitt neu;
PROC bildabschnitt neu (INT CONST von zeile, bis zeile) : (*sh*)
IF von zeile <= bis zeile
THEN erster neusatz := max (1, von zeile + bildanfang - 1);
letzter neusatz := min (bildlaenge, bis zeile + bildanfang - 1);
IF von zeile < 1
THEN neu (ueberschrift, abschnitt)
ELSE neu (nix , abschnitt)
FI
ELSE bildabschnitt neu (bis zeile, von zeile)
FI
END PROC bildabschnitt neu;
PROC bild neu : neu (nix, bild) END PROC bild neu; (*sh*)
PROC bild neu (FILE VAR f) :
INT CONST editor no := abs (editinfo (f)) DIV 256;
IF editor no > 0 AND editor no <= max used editor
THEN IF editor no = actual editor
THEN bild neu
ELSE editstack (editor no).bildstatus.bildbereich := bild
FI
FI
END PROC bild neu;
PROC alles neu :
neu (ueberschrift, bild);
INT VAR i;
FOR i FROM 1 UPTO max used editor REP
editstack (i).bildstatus.bildbereich := bild;
editstack (i).bildstatus.ueberschriftbereich := ueberschrift
PER
END PROC alles neu;
PROC satznr zeigen :
out (satznr pre); out (text (text (lineno (file)), 4))
END PROC satznr zeigen;
PROC ueberschrift zeigen :
SELECT ueberschriftbereich OF
CASE akt satznr : satznr zeigen;
ueberschriftbereich := nix
CASE ueberschrift : ueberschrift schreiben;
ueberschriftbereich := nix
CASE fehlermeldung : fehlermeldung schreiben;
ueberschriftbereich := ueberschrift
END SELECT
END PROC ueberschrift zeigen;
PROC fenster zeigen :
SELECT bildbereich OF
CASE bildzeile :
zeile := bildrand + zeilennr;
IF line no (file) > lines (file)
THEN feldout ("", stelle)
ELSE exec (PROC (TEXT CONST, INT CONST) feldout, file, stelle)
FI
CASE abschnitt :
bild ausgeben
CASE bild :
erster neusatz := 1;
letzter neusatz := 9999;
bild ausgeben
OTHERWISE :
LEAVE fenster zeigen
END SELECT;
erster neusatz := 9999;
letzter neusatz := 0;
bildbereich := nix
END PROC fenster zeigen ;
PROC bild ausgeben :
BOOL CONST schreiben ist ganz einfach := NOT markiert AND verschoben = 0;
INT CONST save marke := marke,
save verschoben := verschoben,
save laenge := laenge,
act lineno := lineno (file),
von := max (1, erster neusatz - bildanfang + 1);
INT VAR bis := min (letzter neusatz - bildanfang + 1, bildlaenge);
IF kurze feldlaenge <= 0 THEN bis := min (bis, kurze bildlaenge) FI;
IF von > bis THEN LEAVE bild ausgeben FI;
verschoben := 0;
IF markiert
THEN IF mark lineno (file) < bildanfang + von - 1
THEN marke := anfang
ELSE marke := 0
FI
FI ;
abschnitt loeschen und neuschreiben;
to line (file, act lineno);
laenge := save laenge;
verschoben := save verschoben;
marke := save marke .
markiert : mark lineno (file) > 0 .
abschnitt loeschen und neuschreiben :
abschnitt loeschen;
INT VAR line number := bildanfang + von - 1;
to line (file, line number);
abschnitt schreiben .
abschnitt loeschen :
cursor (rand + 1, bildrand + von);
IF bildrest darf komplett geloescht werden
THEN out (clear eop)
ELSE zeilenweise loeschen
FI .
bildrest darf komplett geloescht werden :
bis = maxlaenge AND kurze bildlaenge = maxlaenge
AND kurze feldlaenge = maxbreite .
zeilenweise loeschen :
INT VAR i;
FOR i FROM von UPTO bis REP
check for interrupt;
feldlaenge einstellen;
feldrest loeschen;
IF i < bis THEN out (down char) FI
PER .
feldlaenge einstellen :
IF ganze zeile sichtbar
THEN laenge := feldlaenge
ELSE laenge := kurze feldlaenge
FI .
ganze zeile sichtbar : i <= kurze bildlaenge .
abschnitt schreiben :
INT CONST last line := lines (file);
FOR i FROM von UPTO bis
WHILE line number <= last line REP
check for interrupt;
feldlaenge einstellen;
zeile schreiben;
down (file);
line number INCR 1
PER .
check for interrupt :
kommando CAT inchety;
IF kommando <> ""
THEN IF zeilen nr = 1 CAND up command CAND vorgaenger erlaubt
THEN LEAVE abschnitt loeschen und neuschreiben
ELIF zeilen nr = bildlaenge CAND down command CAND nicht letzter satz
THEN LEAVE abschnitt loeschen und neuschreiben
FI
FI .
vorgaenger erlaubt :
satznr > max (1, bildmarke) .
up command : next incharety is (""3"") COR next incharety is (""1""3"") .
down command :
next incharety is (""10"") CAND bildlaenge < maxlaenge
COR next incharety is (""1""10"") .
nicht letzter satz : act lineno < lines (file) .
zeile schreiben :
zeile := bildrand + i;
IF schreiben ist ganz einfach
THEN exec (PROC (TEXT CONST, INT CONST) simple feldout, file, 0)
ELSE zeile kompliziert schreiben
FI ;
IF line number = old lineno THEN old line update := FALSE FI .
zeile kompliziert schreiben :
IF line number = mark lineno (file) THEN marke := mark col (file) FI;
IF line number = act lineno
THEN verschoben := save verschoben;
exec (PROC (TEXT CONST, INT CONST) feldout, file, stelle);
verschoben := 0; marke := 0
ELSE exec (PROC (TEXT CONST, INT CONST) feldout, file, 0);
IF line number = mark lineno (file) THEN marke := anfang FI
FI .
END PROC bild ausgeben;
PROC bild zeigen : (* wk *)
dateizustand holen ;
ueberschrift zeigen ;
bildausgabe steuern ;
bild neu ;
fenster zeigen ;
oldline no := satznr ;
old line update := FALSE ;
old satz := "" ;
old zeilennr := satznr - bildanfang + 1 ;
dateizustand retten .
ENDPROC bild zeigen ;
PROC ueberschrift initialisieren : (*sh*)
satznr pre :=
cursor pos + code (bildrand - 1) + code (rand + feldlaenge - 6);
ueberschrift pre :=
cursor pos + code (bildrand - 1) + code (rand) + mark anf;
ueberschrift text := ""; INT VAR i;
FOR i FROM 16 UPTO feldlaenge REP ueberschrift text CAT "." PER;
ueberschrift post := blank + mark end + "Zeile " + mark anf;
ueberschrift post CAT blank + mark end + " ";
filename := headline (file);
filename := subtext (filename, 1, feldlaenge - 24);
insert char (filename, blank, 1); filename CAT blank;
replace (ueberschrift text, filenamepos, filename);
rubin segment in ueberschrift eintragen;
margin segment in ueberschrift eintragen;
rest segment in ueberschrift eintragen;
learn segment in ueberschrift eintragen .
filenamepos : (LENGTH ueberschrift text - LENGTH filename + 3) DIV 2 .
mark anf : begin mark + mark ausgleich.
mark end : end mark + mark ausgleich.
mark ausgleich : (1 - sign (max (mark size, 0))) * blank .
rubin segment in ueberschrift eintragen :
replace (ueberschrift text, 9, rubin segment) .
rubin segment :
IF einfuegen THEN "RUBIN" ELSE "....." FI .
margin segment in ueberschrift eintragen :
replace (ueberschrift text, 2, margin segment) .
margin segment :
IF anfang <= 1
THEN "......"
ELSE TEXT VAR margin text := "M" + text (anfang);
(6 - LENGTH margin text) * "." + margin text
FI .
rest segment in ueberschrift eintragen :
replace (ueberschrift text, feldlaenge - 25, rest segment) .
rest segment :
IF zeileneinfuegen THEN "REST" ELSE "...." FI .
learn segment in ueberschrift eintragen :
replace (ueberschrift text, feldlaenge - 19, learn segment) .
learn segment :
IF lernmodus THEN "LEARN" ELSE "....." FI .
END PROC ueberschrift initialisieren;
PROC ueberschrift schreiben :
replace (ueberschrift post, satznr pos, text (text (lineno (file)), 4));
out (ueberschrift pre); out (ueberschrift text); out (ueberschrift post);
get tabs (file, tab);
IF pos (tab, dach) > 0
THEN out (ueberschrift pre);
out subtext (tab, anfang + 1, anfang + feldlaenge - 1);
cursor (rand + 1 + feldlaenge, bildrand); out (end mark)
FI .
satznr pos : IF mark size > 0 THEN 9 ELSE 10 FI . (*sh*)
END PROC ueberschrift schreiben;
PROC fehlermeldung schreiben :
ueberschrift schreiben;
out (ueberschrift pre);
out ("FEHLER: ");
out subtext (fehlertext, 1, feldlaenge - 21);
out (blank);
out (piep);
cursor (rand + 1 + feldlaenge, bildrand); out (end mark)
END PROC fehlermeldung schreiben;
PROC set busy indicator :
cursor (rand + 2, bildrand)
END PROC set busy indicator;
PROC kommando analysieren (TEXT CONST taste,
PROC (TEXT CONST) kommando interpreter) :
disable stop;
bildausgabe normieren;
zustand in datei sichern;
editfile modus setzen;
kommando interpreter (taste);
editfile modus zuruecksetzen;
IF actual editor <= 0 THEN LEAVE kommando analysieren FI;
absatz ausgleich := 2; (*sh*)
konstanten neu berechnen;
neues bild bei undefinierter benutzeraktion;
evtl fehler behandeln;
zustand aus datei holen;
bildausgabe steuern .
editfile modus setzen :
BOOL VAR alter editget modus := editget modus ;
editget modus := FALSE .
editfile modus zuruecksetzen :
editget modus := alter editget modus .
evtl fehler behandeln :
IF is error
THEN fehlertext := errormessage;
IF fehlertext <> "" THEN neu (fehlermeldung, nix) FI;
clear error
ELSE fehlertext := ""
FI .
zustand in datei sichern :
old zeilennr := zeilennr;
old mark lineno := bildmarke;
dateizustand retten .
zustand aus datei holen :
dateizustand holen;
IF letzer editor auf dieser datei <> actual editor
THEN zurueck auf alte position; neu (ueberschrift, bild)
FI .
zurueck auf alte position :
to line (file, old lineno);
col (file, alte stelle);
IF fliesstext
THEN editinfo (file, old zeilennr)
ELSE editinfo (file, - old zeilennr)
FI ; dateizustand holen .
bildausgabe normieren :
bildbereich := undefinierter bereich;
erster neusatz := 9999;
letzter neusatz := 0 .
neues bild bei undefinierter benutzeraktion :
IF bildbereich = undefinierter bereich THEN alles neu FI .
END PROC kommando analysieren;
PROC bildausgabe steuern :
IF markiert
THEN IF old mark lineno = 0
THEN abschnitt neu (bildmarke, satznr);
konstanten neu berechnen
ELIF stelle veraendert (*sh*)
THEN zeile neu
FI
ELIF old mark lineno > 0
THEN abschnitt neu (old mark lineno, (max (satznr, old lineno)));
konstanten neu berechnen
FI ;
IF satznr <> old lineno
THEN neu (akt satznr, nix);
neuen bildaufbau bestimmen
ELSE zeilennr := old zeilennr
FI ;
zeilennr := min (min (zeilennr, satznr), aktuelle bildlaenge);
bildanfang := satznr - zeilennr + 1 .
stelle veraendert : stelle <> alte stelle .
neuen bildaufbau bestimmen :
zeilennr := old zeilennr + satznr - old lineno;
IF 1 <= zeilennr AND zeilennr <= aktuelle bildlaenge
THEN im fenster springen
ELSE bild neu aufbauen
FI .
im fenster springen :
IF markiert THEN abschnitt neu (old lineno, satznr) FI .
bild neu aufbauen :
neu (nix, bild); zeilennr := max (1, aktuelle bildlaenge DIV 2) .
END PROC bildausgabe steuern;
PROC word wrap (BOOL CONST b) :
IF actual editor = 0
THEN std fliesstext := b
ELSE fliesstext in datei setzen
FI .
fliesstext in datei setzen :
fliesstext := b;
IF fliesstext veraendert THEN editinfo (file, - editinfo (file)) FI;
neu (ueberschrift, bild) .
fliesstext veraendert :
fliesstext AND editinfo (file) < 0 OR
NOT fliesstext AND editinfo (file) > 0 .
END PROC word wrap;
BOOL PROC word wrap : (*sh*)
IF actual editor = 0
THEN std fliesstext
ELSE fliesstext
FI
END PROC word wrap;
INT PROC margin : anfang END PROC margin;
PROC margin (INT CONST i) : (*sh*)
IF anfang <> i CAND i > 0 AND i < 16001
THEN anfang := i; neu (ueberschrift, bild);
margin segment in ueberschrift eintragen
ELSE IF i >= 16001 OR i < 0
THEN errorstop ("ungueltige Anfangsposition (1 - 16000)")
FI
FI .
margin segment in ueberschrift eintragen :
replace (ueberschrift text, 2, margin segment) .
margin segment :
IF anfang <= 1
THEN "......"
ELSE TEXT VAR margin text := "M" + text (anfang);
(6 - LENGTH margin text) * "." + margin text
FI .
END PROC margin;
BOOL PROC rubin mode : rubin mode (actual editor) END PROC rubin mode;
BOOL PROC rubin mode (INT CONST editor nr) : (*sh*)
IF editor nr < 1 OR editor nr > max used editor
THEN errorstop ("Editor nicht eroeffnet")
FI ;
IF editor nr = actual editor
THEN einfuegen
ELSE editstack (editor nr).feldstatus.einfuegen
FI
END PROC rubin mode;
PROC edit (INT CONST i, TEXT CONST res,
PROC (TEXT CONST) kommando interpreter) :
edit (i, i, i, res, PROC (TEXT CONST) kommando interpreter)
END PROC edit;
PROC edit (INT CONST von, bis, start, TEXT CONST res,
PROC (TEXT CONST) kommando interpreter) :
disable stop;
IF von < bis
THEN edit (von+1, bis, start, res, PROC (TEXT CONST) kommando interpreter);
IF max used editor < von THEN LEAVE edit FI;
open editor (von)
ELSE open editor (start)
FI ;
absatz ausgleich := 2;
bildeditor (res, PROC (TEXT CONST) kommando interpreter);
cursor (1, schirmhoehe);
IF is error
THEN kommando zeiger := 1; kommando := ""; quit
FI ;
IF lernmodus CAND actual editor = 0 THEN warnung ausgeben FI . (*sh*)
warnung ausgeben :
out (clear eop); out ("WARNUNG: Lernmodus nicht ausgeschaltet"13""10"") .
END PROC edit;
PROC dateizustand holen :
modify (file);
get tabs (file, tabulator);
zeilennr und fliesstext und letzter editor aus editinfo decodieren;
limit := max line length (file);
stelle := col (file);
markiert := mark (file);
IF markiert
THEN markierung holen
ELSE keine markierung
FI ;
satz nr := lineno (file);
IF zeilennr > aktuelle bildlaenge (*sh*)
THEN zeilennr := min (satznr, aktuelle bildlaenge); bild neu
ELIF zeilennr > satznr
THEN zeilennr := min (satznr, aktuelle bildlaenge)
FI ; zeilennr := max (zeilennr, 1);
bildanfang := satz nr - zeilennr + 1 .
zeilennr und fliesstext und letzter editor aus editinfo decodieren :
zeilennr := edit info (file);
IF zeilennr = 0
THEN zeilennr := 1;
fliesstext := std fliesstext
ELIF zeilennr > 0
THEN fliesstext := TRUE
ELSE zeilennr := - zeilennr;
fliesstext := FALSE
FI ;
letzer editor auf dieser datei := zeilennr DIV 256;
zeilennr := zeilennr MOD 256 .
markierung holen :
bildmarke := mark lineno (file);
feldmarke := mark col (file);
IF line no (file) <= bildmarke
THEN to line (file, bildmarke);
marke := feldmarke;
stelle := max (stelle, feldmarke)
ELSE marke := 1
FI .
keine markierung :
bildmarke := 0;
feldmarke := 0;
marke := 0 .
END PROC dateizustand holen;
PROC dateizustand retten :
put tabs (file, tabulator);
IF fliesstext
THEN editinfo (file, zeilennr + actual editor * 256)
ELSE editinfo (file, - (zeilennr + actual editor * 256))
FI ;
max line length (file, limit);
col (file, stelle);
IF markiert
THEN mark (file, bildmarke, feldmarke)
ELSE mark (file, 0, 0)
FI
END PROC dateizustand retten;
PROC open editor (FILE CONST new file, BOOL CONST access) :
disable stop; quit last;
neue bildparameter bestimmen;
open editor (actual editor + 1, new file, access, x, y, x len, y len).
neue bildparameter bestimmen :
INT VAR x, y, x len, y len;
IF actual editor > 0
THEN teilbild des aktuellen editors
ELSE volles bild
FI .
teilbild des aktuellen editors :
get editcursor (x, y); bildgroesse bestimmen;
IF fenster zu schmal (*sh*)
THEN enable stop; errorstop ("Fenster zu klein")
ELIF fenster zu kurz
THEN verkuerztes altes bild nehmen
FI .
bildgroesse bestimmen :
x len := rand + feldlaenge - x + 3;
y len := bildrand + bildlaenge - y + 1 .
fenster zu schmal : x > schirmbreite - 17 .
fenster zu kurz : y > schirmhoehe - 1 .
verkuerztes altes bild nehmen :
x := rand + 1; y := bildrand + 1;
IF fenster zu kurz THEN enable stop; errorstop ("Fenster zu klein") FI;
x len := feldlaenge + 2;
y len := bildlaenge;
kurze feldlaenge := 0;
kurze bildlaenge := 1 .
volles bild :
x := 1; y := 1; x len := schirmbreite; y len := schirmhoehe .
END PROC open editor;
PROC open editor (INT CONST editor nr,
FILE CONST new file, BOOL CONST access,
INT CONST x start, y, x len start, y len) :
INT VAR x := x start,
x len := x len start;
IF editor nr > max editor
THEN errorstop ("zu viele Editor-Fenster")
ELIF editor nr > max used editor + 1 OR editor nr < 1
THEN errorstop ("Editor nicht eroeffnet")
ELIF fenster ungueltig
THEN errorstop ("Fenster ungueltig")
ELSE neuen editor stacken
FI .
fenster ungueltig :
x < 1 COR x > schirmbreite COR y < 1 COR y > schirmhoehe COR
x len - 2 <= 15 COR y len - 1 < 1 COR
x + x len - 1 > schirmbreite COR y + y len - 1 > schirmhoehe .
neuen editor stacken :
disable stop;
IF actual editor > 0 AND ist einschraenkung des alten bildes
THEN dateizustand holen;
aktuelles editorbild einschraenken;
arbeitspunkt in das restbild positionieren;
abgrenzung beruecksichtigen
FI ;
aktuellen zustand retten;
neuen zustand setzen;
neues editorbild zeigen;
actual editor := editor nr;
IF actual editor > max used editor
THEN max used editor := actual editor
FI .
ist einschraenkung des alten bildes :
x > rand CAND x + x len = rand + feldlaenge + 3 CAND
y > bildrand CAND y + y len = bildrand + bildlaenge + 1 .
aktuelles editorbild einschraenken :
kurze feldlaenge := x - rand - 3;
kurze bildlaenge := y - bildrand - 1 .
arbeitspunkt in das restbild positionieren :
IF stelle > 3
THEN stelle DECR 3; alte stelle := stelle
ELSE WHILE zeilennr > 1 AND zeilennr > kurze bildlaenge REP
vorgaenger
PER; old lineno := satznr
FI .
abgrenzung beruecksichtigen :
IF x - rand > 1
THEN balken malen;
x INCR 2;
x len DECR 2
FI .
balken malen :
INT VAR i;
FOR i FROM 0 UPTO y len-1 REP
cursor (x, y+i); out (kloetzchen) (*sh*)
PER .
kloetzchen : IF mark size > 0 THEN ""15""14"" ELSE ""15" "14" " FI .
aktuellen zustand retten :
IF actual editor > 0
THEN dateizustand retten;
editstack (actual editor).feldstatus := feldstatus;
editstack (actual editor).bildstatus := bildstatus;
einrueckstack (actual editor) := alte einrueckposition
FI .
neuen zustand setzen :
FRANGE VAR frange;
feldstatus := FELDSTATUS :
(1, 1, x-1, 0, 1, 0, x len-2, 0, FALSE, TRUE, access, "");
bildstatus := BILDSTATUS :
(x len-2, x len-2, y, y len-1, y len-1, ueberschrift, bild,
0, 0, 1, 0, 0, FALSE, FALSE, "", "", "", "", "", frange, new file);
alte einrueckposition := 1;
dateizustand holen;
ueberschrift initialisieren .
neues editorbild zeigen :
ueberschrift zeigen; fenster zeigen
END PROC open editor;
PROC open editor (INT CONST i) :
IF i < 1 OR i > max used editor
THEN errorstop ("Editor nicht eroeffnet")
ELIF actual editor <> i
THEN switch editor
FI .
switch editor :
aktuellen zustand retten;
actual editor := i;
neuen zustand setzen;
IF kein platz mehr fuer restfenster
THEN eingeschachtelte editoren vergessen;
bildeinschraenkung aufheben
ELSE neu (nix, nix)
FI .
aktuellen zustand retten :
IF actual editor > 0
THEN editstack (actual editor).feldstatus := feldstatus;
editstack (actual editor).bildstatus := bildstatus;
einrueckstack (actual editor) := alte einrueckposition;
dateizustand retten
FI .
neuen zustand setzen :
feldstatus := editstack (i).feldstatus;
bildstatus := editstack (i).bildstatus;
alte einrueckposition := einrueckstack (i);
dateizustand holen .
kein platz mehr fuer restfenster :
kurze feldlaenge < 1 AND kurze bildlaenge < 1 .
eingeschachtelte editoren vergessen :
IF actual editor < max used editor
THEN open editor (actual editor + 1) ;
quit
FI ;
open editor (i) .
bildeinschraenkung aufheben :
laenge := feldlaenge;
kurze feldlaenge := feldlaenge;
kurze bildlaenge := bildlaenge;
neu (ueberschrift, bild) .
END PROC open editor;
FILE PROC editfile :
IF actual editor = 0 OR editget modus
THEN errorstop ("Editor nicht eroeffnet")
FI ; file
END PROC editfile;
PROC get window (INT VAR x, y, x size, y size) :
x := rand + 1;
y := bildrand;
x size := feldlaenge + 2;
y size := bildlaenge + 1
ENDPROC get window;
(************************* Zugriff auf Bildstatus *************************).
feldlaenge : bildstatus.feldlaenge .
kurze feldlaenge : bildstatus.kurze feldlaenge .
bildrand : bildstatus.bildrand .
bildlaenge : bildstatus.bildlaenge .
kurze bildlaenge : bildstatus.kurze bildlaenge .
ueberschriftbereich : bildstatus.ueberschriftbereich .
bildbereich : bildstatus.bildbereich .
erster neusatz : bildstatus.erster neusatz .
letzter neusatz : bildstatus.letzter neusatz .
old zeilennr : bildstatus.old zeilennr .
old lineno : bildstatus.old lineno .
old mark lineno : bildstatus.old mark lineno .
zeileneinfuegen : bildstatus.zeileneinfuegen .
old line update : bildstatus.old line update .
satznr pre : bildstatus.satznr pre .
ueberschrift pre : bildstatus.ueberschrift pre .
ueberschrift text : bildstatus.ueberschrift text .
ueberschrift post : bildstatus.ueberschrift post .
old satz : bildstatus.old satz .
old range : bildstatus.old range .
file : bildstatus.file .
END PACKET editor paket;
|