summaryrefslogtreecommitdiff
path: root/dialog/ls-DIALOG 2
diff options
context:
space:
mode:
Diffstat (limited to 'dialog/ls-DIALOG 2')
-rw-r--r--dialog/ls-DIALOG 2871
1 files changed, 819 insertions, 52 deletions
diff --git a/dialog/ls-DIALOG 2 b/dialog/ls-DIALOG 2
index 1750162..7fb5d36 100644
--- a/dialog/ls-DIALOG 2
+++ b/dialog/ls-DIALOG 2
@@ -22,56 +22,823 @@
*)
PACKET ls dialog 2 DEFINES
- some,{} one,{} infix namen,{} ohne praefix,{} not empty:{}LET maxentries = 200;{}LET zeichenstring = ""1""27""3""10""13""12"xo?",{} oben unten return rubout kreuz kringel = ""3""10""13""12"xo",{} q eins neun h = "q19h";{}LET zurueck = ""8"",{} piep = ""7"";{}LET hop = 1,{} esc = 2,{} oben = 3,{} unten = 4,{} return = 5,{} rubout = 6,{}
- kreuz = 7,{} kringel = 8,{} frage = 9;{}LET punkt = ".",{} gleich = "=",{} blank = " ";{}INT VAR x,{} y,{} xsize,{} ysize,{} maxeintraege,{} anzahl,{} erste auswahlzeile,{} virtueller cursor,{} reeller cursor;{}TEXT VAR kennzeile 1,{} kennzeile 2,{} registrierkette :: "";{}BOOL VAR abbruch,{} auswahlende;{}BOUND ROW max entries TEXT VAR eintrag;{}ROW 2 TEXT CONST fehlermeldung :: ROW 2 TEXT : ({}
- "Unzulässige Cursorwerte bei der Auswahl",{} "Fenster für Auswahl zu klein (x < 56 / y < 15)");{}ROW 24 TEXT CONST hinweis :: ROW 24 TEXT : ({} " Bitte warten... Ich sortiere und räume auf!",{} " Info: <?> Fertig: <ESC><q> Abbrechen: <ESC><h>",{} " Zum Weitermachen bitte irgendeine Taste tippen!",{} "Weitere Dateien!",{} "INFORMATIONEN: Auswahl mehrerer Dateien",{} "INFORMATIONEN: Auswahl einer Datei",{} " "15"Positionierungen: "14"",{} " hoch : zum vorausgehenden Namen",{}
- " runter : zum folgenden Namen",{} " HOP hoch : auf den ersten Namen der Seite", (***********){} " HOP runter : auf den letzten Namen der Seite", (* bitte *){} " ESC 1 : auf den ersten Namen der Liste", (* diese *){} " ESC 9 : auf den letzten Namen der Liste", (* Länge *){} " "15"Auswahl treffen: "14"", (* nicht *){} " RETURN / x : diesen Namen ankreuzen ", (* über- *){}
- " RUBOUT / o : Kreuz vor dem Namen loeschen", (* schrei-*){} " HOP RETURN / HOP x : alle folgende Namen ankreuzen", (* ten! *){} " HOP RUBOUT / HOP o : alle folgende Kreuze loeschen", (***********){} " "15"Auswahl verlassen: "14"",{} " ESC q : Auswahl verlassen",{} " ESC h : Auswahl abbrechen",{} " Auswahl m e h r e r e r Dateien durch Ankreuzen",{} " Auswahl e i n e r Datei durch Ankreuzen",{} " Bitte warten... Ich breche die Auswahl ab!"{}
- );{}THESAURUS PROC auswahl (THESAURUS CONST t,{} BOOL CONST mehrere moeglich,{} TEXT CONST t1, t2):{} werte initialisieren;{} namen besorgen;{} bildschirm aufbauen;{} auswaehlen lassen;{} abgang vorbereiten.{} werte initialisieren:{} THESAURUS VAR ausgabe :: empty thesaurus;{} DATASPACE VAR ds := nilspace;{} eintrag := ds;{} kennzeile 1 := t1;{} kennzeile 2 := t2;{} abbruch := FALSE;{}
- erste auswahlzeile := y + 7;{} anzahl := 0;{} maxeintraege := ysize - 11;{} virtueller cursor := 1;{} reeller cursor := 1.{} namen besorgen:{} fische die namen aus dem thesaurus;{} IF kein eintrag vorhanden{} THEN LEAVE auswahl WITH ausgabe{} FI.{} bildschirm aufbauen:{} schreibe kopfzeile;{} gib hinweis aus (kennzeile 1, kennzeile 2);{} gib erklaerungszeile aus (mehrere moeglich);{} baue bildschirm auf (1);{} footnote (x, y, xsize, ysize, hinweis [2]);{}
- schreibe fusszeile;{} reellen cursor setzen .{} schreibe kopfzeile:{} cursor (x, y);{} out(ecke oben links);{} (xsize - 2) TIMESOUT waagerecht;{} out(ecke oben rechts).{} schreibe fusszeile:{} cursor (x, y + ysize - 1);{} out (ecke unten links);{} (xsize - 2) TIMESOUT waagerecht;{} out (ecke unten rechts).{} auswaehlen lassen:{} kreuze an (mehrere moeglich).{} abgang vorbereiten:{} IF abbruch{} THEN change footnote (x, y, xsize, ysize, hinweis [24]){}
- ELSE change footnote (x, y, xsize, ysize, hinweis [ 1]){} FI;{} cursor (x + 1, y + ysize - 1);{} ausgabe erzeugen;{} forget (ds);{} ausgabe.{} fische die namen aus dem thesaurus:{} INT VAR zeiger;{} FOR zeiger FROM 1 UPTO highest entry (t) REP{} IF name (t, zeiger) <> ""{} THEN anzahl INCR 1;{} eintrag [anzahl] := name (t, zeiger){} FI{} PER.{} kein eintrag vorhanden:{} anzahl = 0.{} ausgabe erzeugen:{} TEXT VAR nummer;{} WHILE registrierkette <> "" REP{}
- nummer := subtext (registrierkette, 1, 3);{} registrierkette := subtext (registrierkette, 5);{} insert (ausgabe, eintrag [ int (nummer)]){} PER.{}END PROC auswahl;{}PROC reellen cursor setzen:{} cursor (x + 1, erste auswahlzeile + reeller cursor - 1);{} out (marke (virtueller cursor, TRUE) + (8 * zurueck)){}END PROC reellen cursor setzen;{}PROC baue bildschirm auf (INT CONST anfang):{} gib kopfzeile aus;{} gib namenstabelle aus;{} gib fusszeile aus;{} loesche ggf restbereich.{}
- gib kopfzeile aus:{} cursor (x, erste auswahlzeile - 1); out (senkrecht);{} IF reeller cursor = virtueller cursor{} THEN (xsize - 2) TIMESOUT punkt{} ELSE (xsize - length (hinweis [4]) - 5) TIMESOUT punkt;{} out (invers (hinweis [4])){} FI;{} out (senkrecht);{} line.{} gib namenstabelle aus:{} INT VAR zeiger, zaehler :: -1;{} FOR zeiger FROM anfang UPTO grenze REP{} zaehler INCR 1;{} cursor (x, erste auswahlzeile + zaehler);{} out (senkrecht); out (marke (zeiger, FALSE));{}
- outtext (subtext (eintrag [zeiger], 1, xsize - 10), 1, xsize - 10);{} out (senkrecht);{} PER.{} gib fusszeile aus:{} cursor (x, erste auswahlzeile + zaehler + 1);{} out (senkrecht);{} IF NOT ((virtueller cursor + maxeintraege - reeller cursor) < anzahl){} THEN (xsize - 2) TIMESOUT punkt{} ELSE (xsize - length (hinweis [4]) - 5) TIMESOUT punkt;{} out (invers (hinweis [4])){} FI;{} out (senkrecht).{} loesche ggf restbereich:{} IF zaehler + 1 < maxeintraege{}
- THEN loesche bildschirmrest{} FI.{} loesche bildschirmrest:{} FOR zeiger FROM restanfang UPTO restende REP{} cursor (x, zeiger); out (senkrecht);{} (xsize - 2) TIMESOUT blank;{} out (senkrecht){} PER.{} restanfang:{} erste auswahlzeile + zaehler + 2.{} restende:{} erste auswahlzeile + maxeintraege.{} grenze:{} min (anzahl, anfang + max eintraege - 1).{}END PROC baue bildschirm auf;{}TEXT PROC marke (INT CONST zeiger, BOOL CONST mit cursor):{}
- INT VAR platz := nr (zeiger);{} IF platz = 0{} THEN leer{} ELSE mit zahl{} FI.{} mit zahl:{} IF mit cursor{} THEN "==>" + (3 - length (text (platz))) * blank + text (platz) + "x "{} ELSE " " + (3 - length (text (platz))) * blank + text (platz) + "x "{} FI.{} leer:{} IF mit cursor{} THEN "==> o "{} ELSE " o "{} FI.{}END PROC marke;{}INT PROC nr (INT CONST zeiger):{} IF pos (registrierkette, textstring (zeiger)) = 0{} THEN 0{} ELSE (pos (registrierkette, textstring (zeiger)) DIV 4) + 1{}
- FI{}END PROC nr;{}TEXT PROC textstring (INT CONST nr):{} text (nr, 3) + "!"{}END PROC textstring;{}PROC info (BOOL CONST mehrere):{} notiere hinweisueberschrift;{} notiere positionierhinweise;{} IF noch platz vorhanden{} THEN notiere auswahlmoeglichkeiten auf alter seite{} ELSE wechsle auf naechste seite;{} notiere hinweisueberschrift;{} notiere auswahlmoeglichtkeiten auf neuer seite{} FI;{} stelle alten bildschirmzustand wieder her.{} notiere hinweisueberschrift:{}
- cursor (x + 1, y + 1);{} IF mehrere{} THEN out (center(xsize - 2, invers (hinweis [5]))){} ELSE out (center(xsize - 2, invers (hinweis [6]))){} FI;{} cursor (x + 1, y + 2); out ("", xsize - 2).{} notiere positionierhinweise:{} cursor (x + 1, y + 3); out (hinweis [ 7], xsize - 2);{} cursor (x + 1, y + 4); out (hinweis [ 8], xsize - 2);{} cursor (x + 1, y + 5); out (hinweis [ 9], xsize - 2);{} cursor (x + 1, y + 6); out (hinweis [10], xsize - 2);{} cursor (x + 1, y + 7); out (hinweis [11], xsize - 2);{}
- cursor (x + 1, y + 8); out (hinweis [12], xsize - 2);{} cursor (x + 1, y + 9); out (hinweis [13], xsize - 2).{} notiere auswahlmoeglichkeiten auf alter seite:{} cursor (x + 1, y + 10); out ("", xsize - 2);{} cursor (x + 1, y + 11); out (hinweis [14], xsize - 2);{} cursor (x + 1, y + 12); out (hinweis [15], xsize - 2);{} IF mehrere{} THEN gib alle auswahlmoeglichkeiten auf der alten seite an{} ELSE gib eine auswahlmoeglichkeit auf der alten seite an{} FI;{}
- notiere verlassmoeglichkeiten auf der alten seite;{} loesche die restlichen zeilen;{} change footnote (x, y, xsize, ysize, hinweis [3]);{} cursor in ruhestellung;{} clear buffer.{} gib alle auswahlmoeglichkeiten auf der alten seite an:{} cursor (x + 1, y + 13); out (hinweis [16], xsize - 2);{} cursor (x + 1, y + 14); out (hinweis [17], xsize - 2);{} cursor (x + 1, y + 15); out (hinweis [18], xsize - 2).{} gib eine auswahlmoeglichkeit auf der alten seite an:{} cursor (x + 1, y + 13); out ("", xsize - 2);{}
- cursor (x + 1, y + 14); out ("", xsize - 2);{} cursor (x + 1, y + 15); out ("", xsize - 2).{} notiere verlassmoeglichkeiten auf der alten seite:{} cursor (x + 1, y + 16); out ("", xsize - 2);{} cursor (x + 1, y + 17); out (hinweis [19], xsize - 2);{} cursor (x + 1, y + 18); out (hinweis [20], xsize - 2);{} cursor (x + 1, y + 19); out (hinweis [21], xsize - 2).{} loesche die restlichen zeilen:{} IF ysize = 24{} THEN cursor (x + 1, y + 20); out ("", xsize - 2){} FI.{}
- wechsle auf naechste seite:{} loesche seitenrest;{} change footnote (x, y, xsize, ysize, hinweis [3]);{} cursor in ruhestellung;{} clear buffer;{} pause.{} loesche seitenrest:{} INT VAR zaehler;{} FOR zaehler FROM 10 UPTO ysize - 4 REP{} cursor (x + 1, y + zaehler); out ("", xsize - 2){} PER.{} notiere auswahlmoeglichtkeiten auf neuer seite:{} cursor (x + 1, y + 3); out (hinweis [14], xsize - 2);{} cursor (x + 1, y + 4); out (hinweis [15], xsize - 2);{} IF mehrere{}
- THEN gib alle auswahlmoeglichkeiten auf der neuen seite an{} ELSE gib eine auswahlmoeglichkeit auf der neuen seite an{} FI;{} notiere verlassmoeglichkeiten auf der neuen seite.{} gib alle auswahlmoeglichkeiten auf der neuen seite an:{} cursor (x + 1, y + 5); out (hinweis [16], xsize - 2);{} cursor (x + 1, y + 6); out (hinweis [17], xsize - 2);{} cursor (x + 1, y + 7); out (hinweis [18], xsize - 2).{} gib eine auswahlmoeglichkeit auf der neuen seite an:{} cursor (x + 1, y + 5); out ("", xsize - 2);{}
- cursor (x + 1, y + 6); out ("", xsize - 2);{} cursor (x + 1, y + 7); out ("", xsize - 2).{} notiere verlassmoeglichkeiten auf der neuen seite:{} cursor (x + 1, y + 8); out ("", xsize - 2);{} cursor (x + 1, y + 9); out (hinweis [19], xsize - 2);{} cursor (x + 1, y + 10); out (hinweis [20], xsize - 2);{} cursor (x + 1, y + 11); out (hinweis [21], xsize - 2);{} cursor in ruhestellung.{} cursor in ruhestellung:{} cursor (x + 1, y + ysize - 2).{} stelle alten bildschirmzustand wieder her:{}
- clear buffer;{} pause;{} gib hinweis aus (kennzeile 1, kennzeile 2);{} gib erklaerungszeile aus (mehrere);{} virtueller cursor := 1;{} reeller cursor := 1;{} baue bildschirm auf (1);{} change footnote (x, y, xsize, ysize, hinweis [2]);{} reellen cursor setzen.{} noch platz vorhanden:{} (ysize - 4) > 18.{}END PROC info;{}PROC kreuze an (BOOL CONST mehrere):{} auswahlende := FALSE;{} REP{} zeichen lesen; zeichen interpretieren{} UNTIL auswahlende PER.{} zeichen lesen:{}
- TEXT VAR zeichen;{} getchar (zeichen).{} zeichen interpretieren:{} SELECT pos (zeichenstring, zeichen) OF{} CASE hop : hop kommando verarbeiten (mehrere){} CASE esc : esc kommando verarbeiten{} CASE oben : nach oben{} CASE unten : nach unten{} CASE kreuz : ankreuzen; evtl aufhoeren{} CASE return : ankreuzen weiter; evtl aufhoeren{} CASE rubout : auskreuzen weiter{} CASE kringel : auskreuzen{} CASE frage : info (mehrere){}
- OTHERWISE out (piep){} END SELECT.{} evtl aufhoeren:{} IF NOT mehrere{} THEN LEAVE kreuze an{} FI.{}END PROC kreuze an;{}PROC hop kommando verarbeiten (BOOL CONST mehrere):{} zweites zeichen lesen;{} zeichen interpretieren.{} zweites zeichen lesen:{} TEXT VAR zweites zeichen;{} getchar(zweites zeichen).{} zeichen interpretieren:{} SELECT pos (oben unten return rubout kreuz kringel, zweites zeichen) OF{} CASE 1 : hop nach oben{} CASE 2 : hop nach unten{}
- CASE 3, 5 : IF mehrere THEN alle darunter ankreuzen FI{} CASE 4, 6 : IF mehrere THEN alle darunter loeschen FI{} OTHERWISE out (piep){} END SELECT.{} alle darunter ankreuzen:{} INT VAR i;{} FOR i FROM virtueller cursor UPTO anzahl REP{} IF nr (i) = 0{} THEN ankreuzen{} FI{} PER;{} bild aktualisieren ;{} reellen cursor setzen .{} ankreuzen:{} registrierkette CAT textstring (i).{} alle darunter loeschen:{} INT VAR j, position;{} FOR j FROM virtueller cursor UPTO anzahl REP{}
- position := nr (j);{} IF position > 0{} THEN rausschmeissen;{} FI{} PER;{} bild aktualisieren;{} reellen cursor setzen.{} rausschmeissen:{} registrierkette := subtext (registrierkette, 1, (4 * position) - 4) +{} subtext (registrierkette, (4 * position) + 1).{} hop nach oben:{} IF ganz oben{} THEN out (piep){} ELIF oben auf der seite{} THEN raufblaettern{} ELSE top of page{} FI.{} ganz oben:{} virtueller cursor = 1.{}
- oben auf der seite:{} reeller cursor = 1.{} raufblaettern:{} virtueller cursor DECR max eintraege;{} virtueller cursor := max (virtueller cursor, 1);{} baue bildschirm auf (virtueller cursor);{} reellen cursor setzen.{} top of page:{} loesche marke;{} virtueller cursor DECR (reeller cursor - 1);{} reeller cursor := 1;{} reellen cursor setzen.{} hop nach unten:{} IF ganz unten{} THEN out (piep){} ELIF unten auf der seite{} THEN runterblaettern{}
- ELSE bottom of page{} FI.{} ganz unten:{} virtueller cursor = anzahl.{} unten auf der seite:{} reeller cursor > max eintraege - 1.{} runterblaettern:{} INT VAR alter virtueller cursor :: virtueller cursor;{} virtueller cursor INCR max eintraege;{} virtueller cursor := min (virtueller cursor, anzahl);{} reeller cursor := virtueller cursor - alter virtueller cursor;{} baue bildschirm auf (alter virtueller cursor + 1);{} reellen cursor setzen.{} bottom of page:{}
- loesche marke;{} alter virtueller cursor := virtueller cursor;{} virtueller cursor INCR (max eintraege - reeller cursor);{} virtueller cursor := min (anzahl, virtueller cursor);{} reeller cursor INCR (virtueller cursor - alter virtueller cursor);{} reellen cursor setzen.{}END PROC hop kommando verarbeiten;{}PROC esc kommando verarbeiten:{} TEXT VAR zweites zeichen;{} getchar (zweites zeichen);{} SELECT pos (q eins neun h, zweites zeichen) OF{} CASE 1 : auswahlende := TRUE{}
- CASE 2 : zeige anfang{} CASE 3 : zeige ende{} CASE 4 : abbruch := TRUE;{} auswahlende := TRUE;{} registrierkette := ""{} OTHERWISE out (piep){} END SELECT.{} zeige anfang:{} IF virtueller cursor = 1{} THEN out (piep){} ELIF virtueller cursor = reeller cursor{} THEN loesche marke;{} virtueller cursor := 1;{} reeller cursor := 1;{} reellen cursor setzen{} ELSE virtueller cursor := 1;{}
- reeller cursor := 1;{} baue bildschirm auf (1);{} reellen cursor setzen{} FI.{} zeige ende:{} IF virtueller cursor = anzahl{} THEN out (piep){} ELIF ende auf bildschirm{} THEN loesche marke;{} reeller cursor INCR (anzahl - virtueller cursor);{} virtueller cursor := anzahl;{} reellen cursor setzen{} ELSE virtueller cursor := anzahl;{} reeller cursor := max eintraege;{}
- baue bildschirm auf (anzahl - (max eintraege - 1));{} reellen cursor setzen{} FI.{} ende auf bildschirm:{} (reeller cursor + anzahl - virtueller cursor) < max eintraege + 1.{}END PROC esc kommando verarbeiten;{}PROC ankreuzen:{} INT VAR platz :: nr (virtueller cursor);{} IF platz <> 0{} THEN out (piep);{} LEAVE ankreuzen{} FI;{} registrierkette CAT textstring (virtueller cursor);{} reellen cursor setzen{}END PROC ankreuzen;{}PROC ankreuzen weiter:{}
- INT VAR platz :: nr (virtueller cursor);{} IF platz <> 0{} THEN out (piep);{} LEAVE ankreuzen weiter{} FI;{} registrierkette CAT textstring (virtueller cursor);{} IF virtueller cursor < anzahl{} THEN nach unten{} FI;{} IF virtueller cursor = anzahl{} THEN reellen cursor setzen{} FI{}END PROC ankreuzen weiter;{}PROC auskreuzen weiter:{} INT VAR position :: nr (virtueller cursor);{} IF position = 0{} THEN out (piep);{} LEAVE auskreuzen weiter{} FI;{} rausschmeissen;{}
- IF virtueller cursor < anzahl{} THEN nach unten{} ELSE loesche marke{} FI;{} bild aktualisieren;{} reellen cursor setzen.{} rausschmeissen:{} registrierkette := subtext (registrierkette, 1, 4 * position - 4) +{} subtext (registrierkette, 4 * position + 1).{}END PROC auskreuzen weiter;{}PROC auskreuzen:{} INT VAR position :: nr (virtueller cursor);{} IF position = 0{} THEN out (piep);{} LEAVE auskreuzen{} FI;{} rausschmeissen;{} loesche marke;{}
- bild aktualisieren;{} reellen cursor setzen.{} rausschmeissen:{} registrierkette := subtext (registrierkette, 1, 4 * position - 4) +{} subtext (registrierkette, 4 * position + 1).{}END PROC auskreuzen;{}PROC bild aktualisieren:{} INT VAR ob, un, i, zaehler :: -1;{} ob := virtueller cursor - reeller cursor + 1;{} un := min (ob + max eintraege - 1, anzahl);{} FOR i FROM ob UPTO un REP{} zaehler INCR 1;{} cursor (x + 1, erste auswahlzeile + zaehler);{} out (marke (i,FALSE)) PER{}
-END PROC bild aktualisieren;{}PROC nach oben:{} IF noch nicht oben (*virtuell*){} THEN gehe nach oben{} ELSE out (piep){} FI.{} noch nicht oben:{} virtueller cursor > 1.{} gehe nach oben:{} IF reeller cursor = 1 THEN scroll down ELSE cursor up FI.{} scroll down:{} virtueller cursor DECR 1;{} baue bildschirm auf (virtueller cursor);{} reellen cursor setzen.{} cursor up:{} loesche marke;{} virtueller cursor DECR 1;{} reeller cursor DECR 1;{} reellen cursor setzen{}
-END PROC nach oben;{}PROC nach unten:{} IF noch nicht unten (*virtuell*){} THEN gehe nach unten{} ELSE out (piep){} FI.{} noch nicht unten:{} virtueller cursor < anzahl.{} gehe nach unten:{} IF reeller cursor > max eintraege - 1 THEN scroll up ELSE cursor down FI.{} scroll up:{} virtueller cursor INCR 1;{} baue bildschirm auf (virtueller cursor - (max eintraege - 1));{} reellen cursor setzen.{} cursor down:{} loesche marke;{} virtueller cursor INCR 1;{} reeller cursor INCR 1;{}
- reellen cursor setzen{}END PROC nach unten;{}PROC loesche marke:{} out (marke (virtueller cursor, FALSE)){}END PROC loesche marke;{}PROC footnote (INT CONST x, y, xsize, ysize, TEXT CONST text):{} cursor (x, y + ysize - 3);{} out (balken links); (xsize - 2) TIMESOUT waagerecht; out (balken rechts);{} change footnote (x, y, xsize, ysize, text){}END PROC footnote;{}PROC change footnote (INT CONST x, y, xsize, ysize, TEXT CONST text):{} cursor (x, y + ysize - 2);{} out (senkrecht); outtext (text, 1, xsize - 2); out (senkrecht){}
-END PROC change footnote;{}PROC gib hinweis aus (TEXT CONST t1, t2):{} cursor (x, y + 1); out (senkrecht);{} out (center (xsize - 2, invers (t1)));{} out (senkrecht);{} cursor (x, y + 2); out (senkrecht);{} out ("", xsize - 2);{} out (senkrecht);{} cursor (x, y + 3); out (senkrecht);{} out (center (xsize - 2, t2));{} out (senkrecht){}END PROC gib hinweis aus;{}PROC gib erklaerungszeile aus (BOOL CONST mehrere):{}
- cursor (x, y + 4); out (senkrecht);{} out ((xsize - 2) * gleich);{} out (senkrecht);{} cursor (x, y + 5); out (senkrecht);{} IF mehrere{} THEN out (erklaerungszeile mehrere){} ELSE out (erklaerungszeile eine){} FI;{} out (senkrecht).{} erklaerungszeile mehrere:{} invers (text 1 + (rest1 * blank)).{} erklaerungszeile eine:{} invers (text 2 + (rest2 * blank)).{}
- text1:{} hinweis [22].{} text2:{} hinweis [23].{} rest1: (***************************){} xsize - length (text1) - 5. (* durch 'invers' wird ein *){} (* Blank angehängt und zu- *){} rest2: (* sätzlich noch durch *){} xsize - length (text2) - 5. (* 'relativcenter' - außer-*){}END PROC gib erklaerungszeile aus; (* dem nimmt die Markierung*){} (* selbst eine Position ein*){}
- (***************************){}THESAURUS PROC infix namen (THESAURUS CONST t, TEXT CONST infix):{} THESAURUS VAR tt :: empty thesaurus;{} INT VAR i;{} FOR i FROM 1 UPTO highest entry (t) REP{} TEXT VAR eintrag :: name (t,i);{} IF eintrag enthaelt infix{} THEN insert (tt, eintrag){} FI{} PER;{} tt.{} eintrag enthaelt infix:{} pos (eintrag, infix) <> 0{}END PROC infix namen;{}THESAURUS PROC infix namen (THESAURUS CONST t, INT CONST dateityp):{}
- THESAURUS VAR tt :: empty thesaurus;{} INT VAR i;{} FOR i FROM 1 UPTO highest entry (t) REP{} TEXT VAR eintrag :: name (t,i);{} IF eintrag enthaelt infix{} THEN insert (tt, eintrag){} FI{} PER;{} tt.{} eintrag enthaelt infix:{} type (old (eintrag)) = dateityp.{}END PROC infix namen;{}THESAURUS PROC infix namen (THESAURUS CONST t,{} TEXT CONST infix 1, INT CONST dateityp):{} THESAURUS VAR tt :: empty thesaurus;{} INT VAR i;{} FOR i FROM 1 UPTO highest entry (t) REP{}
- TEXT VAR eintrag :: name (t,i);{} IF eintrag enthaelt infix{} THEN insert (tt, eintrag){} FI{} PER;{} tt.{} eintrag enthaelt infix:{} (pos (eintrag, infix 1) <> 0) AND (type (old (eintrag)) = dateityp).{}END PROC infix namen;{}THESAURUS PROC infix namen (THESAURUS CONST t,{} TEXT CONST infix 1, infix 2):{} THESAURUS VAR tt :: empty thesaurus;{} INT VAR i;{} FOR i FROM 1 UPTO highest entry (t) REP{} TEXT VAR eintrag :: name (t,i);{} IF eintrag enthaelt infix{}
- THEN insert (tt, eintrag){} FI{} PER;{} tt.{} eintrag enthaelt infix:{} (pos (eintrag, infix 1) <> 0) OR (pos (eintrag, infix 2) <> 0){}END PROC infix namen;{}THESAURUS PROC infix namen (TEXT CONST infix):{} infix namen (ALL myself, infix){}END PROC infix namen;{}THESAURUS PROC infix namen (TEXT CONST infix 1, infix 2):{} infix namen (ALL myself, infix 1, infix 2){}END PROC infix namen;{}THESAURUS PROC ohne praefix (THESAURUS CONST thesaurus, TEXT CONST praefix):{} THESAURUS VAR t :: empty thesaurus;{}
- INT VAR zaehler;{} FOR zaehler FROM 1 UPTO highest entry (thesaurus) REP{} IF name (thesaurus, zaehler) <> ""{} AND pos (name (thesaurus, zaehler), praefix) = 1{} THEN insert (t, subtext (name (thesaurus, zaehler),{} length (praefix) + 1)){} FI;{} PER;{} t{}END PROC ohne praefix;{}BOOL PROC not empty (THESAURUS CONST t):{} INT VAR i;{} FOR i FROM 1 UPTO highest entry (t) REP{} IF name (t, i) <> ""{} THEN LEAVE not empty WITH TRUE{}
- FI{} PER;{} FALSE{}END PROC not empty;{}PROC untersuche bildschirmmasszahlen (TEXT CONST t1, t2):{} IF unzulaessige cursorwerte{} THEN errorstop (fehlermeldung [1]){} ELIF fenster ist zu klein{} THEN errorstop (fehlermeldung [2]){} FI.{} unzulaessige cursorwerte:{} (x + xsize) > 80 COR (y + ysize) > 25 COR x < 1 COR y < 1{} COR xsize > 79 COR ysize > 24.{} fenster ist zu klein:{} (xsize) < 56 COR (ysize) < 15{} COR length (t1) > (xsize - 5) COR length (t2) > (xsize - 5).{}
-END PROC untersuche bildschirmmasszahlen;{}TEXT PROC ggf gekuerzter text (TEXT CONST text):{} IF length (text) > (xsize - 5){} THEN subtext (text, 1, xsize - 7) + ".."{} ELSE text{} FI{}END PROC ggf gekuerzter text;{}THESAURUS PROC some (INT CONST spa, zei, breite, hoehe,{} THESAURUS CONST t,{} TEXT CONST t1, t2):{} TEXT VAR text 1, text 2;{} x := spa;{} y := zei;{} xsize := breite;{} ysize := hoehe;{} text 1 := ggf gekuerzter text (t1);{}
- text 2 := ggf gekuerzter text (t2);{} untersuche bildschirmmasszahlen (text 1, text 2);{} auswahl (t, TRUE, text 1, text 2){}END PROC some;{}THESAURUS PROC some (INT CONST spa, zei,{} THESAURUS CONST t,{} TEXT CONST t1, t2):{} some (spa, zei, 79 - spa + 1, 24 - zei + 1, t, t1, t2){}END PROC some;{}THESAURUS PROC some (THESAURUS CONST t,{} TEXT CONST t1, t2):{} some (1, 1, 79, 24, t, t1, t2){}END PROC some;{}TEXT PROC one (INT CONST spa, zei, breite, hoehe,{}
- THESAURUS CONST t,{} TEXT CONST t1, t2):{} TEXT VAR text 1, text 2;{} x := spa;{} y := zei;{} xsize := breite;{} ysize := hoehe;{} text 1 := ggf gekuerzter text (t1);{} text 2 := ggf gekuerzter text (t2);{} untersuche bildschirmmasszahlen (text 1, text 2);{} name (auswahl (t, FALSE, text 1, text 2), 1){}END PROC one;{}TEXT PROC one (INT CONST spa, zei,{} THESAURUS CONST t,{} TEXT CONST t1, t2):{} one (spa, zei, 79 - spa + 1, 24 - zei + 1, t, t1, t2){}
-END PROC one;{}TEXT PROC one (THESAURUS CONST t, TEXT CONST t1, t2):{} one (1, 1, 79, 24, t, t1, t2){}END PROC one;{}END PACKET ls dialog 2;{}
+ some,
+ one,
+ infix namen,
+ ohne praefix,
+ not empty:
+LET maxentries = 200;
+LET zeichenstring = ""1""27""3""10""13""12"xo?",
+ oben unten return rubout kreuz kringel = ""3""10""13""12"xo",
+ q eins neun h = "q19h";
+LET zurueck = ""8"",
+ piep = ""7"";
+LET hop = 1,
+ esc = 2,
+ oben = 3,
+ unten = 4,
+ return = 5,
+ rubout = 6,
+
+ kreuz = 7,
+ kringel = 8,
+ frage = 9;
+LET punkt = ".",
+ gleich = "=",
+ blank = " ";
+INT VAR x,
+ y,
+ xsize,
+ ysize,
+ maxeintraege,
+ anzahl,
+ erste auswahlzeile,
+ virtueller cursor,
+ reeller cursor;
+TEXT VAR kennzeile 1,
+ kennzeile 2,
+ registrierkette :: "";
+BOOL VAR abbruch,
+ auswahlende;
+BOUND ROW max entries TEXT VAR eintrag;
+ROW 2 TEXT CONST fehlermeldung :: ROW 2 TEXT : (
+
+ "Unzulässige Cursorwerte bei der Auswahl",
+ "Fenster für Auswahl zu klein (x < 56 / y < 15)");
+ROW 24 TEXT CONST hinweis :: ROW 24 TEXT : (
+ " Bitte warten... Ich sortiere und räume auf!",
+ " Info: <?> Fertig: <ESC><q> Abbrechen: <ESC><h>",
+ " Zum Weitermachen bitte irgendeine Taste tippen!",
+ "Weitere Dateien!",
+ "INFORMATIONEN: Auswahl mehrerer Dateien",
+ "INFORMATIONEN: Auswahl einer Datei",
+ " "15"Positionierungen: "14"",
+ " hoch : zum vorausgehenden Namen",
+
+ " runter : zum folgenden Namen",
+ " HOP hoch : auf den ersten Namen der Seite", (***********)
+ " HOP runter : auf den letzten Namen der Seite", (* bitte *)
+ " ESC 1 : auf den ersten Namen der Liste", (* diese *)
+ " ESC 9 : auf den letzten Namen der Liste", (* Länge *)
+ " "15"Auswahl treffen: "14"", (* nicht *)
+ " RETURN / x : diesen Namen ankreuzen ", (* über- *)
+
+ " RUBOUT / o : Kreuz vor dem Namen loeschen", (* schrei-*)
+ " HOP RETURN / HOP x : alle folgende Namen ankreuzen", (* ten! *)
+ " HOP RUBOUT / HOP o : alle folgende Kreuze loeschen", (***********)
+ " "15"Auswahl verlassen: "14"",
+ " ESC q : Auswahl verlassen",
+ " ESC h : Auswahl abbrechen",
+ " Auswahl m e h r e r e r Dateien durch Ankreuzen",
+ " Auswahl e i n e r Datei durch Ankreuzen",
+ " Bitte warten... Ich breche die Auswahl ab!"
+
+ );
+THESAURUS PROC auswahl (THESAURUS CONST t,
+ BOOL CONST mehrere moeglich,
+ TEXT CONST t1, t2):
+ werte initialisieren;
+ namen besorgen;
+ bildschirm aufbauen;
+ auswaehlen lassen;
+ abgang vorbereiten.
+ werte initialisieren:
+ THESAURUS VAR ausgabe :: empty thesaurus;
+ DATASPACE VAR ds := nilspace;
+ eintrag := ds;
+ kennzeile 1 := t1;
+ kennzeile 2 := t2;
+ abbruch := FALSE;
+
+ erste auswahlzeile := y + 7;
+ anzahl := 0;
+ maxeintraege := ysize - 11;
+ virtueller cursor := 1;
+ reeller cursor := 1.
+ namen besorgen:
+ fische die namen aus dem thesaurus;
+ IF kein eintrag vorhanden
+ THEN LEAVE auswahl WITH ausgabe
+ FI.
+ bildschirm aufbauen:
+ schreibe kopfzeile;
+ gib hinweis aus (kennzeile 1, kennzeile 2);
+ gib erklaerungszeile aus (mehrere moeglich);
+ baue bildschirm auf (1);
+ footnote (x, y, xsize, ysize, hinweis [2]);
+
+ schreibe fusszeile;
+ reellen cursor setzen .
+ schreibe kopfzeile:
+ cursor (x, y);
+ out(ecke oben links);
+ (xsize - 2) TIMESOUT waagerecht;
+ out(ecke oben rechts).
+ schreibe fusszeile:
+ cursor (x, y + ysize - 1);
+ out (ecke unten links);
+ (xsize - 2) TIMESOUT waagerecht;
+ out (ecke unten rechts).
+ auswaehlen lassen:
+ kreuze an (mehrere moeglich).
+ abgang vorbereiten:
+ IF abbruch
+ THEN change footnote (x, y, xsize, ysize, hinweis [24])
+
+ ELSE change footnote (x, y, xsize, ysize, hinweis [ 1])
+ FI;
+ cursor (x + 1, y + ysize - 1);
+ ausgabe erzeugen;
+ forget (ds);
+ ausgabe.
+ fische die namen aus dem thesaurus:
+ INT VAR zeiger;
+ FOR zeiger FROM 1 UPTO highest entry (t) REP
+ IF name (t, zeiger) <> ""
+ THEN anzahl INCR 1;
+ eintrag [anzahl] := name (t, zeiger)
+ FI
+ PER.
+ kein eintrag vorhanden:
+ anzahl = 0.
+ ausgabe erzeugen:
+ TEXT VAR nummer;
+ WHILE registrierkette <> "" REP
+
+ nummer := subtext (registrierkette, 1, 3);
+ registrierkette := subtext (registrierkette, 5);
+ insert (ausgabe, eintrag [ int (nummer)])
+ PER.
+END PROC auswahl;
+PROC reellen cursor setzen:
+ cursor (x + 1, erste auswahlzeile + reeller cursor - 1);
+ out (marke (virtueller cursor, TRUE) + (8 * zurueck))
+END PROC reellen cursor setzen;
+PROC baue bildschirm auf (INT CONST anfang):
+ gib kopfzeile aus;
+ gib namenstabelle aus;
+ gib fusszeile aus;
+ loesche ggf restbereich.
+
+ gib kopfzeile aus:
+ cursor (x, erste auswahlzeile - 1); out (senkrecht);
+ IF reeller cursor = virtueller cursor
+ THEN (xsize - 2) TIMESOUT punkt
+ ELSE (xsize - length (hinweis [4]) - 5) TIMESOUT punkt;
+ out (invers (hinweis [4]))
+ FI;
+ out (senkrecht);
+ line.
+ gib namenstabelle aus:
+ INT VAR zeiger, zaehler :: -1;
+ FOR zeiger FROM anfang UPTO grenze REP
+ zaehler INCR 1;
+ cursor (x, erste auswahlzeile + zaehler);
+ out (senkrecht); out (marke (zeiger, FALSE));
+
+ outtext (subtext (eintrag [zeiger], 1, xsize - 10), 1, xsize - 10);
+ out (senkrecht);
+ PER.
+ gib fusszeile aus:
+ cursor (x, erste auswahlzeile + zaehler + 1);
+ out (senkrecht);
+ IF NOT ((virtueller cursor + maxeintraege - reeller cursor) < anzahl)
+ THEN (xsize - 2) TIMESOUT punkt
+ ELSE (xsize - length (hinweis [4]) - 5) TIMESOUT punkt;
+ out (invers (hinweis [4]))
+ FI;
+ out (senkrecht).
+ loesche ggf restbereich:
+ IF zaehler + 1 < maxeintraege
+
+ THEN loesche bildschirmrest
+ FI.
+ loesche bildschirmrest:
+ FOR zeiger FROM restanfang UPTO restende REP
+ cursor (x, zeiger); out (senkrecht);
+ (xsize - 2) TIMESOUT blank;
+ out (senkrecht)
+ PER.
+ restanfang:
+ erste auswahlzeile + zaehler + 2.
+ restende:
+ erste auswahlzeile + maxeintraege.
+ grenze:
+ min (anzahl, anfang + max eintraege - 1).
+END PROC baue bildschirm auf;
+TEXT PROC marke (INT CONST zeiger, BOOL CONST mit cursor):
+
+ INT VAR platz := nr (zeiger);
+ IF platz = 0
+ THEN leer
+ ELSE mit zahl
+ FI.
+ mit zahl:
+ IF mit cursor
+ THEN "==>" + (3 - length (text (platz))) * blank + text (platz) + "x "
+ ELSE " " + (3 - length (text (platz))) * blank + text (platz) + "x "
+ FI.
+ leer:
+ IF mit cursor
+ THEN "==> o "
+ ELSE " o "
+ FI.
+END PROC marke;
+INT PROC nr (INT CONST zeiger):
+ IF pos (registrierkette, textstring (zeiger)) = 0
+ THEN 0
+ ELSE (pos (registrierkette, textstring (zeiger)) DIV 4) + 1
+
+ FI
+END PROC nr;
+TEXT PROC textstring (INT CONST nr):
+ text (nr, 3) + "!"
+END PROC textstring;
+PROC info (BOOL CONST mehrere):
+ notiere hinweisueberschrift;
+ notiere positionierhinweise;
+ IF noch platz vorhanden
+ THEN notiere auswahlmoeglichkeiten auf alter seite
+ ELSE wechsle auf naechste seite;
+ notiere hinweisueberschrift;
+ notiere auswahlmoeglichtkeiten auf neuer seite
+ FI;
+ stelle alten bildschirmzustand wieder her.
+ notiere hinweisueberschrift:
+
+ cursor (x + 1, y + 1);
+ IF mehrere
+ THEN out (center(xsize - 2, invers (hinweis [5])))
+ ELSE out (center(xsize - 2, invers (hinweis [6])))
+ FI;
+ cursor (x + 1, y + 2); out ("", xsize - 2).
+ notiere positionierhinweise:
+ cursor (x + 1, y + 3); out (hinweis [ 7], xsize - 2);
+ cursor (x + 1, y + 4); out (hinweis [ 8], xsize - 2);
+ cursor (x + 1, y + 5); out (hinweis [ 9], xsize - 2);
+ cursor (x + 1, y + 6); out (hinweis [10], xsize - 2);
+ cursor (x + 1, y + 7); out (hinweis [11], xsize - 2);
+
+ cursor (x + 1, y + 8); out (hinweis [12], xsize - 2);
+ cursor (x + 1, y + 9); out (hinweis [13], xsize - 2).
+ notiere auswahlmoeglichkeiten auf alter seite:
+ cursor (x + 1, y + 10); out ("", xsize - 2);
+ cursor (x + 1, y + 11); out (hinweis [14], xsize - 2);
+ cursor (x + 1, y + 12); out (hinweis [15], xsize - 2);
+ IF mehrere
+ THEN gib alle auswahlmoeglichkeiten auf der alten seite an
+ ELSE gib eine auswahlmoeglichkeit auf der alten seite an
+ FI;
+
+ notiere verlassmoeglichkeiten auf der alten seite;
+ loesche die restlichen zeilen;
+ change footnote (x, y, xsize, ysize, hinweis [3]);
+ cursor in ruhestellung;
+ clear buffer.
+ gib alle auswahlmoeglichkeiten auf der alten seite an:
+ cursor (x + 1, y + 13); out (hinweis [16], xsize - 2);
+ cursor (x + 1, y + 14); out (hinweis [17], xsize - 2);
+ cursor (x + 1, y + 15); out (hinweis [18], xsize - 2).
+ gib eine auswahlmoeglichkeit auf der alten seite an:
+ cursor (x + 1, y + 13); out ("", xsize - 2);
+
+ cursor (x + 1, y + 14); out ("", xsize - 2);
+ cursor (x + 1, y + 15); out ("", xsize - 2).
+ notiere verlassmoeglichkeiten auf der alten seite:
+ cursor (x + 1, y + 16); out ("", xsize - 2);
+ cursor (x + 1, y + 17); out (hinweis [19], xsize - 2);
+ cursor (x + 1, y + 18); out (hinweis [20], xsize - 2);
+ cursor (x + 1, y + 19); out (hinweis [21], xsize - 2).
+ loesche die restlichen zeilen:
+ IF ysize = 24
+ THEN cursor (x + 1, y + 20); out ("", xsize - 2)
+ FI.
+
+ wechsle auf naechste seite:
+ loesche seitenrest;
+ change footnote (x, y, xsize, ysize, hinweis [3]);
+ cursor in ruhestellung;
+ clear buffer;
+ pause.
+ loesche seitenrest:
+ INT VAR zaehler;
+ FOR zaehler FROM 10 UPTO ysize - 4 REP
+ cursor (x + 1, y + zaehler); out ("", xsize - 2)
+ PER.
+ notiere auswahlmoeglichtkeiten auf neuer seite:
+ cursor (x + 1, y + 3); out (hinweis [14], xsize - 2);
+ cursor (x + 1, y + 4); out (hinweis [15], xsize - 2);
+ IF mehrere
+
+ THEN gib alle auswahlmoeglichkeiten auf der neuen seite an
+ ELSE gib eine auswahlmoeglichkeit auf der neuen seite an
+ FI;
+ notiere verlassmoeglichkeiten auf der neuen seite.
+ gib alle auswahlmoeglichkeiten auf der neuen seite an:
+ cursor (x + 1, y + 5); out (hinweis [16], xsize - 2);
+ cursor (x + 1, y + 6); out (hinweis [17], xsize - 2);
+ cursor (x + 1, y + 7); out (hinweis [18], xsize - 2).
+ gib eine auswahlmoeglichkeit auf der neuen seite an:
+ cursor (x + 1, y + 5); out ("", xsize - 2);
+
+ cursor (x + 1, y + 6); out ("", xsize - 2);
+ cursor (x + 1, y + 7); out ("", xsize - 2).
+ notiere verlassmoeglichkeiten auf der neuen seite:
+ cursor (x + 1, y + 8); out ("", xsize - 2);
+ cursor (x + 1, y + 9); out (hinweis [19], xsize - 2);
+ cursor (x + 1, y + 10); out (hinweis [20], xsize - 2);
+ cursor (x + 1, y + 11); out (hinweis [21], xsize - 2);
+ cursor in ruhestellung.
+ cursor in ruhestellung:
+ cursor (x + 1, y + ysize - 2).
+ stelle alten bildschirmzustand wieder her:
+
+ clear buffer;
+ pause;
+ gib hinweis aus (kennzeile 1, kennzeile 2);
+ gib erklaerungszeile aus (mehrere);
+ virtueller cursor := 1;
+ reeller cursor := 1;
+ baue bildschirm auf (1);
+ change footnote (x, y, xsize, ysize, hinweis [2]);
+ reellen cursor setzen.
+ noch platz vorhanden:
+ (ysize - 4) > 18.
+END PROC info;
+PROC kreuze an (BOOL CONST mehrere):
+ auswahlende := FALSE;
+ REP
+ zeichen lesen; zeichen interpretieren
+ UNTIL auswahlende PER.
+ zeichen lesen:
+
+ TEXT VAR zeichen;
+ getchar (zeichen).
+ zeichen interpretieren:
+ SELECT pos (zeichenstring, zeichen) OF
+ CASE hop : hop kommando verarbeiten (mehrere)
+ CASE esc : esc kommando verarbeiten
+ CASE oben : nach oben
+ CASE unten : nach unten
+ CASE kreuz : ankreuzen; evtl aufhoeren
+ CASE return : ankreuzen weiter; evtl aufhoeren
+ CASE rubout : auskreuzen weiter
+ CASE kringel : auskreuzen
+ CASE frage : info (mehrere)
+
+ OTHERWISE out (piep)
+ END SELECT.
+ evtl aufhoeren:
+ IF NOT mehrere
+ THEN LEAVE kreuze an
+ FI.
+END PROC kreuze an;
+PROC hop kommando verarbeiten (BOOL CONST mehrere):
+ zweites zeichen lesen;
+ zeichen interpretieren.
+ zweites zeichen lesen:
+ TEXT VAR zweites zeichen;
+ getchar(zweites zeichen).
+ zeichen interpretieren:
+ SELECT pos (oben unten return rubout kreuz kringel, zweites zeichen) OF
+ CASE 1 : hop nach oben
+ CASE 2 : hop nach unten
+
+ CASE 3, 5 : IF mehrere THEN alle darunter ankreuzen FI
+ CASE 4, 6 : IF mehrere THEN alle darunter loeschen FI
+ OTHERWISE out (piep)
+ END SELECT.
+ alle darunter ankreuzen:
+ INT VAR i;
+ FOR i FROM virtueller cursor UPTO anzahl REP
+ IF nr (i) = 0
+ THEN ankreuzen
+ FI
+ PER;
+ bild aktualisieren ;
+ reellen cursor setzen .
+ ankreuzen:
+ registrierkette CAT textstring (i).
+ alle darunter loeschen:
+ INT VAR j, position;
+ FOR j FROM virtueller cursor UPTO anzahl REP
+
+ position := nr (j);
+ IF position > 0
+ THEN rausschmeissen;
+ FI
+ PER;
+ bild aktualisieren;
+ reellen cursor setzen.
+ rausschmeissen:
+ registrierkette := subtext (registrierkette, 1, (4 * position) - 4) +
+ subtext (registrierkette, (4 * position) + 1).
+ hop nach oben:
+ IF ganz oben
+ THEN out (piep)
+ ELIF oben auf der seite
+ THEN raufblaettern
+ ELSE top of page
+ FI.
+ ganz oben:
+ virtueller cursor = 1.
+
+ oben auf der seite:
+ reeller cursor = 1.
+ raufblaettern:
+ virtueller cursor DECR max eintraege;
+ virtueller cursor := max (virtueller cursor, 1);
+ baue bildschirm auf (virtueller cursor);
+ reellen cursor setzen.
+ top of page:
+ loesche marke;
+ virtueller cursor DECR (reeller cursor - 1);
+ reeller cursor := 1;
+ reellen cursor setzen.
+ hop nach unten:
+ IF ganz unten
+ THEN out (piep)
+ ELIF unten auf der seite
+ THEN runterblaettern
+
+ ELSE bottom of page
+ FI.
+ ganz unten:
+ virtueller cursor = anzahl.
+ unten auf der seite:
+ reeller cursor > max eintraege - 1.
+ runterblaettern:
+ INT VAR alter virtueller cursor :: virtueller cursor;
+ virtueller cursor INCR max eintraege;
+ virtueller cursor := min (virtueller cursor, anzahl);
+ reeller cursor := virtueller cursor - alter virtueller cursor;
+ baue bildschirm auf (alter virtueller cursor + 1);
+ reellen cursor setzen.
+ bottom of page:
+
+ loesche marke;
+ alter virtueller cursor := virtueller cursor;
+ virtueller cursor INCR (max eintraege - reeller cursor);
+ virtueller cursor := min (anzahl, virtueller cursor);
+ reeller cursor INCR (virtueller cursor - alter virtueller cursor);
+ reellen cursor setzen.
+END PROC hop kommando verarbeiten;
+PROC esc kommando verarbeiten:
+ TEXT VAR zweites zeichen;
+ getchar (zweites zeichen);
+ SELECT pos (q eins neun h, zweites zeichen) OF
+ CASE 1 : auswahlende := TRUE
+
+ CASE 2 : zeige anfang
+ CASE 3 : zeige ende
+ CASE 4 : abbruch := TRUE;
+ auswahlende := TRUE;
+ registrierkette := ""
+ OTHERWISE out (piep)
+ END SELECT.
+ zeige anfang:
+ IF virtueller cursor = 1
+ THEN out (piep)
+ ELIF virtueller cursor = reeller cursor
+ THEN loesche marke;
+ virtueller cursor := 1;
+ reeller cursor := 1;
+ reellen cursor setzen
+ ELSE virtueller cursor := 1;
+
+ reeller cursor := 1;
+ baue bildschirm auf (1);
+ reellen cursor setzen
+ FI.
+ zeige ende:
+ IF virtueller cursor = anzahl
+ THEN out (piep)
+ ELIF ende auf bildschirm
+ THEN loesche marke;
+ reeller cursor INCR (anzahl - virtueller cursor);
+ virtueller cursor := anzahl;
+ reellen cursor setzen
+ ELSE virtueller cursor := anzahl;
+ reeller cursor := max eintraege;
+
+ baue bildschirm auf (anzahl - (max eintraege - 1));
+ reellen cursor setzen
+ FI.
+ ende auf bildschirm:
+ (reeller cursor + anzahl - virtueller cursor) < max eintraege + 1.
+END PROC esc kommando verarbeiten;
+PROC ankreuzen:
+ INT VAR platz :: nr (virtueller cursor);
+ IF platz <> 0
+ THEN out (piep);
+ LEAVE ankreuzen
+ FI;
+ registrierkette CAT textstring (virtueller cursor);
+ reellen cursor setzen
+END PROC ankreuzen;
+PROC ankreuzen weiter:
+
+ INT VAR platz :: nr (virtueller cursor);
+ IF platz <> 0
+ THEN out (piep);
+ LEAVE ankreuzen weiter
+ FI;
+ registrierkette CAT textstring (virtueller cursor);
+ IF virtueller cursor < anzahl
+ THEN nach unten
+ FI;
+ IF virtueller cursor = anzahl
+ THEN reellen cursor setzen
+ FI
+END PROC ankreuzen weiter;
+PROC auskreuzen weiter:
+ INT VAR position :: nr (virtueller cursor);
+ IF position = 0
+ THEN out (piep);
+ LEAVE auskreuzen weiter
+ FI;
+ rausschmeissen;
+
+ IF virtueller cursor < anzahl
+ THEN nach unten
+ ELSE loesche marke
+ FI;
+ bild aktualisieren;
+ reellen cursor setzen.
+ rausschmeissen:
+ registrierkette := subtext (registrierkette, 1, 4 * position - 4) +
+ subtext (registrierkette, 4 * position + 1).
+END PROC auskreuzen weiter;
+PROC auskreuzen:
+ INT VAR position :: nr (virtueller cursor);
+ IF position = 0
+ THEN out (piep);
+ LEAVE auskreuzen
+ FI;
+ rausschmeissen;
+ loesche marke;
+
+ bild aktualisieren;
+ reellen cursor setzen.
+ rausschmeissen:
+ registrierkette := subtext (registrierkette, 1, 4 * position - 4) +
+ subtext (registrierkette, 4 * position + 1).
+END PROC auskreuzen;
+PROC bild aktualisieren:
+ INT VAR ob, un, i, zaehler :: -1;
+ ob := virtueller cursor - reeller cursor + 1;
+ un := min (ob + max eintraege - 1, anzahl);
+ FOR i FROM ob UPTO un REP
+ zaehler INCR 1;
+ cursor (x + 1, erste auswahlzeile + zaehler);
+ out (marke (i,FALSE)) PER
+
+END PROC bild aktualisieren;
+PROC nach oben:
+ IF noch nicht oben (*virtuell*)
+ THEN gehe nach oben
+ ELSE out (piep)
+ FI.
+ noch nicht oben:
+ virtueller cursor > 1.
+ gehe nach oben:
+ IF reeller cursor = 1 THEN scroll down ELSE cursor up FI.
+ scroll down:
+ virtueller cursor DECR 1;
+ baue bildschirm auf (virtueller cursor);
+ reellen cursor setzen.
+ cursor up:
+ loesche marke;
+ virtueller cursor DECR 1;
+ reeller cursor DECR 1;
+ reellen cursor setzen
+
+END PROC nach oben;
+PROC nach unten:
+ IF noch nicht unten (*virtuell*)
+ THEN gehe nach unten
+ ELSE out (piep)
+ FI.
+ noch nicht unten:
+ virtueller cursor < anzahl.
+ gehe nach unten:
+ IF reeller cursor > max eintraege - 1 THEN scroll up ELSE cursor down FI.
+ scroll up:
+ virtueller cursor INCR 1;
+ baue bildschirm auf (virtueller cursor - (max eintraege - 1));
+ reellen cursor setzen.
+ cursor down:
+ loesche marke;
+ virtueller cursor INCR 1;
+ reeller cursor INCR 1;
+
+ reellen cursor setzen
+END PROC nach unten;
+PROC loesche marke:
+ out (marke (virtueller cursor, FALSE))
+END PROC loesche marke;
+PROC footnote (INT CONST x, y, xsize, ysize, TEXT CONST text):
+ cursor (x, y + ysize - 3);
+ out (balken links); (xsize - 2) TIMESOUT waagerecht; out (balken rechts);
+ change footnote (x, y, xsize, ysize, text)
+END PROC footnote;
+PROC change footnote (INT CONST x, y, xsize, ysize, TEXT CONST text):
+ cursor (x, y + ysize - 2);
+ out (senkrecht); outtext (text, 1, xsize - 2); out (senkrecht)
+
+END PROC change footnote;
+PROC gib hinweis aus (TEXT CONST t1, t2):
+ cursor (x, y + 1); out (senkrecht);
+ out (center (xsize - 2, invers (t1)));
+ out (senkrecht);
+ cursor (x, y + 2); out (senkrecht);
+ out ("", xsize - 2);
+ out (senkrecht);
+ cursor (x, y + 3); out (senkrecht);
+ out (center (xsize - 2, t2));
+ out (senkrecht)
+END PROC gib hinweis aus;
+PROC gib erklaerungszeile aus (BOOL CONST mehrere):
+
+ cursor (x, y + 4); out (senkrecht);
+ out ((xsize - 2) * gleich);
+ out (senkrecht);
+ cursor (x, y + 5); out (senkrecht);
+ IF mehrere
+ THEN out (erklaerungszeile mehrere)
+ ELSE out (erklaerungszeile eine)
+ FI;
+ out (senkrecht).
+ erklaerungszeile mehrere:
+ invers (text 1 + (rest1 * blank)).
+ erklaerungszeile eine:
+ invers (text 2 + (rest2 * blank)).
+
+ text1:
+ hinweis [22].
+ text2:
+ hinweis [23].
+ rest1: (***************************)
+ xsize - length (text1) - 5. (* durch 'invers' wird ein *)
+ (* Blank angehängt und zu- *)
+ rest2: (* sätzlich noch durch *)
+ xsize - length (text2) - 5. (* 'relativcenter' - außer-*)
+END PROC gib erklaerungszeile aus; (* dem nimmt die Markierung*)
+ (* selbst eine Position ein*)
+
+ (***************************)
+THESAURUS PROC infix namen (THESAURUS CONST t, TEXT CONST infix):
+ THESAURUS VAR tt :: empty thesaurus;
+ INT VAR i;
+ FOR i FROM 1 UPTO highest entry (t) REP
+ TEXT VAR eintrag :: name (t,i);
+ IF eintrag enthaelt infix
+ THEN insert (tt, eintrag)
+ FI
+ PER;
+ tt.
+ eintrag enthaelt infix:
+ pos (eintrag, infix) <> 0
+END PROC infix namen;
+THESAURUS PROC infix namen (THESAURUS CONST t, INT CONST dateityp):
+
+ THESAURUS VAR tt :: empty thesaurus;
+ INT VAR i;
+ FOR i FROM 1 UPTO highest entry (t) REP
+ TEXT VAR eintrag :: name (t,i);
+ IF eintrag enthaelt infix
+ THEN insert (tt, eintrag)
+ FI
+ PER;
+ tt.
+ eintrag enthaelt infix:
+ type (old (eintrag)) = dateityp.
+END PROC infix namen;
+THESAURUS PROC infix namen (THESAURUS CONST t,
+ TEXT CONST infix 1, INT CONST dateityp):
+ THESAURUS VAR tt :: empty thesaurus;
+ INT VAR i;
+ FOR i FROM 1 UPTO highest entry (t) REP
+
+ TEXT VAR eintrag :: name (t,i);
+ IF eintrag enthaelt infix
+ THEN insert (tt, eintrag)
+ FI
+ PER;
+ tt.
+ eintrag enthaelt infix:
+ (pos (eintrag, infix 1) <> 0) AND (type (old (eintrag)) = dateityp).
+END PROC infix namen;
+THESAURUS PROC infix namen (THESAURUS CONST t,
+ TEXT CONST infix 1, infix 2):
+ THESAURUS VAR tt :: empty thesaurus;
+ INT VAR i;
+ FOR i FROM 1 UPTO highest entry (t) REP
+ TEXT VAR eintrag :: name (t,i);
+ IF eintrag enthaelt infix
+
+ THEN insert (tt, eintrag)
+ FI
+ PER;
+ tt.
+ eintrag enthaelt infix:
+ (pos (eintrag, infix 1) <> 0) OR (pos (eintrag, infix 2) <> 0)
+END PROC infix namen;
+THESAURUS PROC infix namen (TEXT CONST infix):
+ infix namen (ALL myself, infix)
+END PROC infix namen;
+THESAURUS PROC infix namen (TEXT CONST infix 1, infix 2):
+ infix namen (ALL myself, infix 1, infix 2)
+END PROC infix namen;
+THESAURUS PROC ohne praefix (THESAURUS CONST thesaurus, TEXT CONST praefix):
+ THESAURUS VAR t :: empty thesaurus;
+
+ INT VAR zaehler;
+ FOR zaehler FROM 1 UPTO highest entry (thesaurus) REP
+ IF name (thesaurus, zaehler) <> ""
+ AND pos (name (thesaurus, zaehler), praefix) = 1
+ THEN insert (t, subtext (name (thesaurus, zaehler),
+ length (praefix) + 1))
+ FI;
+ PER;
+ t
+END PROC ohne praefix;
+BOOL PROC not empty (THESAURUS CONST t):
+ INT VAR i;
+ FOR i FROM 1 UPTO highest entry (t) REP
+ IF name (t, i) <> ""
+ THEN LEAVE not empty WITH TRUE
+
+ FI
+ PER;
+ FALSE
+END PROC not empty;
+PROC untersuche bildschirmmasszahlen (TEXT CONST t1, t2):
+ IF unzulaessige cursorwerte
+ THEN errorstop (fehlermeldung [1])
+ ELIF fenster ist zu klein
+ THEN errorstop (fehlermeldung [2])
+ FI.
+ unzulaessige cursorwerte:
+ (x + xsize) > 80 COR (y + ysize) > 25 COR x < 1 COR y < 1
+ COR xsize > 79 COR ysize > 24.
+ fenster ist zu klein:
+ (xsize) < 56 COR (ysize) < 15
+ COR length (t1) > (xsize - 5) COR length (t2) > (xsize - 5).
+
+END PROC untersuche bildschirmmasszahlen;
+TEXT PROC ggf gekuerzter text (TEXT CONST text):
+ IF length (text) > (xsize - 5)
+ THEN subtext (text, 1, xsize - 7) + ".."
+ ELSE text
+ FI
+END PROC ggf gekuerzter text;
+THESAURUS PROC some (INT CONST spa, zei, breite, hoehe,
+ THESAURUS CONST t,
+ TEXT CONST t1, t2):
+ TEXT VAR text 1, text 2;
+ x := spa;
+ y := zei;
+ xsize := breite;
+ ysize := hoehe;
+ text 1 := ggf gekuerzter text (t1);
+
+ text 2 := ggf gekuerzter text (t2);
+ untersuche bildschirmmasszahlen (text 1, text 2);
+ auswahl (t, TRUE, text 1, text 2)
+END PROC some;
+THESAURUS PROC some (INT CONST spa, zei,
+ THESAURUS CONST t,
+ TEXT CONST t1, t2):
+ some (spa, zei, 79 - spa + 1, 24 - zei + 1, t, t1, t2)
+END PROC some;
+THESAURUS PROC some (THESAURUS CONST t,
+ TEXT CONST t1, t2):
+ some (1, 1, 79, 24, t, t1, t2)
+END PROC some;
+TEXT PROC one (INT CONST spa, zei, breite, hoehe,
+
+ THESAURUS CONST t,
+ TEXT CONST t1, t2):
+ TEXT VAR text 1, text 2;
+ x := spa;
+ y := zei;
+ xsize := breite;
+ ysize := hoehe;
+ text 1 := ggf gekuerzter text (t1);
+ text 2 := ggf gekuerzter text (t2);
+ untersuche bildschirmmasszahlen (text 1, text 2);
+ name (auswahl (t, FALSE, text 1, text 2), 1)
+END PROC one;
+TEXT PROC one (INT CONST spa, zei,
+ THESAURUS CONST t,
+ TEXT CONST t1, t2):
+ one (spa, zei, 79 - spa + 1, 24 - zei + 1, t, t1, t2)
+
+END PROC one;
+TEXT PROC one (THESAURUS CONST t, TEXT CONST t1, t2):
+ one (1, 1, 79, 24, t, t1, t2)
+END PROC one;
+END PACKET ls dialog 2;
+