PACKET textalsrowDEFINES ins,del,CAT ,ipos,dump,replaceiac,VSUB ,VISUB :LET nil13byte="�������������",nil4byte="����",nilbyte="�";TEXT VAR g1,code2:="��" ;PROC ins(TEXT VAR row,INT CONST wo,was):replace(code2,1,was);g1:=subtext(row ,2*wo-1);row:=subtext(row,1,2*wo-2);rowCAT code2;rowCAT g1END PROC ins;PROC del(TEXT VAR row,INT CONST wo):g1:=subtext(row,2*wo+1);row:=subtext(row,1,2* wo-2);rowCAT g1END PROC del;OP CAT (TEXT VAR row,INT CONST was):replace(code2 ,1,was);rowCAT code2END OP CAT ;INT PROC ipos(TEXT CONST row,INT CONST was): INT VAR start:=0;replace(code2,1,was);REP start:=pos(row,code2,start+1)UNTIL startMOD 2=1OR start=0PER ;(start+1)DIV 2END PROC ipos;PROC dump(TEXT VAR row ):INT VAR i;FOR iFROM 1UPTO length(row)DIV 2REP put(rowISUB i)PER END PROC dump;PROC replaceiac(TEXT VAR string,INT CONST wo,TEXT CONST was):IF LENGTH string<=LENGTH was+wo-1THEN stretch(string,LENGTH was+wo-1)FI ;replace(string ,wo,was)END PROC replaceiac;PROC stretch(TEXT VAR t,INT CONST wo):WHILE LENGTH t<=wo-13REP tCAT nil13bytePER ;WHILE LENGTH t<=wo-4REP tCAT nil4byte PER ;WHILE LENGTH tganzrichtigTHEN reorganizescreenFI END PROC checkscreen; screenpage;PROC screencursor(INT CONST x,y):curx:=x;cury:=yEND PROC screencursor;PROC screenpage:FOR curyFROM 1UPTO zeilen-1REPEAT screen(cury):= emptylinePER ;screen(zeilen):=blankline;cury:=1;curx:=1END PROC screenpage; PROC screenbs:curxDECR 1END PROC screenbs;PROC screenline:curyINCR 1;curx:=1; END PROC screenline;PROC screenput(TEXT CONST was):IF was>""THEN checkworkline;getfirstparttoput;WHILE theremaybearestREP replacepart; getnextparttoputPER ;replacerestFI .getfirstparttoput:pbegin:=pos(was," ","�" ,1);pend:=pos(was,"�","�",pbegin)-1.theremaybearest:pend>0.replacepart:buffer :=subtext(was,pbegin,pend);replace(workline,pbegin+curx-1,buffer). getnextparttoput:pbegin:=pos(was," ","�",pend+2);IF pbegin>0THEN pend:=pos( was,"�","�",pbegin)-1;ELSE pend:=0FI .replacerest:IF pbegin>0THEN IF pbegin=1 THEN replace(workline,curx,was)ELSE buffer:=subtext(was,pbegin,LENGTH was); replace(workline,pbegin+curx-1,buffer)FI ;curxINCR LENGTH was;IF curx>spalten THEN curyINCR 1;curxDECR spaltenFI ;FI .END PROC screenput;PROC screenout( TEXT CONST was,INT CONST von,bis):buffer:=subtext(was,von,bis);checkscreen; IF buffer>""THEN checkworkline;replace(workline,curx,buffer);curxINCR ((bis- von)+1);IF curx>spaltenTHEN curyINCR 1;curxDECR spaltenFI FI .workline:screen (cury).END PROC screenout;PROC screenout(TEXT CONST was):checkscreen;IF was> ""THEN checkworkline;replace(workline,curx,was);curxINCR LENGTH was;IF curx> spaltenTHEN curyINCR 1;curxDECR spaltenFI FI .END PROC screenout;PROC reorganizescreen:out("�");IF screenstatus=teilweisefalschTHEN FOR zeileFROM 1 UPTO zeilen-1REPEAT IF lineok(zeile)THEN out(" ")ELSE out(screen(zeile))FI PER ;IF NOT lineok(zeilen)THEN outsubtext(screen(zeilen),1,spalten-1);FI ELSE FOR zeileFROM 1UPTO zeilen-1REPEAT out(screen(zeile))PER ;outsubtext( screen(zeilen),1,spalten-1);FI ;cursor(curx,cury);screenok;END PROC reorganizescreen;PROC screencopy(FILE VAR f):putline(f,"#page#");INT VAR zeile;FOR zeileFROM 1UPTO zeilenREPEAT TEXT VAR t:=screen(zeile);changeall(t, "�"," ");changeall(t,"�"," ");putline(f,t)PER ;END PROC screencopy;PROC reorganizescreen(INT CONST zeile,von,bis):cursor(von,zeile);IF LENGTH screen( zeile)0END PROC fieldexists;INT PROC xsize(TAG CONST a):a.xmaxEND PROC xsize;INT PROC ysize(TAG CONST a):a.ymaxEND PROC ysize;TEXT PROC formline( TAG CONST a,INT CONST l):a.formblatt(l)END PROC formline;PROC setinfo(TEXT CONST string,INT CONST pos):workint:=stringVSUB pos;IF workint>0THEN setallvaluesELSE normal:=TRUE FI .setallvalues:closedbit:=hbit;protectbit:= hbit;darstbit:=hbit;tabbit:=hbit;leftbit:=hbit;exitbit:=hbit;rollbit:=hbit; normal:=FALSE .hbit:workint:=workint*2;IF workint>255THEN workintDECR 256; TRUE ELSE FALSE FI .END PROC setinfo;PROC clearfield(TAG VAR a,INT CONST feld ):sucheanfangdesfeldelementstring;sucheendedesfeldelementstring; loeschefeldelementeintraege;korrigiereerstelverweise;loeschefeldeintraege. sucheanfangdesfeldelementstring:INT VAR anf:=pos(a.feld,code(feld)). sucheendedesfeldelementstring:INT VAR ende:=anf;WHILE (a.feldVSUB ende)=feld REP endeINCR 1PER ;endeDECR 1.loeschefeldelementeintraege:change(a.feld,anf, ende,"");change(a.x,anf,ende,"");change(a.y,anf,ende,"");change(a.len,anf, ende,"");change(a.tab,anf,ende,"").korrigiereerstelverweise:INT VAR feldnr; FOR feldnrFROM 1UPTO LENGTH a.erstelREP IF code(a.erstelSUB feldnr)>endeTHEN replace(a.erstel,feldnr,code(decrementierterwert))FI ;PER . decrementierterwert:code(a.erstelSUB feldnr)-(ende-anf+1). loeschefeldeintraege:replace(a.erstel,feld,"�");replace(a.darst,feld,"�"); replace(a.diainfo,feld,"�");IF LENGTH a.dbnam>=2*feldTHEN replace(a.dbnam, feld,0)FI ;IF LENGTH a.ausknam>=2*feldTHEN replace(a.ausknam,feld,0)FI .END PROC clearfield;PROC definefield(TAG VAR t,TEXT CONST xb,yb,lenb,tabb,INT CONST dbnam,auskinfo,feldnr,TEXT CONST darst,diainfo):IF fieldexists(t,feldnr )THEN clearfield(t,feldnr)FI ;elementarfeldpossuchen;elementarfeldereinfuegen ;erstelverweisekorrigieren;feldeintragen.elementarfeldpossuchen: zumerstenelfeld;WHILE elfelddaCAND (liegtvorneuemCOR NOT isterstel)REP oldnumber:=feld;elementarfeldposINCR 1PER .elementarfeldereinfuegen: insertchar(t.y,yb,elementarfeldpos);insertchar(t.x,xb,elementarfeldpos); insertchar(t.tab,tabb,elementarfeldpos);insertchar(t.len,lenb, elementarfeldpos);insertchar(t.feld,LENGTH xb*code(feldnr),elementarfeldpos). erstelverweisekorrigieren:INT VAR fnr;FOR fnrFROM 1UPTO LENGTH t.erstelREP IF code(t.erstelSUB fnr)>=elementarfeldposTHEN replace(t.erstel,fnr,code( incrementierterwert))FI ;PER .incrementierterwert:code(t.erstelSUB fnr)+ LENGTH xb.feldeintragen:replaceiac(t.erstel,feldnr,code(elementarfeldpos)); replaceiac(t.diainfo,feldnr,diainfo);replaceiac(t.darst,feldnr,darst);IF dbnam<>0THEN replaceiac(t.dbnam,feldnr,dbnam)FI ;IF auskinfo<>0THEN replaceiac(t.ausknam,feldnr,auskinfo)FI .zumerstenelfeld:INT VAR oldnumber:=0 ;INT VAR elementarfeldpos:=1.liegtvorneuem:y<(ybSUB 1)OR (y=(ybSUB 1)AND x<( xbSUB 1)).isterstel:oldnumber<>feld.elfeldda:elementarfeldpos<=LENGTH t.x.y:t .ySUB elementarfeldpos.x:t.xSUB elementarfeldpos.feld:code(t.feldSUB elementarfeldpos).END PROC definefield;OP SCROLL (TAG VAR t,INT CONST lines): cat:="";INT VAR i;FOR iFROM 1UPTO LENGTH (t.y)REP INT VAR v:=code(t.ySUB i)+ lines;IF v<1OR v>taglinesTHEN errorstop( "Feld ausserhalb Bildschirm durch SCROLL")FI ;catCAT code(v)PER ;t.y:=cat;IF lines>0THEN FOR iFROM min(taglines-lines,t.ymax)DOWNTO 1REP t.formblatt(i+ lines):=t.formblatt(i)PER ;FOR iFROM linesDOWNTO 1REP t.formblatt(i):=""PER ; t.ymaxINCR lines;t.ymax:=min(taglines,t.ymax)ELSE FOR iFROM 1-linesUPTO min(t .ymax-lines,taglines)REP t.formblatt(i+lines):=t.formblatt(i)PER ;FOR iFROM t .ymax+lines+1UPTO t.ymaxREP t.formblatt(i):=""PER ;t.ymaxINCR lines;t.ymax:= max(t.ymax,1);FI .END OP SCROLL ;INT PROC fieldwithname(TAG CONST t,INT CONST name):ipos(t.dbnam,name)END PROC fieldwithname;INT PROC symbolicname( TAG CONST t,INT CONST feld):t.dbnamVISUB feldEND PROC symbolicname;PROC symbolicname(TAG VAR t,INT CONST feld,symbol):replaceiac(t.dbnam,feld,symbol) END PROC symbolicname;INT PROC auskunftsnr(TAG CONST t,INT CONST feld):t. ausknamVISUB feldEND PROC auskunftsnr;INT PROC auskunftsnr:ausnrEND PROC auskunftsnr;PROC auskunftsnr(TAG VAR t,INT CONST feld,ausknr):replaceiac(t. ausknam,feld,ausknr)END PROC auskunftsnr;PROC fieldinfos(TAG CONST t,INT CONST feld,INT VAR geheimcode,BOOL VAR closed,protected,secret,special,left): geheimcode:=code(t.darstSUB feld);setinfo(t.diainfo,feld);IF normalTHEN closed:=FALSE ;protected:=FALSE ;secret:=FALSE ;special:=FALSE ;left:=FALSE ; ELSE closed:=closedbit;protected:=protectbit;secret:=darstbit;special:=tabbit ;left:=leftbit;FI END PROC fieldinfos;PROC setfieldinfos(TAG VAR t,INT CONST feld,BOOL CONST closed,protected,secret):INT VAR cd:=(t.diainfoVSUB feld)MOD 32;IF secretTHEN cdINCR 32FI ;IF protectedTHEN cdINCR 64FI ;IF closedTHEN cd INCR 128FI ;replaceiac(t.diainfo,feld,code(cd))END PROC setfieldinfos;PROC transform(TAG CONST t,FILE VAR o):enablestop;buffer:="";bufferCAT t.xmax; bufferCAT t.ymax;bufferCAT t.xs;bufferCAT t.ys;bufferCAT t.dbp;bufferCAT t. ver;bufferCAT t.durchs;bufferCAT t.art;putline(o,buffer);putline(o,t.darst); putline(o,t.erstel);putline(o,t.diainfo);putline(o,t.dbnam);putline(o,t. ausknam);putline(o,t.feld);putline(o,t.x);putline(o,t.y);putline(o,t.tab); putline(o,t.len);putline(o,trtab);tTO o.END PROC transform;PROC transform( FILE VAR i,TAG VAR t):enablestop;TEXT VAR oldtrtab:=trtab;getline(i,buffer);t .xmax:=bufferISUB 1;IF t.xmax<>12336THEN t.ymax:=bufferISUB 2;t.xs:=buffer ISUB 3;t.ys:=bufferISUB 4;t.dbp:=bufferISUB 5;t.ver:=bufferISUB 6;t.durchs:= bufferISUB 7;t.art:=bufferISUB 8;getline(i,t.darst);getline(i,t.erstel); getline(i,t.diainfo);getline(i,t.dbnam);getline(i,t.ausknam);getline(i,t.feld );getline(i,t.x);getline(i,t.y);getline(i,t.tab);getline(i,t.len);getline(i, trtab);ELSE nil(t);FI ;iTO t;trtab:=oldtrtab;IF t.ver<>1THEN errorstop( "Datei enth�lt kein TAG")FI .END PROC transform;PROC filetotag(DATASPACE CONST ei):type(ei,tagtypenr)END PROC filetotag;PROC tagtofile(DATASPACE CONST ei):IF type(ei)=tagtypenrTHEN type(ei,filetypenr)ELSE errorstop( "TYPE nicht TAG")FI END PROC tagtofile;PROC efill(TAG VAR ff,TEXT CONST t, INT CONST elfeld):INT CONST abwo:=1;zumerstenelementarfeld;WHILE nochgenugtextdaREP fuelleelementarfeld;elementarfeldweiterzaehlen;IF gehoertzumnaechstenfeldTHEN markiereueberlauf;LEAVE efillFI ;zumelementarfeld ;PER ;gibrestaus.zumerstenelementarfeld:tlen:=LENGTH t;tout:=abwo-1;afeld:=ff .feldVSUB elfeld;ael:=elfeld;zumelementarfeld.fuelleelementarfeld:cat:= subtext(t,tout+1,tout+al);replace(ff.formblatt(ay),ax,cat);toutINCR al. nochgenugtextda:tout+alafeld.gibrestaus:cat:=subtext(t, tout+1,tlen);replace(ff.formblatt(ay),ax,cat).markiereueberlauf:replace(ff. formblatt(ay),ax+al-1,"<").END PROC efill;PROC fill(TAG VAR t,TEXT CONST inhalt,INT CONST feld):setinfo(t.diainfo,feld);INT VAR erstelem:=t.erstel VSUB feld;IF erstelem>0THEN IF normalCOR NOT closedbitTHEN efill(t,inhalt, erstelem)FI FI END PROC fill;OP CLEARBY (TAG VAR u,TAG CONST u1):INT VAR i; FOR iFROM 1UPTO u.ymaxREP u.formblatt(i):=u1.formblatt(i)PER ;END OP CLEARBY ;INT VAR afeld,ax,ay,al,ael,tlen,tout;PROC eput(TAG CONST ff,TEXT CONST t, INT CONST elfeld):eput(ff,t,elfeld,1)END PROC eput;PROC eput(TAG CONST ff, TEXT CONST t,INT CONST elfeld,INT CONST abwo):zumerstenelementarfeld;WHILE nochgenugtextdaREP fuelleelementarfeld;elementarfeldweiterzaehlen;IF gehoertzumnaechstenfeldTHEN markiereueberlauf;LEAVE eputFI ;zumelementarfeld; PER ;gibrestaus;REP elementarfeldweiterzaehlen;IF gehoertzumnaechstenfeld THEN LEAVE eputFI ;zumelementarfeld;gibhintergrundausPER . zumerstenelementarfeld:tlen:=LENGTH t;tout:=abwo-1;afeld:=ff.feldVSUB elfeld; ael:=elfeld;positionieren(ff).fuelleelementarfeld:xoutsubtext(t,tout+1,tout+ al);toutINCR al.nochgenugtextda:tout+alafeld.gibrestaus:xoutsubtext(t,tout+1,tlen);IF tout+al>tlenTHEN xoutsubtext(grund,ax+tlen-tout,ax+al-1)FI .gibhintergrundaus:xoutsubtext( grund,ax,ax+al-1).grund:ff.formblatt(ay).markiereueberlauf:IF outputallowed THEN out("�<")FI ;IF protTHEN screenbs;screenout("<")FI .END PROC eput;PROC positionieren(TAG CONST ff):al:=ff.lenVSUB ael;ax:=ff.xVSUB ael;ay:=ff.yVSUB ael;IF protTHEN screencursor(ax,ay)FI ;IF outputallowedTHEN cursor(ax,ay)FI . END PROC positionieren;PROC cursor(TAG CONST ff,INT CONST feld):ael:=ff. erstelVSUB feld;positionieren(ff)END PROC cursor;INT PROC length(TAG CONST ff ,INT CONST feld):zumerstenelementarfeld;IF ael<1THEN LEAVE lengthWITH 0FI ; INT VAR len:=0;REP lenINCR feldlaenge;zumnaechstenelementarfeld;UNTIL gehoertzumnaechstenfeldPER ;len.zumerstenelementarfeld:ael:=ff.erstelVSUB feld.zumnaechstenelementarfeld:aelINCR 1.gehoertzumnaechstenfeld:(ff.feld VSUB ael)<>feld.feldlaenge:ff.lenVSUB ael.END PROC length;PROC show(TAG CONST ff):INT VAR i;IF protTHEN IF screenreorganizedTHEN FOR iFROM 1UPTO ff. ymaxREP screencursor(1,i);screenput(ff.formblatt(i))PER ;ELSE FOR iFROM 1 UPTO ff.ymaxREP IF ff.formblatt(i)>""THEN screencursor(1,i);screenok(FALSE ,i ,i);screenput(ff.formblatt(i))FI PER ;IF outputallowedTHEN reorganizescreen FI ;LEAVE showFI FI ;IF outputallowedTHEN out(home);out(ff.formblatt(1));FOR iFROM 2UPTO ff.ymaxREP line;out(ff.formblatt(i))PER FI .END PROC show;INT VAR charcode:=0,lastx,lasty;PROC translatecode:charcode:=code(char);SELECT charcodeOF CASE chop:charcode:=chomeCASE cvor:charcode:=cfeldendeCASE crueck: charcode:=cfeldanfCASE choch:charcode:=cseiterueckCASE crunter:charcode:= cseitevorCASE ctab:charcode:=csettabCASE ceinf:charcode:=caufbrechCASE causf: charcode:=cloeschendeCASE cfeldvor:charcode:=cfeldrueckCASE cmark:charcode:= cneuCASE cesc:charcode:=clearnOTHERWISE charcode:=pos(hoptasten,char);IF charcode=0THEN IF ischarTHEN FI ELSE char:=hopcodesSUB charcode;charcode:= code(char)FI END SELECT END PROC translatecode;TEXT VAR char,pseudochar;BOOL PROC ischar:inchar(char);charcode:=code(char);IF charcode>31THEN TRUE ELIF charcode=chopTHEN inchar(char);translatecode;charcode>31ELSE FALSE FI END PROC ischar;INT VAR aktlimit,aktbegin,aktfeld,aktline,aktlen,aktanf,aktel,wo; PROC setfieldvalues(TAG CONST ta):aktlen:=ta.lenVSUB aktel;aktanf:=ta.xVSUB aktel;aktline:=ta.yVSUB aktelEND PROC setfieldvalues;INT VAR nextfeld,nextel, nextwo,nextbegin;PROC setlasteditvalues:preset:=TRUE END PROC setlasteditvalues;PROC setneweditvalues:aktfeld:=nextfeld;aktbegin:=nextbegin ;aktel:=nextel;wo:=nextwo;preset:=TRUE END PROC setneweditvalues;BOOL VAR preset:=FALSE ,feldda;PROC searchfield(TAG CONST t,INT CONST x,y,BOOL VAR erfolg):erfolg:=FALSE ;nextel:=0;REP sucheelementinrichtigerzeileUNTIL keinsmehrdaCOR xposstimmtPER ;IF erfolgTHEN nextfeld:=t.feldVSUB nextel; nextbegin:=1;INT VAR i:=t.erstelVSUB nextfeld;WHILE ix;erfolg.anfang:t.xVSUB nextel. ende:(t.xVSUB nextel)+(t.lenVSUB nextel).END PROC searchfield;PROC editieren( TAG CONST ff,TEXT VAR eing,INT CONST feld):IF fieldexists(ff,feld)THEN bestimmeeinstieg;REPEAT REPEAT wertesteuerzeichenausUNTIL ischarPER ;REPEAT schreibezeichen;UNTIL wo>aktlimitCOR NOT ischarPER PER FI .bestimmeeinstieg: IF presetAND (feld=0COR feld=aktfeld)THEN ELSE aktfeld:=feld;aktel:=ff.erstel VSUB aktfeld;aktbegin:=1;wo:=1FI ;charcode:=centry;preset:=FALSE ;IF NOT normalTHEN preparespecialeditingFI .preparespecialediting:IF darstbitTHEN pseudochar:=ff.darstSUB feldFI .schreibezeichen:IF wo<=LENGTH eingTHEN replace(eing,wo,char)ELSE eingCAT char;IF wo>LENGTH eing+1THEN normalizepositionFI FI ;IF normalCOR NOT darstbitTHEN out(char)ELSE out( pseudochar)FI ;woINCR 1.wertesteuerzeichenaus:SELECT charcodeOF CASE cneu: neuschreibenCASE centry:setfieldvalues(ff);positionieren;aktlimit:=aktbegin+ aktlen-1CASE cvor:IF wo<=LENGTH eingTHEN woINCR 1;out(right);forwardFI CASE cfeldende:zumfeldendeCASE crueck:woDECR 1;out(left);backwardCASE cfeldanf:wo :=1;backwardtoendCASE ceinf:insertchar(eing," ",wo);restneuschreibenCASE causf:IF LENGTH eing>0THEN IF wo>LENGTH eingTHEN woDECR 1;out(left);backward FI ;deletechar(eing,wo);restneuschreibenFI ;CASE cloeschende:eing:=subtext( eing,1,wo-1);restneuschreibenCASE choch:gouporleaveCASE crunter:godownorleave OTHERWISE :IF charcode>31THEN forwardELSE leaveFI END SELECT .zumfeldende:wo :=LENGTH eing+1;forward;positionieren.positionieren:cursor(aktanf+(wo- aktbegin),aktline).forward:WHILE wo>aktlimitREPEAT aktelINCR 1;IF gehoertzumfeldTHEN aktbegin:=aktlimit+1;decodefieldlen;aktlimitINCR aktlen ELSE aktelDECR 1;wo:=aktlimitFI ;positionierenPER .leave:getcursor(lastx, lasty);LEAVE editieren.godownorleave:getcursor(lastx,lasty);searchfield(ff, lastx,lasty+1,feldda);IF felddaCAND nextfeld=aktfeldTHEN wo:=nextwo;aktel:= nextel;setfieldvalues(ff);aktbegin:=nextbegin;aktlimit:=aktbegin-1+aktlen; positionierenELSE LEAVE editierenFI .gouporleave:getcursor(lastx,lasty); searchfield(ff,lastx,lasty-1,feldda);IF felddaCAND nextfeld=aktfeldTHEN wo:= nextwo;aktel:=nextel;setfieldvalues(ff);aktbegin:=nextbegin;aktlimit:= aktbegin-1+aktlen;positionierenELSE LEAVE editierenFI .backward:IF wo< aktbeginTHEN IF wo<1THEN wo:=1ELSE aktelDECR 1;decodefieldlen;aktlimit:= aktbegin-1;aktbeginDECR aktlen;FI ;positionierenFI .backwardtoend:aktel:=ff. erstelVSUB aktfeld;decodefieldlen;aktbegin:=1;aktlimit:=aktlen;positionieren. normalizeposition:wo:=LENGTH eing;WHILE wo0THEN IF normalCOR NOT darstbitTHEN eput(ff,v,erstelem)ELSE eput(ff,LENGTH v*(ff.darstSUB feld), erstelem)FI FI END PROC put;INT PROC leavingcode:charcodeEND PROC leavingcode ;PROC putget(TAG CONST ff,ROW maxfieldsTEXT VAR v,INT VAR einstieg):put(ff,v) ;get(ff,v,einstieg)END PROC putget;PROC put(TAG CONST ff,ROW maxfieldsTEXT VAR fieldvalues):INT VAR iFOR iFROM 1UPTO LENGTH ff.erstelREP IF fieldexists( ff,i)THEN put(ff,fieldvalues(i),i)FI PER END PROC put;PROC get(TAG CONST ff, ROW maxfieldsTEXT VAR fieldvalues,INT VAR feld):INT VAR felder:=LENGTH ff. erstel;IF NOT fieldexists(ff,feld)THEN errorstop("startfeld nicht im tag") ELSE WHILE feld<=felderREPEAT get(ff,fieldvalues(feld),feld); executecommandcode(ff,feld)UNTIL charcode=cescPER FI END PROC get;PROC executecommandcode(TAG CONST ff,INT VAR feld):SELECT charcodeOF CASE cfeldrueck:topriorfieldCASE cfeldvor:tonextfieldCASE choch:goupifpossible CASE crunter:godownifpossibleCASE chome:tohomefieldCASE ctab:IF protTHEN reorganizescreenFI ;setlasteditvaluesCASE cesc:ausnr:=auskunftsnr(ff,feld) END SELECT .topriorfield:REPEAT feld:=priorfield(ff,feld)UNTIL warerstesCOR nichtgesperrtPER ;IF warerstesTHEN tohomefieldFI .tonextfield:INT VAR oldfeld :=feld;REP feld:=nextfield(ff,feld)UNTIL warletztesCOR nichtgesperrtPER ;IF warletztesTHEN feld:=oldfeld;IF beimletztenrausfallenTHEN charcode:=cesc; beimletztenrausfallen:=FALSE FI FI .tohomefield:feld:=firstfield(ff);WHILE gesperrtREP feld:=nextfield(ff,feld)PER .goupifpossible:BOOL VAR erfolg; searchfield(ff,lastx,lasty-1,erfolg);IF erfolgAND nextnichtgesperrtTHEN setneweditvalues;feld:=nextfeldELSE setlasteditvaluesFI .godownifpossible: searchfield(ff,lastx,lasty+1,erfolg);IF erfolgAND nextnichtgesperrtTHEN setneweditvalues;feld:=nextfeldELSE setlasteditvaluesFI .nichtgesperrt:(ff. diainfoVSUB feld)<64.nextnichtgesperrt:(ff.diainfoVSUB nextfeld)<64.gesperrt: NOT nichtgesperrt.warletztes:feld<1.warerstes:feld<1.END PROC executecommandcode;PROC setautoesc:beimletztenrausfallen:=TRUE END PROC setautoesc;INT PROC firstfield(TAG CONST t):t.feldVSUB 1END PROC firstfield; INT PROC nextfield(TAG CONST t,INT CONST feld):INT VAR el:=(t.erstelVSUB feld )+1;WHILE (t.feldVSUB el)=feldREP elINCR 1PER ;t.feldVSUB elEND PROC nextfield;INT PROC priorfield(TAG CONST t,INT CONST feld):t.feldVSUB ((t. erstelVSUB feld)-1)END PROC priorfield;TEXT VAR buffer,blinkan,blinkaus;TEXT VAR trtab:="!<> ",tr;TAG VAR hilfstag;nil(hilfstag);hilfstag.formblatt( taglines):=" Feldnummer : __ "; definefield(hilfstag,code(pos(hilfstag.formblatt(taglines),"_")),code( taglines),"�",".",0,0,1,"�","�");OP TO (FILE VAR a,TAG VAR t):INT VAR i,j; TEXT VAR char;t.xmax:=0;FOR jFROM 1UPTO taglinesREP IF NOT eof(a)THEN getline (a,buffer);transform;IF length(buffer)>t.xmaxTHEN t.xmax:=length(buffer)FI ;t .ymax:=jELSE tr:=niltext;FI ;t.formblatt(j):=tr;PER .transform:tr:=niltext; FOR iFROM 1UPTO LENGTH bufferREP char:=bufferSUB i;SELECT pos(trtab,char)OF CASE 2:trCAT inversCASE 3:trCAT endinversCASE 1:trCAT " "CASE 4:trCAT right OTHERWISE :trCAT charEND SELECT PER .END OP TO ;OP TO (TAG CONST t,FILE VAR f ):INT VAR i,j;TEXT VAR pseudoblank:=trtabSUB 1,char;FOR jFROM 1UPTO t.ymax REP buffer:=t.formblatt(j);retransform;putline(f,tr)PER .retransform:tr:= niltext;FOR iFROM 1UPTO LENGTH bufferREP char:=bufferSUB i;SELECT code(char) OF CASE 32:trCAT pseudoblankCASE 15:trCAT (trtabSUB 2)CASE 14:trCAT (trtab SUB 3)CASE cvor:trCAT " "OTHERWISE :trCAT charEND SELECT PER ;buffer:=tr.END OP TO ;PROC trans(TEXT CONST x):IF LENGTH x=3THEN trtab:=x;trtabCAT " "ELSE errorstop("falsche Umsetztabelle")FI END PROC trans;TEXT PROC blink(TAG CONST t,INT VAR feld):blinkan:=length(t,feld)*"#";blinkaus:=LENGTH blinkan* "!";INT VAR i;FOR iFROM 1UPTO 20REP IF (iMOD 2)=0THEN put(t,blinkan,feld); ELSE put(t,blinkaus,feld);FI ;buffer:=incharety(3)UNTIL buffer<>""PER ;buffer END PROC blink;PROC findchar(TAG CONST f,TEXT CONST eingabe,INT VAR posx,posy ):INT VAR posxn:=posx,posyn:=posy;WHILE (f.formblatt(posy)SUB posxn)=eingabe REP posxnINCR 1PER ;posxn:=pos(f.formblatt(posy),eingabe,posxn+1);WHILE posxn =0REP posynINCR 1;IF posyn>f.ymaxTHEN LEAVE findcharFI ;posxn:=pos(f. formblatt(posyn),eingabe)PER ;posx:=posxn;posy:=posyn.END PROC findchar;PROC designelfield(TAG CONST t,INT CONST xm,ym,INT VAR x,y,l):cursortostartpos; cursortoendpos.cursortostartpos:TEXT VAR storage:="_";REP cursor(x,y);IF ischarTHEN findchar(t,char,x,y);storage:=charELSE SELECT charcodeOF CASE chome:x:=1;y:=1CASE cvor:x:=xMOD xm;xINCR 1CASE crueck:IF x=1THEN x:=xmELSE x DECR 1FI CASE cfeldanf:x:=1CASE cfeldende:x:=xmCASE choch:IF y=1THEN y:=ym ELSE yDECR 1FI CASE crunter:y:=yMOD ym;yINCR 1CASE causkunft:cursor(1,24);out ("X=");put(text(x,2));out(" Y=");put(text(y,2))CASE cesc:LEAVE designelfield CASE ctab:findchar(t,storage,x,y)CASE cfeldvor:LEAVE cursortostartpos OTHERWISE :out("�")END SELECT FI PER .cursortoendpos:TEXT VAR aktchar:=t. formblatt(y)SUB x;IF aktchar>" "AND (t.formblatt(y)SUB x-1)<>aktcharTHEN l:=1 ;WHILE (t.formblatt(y)SUB (x+l))=aktcharREP lINCR 1PER ;FI ;markiere;REP WHILE ischarREP out("�")PER ;IF charcode=cvorAND x+l");out(left);ELIF charcode=crueckAND l>1THEN originalzeichenausgeben;lDECR 1ELIF charcode=cescTHEN LEAVE designelfield ELIF charcode=cfeldvorTHEN LEAVE cursortoendposFI PER . originalzeichenausgeben:out(" �");out(t.formblatt(y)SUB (x+l-1));out("��"). markiere:cursor(x,y);lTIMESOUT ">";out(left).END PROC designelfield;INT VAR el;PROC designfield(TAG CONST t,INT CONST feld,TEXT VAR x,y,l,ta):IF NOT varsinitializedTHEN initializeFI ;REP designelement;elINCR 1PER . varsinitialized:LENGTH x=LENGTH yAND LENGTH y=LENGTH lAND LENGTH l=LENGTH ta AND LENGTH x>0.initialize:IF NOT fieldexists(t,feld)THEN x:="";y:="";l:="";ta :=""ELSE INT VAR begin:=t.erstelVSUB feld,end:=begin;WHILE (t.feldVSUB end)= feldREP endINCR 1PER ;endDECR 1;x:=subtext(t.x,begin,end);y:=subtext(t.y, begin,end);l:=subtext(t.len,begin,end);ta:=subtext(t.tab,begin,end);FI ;el:=1 .designelement:INT VAR xb,yb,lb;cursor(1,24);out(text(el));out( ". Teilfeld ");IF LENGTH xcescCOR no(" �Formulardarstellung veraendern")PER END PROC design;PROC designform(TAG VAR f):taginitialisieren;formulareditieren. formulareditieren:DATASPACE VAR wds:=nilspace;FILE VAR in:=sequentialfile( output,wds);fTO in;modify(in);headline(in,"Formular eingeben !");edit(in); page;input(in);reset(in);inTO f;forget(wds).taginitialisieren:IF f.ver<>1 THEN nil(f)FI .END PROC designform;PROC dummie(INT VAR a,b,TEXT VAR c,BOOL VAR d,e):LEAVE dummie;a:=b;d:=e;c:="";END PROC dummie;PROC designfields(TAG VAR f):designfields(f,PROC dummie)END PROC designfields;PROC designfields( TAG VAR f,PROC (INT VAR ,INT VAR ,TEXT VAR ,BOOL VAR ,BOOL VAR )setparam): show(f);INT VAR feld:=2;TEXT VAR xrow,yrow,lrow,trow;REPEAT feldnummereinlesen;benutzerwunscherfragen;benutzerwunschauswertenEND REP . benutzerwunscherfragen:IF fieldexists(f,feld)THEN REP cursor(1,24);out( "a(endern) ,l(oeschen), i(rrtum) ?");TEXT VAR ein:=blink(f,feld);IF ein="�" THEN charcode:=cesc;LEAVE designfieldsFI UNTIL pos("aAäÄlLiI",ein)>0PER ; ELSE REP cursor(1,24);out(" n(eu einrichten), (i)rrtum ?");inchar(ein); IF ein="�"THEN charcode:=cesc;LEAVE designfieldsFI UNTIL pos("nNiI",ein)>0 PER ;FI ;cursor(1,24);out(" "). benutzerwunschauswerten:IF pos("lL",ein)>0THEN put(f,"",feld);clearfield(f, feld)ELSE IF fieldexists(f,feld)THEN put(f,"",feld);FI ;IF pos("iI",ein)=0 THEN xrow:="";yrow:=" ";lrow:="";trow:="";designfield(f,feld,xrow,yrow,lrow, trow);parametersetzen;definefield(f,xrow,yrow,lrow,trow,sym,aus,feld,dar,dia) ;feldINCR 1;FI FI .feldnummereinlesen:TEXT VAR itext:=text(feld);REPEAT cursor(1,24);out("�");out(hilfstag.formblatt(taglines));putget(hilfstag,itext ,1);IF leavingcode=cescTHEN LEAVE designfieldsFI ;feld:=int(itext);IF feld<1 OR leavingcode=causkunftOR NOT lastconversionokTHEN dialogueELSE LEAVE feldnummereinlesen;FI ;PER .dialogue:REP cursor(1,24);out( "q(uit), i(rrtum), m(aske neu zeigen), f(eldnummern) �");inchar(ein);IF ein= "�"THEN charcode:=cesc;LEAVE designfieldsFI UNTIL pos("qQiImMfF",ein)>0PER ; SELECT (pos("qQiImMfF",ein)-1)DIV 2OF CASE 0:LEAVE designfieldsCASE 1:LEAVE dialogueCASE 2:show(f)CASE 3:INT VAR i;FOR iFROM 1UPTO fields(f)REP TEXT VAR buf:=text(i);bufCAT "*";put(f,((length(f,i)-1)DIV LENGTH (buf)+1)*buf,i)PER END SELECT .parametersetzen:INT VAR aus:=auskunftsnr(f,feld),sym:= symbolicname(f,feld);TEXT VAR dar:=f.darstSUB feld,dia;setinfo(f.diainfo,feld );BOOL VAR a:=closedbit,b:=protectbit,c:=darstbit;setparam(sym,aus,dar,b,c); setfieldinfos(f,feld,a,b,c);dia:=f.diainfoSUB feld;dar:=text(dar,1).END PROC designfields;END PACKET mask;PACKET dateDEFINES monat,jahr,tag,datum,tmj, datumjh,nildatum,jahrestag,wochentag:LET seperatorzeichen=":./ ", seperatorzeichen1=".";INT CONST beforefirstday:=-(22*vierjahre)-1;TEXT VAR b; BOOL VAR conversionerror:=FALSE ;INT PROC nildatum:beforefirstdayEND PROC nildatum;#L datumslets#LET letzterjanuar=31,letzterfebruar=59,letztermaerz=90 ,letzterapril=120,letztermai=151,letzterjuni=181,letzterjuli=212, letzteraugust=243,letzterseptember=273,letzteroktober=304,letzternovember=334 ,#letzterdezember=365,#vierjahre=1461;PROC tmj(INT CONST d,INT VAR t,m,j): INT VAR a;IF d<=beforefirstdayTHEN t:=-1;m:=-1;j:=-1;LEAVE tmjFI ;a:=d;IF a>0 THEN j:=88ELSE j:=0;aINCR (-(beforefirstday+1))FI ;jINCR 4*(aDIV vierjahre);a :=aMOD vierjahre;IF a=letzterfebruarTHEN t:=29;m:=2;LEAVE tmjELIF a> letzterfebruarTHEN aDECR 1FI ;jINCR aDIV 365;a:=(aMOD 365)+1;IF a<= letzterjuniTHEN januarbisjuniELSE julibisdezemberFI .januarbisjuni:IF a<= letztermaerzTHEN januarbismaerzELSE aprilbisjuniFI .julibisdezember:IF a<= letzterseptemberTHEN julibisseptemberELSE oktoberbisdezemberFI . januarbismaerz:IF a<=letzterjanuarTHEN m:=1;t:=aELIF a<=letzterfebruarTHEN m :=2;t:=a-letzterjanuarELSE m:=3;t:=a-letzterfebruarFI .aprilbisjuni:IF a<= letzteraprilTHEN m:=4;t:=a-letztermaerzELIF a<=letztermaiTHEN m:=5;t:=a- letzteraprilELSE m:=6;t:=a-letztermaiFI .julibisseptember:IF a<=letzterjuli THEN m:=7;t:=a-letzterjuniELIF a<=letzteraugustTHEN m:=8;t:=a-letzterjuli ELSE m:=9;t:=a-letzteraugustFI .oktoberbisdezember:IF a<=letzteroktoberTHEN m :=10;t:=a-letzterseptemberELIF a<=letzternovemberTHEN m:=11;t:=a- letzteroktoberELSE m:=12;t:=a-letzternovemberFI .END PROC tmj;INT PROC datum( TEXT CONST a):b:=a;conversionerror:=FALSE ;INT VAR seperator:=seppos,t,m,j; IF seperator=0THEN IF length(b)=6THEN t:=z(1)*10+z(2);m:=z(3)*10+z(4);j:=z(5) *10+z(6);INT VAR dummy:=datum(t,m,j);IF conversionerrorTHEN dummy:=nildatum FI ;LEAVE datumWITH dummyELSE leaveFI ELIF seperator=2THEN t:=z(1);ELIF seperator=3THEN t:=10*z(1)+z(2);ELSE leaveFI ;b:=subtext(b,seperator+1); seperator:=seppos;IF seperator=3THEN m:=z(1)*10+z(2);ELIF seperator=2THEN m:= z(1)ELSE leaveFI ;b:=subtext(b,seperator+1);IF length(b)=2THEN j:=z(1)*10+z(2 )ELIF length(b)=4THEN j:=z(1)*1000+z(2)*100+z(3)*10+z(4)-1900;ELSE leaveFI ; IF conversionerrorTHEN nildatumELSE datum(t,m,j)FI .leave:LEAVE datumWITH nildatum.seppos:INT VAR q;FOR qFROM 2UPTO 3REP IF pos(seperatorzeichen,bSUB q )>0THEN LEAVE sepposWITH q;FI PER ;0.END PROC datum;INT PROC z(INT CONST wo): INT VAR e:=code(bSUB wo)-48;IF e<0OR e>9THEN conversionerror:=TRUE ;0ELSE e FI END PROC z;INT PROC datum(INT CONST t,m,jc):INT VAR j:=jc-1900IF j<0THEN j INCR 1900FI ;IF (j+160)DIV 160<>1THEN nildatumELIF t<0THEN nildatumELSE SELECT mOF CASE 1,3,5,7,8,10,12:IF t>31THEN nildatumELSE erg(t,m,j)FI CASE 4, 6,9,11:IF t>30THEN nildatumELSE erg(t,m,j)FI CASE 2:IF t<29THEN erg(t,m,j) ELIF t=29AND jMOD 4=0THEN erg(t,m,j)ELSE nildatumFI OTHERWISE nildatumEND SELECT FI END PROC datum;INT PROC wochentag(INT CONST d):INT CONST x:=d-1;IF x<0THEN 6-(-xMOD 7)ELSE xMOD 7FI END PROC wochentag;INT PROC jahrestag(INT CONST d):INT VAR a;IF d<=beforefirstdayTHEN LEAVE jahrestagWITH -1FI ;a:=d; IF a<=0THEN aINCR (-(beforefirstday+1))FI ;a:=aMOD vierjahre;IF a>365THEN a DECR 366;a:=aMOD 365FI ;a+1END PROC jahrestag;INT PROC erg(INT CONST t,m,jc): INT VAR j:=jc;INT VAR result:=beforefirstday,tagimzyklus;IF j>=88THEN jDECR 88;result:=-1FI ;resultINCR ((jDIV 4)*vierjahre);j:=jMOD 4;tagimzyklus:= tagundmonat+365*j;IF tagimzyklus>erstermaerzimschaltjahrTHEN tagimzyklusINCR 1ELIF tagimzyklus=erstermaerzimschaltjahrAND m=3THEN tagimzyklusINCR 1FI ; result+tagimzyklus.erstermaerzimschaltjahr:60.tagundmonat:SELECT mOF CASE 1:t CASE 2:t+letzterjanuarCASE 3:t+letzterfebruarCASE 4:t+letztermaerzCASE 5:t+ letzteraprilCASE 6:t+letztermaiCASE 7:t+letzterjuniCASE 8:t+letzterjuliCASE 9 :t+letzteraugustCASE 10:t+letzterseptemberCASE 11:t+letzteroktoberCASE 12:t+ letzternovemberOTHERWISE errorstop("monat > 12 oder < 0");0END SELECT .END PROC erg;INT PROC tag(INT CONST d):INT VAR t,m,j;tmj(d,t,m,j);tEND PROC tag; INT PROC jahr(INT CONST d):INT VAR t,m,j;tmj(d,t,m,j);j+1900END PROC jahr; INT PROC monat(INT CONST d):INT VAR t,m,j;tmj(d,t,m,j);mEND PROC monat;TEXT PROC datumjh(INT CONST d):INT VAR t,m,j;TEXT VAR e;tmj(d,t,m,j);IF t<0THEN LEAVE datumjhWITH ""FI ;e:=code(tDIV 10+48);eCAT code(tMOD 10+48);eCAT seperatorzeichen1;eCAT code(mDIV 10+48);eCAT code(mMOD 10+48);eCAT seperatorzeichen1;IF j<100THEN eCAT "19"ELSE eCAT "20";jDECR 100FI ;eCAT code (jDIV 10+48);eCAT code(jMOD 10+48);eEND PROC datumjh;TEXT PROC datum(INT CONST d):INT VAR t,m,j;TEXT VAR e;tmj(d,t,m,j);IF t<0THEN LEAVE datumWITH "" FI ;e:=code(tDIV 10+48);eCAT code(tMOD 10+48);eCAT seperatorzeichen1;eCAT code(mDIV 10+48);eCAT code(mMOD 10+48);eCAT seperatorzeichen1;eCAT code((j MOD 100)DIV 10+48);eCAT code(jMOD 10+48);eEND PROC datum;END PACKET date;