summaryrefslogtreecommitdiff
path: root/app/baisy/2.2.1-schulis/src/systembauminterpreter
blob: 222cdfe7703b2dde8de042113c2a729dd63c7781 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
PACKET systembauminterpreterDEFINES startebaisy,starteschulis,starteanwendung
,startbaisy:LET esctaste="�",#crtaste="
",#obentaste="�",untentaste="
",
rechtstaste="�",hoptaste="�",ausrufezeichen="!",#leertaste=" ",#stufentrenner
=".",berechttrenner="/",codefuerziffernull=48,codefuerzifferneun=57,
titelfeldnr=2,felderanzahlbishistoriebeginn=2,historiebeginn=3,maxhknoten=4,
felderanzahlbismenuebeginn=6,historieende=6,menuebeginn=7,maxmenuepunkte=20,
felderpromenuepunkt=1,felderimanwahlmenue=18,fcursor=">",fcursorweg=" ",
laengedescursors=2,offenermenuepunkt="noch nicht realisiert",menuemaskenname=
"mb anwahlmenue",wartezeit=30,wegtext="  Ihr Weg durch das Menü:",stern="*",
strich="-",if="Systemfehler ",zeile=" Zeile: ",fortsetzung=
"Weiterarbeiten ist möglich. Fehlermeldung wird gedruckt!",POINTER =STRUCT (
INT xpointer,ypointer);KNOTEN VAR k;ROW maxmenuepunkteKNOTEN VAR ktab;ROW 
maxmenuepunkteBOOL VAR menuepunktanwaehlbar;ROW maxmenuepunktePOINTER VAR 
pointer;TEXT VAR benutzerberechtigung:="";INT VAR aktfeldnr:=menuebeginn;
TEXT VAR vpname,npname;BOOL VAR menuemaske:=FALSE ,cursorbewegungmithop:=
FALSE ;LET zeilenzahlbildschirm=24,spaltenzahlbildschirm=79,
rahmenzusatzzeilen=4,spaltendesmenuerands=10,maxmenuetextlaenge=60,
tastenlaenge=4,zeichenblankstern=" *";TEXT VAR ueberschrift:="";INT VAR x1:=1
,y1:=1,aktuellezeile,spaltendesmenuerahmens,zeilenzahldesfktmenues,
anzblankstern,textlaenge,cursorx,cursory;KNOTEN VAR 
knotenfuerbildschirmausdruck,knotenfuerauskunftserteilung;LET 
knotennamefuerbildschirmausdruck="hardcopy",knotennamefuerauskunftserteilung=
"auskunft",tastefuerbildschirmausdruck="o",tastefuerauskunftserteilung="?";
PROC vpausfuehren(PROC (INT CONST ,BOOL CONST ,TEXT CONST )call):INT VAR 
prozedurindex;prozedurindex:=knotenaufrufindex(k);enablestop;call(
prozedurindex,TRUE ,vpname)END PROC vpausfuehren;PROC npausfuehren(PROC (INT 
CONST ,BOOL CONST ,TEXT CONST )call):INT VAR prozedurindex;prozedurindex:=
knotenaufrufindex(k);enablestop;call(prozedurindex,FALSE ,npname)END PROC 
npausfuehren;BOOL PROC vpvorhanden:NOT ((vpname)="")END PROC vpvorhanden;
BOOL PROC npvorhanden:NOT ((npname)="")END PROC npvorhanden;PROC 
bereitemenuemaskenausgabevor:page;loeschetastendruckEND PROC 
bereitemenuemaskenausgabevor;PROC tasteholen:TEXT VAR zwischentaste;inchar(
zwischentaste);setzetastendruck(zwischentaste)END PROC tasteholen;PROC 
gedaechtnisloeschen:TEXT VAR t:=" ";WHILE t<>""REP t:=incharetyPER END PROC 
gedaechtnisloeschen;PROC setzeschalterfuermenueausgabenachfunktionstaste:IF (
tastendruck=ausrufezeichen)OR (tastendruck="")THEN 
setzeschalterfuermenueausgabe(TRUE )ELSE setzeschalterfuermenueausgabe(FALSE 
)FI .END PROC setzeschalterfuermenueausgabenachfunktionstaste;BOOL PROC 
anderermenuepunkt:IF nachobenoderuntenTHEN cursorbewegungmithop:=FALSE ;TRUE 
ELIF tastendruck=hoptasteTHEN tasteholen;IF nachobenoderuntenTHEN 
cursorbewegungmithop:=TRUE ;TRUE ELIF tastendruck=hoptasteTHEN 
cursorbewegungmithop:=TRUE ;setzetastendruck(obentaste);TRUE ELSE FALSE FI 
ELSE FALSE FI .nachobenoderunten:(tastendruck=obentaste)OR (tastendruck=
untentaste).END PROC anderermenuepunkt;BOOL PROC 
knotenwechselbeiprozedurausfuehrung:NOT (k=vergleichsknoten)END PROC 
knotenwechselbeiprozedurausfuehrung;PROC menuetextzusammensetzen(INT CONST 
mpkt,TEXT CONST stufennum,TEXT VAR menuetext):TEXT VAR kts,ktx;BOOL VAR 
berechtigt:=FALSE ;IF ktab(mpkt)=nilknotenTHEN ktx:=offenermenuepunkt;
behandlemenuepunkt(menuetext,mpkt,kts,ktx,FALSE )ELSE ktx:=text(ktab(mpkt));
berechtigungspruefung(stufennum,mpkt,berechtigt);behandlemenuepunkt(menuetext
,mpkt,kts,ktx,berechtigt)FI .END PROC menuetextzusammensetzen;PROC 
behandlemenuepunkt(TEXT VAR menuetextaufber,INT CONST menuepunkt,TEXT CONST 
ktaste,ktext,BOOL CONST berechtigt):IF berechtigtTHEN menuetextaufber:=""+
text(menuepunktMOD 10,1)+" "+ktextELSE menuetextaufber:="    "+ktextFI ;
setzemenuepunktzugang(menuepunkt+maxhknoten,berechtigt).END PROC 
behandlemenuepunkt;PROC setzemenuepunktzugang(INT CONST feldnr,BOOL CONST 
wahrwert):menuepunktanwaehlbar(feldnr):=wahrwertEND PROC 
setzemenuepunktzugang;BOOL PROC zugangerlaubt(INT CONST feldnr):
menuepunktanwaehlbar(feldnr)END PROC zugangerlaubt;PROC fehlerbehandeln:
cursor(1,23);TEXT VAR fehlerzeile:=if+errormessage+zeile+text(errorline);put(
""+fehlerzeile+"�");line;put(fortsetzung+"�");clearerror;#FILE VAR f:=
sequentialfile(output,if);line(f);putline(f,date+"  "+timeofday);line(f);
putline(f,text(vergleichsknoten));line(f);putline(f,fehlerzeile);print(if);
forget(if,quiet)#END PROC fehlerbehandeln;PROC zeige(TEXT VAR te,INT CONST 
start1,start2,schluss):INT VAR zeile2:=start1+1;cursor(1,start1);out(te);INT 
CONST ende:=length(te),anfang:=pos(te,stern);INT CONST stellen:=ende-anfang+2
;historiemalen;trennungslinie;restmalen.historiemalen:cursor(anfang,zeile2);
out(stern);out(wegtext);cursor(ende,zeile2);out(stern);INT VAR i;FOR iFROM 
zeile2+1UPTO start2-2REP zeilerausPER .trennungslinie:cursor(anfang,start2-1)
;out(stern);(stellen-3)TIMESOUT strich;out(stern).restmalen:FOR iFROM start2
UPTO schluss-1REP zeilerausPER ;cursor(1,schluss);out(te).zeileraus:cursor(
anfang,i);out(stern);cursor(ende,i);out(stern).END PROC zeige;PROC 
getposition(INT VAR x,y,INT CONST feldnr):POINTER CONST p:=pointer(feldnr);x
:=p.xpointer;y:=p.ypointer;END PROC getposition;PROC putposition(TAG VAR t,
INT CONST feldnr):POINTER VAR p;INT VAR x,y;getcursor(x,y);p.xpointer:=x-
length(t,feldnr)-laengedescursors;p.ypointer:=y;pointer(feldnr):=pEND PROC 
putposition;PROC ermittlegrenzwertedesmenuerahmens(INT CONST sohnanz,BOOL 
CONST nichtvorhandenetaste):INT CONST mindestlaengewegenfehlermeldung:=31;
ueberschrift:=text(k);spaltendesmenuerahmens:=maxtextlaenge+
spaltendesmenuerands;IF geradespaltenanzahlTHEN spaltendesmenuerahmensINCR 1;
textlaengeINCR 1FI ;bestimmezeilenzahldesfktmenues;legeeckpunktefest.
geradespaltenanzahl:(spaltendesmenuerahmensMOD 2)=0.maxtextlaenge:INT VAR 
menuepkt;IF nichtvorhandenetasteTHEN textlaenge:=
mindestlaengewegenfehlermeldungELSE textlaenge:=0FI ;textlaenge:=max(
textlaenge,length(ueberschrift));FOR menuepktFROM 1UPTO sohnanzREP textlaenge
:=max(textlaenge,length(text(ktab(menuepkt))))PER ;textlaenge:=min(textlaenge
,maxmenuetextlaenge);textlaenge.bestimmezeilenzahldesfktmenues:IF 
nichtvorhandenetasteTHEN zeilenzahldesfktmenues:=sohnanz+rahmenzusatzzeilen+1
ELSE zeilenzahldesfktmenues:=sohnanz+rahmenzusatzzeilenFI .legeeckpunktefest:
bestimmepositionfuerfktmenueauscursorpos(x1,y1);
veraenderex1fallshaelftedesbsnichtausreicht;
veraenderey1fallshaelftedesbsnichtausreicht;aktuellezeile:=y1;anzblankstern:=
spaltendesmenuerahmensDIV 2.veraenderex1fallshaelftedesbsnichtausreicht:IF (
x1+spaltendesmenuerahmens)>spaltenzahlbildschirmTHEN x1:=
spaltenzahlbildschirm-spaltendesmenuerahmensFI .
veraenderey1fallshaelftedesbsnichtausreicht:IF (y1+zeilenzahldesfktmenues)>
zeilenzahlbildschirmTHEN y1:=zeilenzahlbildschirm-zeilenzahldesfktmenuesFI .
END PROC ermittlegrenzwertedesmenuerahmens;PROC 
bestimmepositionfuerfktmenueauscursorpos(INT VAR xwert,ywert):
bestimmecursorposition;bestimmeeckpunktlinksoben.bestimmecursorposition:
getcursor(cursorx,cursory).bestimmeeckpunktlinksoben:IF vierterquadrantTHEN 
xwert:=1;ywert:=1;ELIF dritterquadrantTHEN xwert:=40;ywert:=1;ELIF 
zweiterquadrantTHEN xwert:=1;ywert:=13;ELIF ersterquadrantTHEN xwert:=40;
ywert:=13;FI .ersterquadrant:(cursorx<40)CAND (cursory<13).zweiterquadrant:(
cursorx>39)CAND (cursory<13).dritterquadrant:(cursorx<40)CAND (cursory>12).
vierterquadrant:(cursorx>39)CAND (cursory>12).END PROC 
bestimmepositionfuerfktmenueauscursorpos;PROC 
zeigefunktionenmenueaufdembildschirm(INT CONST sohnanz,BOOL VAR 
nichtvorhandenetaste):TEXT CONST meldungungueltigefkttaste:=
"Diese Funktion gibt es nicht. ";zeigemenuekopfzeile;zeigeueberschriftzeile
;zeigemenueteil;zeigemenueabschlusszeile.zeigemenuekopfzeile:
setzecursoraufausgabeanfangsposition;zeichnesternzeile.
setzecursoraufausgabeanfangsposition:cursor(x1,aktuellezeile).
zeichnesternzeile:put("*"+(anzblankstern*zeichenblankstern)).
zeigeueberschriftzeile:setzecursoraufnaechstenzeilenanfang;put("*  "+
zentrierteueberschrift+"  *").zentrierteueberschrift:TEXT VAR zwtext:=
zentriert(ueberschrift,textlaenge+tastenlaenge);IF length(zwtext)<(textlaenge
+tastenlaenge)THEN zwtextCAT " "FI ;zwtext.zeigemenueabschlusszeile:
setzecursoraufnaechstenzeilenanfang;IF nichtvorhandenetasteTHEN 
gebehinweisaufungueltigefkttaste;setzeschalterzurueck;
setzecursoraufnaechstenzeilenanfangFI ;zeichnesternzeile.
gebehinweisaufungueltigefkttaste:put("*  "+eingepasstemeldung+"  *").
eingepasstemeldung:zwtext:=zentriert(meldungungueltigefkttaste,textlaenge+
tastenlaenge);IF length(zwtext)<(textlaenge+tastenlaenge)THEN zwtextCAT " "
FI ;zwtext.setzeschalterzurueck:nichtvorhandenetaste:=FALSE .
setzecursoraufnaechstenzeilenanfang:aktuellezeileINCR 1;cursor(x1,
aktuellezeile).zeigemenueteil:zeigeleerzeile;zeigemenuezeilen;zeigeleerzeile.
zeigeleerzeile:setzecursoraufnaechstenzeilenanfang;leerzeile.leerzeile:put(
"*"+((spaltendesmenuerahmens-2)*" ")+"*").zeigemenuezeilen:INT VAR menuepkt:=
0;FOR menuepktFROM 1UPTO sohnanzREP zeigemenuezeilePER .zeigemenuezeile:
setzecursoraufnaechstenzeilenanfang;put(anfangundfkttaste+aufbereitetertext+
zeichenblankstern).anfangundfkttaste:"*   "+fkttaste+" ".fkttaste:TEXT VAR 
aufbertaste:=taste(ktab(menuepkt));IF aufbertaste<>""THEN aufbertasteELSE " "
FI .aufbereitetertext:IF menuetextzulangTHEN subtext(text(ktab(menuepkt)),1,
textlaenge)ELSE text(ktab(menuepkt))+restblanksFI .menuetextzulang:length(
text(ktab(menuepkt)))>textlaenge.restblanks:(textlaenge-length(text(ktab(
menuepkt))))*" ".END PROC zeigefunktionenmenueaufdembildschirm;TEXT PROC 
zentriert(TEXT CONST text,INT CONST breite):TEXT CONST blank:=" ";TEXT CONST 
blanks:=blankausgleich;blanks+text+blanks.blankausgleich:((breite-length(text
))DIV 2)*blank.END PROC zentriert;PROC einzelknotenfuerfunktionenmenueholen(
BOOL CONST verteilteanwendung):BOOL VAR ok;IF verteilteanwendungTHEN 
einzelknotenholen(tastefuerbildschirmausdruck,knotenfuerbildschirmausdruck,ok
);einzelknotenholen(tastefuerauskunftserteilung,knotenfuerauskunftserteilung,
ok)ELSE einzelknotenholen(knotennamefuerbildschirmausdruck,
knotenfuerbildschirmausdruck,ok);einzelknotenholen(
knotennamefuerauskunftserteilung,knotenfuerauskunftserteilung,ok)FI .END 
PROC einzelknotenfuerfunktionenmenueholen;PROC startbaisy(TEXT CONST kn,PROC 
(INT CONST ,BOOL CONST ,TEXT CONST )call):BOOL VAR menuepunktgefunden,
anwahleineshistoriepunktes:=FALSE ,gueltigetasteimmenue:=FALSE ,
anderemenueebene:=FALSE ,zurueckuebercursortaste:=FALSE ,nichtvorhandenetaste
:=FALSE ,ebenenwechsel:=FALSE ,programmeinstiegnachmenueanwahl,#
benutzerberechtigt:=FALSE ,#druckenkommtimfktmenuevor:=FALSE ,
auskunftkommtimfktmenuevor:=FALSE ;TAG VAR t,men;TEXT VAR te,stufennummer:=""
;INT VAR start1,start2,schluss,koordx;TEXT VAR anfangsknotenname;ROW 
maxhknotenTEXT VAR histtexttab;ROW maxhknotenINT VAR histanwahlpos;INT VAR 
sohnanzahl,mpkt,letztemenueanwahlpos:=menuebeginn,aktmaxmenuepunkte,x,y;
KNOTEN VAR sk;KNOTENMENGE VAR ksoehne;initialisierenzumanfang;
holenamedesanfangsknotens;fortlaufendeknotenbehandlung.
fortlaufendeknotenbehandlung:REP behandleknotenPER .initialisierenzumanfang:
IF kn<>""THEN initmaske(men,menuemaskenname);schluss:=ysize(men)FI ;ksoehne:=
leeremenge;bildschirmwiederholspeichereinschalten.holenamedesanfangsknotens:
anfangsknotenname:=text(k);.behandleknoten:setzevergleichsknoten(k);
programmeinstiegnachmenueanwahl:=menuemaske;schaueobmaskediemenuemaskeist;IF 
vpgewaehltTHEN vpname:=vorprozedur(k);IF vpvorhandenTHEN clearerror;
disablestop;vpausfuehren(PROC (INT CONST ,BOOL CONST ,TEXT CONST )call);IF 
programmendeTHEN LEAVE fortlaufendeknotenbehandlungFI ;IF iserrorTHEN 
fehlerbehandeln;clearerrorFI ;enablestop;IF 
knotenwechselbeiprozedurausfuehrungTHEN vaterknotenalsneuenknotennehmen;
ebenenwechsel:=TRUE ;LEAVE behandleknotenFI ;holefunktionstaste;ELSE 
bereitemenuemaskenausgabevorFI ;ELSE IF npgewaehltTHEN npname:=nachprozedur(k
);IF npvorhandenTHEN clearerror;disablestop;npausfuehren(PROC (INT CONST ,
BOOL CONST ,TEXT CONST )call);IF programmendeTHEN LEAVE 
fortlaufendeknotenbehandlungFI ;IF iserrorTHEN fehlerbehandeln;clearerrorFI ;
enablestop;IF knotenwechselbeiprozedurausfuehrungTHEN 
vaterknotenalsneuenknotennehmen;ebenenwechsel:=TRUE ;LEAVE behandleknotenFI ;
holefunktionstaste;ELSE bereitemenuemaskenausgabevorFI ;ELSE 
bereitemenuemaskenausgabevorFI FI ;holeberechtigungswert(benutzerberechtigung
);holeallesohnknoten;setzeschalterfuermenueausgabenachfunktionstaste;IF 
bittedasmenuezeigenTHEN anwahluebermenueELSE direktefunktionstaste;IF 
nichtvorhandenetasteTHEN setzeschalterfuermenueausgabe(TRUE );
anwahluebermenueFI ;FI ;holenaechstenknoten.schaueobmaskediemenuemaskeist:
menuemaske:=nachprozedur(k)="".direktefunktionstaste:menuepunktgefunden:=
FALSE ;IF sohnanzahl>0THEN 
pruefetasteundliefereknotenodermenuepunktnichtgefundenFI ;IF NOT 
menuepunktgefundenTHEN IF tastendruck=tastefuerbildschirmausdruckTHEN sk:=
knotenfuerbildschirmausdruck;merkeknotenalsgefundenenmenuepunktELIF 
tastendruck=tastefuerauskunftserteilungTHEN sk:=knotenfuerauskunftserteilung;
merkeknotenalsgefundenenmenuepunktELSE nichtvorhandenetaste:=TRUE FI FI .
pruefetasteundliefereknotenodermenuepunktnichtgefunden:menuepunkt:=0;sk:=
erster(ksoehne);WHILE weitere(sk,ksoehne)AND NOT menuepunktgefundenREP IF (
NOT isopen(sk))CAND gesuchtetastegefundenTHEN 
merkeknotenalsgefundenenmenuepunktFI ;naechster(sk)PER .
merkeknotenalsgefundenenmenuepunkt:menuepunktgefunden:=TRUE ;menuepunktINCR 1
;ktab(menuepunkt):=sk.gesuchtetastegefunden:taste(sk)=tastendruck.
holeallesohnknoten:mengedernachfolger(k,ksoehne);sohnanzahl:=zahlderelemente(
ksoehne).holefunktionstaste:IF NOT gesetztdurcheditorTHEN IF menuemaskeTHEN 
loeschetastendruckELSE setzetastendruck(incharety(wartezeit))FI FI .
anwahluebermenue:bildschirmwiederholspeicherausschalten;IF menuemaskeTHEN 
maskeaufbauen;maskekomplettausgeben;menueanwahlbestimmen;
setzeschalterfuermenueausgabe(FALSE )ELSE fktmenueaufbauenundausgeben;
fktmenueanwahlbestimmenFI .fktmenueaufbauenundausgeben:
holeallesohnknotenfuerfktmenue;ermittlegrenzwertedesmenuerahmens(sohnanzahl,
nichtvorhandenetaste);zeigefunktionenmenueaufdembildschirm(sohnanzahl,
nichtvorhandenetaste).holeallesohnknotenfuerfktmenue:menuepunkt:=0;
druckenkommtimfktmenuevor:=FALSE ;auskunftkommtimfktmenuevor:=FALSE ;sk:=
erster(ksoehne);REP knotentabfuellenUNTIL (menuepunkt>=sohnanzahl)OR (
menuepunkt>=maxmenuepunkte)PER ;IF (NOT druckenkommtimfktmenuevor)CAND 
sohnanzahl<maxmenuepunkteTHEN sohnanzahlINCR 1;ktab(sohnanzahl):=
knotenfuerbildschirmausdruckFI ;IF (NOT auskunftkommtimfktmenuevor)CAND 
sohnanzahl<maxmenuepunkteTHEN sohnanzahlINCR 1;ktab(sohnanzahl):=
knotenfuerauskunftserteilungFI ;aktmaxmenuepunkte:=sohnanzahl.
knotentabfuellen:menuepunktINCR 1;IF isopen(sk)THEN ktab(menuepunkt):=
nilknotenELSE ktab(menuepunkt):=sk;IF taste(sk)=tastefuerbildschirmausdruck
THEN druckenkommtimfktmenuevor:=TRUE ELIF taste(sk)=
tastefuerauskunftserteilungTHEN auskunftkommtimfktmenuevor:=TRUE FI ;FI ;
naechster(sk).fktmenueanwahlbestimmen:
eventuellefehlermeldungimfktmenueausgeben;
setzecursoraufeinleseanfangsposition;tasteholen;anderemenueebene:=FALSE ;REP 
tastendruckimfktmenueUNTIL anderemenueebenePER ;
bildschirmwiederholspeichereinschalten.
eventuellefehlermeldungimfktmenueausgeben:.
setzecursoraufeinleseanfangsposition:x:=x1+2;INT VAR yanfang:=y1+3;INT VAR 
yende:=yanfang+sohnanzahl-1;y:=yanfang;fktcursorzeigen.tastendruckimfktmenue:
IF anderermenuepunktTHEN fktcursorloeschen;neuenfktmenuepunktbestimmen;
fktcursorzeigen;tasteholen;ELSE pruefefkttastezudiesemmenue;IF NOT 
anderemenueebeneTHEN tasteholenFI FI .fktcursorloeschen:cursor(x,y);out(" ").
fktcursorzeigen:cursor(x,y);out(">");cursor(x,y).pruefefkttastezudiesemmenue:
IF tastendruck=rechtstasteTHEN anderemenueebene:=TRUE ;
wandleypositioninmenuepunktnummerum;fktcursorloeschenELIF tastendruck=
esctasteTHEN anderemenueebene:=TRUE ;funktionenmenueloeschenELSE 
vergleichetastemitgueltigenfkttasten;IF gueltigetasteimmenueTHEN 
anderemenueebene:=TRUE ;fktcursorloeschen;wandlemenuepunktnummerinypositionum
;fktcursorzeigen;fktcursorloeschenFI FI .wandleypositioninmenuepunktnummerum:
getcursor(x,y);menuepunkt:=y-yanfang+1.wandlemenuepunktnummerinypositionum:y
:=yanfang+menuepunkt-1.funktionenmenueloeschen:
schalterzurueckuebercursortasteein;IF vpvorhandenTHEN IF NOT 
gesetztdurcheditorTHEN reorganizescreen;cursor(cursorx,cursory);
setlasteditvalues;setzeschalterfuermenueausgabe(FALSE )FI ;return(0)ELSE 
enter(1)FI .vergleichetastemitgueltigenfkttasten:gueltigetasteimmenue:=FALSE 
;menuepunkt:=0;WHILE (NOT gueltigetasteimmenue)AND menuepunkt<
aktmaxmenuepunkteREP menuepunktINCR 1;IF tastendruck=taste(ktab(menuepunkt))
THEN gueltigetasteimmenue:=TRUE FI PER .neuenfktmenuepunktbestimmen:IF 
cursorbewegungmithopTHEN aktuellerstenoderletztenfktmenuepunktbestimmenELSE 
naechstenfktmenuepunktbestimmenFI .
aktuellerstenoderletztenfktmenuepunktbestimmen:cursorbewegungmithop:=FALSE ;
IF tastendruck=obentasteTHEN y:=yanfangELSE y:=yendeFI .
naechstenfktmenuepunktbestimmen:IF tastendruck=obentasteTHEN IF y>yanfang
THEN yDECR 1ELIF y=yanfangTHEN y:=yendeFI ELIF tastendruck=untentasteTHEN IF 
y<yendeTHEN yINCR 1ELIF y=yendeTHEN y:=yanfangFI FI .maskeaufbauen:
holemaskedesknotens;fuellemaske.holemaskedesknotens:t:=men.fuellemaske:
fuelletitel;fuelletextederhistorie;fuelletextedersoehne.fuelletitel:put(t,
text(k),titelfeldnr);getcursor(koordx,start2).fuelletextederhistorie:INT VAR 
hknr,tabzeiger,histmpkt;menuefeldnr:=historieende;FOR hknrFROM 1UPTO 
maxhknotenREP holehistorietext(menuetext,histmpkt,hknr);tabzeiger:=
menuefeldnr-felderanzahlbishistoriebeginn;IF menuetext=""THEN 
setzemenuepunktzugang(tabzeiger,FALSE );menuetext:=" "ELSE 
setzemenuepunktzugang(tabzeiger,TRUE );histtexttab(hknr):=menuetext;
histanwahlpos(hknr):=histmpkt;menuetext:=tabzeiger*" "+menuetext;put(t,
menuetext,menuefeldnr);putposition(t,menuefeldnr);FI ;menuefeldnrDECR 1PER ;
getposition(koordx,start1,historieende);start1:=start1-maxhknoten-1;te:=
formline(men,start1);zeige(te,start1,start2,schluss).fuelletextedersoehne:
TEXT VAR menuetext;INT VAR menuepunkt:=0,menuefeldnr;menuefeldnr:=menuebeginn
;sk:=erster(ksoehne);WHILE (menuefeldnr<=felderimanwahlmenue)REP menuepunkt
INCR 1;IF menuepunkt>sohnanzahlTHEN keinenmenuetext;ELSE IF isopen(sk)THEN 
ktab(menuepunkt):=nilknotenELSE ktab(menuepunkt):=skFI ;
menuetextzusammensetzen(menuepunkt,stufennummer,menuetext);naechster(sk);put(
t,menuetext,menuefeldnr);putposition(t,menuefeldnr)FI ;menuefeldnrINCR 1PER ;
aktmaxmenuepunkte:=menuepunkt.keinenmenuetext:menuetext:=" ";mpkt:=menuepunkt
+maxhknoten;setzemenuepunktzugang(mpkt,FALSE ).maskekomplettausgeben:
eventuellefehlermeldungausgeben;erstenmenuepunktbestimmen;
cursorpositionerrechnen;cursorzeigen;tasteholen;anderemenueebene:=FALSE ;REP 
tastendruckindiesemmenueUNTIL anderemenueebenePER ;cursorloeschen;
bildschirmwiederholspeichereinschalten.eventuellefehlermeldungausgeben:.
erstenmenuepunktbestimmen:IF ebenenwechselTHEN ebenenwechsel:=FALSE ;
aktfeldnr:=letztemenueanwahlposFI ;mpkt:=aktfeldnr-
felderanzahlbishistoriebeginn;IF NOT zugangerlaubt(mpkt)THEN setzetastendruck
(untentaste);neuenmenuepunktbestimmenFI ;mpkt:=aktfeldnr-
felderanzahlbishistoriebeginn;IF (NOT zugangerlaubt(mpkt))AND menuemaskeTHEN 
aktfeldnr:=historieendeFI .cursorpositionerrechnen:getposition(x,y,aktfeldnr)
.cursorzeigen:cursor(x,y);out(fcursor);xDECR 1;cursor(x,y);out(" ").
cursorloeschen:cursorvormenuepunktloeschen.cursorvormenuepunktloeschen:
getcursor(x,y);cursor(x,y);out(fcursorweg).tastendruckindiesemmenue:IF 
anderermenuepunktTHEN cursorloeschen;neuenmenuepunktbestimmen;
cursorpositionerrechnen;cursorzeigen;tasteholenELSE 
pruefetastendruckzudiesemmenue;IF NOT anderemenueebeneTHEN tasteholenFI FI .
pruefetastendruckzudiesemmenue:IF tastendruck=rechtstasteTHEN 
anderemenueebene:=TRUE ELIF code(tastendruck)>=codefuerziffernullAND code(
tastendruck)<=codefuerzifferneunTHEN IF code(tastendruck)=codefuerziffernull
THEN mpkt:=10ELSE mpkt:=code(tastendruck)-codefuerziffernullFI ;IF sohnanzahl
<mpktTHEN gedaechtnisloeschen;out("�");cursor(x+1,y)ELIF NOT zugangerlaubt(
mpkt+maxhknoten)THEN gedaechtnisloeschen;out("�");cursor(x+1,y)ELSE 
anderemenueebene:=TRUE ;cursorloeschen;aktfeldnr:=menuebeginn+(mpkt-1)*
felderpromenuepunkt;setzetastendruck(rechtstaste);cursorpositionerrechnen;
cursorzeigenFI FI .neuenmenuepunktbestimmen:IF cursorbewegungmithopTHEN 
aktuellerstenoderletztenmenuepunktbestimmenELSE naechstenmenuepunktbestimmen
FI .aktuellerstenoderletztenmenuepunktbestimmen:BOOL VAR 
erstenoderletztenmenuepunktgefunden:=FALSE ;WHILE NOT 
erstenoderletztenmenuepunktgefundenREP naechstenmenuepunktbestimmen;IF 
savefeldnr=aktfeldnrTHEN erstenoderletztenmenuepunktgefunden:=TRUE FI ;PER ;
cursorbewegungmithop:=FALSE .naechstenmenuepunktbestimmen:BOOL VAR 
neuenmenuepunktgefunden:=FALSE ;INT VAR savefeldnr:=aktfeldnr;REP 
sucheneuenmenuepunktUNTIL neuenmenuepunktgefundenPER .sucheneuenmenuepunkt:
IF tastendruck=obentasteTHEN aktfeldnrDECR felderpromenuepunktELIF 
tastendruck=untentasteTHEN aktfeldnrINCR felderpromenuepunktFI ;IF 
cursorbewegungmithopTHEN IF aktfeldnr<historiebeginnOR aktfeldnr>
felderimanwahlmenueTHEN aktfeldnr:=savefeldnr;neuenmenuepunktgefunden:=TRUE ;
LEAVE sucheneuenmenuepunktFI ELSE IF aktfeldnr<historiebeginnTHEN aktfeldnr:=
fields(t)-felderpromenuepunkt+1ELIF aktfeldnr>fields(t)THEN aktfeldnr:=
historiebeginnFI FI ;IF feldvorhandenTHEN mpkt:=aktfeldnr-
felderanzahlbishistoriebeginn;IF zugangerlaubt(mpkt)THEN 
neuenmenuepunktgefunden:=TRUE FI ;FI .feldvorhanden:fieldexists(t,aktfeldnr).
bildschirmwiederholspeicherausschalten:store(FALSE ).
bildschirmwiederholspeichereinschalten:store(TRUE ).menueanwahlbestimmen:IF 
menuemaskeTHEN IF aktfeldnr<menuebeginnTHEN letztemenueanwahlpos:=menuebeginn
ELSE letztemenueanwahlpos:=aktfeldnrFI ;FI ;IF tastendruck=rechtstasteTHEN 
bestimmemenuepunktfuernaechstesmenueELSE schalterzurueckuebercursortasteein;
IF vpvorhandenTHEN IF NOT gesetztdurcheditorTHEN reorganizescreenFI ;return(0
)ELSE enter(1)FI ;FI .bestimmemenuepunktfuernaechstesmenue:IF aktfeldnr>=
menuebeginnTHEN aktfeldnrDECR felderanzahlbismenuebeginnELSE aktfeldnrDECR 
felderanzahlbishistoriebeginn;anwahleineshistoriepunktes:=TRUE FI ;menuepunkt
:=aktfeldnr.holenaechstenknoten:setzeeditorschalterzurueck;IF 
zurueckuebercursortasteTHEN schalterzurueckuebercursortasteaus;
vaterknotenalsneuenknotennehmenELIF historiepunktangewaehltTHEN 
anwahleineshistoriepunktes:=FALSE ;textdeshistoriepunktesbestimmen;
historieknotenalsneuenknotennehmenELSE knotenaufstackablegen(k);IF 
aktuellerhistorieknotenTHEN legehistorieknotenab(text(k),menuepunkt)FI ;
sohnknotenalsneuenknotennehmenFI .historiepunktangewaehlt:
anwahleineshistoriepunktes.textdeshistoriepunktesbestimmen:TEXT VAR histtext;
hknr:=maxhknoten+1-menuepunkt;histtext:=histtexttab(hknr);aktfeldnr:=
historieende+histanwahlpos(hknr).historieknotenalsneuenknotennehmen:REP enter
(1);vaterknotenalsneuenknotennehmenUNTIL text(k)=histtextPER .
reduzierestufennummer:INT VAR lstufnr:=length(stufennummer);IF lstufnr<=3
THEN stufennummer:=""ELSE IF subtext(stufennummer,lstufnr-1,lstufnr-1)=
stufentrennerTHEN stufennummer:=subtext(stufennummer,1,lstufnr-2)ELSE 
stufennummer:=subtext(stufennummer,1,lstufnr-3)FI ;FI .
aktuellerhistorieknoten:menuemaskeOR (text(k)=anfangsknotenname).
vaterknotenalsneuenknotennehmen:k:=vergleichsknoten;IF nachprozedur(k)=""
THEN reduzierestufennummerFI .sohnknotenalsneuenknotennehmen:KNOTEN VAR 
tabknoten:=ktab(menuepunkt);IF reinlokaleoperationTHEN k:=tabknoten;IF 
menuemaskeTHEN erweiterestufennummerFI ;aktfeldnr:=menuebeginnELSE 
fuehreknotenwechselmittaskwechseldurch;ebenenwechsel:=TRUE FI ;vpwunsch.
reinlokaleoperation:TEXT CONST knotentask:=task(tabknoten);knotentask="".
fuehreknotenwechselmittaskwechseldurch:INT VAR statustaskwechsel:=0;
umgebungswechsel(tabknoten,knotentask,statustaskwechsel);k:=
altermenueknotenaufstack;IF statustaskwechsel=1THEN cursor(1,23);put(
"Verzweigung ist nicht möglich");pauseELIF statustaskwechsel=2THEN cursor(1,
23);put("es wird bereits innerhalb dieser Anwendungen gearbeitet");pauseFI .
altermenueknotenaufstack:enter(1);vergleichsknoten.erweiterestufennummer:IF 
stufennummer=""THEN stufennummer:=berechttrenner+text(menuepunkt)ELSE 
stufennummer:=stufennummer+stufentrenner+text(menuepunkt)FI .
schalterzurueckuebercursortasteein:zurueckuebercursortaste:=TRUE .
schalterzurueckuebercursortasteaus:zurueckuebercursortaste:=FALSE .END PROC 
startbaisy;PROC berechtigungspruefung(TEXT CONST altnr,INT CONST neunr,BOOL 
VAR berechtigt):IF NOT menuemaskeTHEN berechtigt:=TRUE ;LEAVE 
berechtigungspruefungFI ;TEXT VAR berechtstring:=benutzerberechtigung;IF 
keineberechtigungzugeteiltTHEN berechtigt:=FALSE ;LEAVE berechtigungspruefung
FI ;berechtigt:=FALSE ;zupruefendestufennummeraufbauen;berechtigungholen;
WHILE NOT berechtigtAND nocheineberechtigungdaREP IF 
berechtistpraefixvonpruefnrOR pruefnristpraefixvonberechtTHEN berechtigt:=
TRUE FI ;berechtigungholenPER .keineberechtigungzugeteilt:berechtstring="".
nocheineberechtigungda:berecht<>"".zupruefendestufennummeraufbauen:TEXT VAR 
pruefnr;IF altnr=""THEN pruefnr:=berechttrenner+text(neunr)ELSE pruefnr:=
altnr+stufentrenner+text(neunr)FI ;pruefnrCAT stufentrenner.berechtigungholen
:TEXT VAR berecht;IF berechtstringabgearbeitetTHEN berecht:=""ELSE 
imberechtstringweitereberechtsuchen;IF nurnocheineberechtigungTHEN berecht:=
berechtstring;berechtstring:=""ELSE berecht:=subtext(berechtstring,1,
postrennz-1);berechtstring:=subtext(berechtstring,postrennz)FI ;berechtCAT 
stufentrenner;FI .imberechtstringweitereberechtsuchen:INT VAR postrennz:=pos(
berechtstring,berechttrenner,2).nurnocheineberechtigung:postrennz=0.
berechtstringabgearbeitet:berechtstring="".berechtistpraefixvonpruefnr:pos(
pruefnr,berecht)<>0.pruefnristpraefixvonberecht:pos(berecht,pruefnr)<>0.END 
PROC berechtigungspruefung;PROC dummycall(INT CONST i,BOOL CONST b,TEXT 
CONST knotenproc):do(knotenproc)END PROC dummycall;PROC startebaisy(TEXT 
CONST kn):initsybifunktionen;BOOL VAR knotenda;anfangsknotenholen(kn,k,
knotenda);holenamedesanfangsknotens;vpwunsch;IF NOT knotendaTHEN put(
"kein knoten da");pause(50);setzeprogrammende(TRUE )ELIF isopen(k)THEN put(
"knoten da, aber offen");pause(50);setzeprogrammende(TRUE )FI ;
setzeanfangsknotennamefuerbenutzerbestand(kn);
einzelknotenfuerfunktionenmenueholen(verteilt);monitorbehandlungundstart.
holenamedesanfangsknotens:TEXT VAR anfangsknotenname;anfangsknotenname:=text(
k);page.verteilt:anfangsknotenname="".monitorbehandlungundstart:putline(
"Das System "+kn+" wird gestartet.");initmeldungsfunktionen;startbaisy(kn,
PROC dummycall)END PROC startebaisy;PROC starteanwendung:BOOL VAR knotenda;
anfangsknotenholen("",k,knotenda);vpwunsch;
einzelknotenfuerfunktionenmenueholen(TRUE );setzeverteilteanwendung;
startbaisy("",PROC dummycall)END PROC starteanwendung;PROC startebaisy:
startebaisy("baisy")END PROC startebaisy;PROC starteschulis:startebaisy(
"schulis")END PROC starteschulis;END PACKET systembauminterpreter;