summaryrefslogtreecommitdiff
path: root/app/schulis/2.2.1/src/6.ida.druck
blob: d24c0cd866e24eab465d676e7fd25701aab991a5 (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
PACKET idadruckDEFINES listendruck,ausdruckauswerten,bschirm,drucker,
namederdruckausgabe,namederdruckausgabeohne,druckausgabeausgeben,ruecksprung,
zurueck,postext,seitenweise:LET linkeklammer="<",rechteklammer=">",
platzhalter="�",linefeed="
",trenner=" ",kzkosmetik="#",kzseitenzahl="%",
ddrucker=1,dbschirm=2,mlddrucken=58,mldaufb=190;TEXT VAR filename:=
"ISP-Liste";INT CONST drucker:=ddrucker,bschirm:=dbschirm;FILE VAR ausgfile;
INT VAR dbauswertung,anzzeilen,zeilenzaehler:=0,fusszeilen:=0,kopfzeilen:=0,
aktuelleseite:=0,aktuellerds:=0,zeilenlaenge,verbund;BOOL VAR tupelbearbeitet
,isppageform:=FALSE ;TEXT VAR restderletztenzeile:="";TEXT VAR schriftart:=""
,kopfbereich:="",fussbereich:="",kosmetikbereich:="zzzz";REAL VAR links,oben;
#nurtest!!!!!!PROC standardmeldung(INT CONST mldaufb,TEXT CONST t):fehler(
"MELDUNG: "+text(mldaufb)+"  "+t)ENDPROC standardmeldung;PROC editiere(TEXT 
CONST fname,BOOL CONST f):edit(fname)ENDPROC editiere;PROC enter(INT CONST i)
:ENDPROC enter;#PROC seitenweise(BOOL CONST jn):isppageform:=jnENDPROC 
seitenweise;BOOL PROC seitenweise:isppageformENDPROC seitenweise;TEXT PROC 
rechtscompress(TEXT CONST zeile):TEXT VAR z:=zeile;INT VAR p:=length(zeile);
WHILE p>0CAND (zSUB p)=trennerREP pDECR 1PER ;z:=text(z,p);zENDPROC 
rechtscompress;INT PROC bestimmevorhandeneblanks(TEXT CONST zeile):INT VAR 
vorhandeneblanks:=0,i;FOR iFROM 1UPTO length(zeile)REP IF (zeileSUB i)=
trennerTHEN vorhandeneblanksINCR 1FI UNTIL (zeileSUB i)<>trennerPER ;
vorhandeneblanksENDPROC bestimmevorhandeneblanks;TEXT PROC 
textmitfuehrendenblanks(TEXT CONST z,INT CONST anzblanks):INT VAR 
vorhandeneblanks:=0;TEXT VAR zeile:=z;vorhandeneblanks:=
bestimmevorhandeneblanks(zeile);IF vorhandeneblanks>anzblanksTHEN 
zeilekuerzenELSE mitblanksauffuellenFI ;zeile.zeilekuerzen:zeile:=subtext(
zeile,vorhandeneblanks-anzblanks).mitblanksauffuellen:zeile:=(anzblanks-
vorhandeneblanks)*trenner+zeile.ENDPROC textmitfuehrendenblanks;TEXT PROC 
aktfilename:IF aktuellerds=0THEN filenameELSE filename+"."+text(aktuellerds)
FI ENDPROC aktfilename;PROC schreibebereich(TEXT CONST bereich,BOOL CONST 
kopf):INT VAR von:=0,bis;TEXT VAR zeile:="";bis:=pos(bereich,linefeed);WHILE 
bis>0REP zeile:=subtext(bereich,von+1,bis-1);IF kopfTHEN changeall(zeile,
kzseitenzahl,text(aktuelleseite));zeilenzaehlerINCR 1FI ;putline(ausgfile,
zeile);von:=bis;bis:=pos(bereich,linefeed,von+1);PER ENDPROC schreibebereich;
PROC schreibekopf:schreibebereich(kopfbereich,TRUE )ENDPROC schreibekopf;
PROC schreibefuss:schreibebereich(fussbereich,FALSE )ENDPROC schreibefuss;
PROC seitenvorschub:schreibefuss;IF filefastvollTHEN ausgabedateianlegenELSE 
putline(ausgfile,"#page#")FI ;zeilenzaehler:=0;aktuelleseiteINCR 1;
schreibekopf.filefastvoll:lines(ausgfile)>=3000COR storage(old(aktfilename))>
700.ENDPROC seitenvorschub;PROC pageeinfuegen:putline(ausgfile,"#page#");
zeilenzaehler:=0;ENDPROC pageeinfuegen;PROC zeilenvorschubundfussdrucken:
WHILE zeilenzaehler<anzzeilen-fusszeilenREP putline(ausgfile,"");
zeilenzaehlerINCR 1PER ;schreibefussENDPROC zeilenvorschubundfussdrucken;
PROC putlein(TEXT CONST zeile,BOOL CONST nurkosmetik):IF seitenweiseTHEN IF 
NOT nurkosmetikCAND zeilenzaehler=anzzeilen-fusszeilenTHEN seitenvorschubFI 
ELSE IF zeilenzaehler=anzzeilen-fusszeilen-kopfzeilenTHEN pageeinfuegenFI FI 
;putline(ausgfile,zeile);zeilenzaehlerINCR 1ENDPROC putlein;PROC putzeile(
TEXT CONST zeile):TEXT VAR auszeile:="";BOOL CONST blocksatz:=(zeileSUB 
length(zeile))=trenner;INT VAR trennpos,linkerrand;IF length(
restderletztenzeile)>0THEN auszeile:=restderletztenzeile;IF 
keintrennerzwischenzeilenTHEN auszeileCAT trennerFI FI ;auszeileCAT zeile;
restderletztenzeile:="";IF length(auszeile)<=zeilenlaengeTHEN putlein(
auszeile,FALSE )ELSE bestimmelinkenrand;WHILE length(auszeile)>zeilenlaenge
REP trennpositionbestimmen;zeileausgebenundkürzen;PER ;IF length(auszeile)>0
THEN IF blocksatzTHEN putlein(auszeile,FALSE )ELSE restderletztenzeile:=
textmitfuehrendenblanks(auszeile,linkerrand)FI FI FI .
keintrennerzwischenzeilen:(restderletztenzeileSUB length(restderletztenzeile)
)<>trennerCAND (zeileSUB 1)<>trenner.bestimmelinkenrand:linkerrand:=
bestimmevorhandeneblanks(auszeile);.trennpositionbestimmen:trennpos:=
zeilenlaenge;WHILE trennpos>linkerrandCAND (auszeileSUB trennpos)<>trenner
REP trennposDECR 1PER ;IF trennpos<=linkerrandTHEN trennpos:=max(zeilenlaenge
,linkerrand+1);WHILE trennpos<=length(auszeile)CAND (auszeileSUB trennpos)<>
trennerREP trennposINCR 1PER ;FI .zeileausgebenundkürzen:putlein(
rechtscompress(text(auszeile,trennpos-1)),FALSE );auszeile:=compress(subtext(
auszeile,trennpos+1));IF length(auszeile)>0THEN auszeile:=
textmitfuehrendenblanks(auszeile,linkerrand)FI .ENDPROC putzeile;PROC 
nextergebnistupel:INT VAR dnr;qsucc(verbund,dnr);tupelbearbeitet:=FALSE ;
verbund:=gettiefennr(verbund);IF dbstatus=endoffileCAND dbauswertung=
ordernewstackTHEN auswertungfortsetzen;dbauswertung:=dbstatus;qsucc(verbund,
dnr);verbund:=gettiefennr(verbund);FI ENDPROC nextergebnistupel;TEXT PROC 
sonderfunktion(TEXT CONST stcode):TEXT VAR t:=stcode,ausdruck:=stcode;IF (
ausdruckSUB 1)=linkeklammerTHEN deletechar(ausdruck,1)FI ;IF (ausdruckSUB 
length(ausdruck))=rechteklammerTHEN deletechar(ausdruck,length(ausdruck))FI ;
IF ausdruck="tagesdatum"THEN t:=dateELIF ausdruck="tag"THEN t:=day(date(date)
)ELIF ausdruck="monat"THEN t:=month(date(date))ELIF ausdruck="jahr"THEN t:=
year(date(date))ELIF ausdruck="zeit"THEN t:=timeofdayELIF ausdruck="tt"THEN t
:=text(date,2)ELIF ausdruck="mm"THEN t:=subtext(date,4,5)ELIF ausdruck="jj"
THEN t:=subtext(date,7)FI ;tENDPROC sonderfunktion;TEXT PROC 
aufbereitetezeile(TEXT CONST zeile,einfuegstellen):TEXT VAR auszeile:="",
auswert:="",ausdruck:="";INT VAR p:=1,pp,ppalt:=1,ix,laenge;BOOL VAR rbuendig
,druckvar;pp:=pos(zeile,platzhalter,ppalt);WHILE pp>0REP auszeileCAT subtext(
zeile,ppalt,pp-1);ix:=decodezahl(einfuegstellen,p);IF ix>0THEN getsteuercode(
ix,ausdruck,laenge,rbuendig,druckvar);IF druckvarTHEN auswert:=
ausdruckauswerten(ausdruck);aufbereitenundschreiben;ELSE auswert:=
sonderfunktion(ausdruck);aufbereitenundschreiben;FI FI ;ppalt:=pp+1;pp:=pos(
zeile,platzhalter,ppalt);PER ;auszeileCAT subtext(zeile,ppalt);auszeile.
aufbereitenundschreiben:IF laenge>0THEN IF length(auswert)>=laengeCOR NOT 
rbuendigTHEN auswert:=text(auswert,laenge)ELSE auswert:=((laenge-length(
auswert))*" ")+auswertFI ;FI ;auszeileCAT auswert.ENDPROC aufbereitetezeile;
PROC druckezeile(TEXT CONST zeile,einfuegstellen):putzeile(aufbereitetezeile(
zeile,einfuegstellen))ENDPROC druckezeile;PROC druckeblock(INT CONST blocknr)
:INT VAR aktzeile:=1,pb,pz,nextblock,nextblockvorzeile;REP IF aktzeile=1CAND 
verbund=blocknrTHEN tupelbearbeitet:=TRUE FI ;pb:=1;pz:=1;bestimmeunterblock;
WHILE aktzeile<=getzeilenanzahl(blocknr)COR aktzeile=nextblockvorzeileREP IF 
aktzeile=nextblockvorzeileTHEN IF verbund<nextblockCAND tupelbearbeitetTHEN 
nextergebnistupelFI ;IF verbund=nextblockTHEN druckeblock(nextblock);FI ;
bestimmeunterblock;ELSE IF NOT (seitenweiseCAND innerhalbkosmetikbereich)
THEN druckezeile(getzeile(blocknr,aktzeile),geteinfuegstellen(blocknr,
aktzeile));IF innerhalbkosmetikbereichTHEN zeilenzaehlerDECR 1FI FI ;aktzeile
INCR 1;FI ;PER ;aktzeile:=1;IF tupelbearbeitetTHEN nextergebnistupel;IF 
verbund<>blocknrTHEN LEAVE druckeblockFI ELIF verbund<>blocknrTHEN LEAVE 
druckeblockFI UNTIL blocknr=0PER .innerhalbkosmetikbereich:(blocknr=0)CAND ((
aktzeile>=code(kosmetikbereichSUB 1)CAND aktzeile<=code(kosmetikbereichSUB 2)
)COR (aktzeile>=code(kosmetikbereichSUB 3)CAND aktzeile<=code(kosmetikbereich
SUB 4))).bestimmeunterblock:nextblock:=decodezahl(getunterbloecke(blocknr),pb
);nextblockvorzeile:=decodezahl(getvorzeilennr(blocknr),pz);.ENDPROC 
druckeblock;PROC listendruck(INT CONST nr):listendruck(nr,bschirm)ENDPROC 
listendruck;PROC ausgabedateianlegen:aktuellerdsINCR 1;forget(aktfilename,
quiet);ausgfile:=sequentialfile(output,aktfilename);putlein(schrifttyp,TRUE )
;putlein(startanweisung,TRUE );zeilenzaehler:=0.schrifttyp:IF schriftart=""
THEN ""ELSE "#type ("""+schriftart+""")#"FI .startanweisung:"#start("+text(
links)+","+text(oben)+")# ".ENDPROC ausgabedateianlegen;PROC 
headundbottommerken:#block(0)nachheadundbottomuntersuchen#INT VAR aktzeile:=1
,p;TEXT VAR ausdruck:="",zeile:="";kopfzeilen:=0;fusszeilen:=0;kopfbereich:=
"";fussbereich:="";kosmetikbereich:="zzzz";WHILE aktzeile<=getzeilenanzahl(0)
REP zeile:=getzeile(0,aktzeile);aktzeileINCR 1;p:=pos(zeile,kzkosmetik);IF p>
0THEN ausdruckeinlesen;IF ausdruck="head"THEN kopfeinlesenELIF ausdruck=
"bottom"THEN fusseinlesenFI ;FI ;PER .ausdruckeinlesen:ausdruck:=compress(
subtext(zeile,p+1,pos(zeile,kzkosmetik,p+1)-1)).bereichsende:p:=pos(zeile,
kzkosmetik);IF p>0THEN ausdruckeinlesen;pos(";head;bottom;end;",";"+ausdruck+
";")>0ELSE FALSE FI .kopfeinlesen:replace(kosmetikbereich,1,code(aktzeile-1))
;REP zeile:=getzeile(0,aktzeile);aktzeileINCR 1;IF bereichsendeTHEN replace(
kosmetikbereich,2,code(aktzeile-1));LEAVE kopfeinlesenELSE kopfzeilenINCR 1;
zeile:=aufbereitetezeile(zeile,geteinfuegstellen(0,aktzeile-1));kopfbereich
CAT (zeile+linefeed)FI PER .fusseinlesen:replace(kosmetikbereich,3,code(
aktzeile-1));REP zeile:=getzeile(0,aktzeile);aktzeileINCR 1;IF bereichsende
THEN replace(kosmetikbereich,4,code(aktzeile-1));LEAVE fusseinlesenELSE 
fusszeilenINCR 1;zeile:=aufbereitetezeile(zeile,geteinfuegstellen(0,aktzeile-
1));fussbereichCAT (zeile+linefeed)FI PER .ENDPROC headundbottommerken;PROC 
listendruck(INT CONST nr,INT CONST medium):REAL VAR limit;INT VAR fontnr:=0;
getdruckaufbereitung(schriftart,links,oben,anzzeilen,limit);schriftartpruefen
;zeilenlaenge:=int(limit);#IF seitenweiseTHEN #headundbottommerken;
aktuelleseite:=1;aktuellerds:=-1;ausgabedateianlegen;IF seitenweiseTHEN 
schreibekopfFI ;auswertung("QUERY."+text(nr));dbauswertung:=dbstatus;
restderletztenzeile:="";verbund:=-1;tupelbearbeitet:=TRUE ;druckeblock(0);IF 
length(restderletztenzeile)>0THEN putzeile("")FI ;IF seitenweiseCAND 
fusszeilen>0THEN zeilenvorschubundfussdruckenFI ;druckegesamtliste.
schriftartpruefen:disablestop;fontnr:=font(schriftart);IF iserrorTHEN 
schriftart:="";clearerror;ELIF fontnr=0THEN schriftart:=font(1)FI ;enablestop
.druckegesamtliste:BOOL VAR cd:=commanddialogue;INT VAR i;IF seitenweiseCOR 
schriftart=""THEN druckausgabeausgeben(filename,medium);IF seitenweiseCAND 
aktuellerds>0CAND medium=druckerTHEN FOR iFROM 1UPTO aktuellerdsREP 
druckausgabeausgeben(filename,medium);PER FI ELSE sysout("dummy");
commanddialogue(FALSE );standardmeldung(mldaufb,"");autopageform(filename);
forget(filename,quiet);sysout("");forget("dummy",quiet);commanddialogue(cd);
druckausgabeausgeben(filename+".p",medium)FI .ENDPROC listendruck;TEXT PROC 
namederdruckausgabeohne:filenameENDPROC namederdruckausgabeohne;TEXT PROC 
namederdruckausgabe:filename+".p"ENDPROC namederdruckausgabe;PROC 
namederdruckausgabe(TEXT CONST fname):filename:=fnameENDPROC 
namederdruckausgabe;PROC druckausgabeausgeben(TEXT CONST fname,INT CONST 
medium):SELECT mediumOF CASE dbschirm:caufanfang;editiere(fname,FALSE );CASE 
ddrucker:standardmeldung(mlddrucken,"");print(fname);enter(1)OTHERWISE :
errorstop("Falscher Druck-Code")ENDSELECT ;zurueck.caufanfang:FILE VAR f:=
sequentialfile(modify,fname);toline(f,1).ENDPROC druckausgabeausgeben;BOOL 
VAR rueck:=FALSE ;PROC zurueck:rueck:=TRUE ENDPROC zurueck;BOOL PROC 
ruecksprung:BOOL VAR b:=rueck;rueck:=FALSE ;bENDPROC ruecksprung;LET 
parametergrenze="%",parametertrennzeichen="#",otherwise="*",niltext="",
textbegrenzer="""";INT PROC postextende(TEXT CONST ausgabe,INT CONST 
aktuelleposition):INT VAR neupos:=aktuelleposition+1;WHILE (ausgabeSUB neupos
)<>textbegrenzerREP neuposINCR 1;IF (ausgabeSUB neupos)=textbegrenzerCAND (
ausgabeSUB neupos+1)=textbegrenzerTHEN neuposINCR 2;FI ;UNTIL neupos>length(
ausgabe)PER ;neupos+1ENDPROC postextende;INT PROC postext(TEXT CONST source,
pattern,INT CONST from):INT VAR p:=from;WHILE (sourceSUB p)<>patternREP 
nextcharUNTIL p>length(source)PER ;#9.12.87#IF p>length(source)THEN 0ELSE p
FI .nextchar:IF (sourceSUB p)=textbegrenzerTHEN p:=postextende(source,p)ELSE 
pINCR 1;#9.12.87#FI .ENDPROC postext;TEXT PROC dbwert(TEXT CONST feldname,
BOOL VAR textvergleich):LET null="0",nulldatum="01.01.00";TEXT VAR ausgabe:=
"";INT CONST fnr:=feldnr(compress(feldname));IF fnr>0THEN ausgabe:=wert(fnr);
IF ((feldtyp(fnr)=intfeld)CAND (ausgabe=null))COR ((feldtyp(fnr)=datumfeld)
CAND (ausgabe=nulldatum))THEN ausgabe:=""FI ;textvergleich:=NOT (feldtyp(fnr)
=realfeldCOR feldtyp(fnr)=intfeld)ELSE textvergleich:=TRUE FI ;ausgabeEND 
PROC dbwert;TEXT PROC auswerten(TEXT CONST eingabe):INT VAR 
positionlinkeklammer:=1,positionrechteklammer:=1,positionlinkeskreuz,
positionrechteskreuz,positionmittlereskreuz,positionparametergrenze,
aktuelleposition:=1,positionotherwise,anzahldergeoeffnetenklammern;BOOL VAR 
ausdruckvorhanden,caseaufruf,linkeseitevariabel,rechteseitevariabel,
textvergleich;TEXT VAR puffer,vergleichswert,aktuellessymbol,parameter1,
ausgabe:=compress(eingabe);REP zeichenketteueberlesen;
auffindeneinesspitzgeklammertenausdrucks;IF ausdruckvorhandenTHEN 
bestimmungdesfeldnamensfuerdieprozedurdbwert;aufrufderprozedurdbwert;IF 
caseaufrufTHEN bestimmungderrichtigenalternativeFI ;
einsetzendesfeldwertsoderderalternative;FI ;UNTIL NOT ausdruckvorhandenPER ;
ausgabe.zeichenketteueberlesen:INT VAR p:=aktuelleposition;#1#BOOL VAR 
innerhalbzeichenkette:=TRUE ;IF (ausgabeSUB p)=linkeklammerTHEN pINCR 1;FI ;
IF aktuelleszeichenisttextbegrenzerTHEN WHILE innerhalbzeichenketteREP REP 
UNTIL textendeCOR aktuelleszeichenisttextbegrenzerPER ;IF NOT textendeCAND (
ausgabeSUB p)=textbegrenzerTHEN innerhalbzeichenkette:=TRUE ;pINCR 1ELSE 
innerhalbzeichenkette:=FALSE ;FI PER ;pDECR 1;aktuelleposition:=p;
leerzeichenentfernen;FI .aktuelleszeichenisttextbegrenzer:IF (ausgabeSUB p)=
textbegrenzerTHEN deletechar(ausgabe,p);TRUE ELSE pINCR 1;FALSE FI .textende:
p>length(ausgabe).leerzeichenentfernen:WHILE (ausgabeSUB p)=" "REP deletechar
(ausgabe,p)PER .auffindeneinesspitzgeklammertenausdrucks:#aktuelleposition:=0
;#linkeseitevariabel:=FALSE ;rechteseitevariabel:=FALSE ;aktuelleposition:=
pos(ausgabe,linkeklammer,aktuelleposition);ausdruckvorhanden:=
aktuelleposition<>0;positionlinkeklammer:=aktuelleposition.
bestimmungdesfeldnamensfuerdieprozedurdbwert:
ueberpruefeoblinkeseitedoppeltgeklammert;bestimmedenfeldnamen;IF 
aktuellessymbol=rechteklammerTHEN caseaufruf:=FALSE ;fuehreleseoperationaus;
ueberpruefeobrechteseitedoppeltgeklammertELSE caseaufruf:=TRUE ;
positionparametergrenze:=aktuellepositionFI .fuehreleseoperationaus:
aktuellepositionINCR 1;IF aktuelleposition>length(ausgabe)THEN 
aktuellessymbol:=rechteklammerELSE aktuellessymbol:=ausgabeSUB 
aktuelleposition;FI ;IF aktuellessymbol=linkeklammerTHEN 
anzahldergeoeffnetenklammernINCR 1ELIF aktuellessymbol=rechteklammerTHEN 
anzahldergeoeffnetenklammernDECR 1FI .fuehreleseoperationausmittextueberlesen
:aktuellepositionINCR 1;IF (ausgabeSUB aktuelleposition)=textbegrenzerTHEN 
aktuelleposition:=postextende(ausgabe,aktuelleposition)FI ;IF 
aktuelleposition>length(ausgabe)THEN aktuellessymbol:=rechteklammerELSE 
aktuellessymbol:=ausgabeSUB aktuelleposition;FI ;IF aktuellessymbol=
linkeklammerTHEN anzahldergeoeffnetenklammernINCR 1ELIF aktuellessymbol=
rechteklammerTHEN anzahldergeoeffnetenklammernDECR 1FI .
ueberpruefeoblinkeseitedoppeltgeklammert:fuehreleseoperationaus;
linkeseitevariabel:=aktuellessymbol=linkeklammer.bestimmedenfeldnamen:WHILE 
NOT (aktuellessymbol=parametertrennzeichenOR aktuellessymbol=parametergrenze
OR aktuellessymbol=rechteklammer)REP fuehreleseoperationausPER ;IF 
linkeseitevariabelTHEN parameter1:=(subtext(ausgabe,positionlinkeklammer+2,
aktuelleposition-1))ELSE parameter1:=(subtext(ausgabe,positionlinkeklammer+1,
aktuelleposition-1))FI .ueberpruefeobrechteseitedoppeltgeklammert:IF 
aktuellessymbol=rechteklammerTHEN rechteseitevariabel:=TRUE ;
positionrechteklammer:=aktuellepositionELSE positionrechteklammer:=
aktuelleposition-1FI .aufrufderprozedurdbwert:puffer:=dbwert(parameter1,
textvergleich).bestimmungderrichtigenalternative:
bestimmungdeserstenvergleichswertes;WHILE 
vergleichswertstimmtnichtuebereinundeinweiterervorhandenREP 
suchenaechstenvergleichswertPER ;positionrechteklammerbeicaseaufrufbestimmen;
IF vergleichswertstimmtmitdemergebnisausdemdbwertaufrufuebereinTHEN 
bereitstellenderentsprechendenalternativeELIF (ausgabeSUB positionotherwise)=
otherwiseTHEN puffer:=auswerten(subtext(ausgabe,positionotherwise+1,
positionrechteklammer-1))ELSE bereitstelleneinerleerenalternativeFI .
bestimmungdeserstenvergleichswertes:positionlinkeskreuz:=
positionparametergrenze;positionmittlereskreuz:=postext(ausgabe,
parametertrennzeichen,positionlinkeskreuz+1);vergleichswert:=subtext(ausgabe,
positionlinkeskreuz+1,positionmittlereskreuz-1);rechteskreuzbestimmen.
suchenaechstenvergleichswert:positionlinkeskreuz:=positionrechteskreuz;
positionmittlereskreuz:=postext(ausgabe,parametertrennzeichen,
positionlinkeskreuz+1);vergleichswert:=subtext(ausgabe,positionlinkeskreuz+1,
positionmittlereskreuz-1);rechteskreuzbestimmen.rechteskreuzbestimmen:
aktuelleposition:=positionmittlereskreuz;anzahldergeoeffnetenklammern:=0;REP 
fuehreleseoperationausmittextueberlesenUNTIL (anzahldergeoeffnetenklammern=0
AND (aktuellessymbol=parametertrennzeichenOR aktuellessymbol=otherwise))OR 
anzahldergeoeffnetenklammern<0PER ;positionrechteskreuz:=aktuelleposition;
positionotherwise:=aktuelleposition.
vergleichswertstimmtmitdemergebnisausdemdbwertaufrufueberein:IF textvergleich
THEN vergleichswert=pufferELSE real(vergleichswert)=real(puffer)FI .
bereitstellenderentsprechendenalternative:puffer:=auswerten(subtext(ausgabe,
positionmittlereskreuz+1,positionrechteskreuz-1)).
bereitstelleneinerleerenalternative:puffer:=niltext.
vergleichswertstimmtnichtuebereinundeinweiterervorhanden:NOT 
vergleichswertstimmtmitdemergebnisausdemdbwertaufrufuebereinAND 
einweiterervergleichswertistvorhanden.einweiterervergleichswertistvorhanden:
aktuellessymbol=parametertrennzeichen.
positionrechteklammerbeicaseaufrufbestimmen:anzahldergeoeffnetenklammern:=0;
IF aktuellessymbol<>rechteklammerTHEN WHILE NOT (anzahldergeoeffnetenklammern
<0AND aktuellessymbol=rechteklammer)REP 
fuehreleseoperationausmittextueberlesenPER FI ;positionrechteklammer:=
aktuelleposition.einsetzendesfeldwertsoderderalternative:change(ausgabe,
positionlinkeklammer,positionrechteklammer,puffer).ENDPROC auswerten;TEXT 
PROC ausdruckauswerten(TEXT CONST ausdruck):TEXT VAR eingabe:=ausdruck;IF (
eingabeSUB 1)<>linkeklammerTHEN insertchar(eingabe,linkeklammer,1)FI ;IF (
eingabeSUB (length(eingabe)))<>rechteklammerTHEN eingabeCAT rechteklammerFI ;
auswerten(eingabe)ENDPROC ausdruckauswerten;ENDPACKET idadruck;