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");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 ysohnanzahlTHEN 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 felderimanwahlmenueTHEN aktfeldnr:=savefeldnr;neuenmenuepunktgefunden:=TRUE ; LEAVE sucheneuenmenuepunktFI ELSE IF aktfeldnrfields(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 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;