summaryrefslogtreecommitdiff
path: root/app/flint
diff options
context:
space:
mode:
Diffstat (limited to 'app/flint')
-rw-r--r--app/flint/0.4/doc/Zusammenstellung62
-rw-r--r--app/flint/0.4/doc/flint.kurzanleitung141
-rw-r--r--app/flint/0.4/source-disk1
-rw-r--r--app/flint/0.4/src/MENUE.gen93
-rw-r--r--app/flint/0.4/src/OPMENUE.gen42
-rw-r--r--app/flint/0.4/src/boxzeichen3
-rw-r--r--app/flint/0.4/src/dummy.configurate6
-rw-r--r--app/flint/0.4/src/editormenue1008
-rw-r--r--app/flint/0.4/src/eudas.manager216
-rw-r--r--app/flint/0.4/src/flint808
-rw-r--r--app/flint/0.4/src/flint.init603
-rw-r--r--app/flint/0.4/src/flint.manager16
-rw-r--r--app/flint/0.4/src/isub.replace19
-rw-r--r--app/flint/0.4/src/klartextbelegung304
-rw-r--r--app/flint/0.4/src/offline.15
-rw-r--r--app/flint/0.4/src/offline.manager383
-rw-r--r--app/flint/0.4/src/operator381
-rw-r--r--app/flint/0.4/src/operator.139
-rw-r--r--app/flint/0.4/src/operator.init390
-rw-r--r--app/flint/0.4/src/operator.manager34
-rw-r--r--app/flint/0.4/src/operator.spoolcmd113
21 files changed, 4667 insertions, 0 deletions
diff --git a/app/flint/0.4/doc/Zusammenstellung b/app/flint/0.4/doc/Zusammenstellung
new file mode 100644
index 0000000..cad83c0
--- /dev/null
+++ b/app/flint/0.4/doc/Zusammenstellung
@@ -0,0 +1,62 @@
+Task "MENUE" unter "UR"
+-----------------------
+
+"menues.1" = "eudas.satzzugriffe"
+ "eudas.fenster"
+ "eudas.menues"
+"offline.1" = "offline.manager"
+IF ibm grafik THEN run ("boxzeichen") END IF
+global manager
+
+
+Task "OPMENUE" unter "SYSUR"
+----------------------------
+
+"menues.1"
+"offline.1"
+"operator.1" = "operator.spoolcmd"
+ "operator.manager"
+ "operator"
+menuedaten einlesen ("operator.init")
+IF ibm grafik THEN run ("boxzeichen") END IF
+global manager
+
+
+Task "OP" unter "OPMENUE"
+-------------------------
+
+
+Task "EUDAS" unter "MENUE" (oder auch in "FLINT")
+-------------------------------------------------
+
+"eudas.1" = "eudas.dateistruktur"
+ "eudas.datenverwaltung"
+"eudas.2" = "eudas.verarbeitung"
+ "eudas.drucken"
+"eudas.3" = "eudas.satzanzeige"
+ "eudas.uebersicht"
+"eudas.4" = "eudas.dialoghilfen"
+ "eudas.steuerung"
+menuedaten einlesen ("eudas.init")
+global manager
+
+
+Task "FLINT" unter "EUDAS"
+--------------------------
+
+"flint.1" = "klartextbelegung"
+ "editormenue"
+ "eudas.manager"
+ "flint.manager"
+ "flint"
+menuedaten einlesen ("flint.init")
+global manager
+
+
+
+Hinweise für L3:
+
+- Vor "menues.1" muß jeweils "isub.replace" insertiert werden.
+- In "offline.1" ist das Vorkommen von "PROCA" zu entfernen.
+- Vor "operator.1" muß eine Dummy-Prozedur 'configurate' insertiert werden.
+
diff --git a/app/flint/0.4/doc/flint.kurzanleitung b/app/flint/0.4/doc/flint.kurzanleitung
new file mode 100644
index 0000000..25608c3
--- /dev/null
+++ b/app/flint/0.4/doc/flint.kurzanleitung
@@ -0,0 +1,141 @@
+Hinweise zur FLINT-Testversion 0.4
+----------------------------------
+
+1. Installation
+
+Die Installation läuft in folgenden Schritten ab:
+
+- Task "OPMENUE" als Sohn von "SYSUR" einrichten.
+ Dort "OPMENUE.gen" vom Archiv holen und starten.
+ Warten bis zur Tapete.
+
+- Task "MENUE" als Sohn von "UR" einrichten.
+ Dort "MENUE.gen" vom Archiv holen und starten.
+ Warten bis zur Tapete.
+
+
+2. Kurzanleitung
+
+Arbeitstasks unter "FLINT" einrichten. Beim Einrichten vom Supervisor aus
+koppelt sich die neue Task sofort ab und muß mit 'continue' wieder ange­
+koppelt werden. Es erscheint das FLINT-Hauptmenue.
+
+Zur Bedienung der Menüs s. EUDAS-Handbuch. Hilfestellungen zu jeder
+Funktion mit ESC '?'.
+
+Die Punkte im ersten Menü führen jeweils in Unterapplikationen. Der Punkt
+'Systemsteuerung' koppelt automatisch die Task "OP" an und zeigt dort das
+Operatormenü. Bei ESC 'q' erfolgt Rückkehr in die eigene Task.
+
+Wechsel in eine andere Task (mit Einrichten bei Bedarf) geschieht mit dem
+Menüpunkt 'Wechsel' im dritten Menü. Dies funktioniert aber nur mit Nach­
+fahren von FLINT. Falls niltext als Name angegeben wird, kann man die Task
+abkoppeln.
+
+Im Operatormenü führt 'Beenden' zu einem Shutup mit anschließender Rückkehr
+in die aufrufende Task. Einige Funktionen sind derzeit noch nicht implemen­
+tiert.
+
+
+3. Textverarbeitung
+
+Unter dem Hauptmenüpunkt 'Textverarbeitung' wird ein Menü aufgerufen, das
+die Kommandos der EUMEL-Textverarbeitung als Menüpunkte aufführt. Welche
+Kommandos jeweils gemeint sind, ist durch ESC '?' zu erfragen bzw. auszu­
+probieren (eine genauere Beschreibung liegt aus Zeitmangel noch nicht vor).
+
+
+4. Menüs im Editor
+
+Zur Unterstützung der Arbeit im Editor kann man auch dort Menüs aufrufen,
+und zwar über ESC 'm' (Edit-Menü) und ESC 't' (Text-Menü). Bei den Menüs
+handelt es sich um Zeilenmenüs, die am unteren Bildrand autauchen, um die
+Sicht auf die Datei möglichst wenig einzuengen. Eine Funktion kann mit den
+Cursortasten ausgewählt und mit Leertaste (oder RETURN) ausgeführt werden.
+Alternativ Aufruf über Anfangsbuchstaben. Das Menü kann mit ESC 'q' ohne
+Wirkung verlassen werden.
+
+
+5. Edit-Menü
+
+Hier stehen Funktionen zur Verfügung, die normalerweise nach ESC ESC als
+Kommandos formuliert werden. Die Funktionen zum Suchen und Ersetzen werden
+nach Ausführung auf 'f' gelegt, so daß sie mit ESC 'f' wiederholt werden
+können.
+
+Als Zusatz steht eine Funktion zur Verfügung, mit der Lernsequenzen im
+Klartext editiert werden können. Die Funktionstasten werden dabei durch
+Namen in spitzen Klammern geschrieben (erlaubt sind u.a. <links> <rechts>
+<oben> <unten> <tab> <return> <rubin> <rubout> <mark> <hop> <esc> <blank>).
+Leerzeichen werden beachtet, aber Zeilenübergänge ignoriert.
+
+Ebenfalls neu sind Funktionen zum Markieren von Wörten und Sätzen (von Wort
+bis Satzende), die für die folgende Einstellung von Modifikationen verwen­
+det werden können.
+
+'Kopiere' ruft entweder PUT oder GET auf, je nachdem, ob ein Block markiert
+ist oder nicht. Die Funktion kann mit ESC 'h' abgebrochen werden.
+
+Mit 'Fenster' kann ein zweites Editorfenster in der unteren Hälfte eröffnet
+werden (geplant ist später, daß die Unterteilung des Schirms sowohl hori­
+zontal als auch vertikal erfolgen kann).
+
+
+6. Text-Menü
+
+Dieses Menü hilft bei der Formulierung von Textkosmetik-Anweisungen. Die
+entsprechenden Anweisungen werden an der Cursorposition oder, falls notwen­
+dig, am Zeilenanfang eingefügt.
+
+Die Funktion zum Einstellen von Modifikationen hat zwei verschiedene Mög­
+lichkeiten: Falls kein Text markiert ist, werden die angekreuzten Modifi­
+kationen ein- oder ausgeschaltet (je nachdem, ob "Aus" angekreuzt ist).
+Falls ein Text markiert ist, werden alle Modifikationsanweisungen am Anfang
+und Ende des Bereichs entfernt und die angekreuzten Modifikationen für
+diesen Bereich eingestellt, wenn nicht "Aus" angekreuzt ist.
+
+Die globalen Einstellungen für eine Datei werden an den Anfang geschrieben,
+wobei die vorherigen Einstellungen ggf. entfernt werden können.
+
+Der markierte Ausschnitt einer Datei kann mit 'lineform' bearbeitet und
+auch mit vorheriger Formatierung gedruckt werden.
+
+
+7. Literatur
+
+Kann als Zusatzmodul insertiert werden. Dazu "litmenue" insertieren und
+anschließend 'menuedaten einlesen ("litmenue.init")' aufrufen. Das Menü
+steht dann durch Aufruf von 'literatur' im Editor zur Verfügung (kann und
+sollte auf eine Funktionstaste gelegt werden).
+
+Die zu verwendenden Literaturdateien müssen vorher in EUDAS eingerichtet und
+gewartet werden. Einzige Bedingung zur Verwendung ist, daß das erste Feld
+als Signatur für einen bestimmten Titel verwendet werden kann. Der Inhalt
+dieses Feldes sollte zur Zeit aus technischen Gründen keine
+Suchmuster-Steuerzeichen (,;*--++..) enthalten. Diese Einschränkung wird
+später aufgehoben.
+
+Die Funktion 'Literatur' dient dazu, eine bestimmte EUDAS-Datei als
+Literaturdatei einzustellen. Geänderte EUDAS-Dateien beliebiger Art müssen
+vor Aufruf des Literaturmenüs gesichert werden!
+
+Durch 'Zeigen' wird in der unteren Bildschirmhälfte eine Übersicht
+angeboten, in der geblättert werden kann. Durch 'Direkt' kann ein bestimmter
+Satz nach Signatur angesteuert werden.
+
+Die Funktion 'Referenzen' dient dazu, die in der editierten Datei
+vorkommenden Literaturreferenzen in der Literaturdatei zu markieren. Dazu
+müssen die Referenzen als Macro \#lit ("Signatur")\# in der Datei angegeben
+werden. Als Option beim Sammeln der Referenzen können diese durch ein
+anderes Macro und den Inhalt eines beliebigen Feldes der EUDAS-Datei ersetzt
+werden. Diese beiden Angaben werden erfragt. Referenzen, die in der
+Literaturdatei nicht vorkommen, werden als Dummy-Einträge an das Ende der
+Literaturdatei geschrieben, so daß sie später in EUDAS ausgefüllt werden
+können.
+
+Mit der Funktion 'Verzeichnis' können dann die markierten Sätze
+(zwischendurch keine neue Datei öffnen!) als Literaturverzeichnis an das
+Ende der Datei gebracht werden. Dazu muß ein vorher erstelltes Druckmuster
+angegeben werden, das die Form der Literatureinträge angibt.
+
+
diff --git a/app/flint/0.4/source-disk b/app/flint/0.4/source-disk
new file mode 100644
index 0000000..3c86110
--- /dev/null
+++ b/app/flint/0.4/source-disk
@@ -0,0 +1 @@
+eudas/flint-0.4.img
diff --git a/app/flint/0.4/src/MENUE.gen b/app/flint/0.4/src/MENUE.gen
new file mode 100644
index 0000000..327438c
--- /dev/null
+++ b/app/flint/0.4/src/MENUE.gen
@@ -0,0 +1,93 @@
+page;
+putline ("Generierung MENUE 0.5");
+BOOL CONST box := yes ("Mit IBM Grafikzeichen");
+BOOL CONST l3 := maxint DIV 2 > 17000;
+TASK VAR dummy, ar;
+IF l3 THEN ar := /"EUMEL" ELSE ar := archive END IF;
+INT VAR kanal := channel;
+fetch ("eudas.satzzugriffe", ar);
+fetch ("eudas.fenster", ar);
+fetch ("eudas.menues", ar);
+fetch ("offline.1", ar);
+fetch ("eudas.1", ar);
+fetch ("eudas.2", ar);
+fetch ("eudas.3", ar);
+fetch ("eudas.dialoghilfen", ar);
+fetch ("flint.init", ar);
+IF yes ("Ggf zweites Archiv eingelegt") THEN END IF;
+fetch ("eudas.steuerung", ar);
+fetch ("eudas.init", ar);
+fetch ("klartextbelegung", ar);
+fetch ("editormenue", ar);
+fetch ("eudas.manager", ar);
+fetch ("flint.manager", ar);
+fetch ("flint", ar);
+IF l3 THEN fetch ("isub.replace", ar) END IF;
+IF box THEN fetch ("boxzeichen", ar) END IF;
+release (ar);
+check off;
+IF l3 THEN do (PROC (TEXT CONST) reorganize, all) END IF;
+IF l3 THEN insert ("isub.replace"); forget ("isub.replace", quiet) END IF;
+insert ("eudas.satzzugriffe"); forget ("eudas.satzzugriffe", quiet);
+insert ("eudas.fenster"); forget ("eudas.fenster", quiet);
+insert ("eudas.menues"); forget ("eudas.menues", quiet);
+IF l3 THEN
+ TEXT VAR zeile; FILE VAR f;
+ f := sequential file (modify, "offline.1");
+ to line (f, 1);
+ read record (f, zeile);
+ INT CONST pp := pos (zeile, ",PROCA");
+ change (zeile, pp, pp + 7, "");
+ write record (f, zeile)
+END IF;
+insert ("offline.1"); forget ("offline.1", quiet);
+IF box THEN run ("boxzeichen"); forget ("boxzeichen", quiet) END IF;
+do ("ausfuehrtaste (""""13"""")");
+begin ("FLINT", PROC flint init, dummy);
+do ("global manager");
+
+PROC flint init :
+
+ disable stop;
+ fetch ("eudas.init");
+ fetch ("flint.init");
+ continue (kanal);
+ command dialogue (FALSE);
+ page;
+ i ("eudas.1");
+ i ("eudas.2");
+ i ("eudas.3");
+ i ("eudas.dialoghilfen");
+ i ("eudas.steuerung");
+ i ("klartextbelegung");
+ i ("editormenue");
+ i ("eudas.manager");
+ i ("flint.manager");
+ i ("flint");
+ do ("menue loeschen (FALSE)");
+ do ("menuedaten einlesen (""eudas.init"")");
+ forget ("eudas.init", quiet);
+ erase ("eudas.init");
+ do ("menuedaten einlesen (""flint.init"")");
+ forget ("flint.init", quiet);
+ erase ("flint.init");
+ erase ("MENUE.gen");
+ command dialogue (TRUE);
+ check on;
+ do ("begin (""OP"", ""OPMENUE"")");
+ do ("global manager")
+
+END PROC flint init;
+
+PROC i (TEXT CONST name) :
+
+ fetch (name);
+ insert (name);
+ IF is error THEN
+ put error; clear error; pause (1000); do ("global manager")
+ END IF;
+ forget (name);
+ erase (name)
+
+END PROC i;
+
diff --git a/app/flint/0.4/src/OPMENUE.gen b/app/flint/0.4/src/OPMENUE.gen
new file mode 100644
index 0000000..28304a6
--- /dev/null
+++ b/app/flint/0.4/src/OPMENUE.gen
@@ -0,0 +1,42 @@
+page;
+putline ("Generierung OPMENUE 0.5");
+BOOL CONST box := yes ("Mit IBM-Grafikzeichen");
+BOOL CONST l3 := maxint DIV 2 > 17000;
+TASK VAR ar;
+IF l3 THEN ar := /"EUMEL" ELSE ar := archive END IF;
+IF l3 THEN fetch ("isub.replace", ar) END IF;
+fetch ("eudas.satzzugriffe", ar);
+fetch ("eudas.fenster", ar);
+fetch ("eudas.menues", ar);
+fetch ("offline.1", ar);
+IF l3 THEN fetch ("dummy.configurate", ar) END IF;
+fetch ("operator.1", ar);
+fetch ("operator.init", ar);
+IF box THEN fetch ("boxzeichen", ar) END IF;
+release (ar);
+IF l3 THEN do (PROC (TEXT CONST) reorganize, all) END IF;
+IF l3 THEN insert ("isub.replace"); forget ("isub.replace", quiet) END IF;
+insert ("eudas.satzzugriffe"); forget ("eudas.satzzugriffe", quiet);
+insert ("eudas.fenster"); forget ("eudas.fenster", quiet);
+insert ("eudas.menues"); forget ("eudas.menues", quiet);
+do ("ausfuehrtaste (""""13"""")");
+IF l3 THEN
+ TEXT VAR zeile; FILE VAR f;
+ f := sequential file (modify, "offline.1");
+ to line (f, 1);
+ read record (f, zeile);
+ INT CONST pp := pos (zeile, ",PROCA");
+ change (zeile, pp, pp + 7, "");
+ write record (f, zeile)
+END IF;
+insert ("offline.1"); forget ("offline.1", quiet);
+IF l3 THEN
+ insert ("dummy.configurate"); forget ("dummy.configurate", quiet)
+END IF;
+insert ("operator.1"); forget ("operator.1", quiet);
+do ("menuedaten einlesen (""operator.init"")");
+forget ("operator.init", quiet);
+IF box THEN run ("boxzeichen"); forget ("boxzeichen", quiet) END IF;
+forget ("OPMENUE.gen", quiet);
+do ("global manager");
+
diff --git a/app/flint/0.4/src/boxzeichen b/app/flint/0.4/src/boxzeichen
new file mode 100644
index 0000000..12c3bb8
--- /dev/null
+++ b/app/flint/0.4/src/boxzeichen
@@ -0,0 +1,3 @@
+box zeichen (""205""186""201""187""200""188""199""182""196"",
+ ""15""14"", ""178" ")
+
diff --git a/app/flint/0.4/src/dummy.configurate b/app/flint/0.4/src/dummy.configurate
new file mode 100644
index 0000000..2834684
--- /dev/null
+++ b/app/flint/0.4/src/dummy.configurate
@@ -0,0 +1,6 @@
+PACKET dummy configurate DEFINES configurate :
+PROC configurate :
+ errorstop ("Für L3 nicht implementiert")
+END PROC configurate;
+END PACKET dummy configurate;
+
diff --git a/app/flint/0.4/src/editormenue b/app/flint/0.4/src/editormenue
new file mode 100644
index 0000000..5ab94f1
--- /dev/null
+++ b/app/flint/0.4/src/editormenue
@@ -0,0 +1,1008 @@
+PACKET edit menue (* Autor: Thomas Berlage *)
+ (* Stand: 16.10.88 *)
+ DEFINES
+
+ edit,
+ edit status anzeigen,
+ zeilenmenue anbieten,
+ editfile setzen,
+ edit menue,
+ element markieren,
+ text menue,
+ ausschnitt drucken,
+ gewaehlte schriftarten einstellen :
+
+
+(************************* Zeilenmenue *************************************)
+
+LET
+ menue status =
+"MENUE: Wählen: <-,-> Ausführen: LEER,RET Abbruch: ESC h Hilfe: ESC ?";
+
+
+PROC zeilenmenue anbieten (TEXT CONST menuename,
+ PROC (INT CONST) kommandos) :
+
+ bild vorbereiten;
+ zeilenmenue anbieten (menuename, TRUE, PROC (INT CONST) kommandos);
+ bild nachbereiten .
+
+bild vorbereiten :
+ INT VAR x, y;
+ get cursor (x, y);
+ cursor (1, y size); out (""5"");
+ status anzeigen (menue status);
+ cursor (x, y);
+ IF aktueller editor > 0 THEN
+ get editcursor (x, y);
+ y := line no (editfile) + y size - y;
+ abschnitt neu (y - 1, y)
+ END IF .
+
+bild nachbereiten :
+ IF aktueller editor > 0 THEN
+ IF mark (editfile) THEN
+ bild neu
+ ELSE
+ abschnitt neu (y - 1, y)
+ END IF
+ END IF;
+ cursor (1, y size - 1); out (""4"") .
+
+END PROC zeilenmenue anbieten;
+
+PROC eget (TEXT CONST prompt, TEXT VAR inhalt) :
+
+ editget (prompt, inhalt, "", "GET/Allgemein")
+
+END PROC eget;
+
+BOOL PROC eja (TEXT CONST frage) :
+
+ ja (frage, "JA/Allgemein", TRUE)
+
+END PROC eja;
+
+
+(* EDIT MENUE *)
+
+TEXT VAR
+ param,
+ fensterdatei := "";
+
+FENSTER VAR zweitfenster;
+fenster initialisieren (zweitfenster);
+
+PROC edit menue :
+
+ zeilenmenue anbieten ("EDIT MENUE:",
+ PROC (INT CONST) edit menue kommandos)
+
+END PROC edit menue;
+
+PROC edit menue kommandos (INT CONST wahl) :
+
+ SELECT wahl OF
+ CASE 1 : springen auf zeile
+ CASE 2 : suchen nach text
+ CASE 3 : suchen und ersetzen
+ CASE 4, 5 : markieren
+ CASE 6 : kopieren oder lesen
+ CASE 7 : fenster editieren
+ CASE 8 : limit einstellen
+ CASE 9 : tastenbelegung
+ END SELECT .
+
+springen auf zeile :
+ TEXT VAR z := "";
+ eget ("Zeilennummer:", z);
+ IF z <> "" THEN
+ INT CONST auf zeile := int (z);
+ IF last conversion ok THEN
+ edit file setzen; T auf zeile
+ ELSE
+ errorstop ("Zeilennummer ist keine Zahl")
+ END IF
+ END IF .
+
+suchen nach text :
+ param := "";
+ eget ("Text:", param);
+ IF param = "" THEN
+ ELIF eja ("Vorwärts") THEN
+ ek ("D" + textdarstellung (param))
+ ELSE
+ ek ("U" + textdarstellung (param))
+ END IF .
+
+suchen und ersetzen :
+ param := "";
+ eget ("Suchtext:", param);
+ IF param <> "" THEN
+ z := ""; eget ("Ersetzen durch:", z);
+ IF z <> "" THEN
+ IF eja ("Nur einmal") THEN
+ ek (textdarstellung (param) + "C" + textdarstellung (z))
+ ELSE
+ editfile setzen;
+ param CA z
+ END IF
+ END IF
+ END IF .
+
+markieren :
+ element markieren (wahl = 5) .
+
+kopieren oder lesen :
+ param := "";
+ editfile setzen;
+ IF mark THEN
+ eget ("Zieldatei (RET = Speicher):", param);
+ PUT param
+ ELSE
+ eget ("Quelldatei (RET = Speicher):", param);
+ GET param
+ END IF .
+
+fenster editieren :
+ INT VAR xa, ya, xl, yl;
+ get window (xa, ya, xl, yl);
+ IF groesster editor >= 2 THEN
+ errorstop ("Nur zwei Fenster")
+ ELSE
+ fenstergroesse setzen (zweitfenster,
+ xa, ya + yl DIV 2, xl, yl - yl DIV 2);
+ eget ("Name der Datei:", fensterdatei);
+ IF NOT exists (fensterdatei) CAND
+ NOT eja ("""" + fensterdatei + """ neu einrichten") THEN
+ errorstop ("")
+ END IF;
+ FILE VAR eff := sequential file (modify, fensterdatei);
+ edit (eff, zweitfenster, "EDIT/Allgemein")
+ END IF .
+
+limit einstellen :
+ z := text (limit);
+ REP
+ eget ("Zeilenbreite bis Umbruch (limit) in Zeichen:", z);
+ INT CONST l := int (z);
+ UNTIL last conversion ok OR z = "" PER;
+ IF z <> "" THEN limit (l) END IF .
+
+tastenbelegung :
+ TEXT VAR taste;
+ status anzeigen ("");
+ cursor (1, 24);
+ put ("Gewünschte Taste drücken (ESC = Abbruch):"5"");
+ getchar (taste);
+ IF taste <> ""27"" THEN
+ put (""13"Sequenz ggf editieren, dann ESC q"5"");
+ lernsequenz editieren (taste)
+ END IF .
+
+END PROC edit menue kommandos;
+
+PROC ek (TEXT CONST kom) :
+
+ kommando auf taste legen ("f", kom);
+ std kommando interpreter ("f")
+
+END PROC ek;
+
+PROC editfile setzen :
+
+ kommando auf taste legen (""27"", "");
+ std kommando interpreter (""27"")
+
+END PROC editfile setzen;
+
+DATASPACE VAR ds;
+
+PROC lernsequenz editieren (TEXT CONST taste) :
+
+ disable stop;
+ ds := nilspace;
+ editieren (taste);
+ forget (ds)
+
+END PROC lernsequenz editieren;
+
+PROC element markieren (BOOL CONST bis satzende) :
+
+ FILE VAR edfile := editfile;
+ INT VAR spalte := col (edfile);
+ IF NOT mark (edfile) THEN
+ zeile lesen;
+ cursor zuruecksetzen;
+ mark (edfile, line no (edfile), spalte)
+ ELSE
+ zeile lesen
+ END IF;
+ IF bis satzende THEN
+ position auf satzende
+ ELSE
+ position auf wortende
+ END IF .
+
+zeile lesen :
+ read record (edfile, param) .
+
+cursor zuruecksetzen :
+ WHILE spalte > 1 CAND (param SUB spalte - 1) <> " " REP
+ spalte DECR 1
+ END REP .
+
+position auf satzende :
+ WHILE pos (param, ".", spalte) = 0 CAND kein absatz REP
+ down (edfile);
+ zeile lesen;
+ spalte := 1
+ END REP;
+ spalte := pos (param, ".", spalte);
+ IF spalte = 0 THEN spalte := length (param) ELSE spalte INCR 1 END IF;
+ col (edfile, spalte) .
+
+kein absatz :
+ (spalte = LENGTH param OR (param SUB LENGTH param) <> " ")
+ AND NOT eof (edfile) .
+
+position auf wortende :
+ spalte DECR 1;
+ REP
+ spalte INCR 1;
+ spalte := pos (param, ""33"", ""255"", spalte);
+ IF spalte = 0 THEN
+ IF eof (edfile) THEN
+ spalte := length (param)
+ ELSE
+ down (edfile);
+ zeile lesen
+ END IF
+ END IF
+ UNTIL spalte > 0 END REP;
+ spalte := pos (param, " ", spalte);
+ IF spalte = 0 THEN spalte := length (param) END IF;
+ col (edfile, spalte) .
+
+END PROC element markieren;
+
+TEXT VAR sequenz, aenderung;
+
+PROC editieren (TEXT CONST taste) :
+
+ enable stop;
+ FILE VAR f := sequential file (output, ds);
+ maxlinelength (f, 37);
+ sequenz := lernsequenz auf taste (taste);
+ klartext in file (f, sequenz);
+ alles neu;
+ abgrenzung zeichnen;
+ editstatus anzeigen;
+ edit (f, 42, 2, x size - 42, y size - 3);
+ klartext aus file (f, aenderung);
+ IF aenderung <> sequenz CAND wirklich aendern THEN
+ lernsequenz auf taste legen (taste, aenderung)
+ END IF .
+
+abgrenzung zeichnen :
+ cursor (40, 1);
+ y size - 3 TIMESOUT ""10""15""14""8""8"" .
+
+wirklich aendern :
+ eja ("Lernsequenz aendern") .
+
+END PROC editieren;
+
+
+(* TEXT MENUE *)
+
+PROC text menue :
+
+ zeilenmenue anbieten ("TEXT MENUE:",
+ PROC (INT CONST) text menue kommandos)
+
+END PROC text menue;
+
+FENSTER VAR fontfenster, modfenster;
+fenster initialisieren (fontfenster);
+fenster initialisieren (modfenster);
+fenstergroesse setzen (fontfenster, 40, 2, 40, 21);
+fenstergroesse setzen (modfenster, 55, 13, 25, 10);
+
+TEXT VAR
+ ezeile,
+ format macro := "";
+
+
+PROC text menue kommandos (INT CONST mwahl) :
+
+ SELECT mwahl OF
+ CASE 1 : schrifttyp einstellen
+ CASE 2 : schriftart einstellen
+ CASE 3 : neue seite beginnen
+ CASE 4 : zwischenraum freilassen
+ CASE 5 : globaleinstellung
+ CASE 6 : zeilenweise formatieren
+ CASE 7 : ausschnitt drucken
+ END SELECT .
+
+schrifttyp einstellen :
+ TEXT VAR typname;
+ schrifttyp auswaehlen (typname);
+ IF typname <> "" THEN
+ textanweisung einfuegen ("type", schriftname, FALSE)
+ END IF .
+
+schriftname :
+ textdarstellung (typname) .
+
+schriftart einstellen :
+ schriftart auswaehlen;
+ gewaehlte schriftarten einstellen (gewaehlte modifikationen) .
+
+schriftart auswaehlen :
+ alles neu;
+ auswahl anbieten ("TEXT.Modwahl", modfenster, -10, "AUSWAHL/Allgemein",
+ PROC (TEXT VAR, INT CONST) modname) .
+
+neue seite beginnen :
+ param := "";
+ eget ("Nummer der nächsten Seite (RET = +1):", param);
+ IF param = "" THEN
+ textanweisung einfuegen ("page", "", TRUE)
+ ELSE
+ INT CONST seitennr := int (param);
+ IF last conversion ok THEN
+ textanweisung einfuegen ("page", text (seitennr), TRUE)
+ ELSE
+ errorstop ("Seitennummer keine Zahl")
+ END IF
+ END IF .
+
+zwischenraum freilassen :
+ param := "";
+ eget ("Zwischenraum in cm:", param);
+ IF param <> "" THEN
+ change all (param, ",", ".");
+ REAL CONST wert := real (param);
+ IF last conversion ok THEN
+ textanweisung einfuegen ("free", text (wert), TRUE)
+ ELSE
+ errorstop ("kein Zahlenwert")
+ END IF
+ END IF .
+
+zeilenweise formatieren :
+ editfile setzen;
+ lineform; ueberschrift neu .
+
+globaleinstellung :
+ einstellung erfragen;
+ einstellung eintragen .
+
+END PROC text menue kommandos;
+
+LET zwischendatei = "&&Druckabschnitt";
+
+PROC ausschnitt drucken :
+
+ LET ende der seite = "Ende der Seite ";
+ FILE VAR ef := editfile;
+ INT VAR pageform anfang;
+ auf pageform datei testen;
+ IF pageform anfang > 0 THEN
+ editfile setzen;
+ IF mark (ef) THEN
+ markierten pageform abschnitt drucken
+ ELSE
+ nach seiten fragen und drucken
+ END IF;
+ print (zwischendatei);
+ forget (zwischendatei, quiet)
+ ELIF mark (ef) THEN
+ abschnitt formatieren und drucken
+ ELSE
+ errorstop ("kein Abschnitt markiert")
+ END IF;
+ alte position einnehmen .
+
+auf pageform datei testen :
+ INT VAR
+ zeile := line no (ef),
+ spalte := col (ef);
+ to line (ef, 1); col (ef, 1);
+ pageform anfang := 0;
+ WHILE NOT eof (ef) CAND kommando in zeile REP
+ IF pos (ef, ende der seite, 8) > 0 THEN
+ pageform anfang := line no (ef);
+ END IF;
+ down (ef)
+ UNTIL pageform anfang > 0 END REP;
+ to line (ef, zeile); col (ef, spalte) .
+
+kommando in zeile :
+ pos (ef, "#", 1) = 1 .
+
+markierten pageform abschnitt drucken :
+ markierten abschnitt kopieren;
+ pageform anfang kopieren (ef, pageform anfang) .
+
+nach seiten fragen und drucken :
+ anfang erfragen;
+ ende erfragen;
+ markierten abschnitt kopieren;
+ pageform anfang kopieren (ef, pageform anfang);
+ mark (ef, 0, 0) .
+
+anfang erfragen :
+ TEXT VAR seitennr := "";
+ eget ("Erste Seite:", seitennr);
+ IF seitennr = "" THEN
+ mark (ef, pageform anfang + 1, 1)
+ ELSE
+ to line (ef, 1);
+ down (ef, ende der seite + text (int (seitennr) - 1));
+ IF eof (ef) THEN
+ mark (ef, pageform anfang + 1, 1)
+ ELSE
+ down (ef);
+ mark (ef, line no (ef), 1)
+ END IF
+ END IF .
+
+ende erfragen :
+ eget ("Letzte Seite:", seitennr);
+ IF seitennr <> "" THEN
+ to line (ef, mark line no (ef));
+ down (ef, ende der seite + seitennr);
+ IF NOT eof (ef) THEN down (ef) END IF
+ ELSE
+ to eof (ef)
+ END IF;
+ col (ef, 1) .
+
+abschnitt formatieren und drucken :
+ macro einfuegen;
+ editfile setzen;
+ ueberschrift neu;
+ IF eja ("Zeilenweise formatieren") THEN
+ lineform; page; ueberschrift zeigen; bild zeigen;
+ markierte schlusszeile
+ END IF;
+ markierten abschnitt kopieren;
+ IF eja ("Seitenweise formatieren") THEN
+ pageform (zwischendatei);
+ alles neu;
+ print (zwischendatei + ".p");
+ forget (zwischendatei + ".p", quiet)
+ ELSE
+ print (zwischendatei)
+ END IF;
+ forget (zwischendatei, quiet);
+ macro entfernen .
+
+markierte schlusszeile :
+ cursor (1, y size - 1);
+ out (""15""); x size - 5 TIMESOUT " "; out (""14""4"") .
+
+macro einfuegen :
+ eget ("Format-Makro:", format macro);
+ IF format macro <> "" THEN
+ to line (ef, mark line no (ef));
+ read record (ef, ezeile);
+ change (ezeile, mark col (ef), mark col (ef) - 1,
+ "#" + format macro + "#");
+ write record (ef, ezeile);
+ to line (ef, zeile); col (ef, spalte)
+ END IF .
+
+macro entfernen :
+ IF format macro <> "" THEN
+ zeile := line no (ef); spalte := col (ef);
+ to line (ef, mark line no (ef));
+ read record (ef, ezeile);
+ change (ezeile, mark col (ef), mark col (ef) + length (format macro) + 1,
+ "");
+ write record (ef, ezeile)
+ END IF;
+ alte position einnehmen .
+
+alte position einnehmen :
+ to line (ef, zeile); col (ef, spalte) .
+
+END PROC ausschnitt drucken;
+
+PROC markierten abschnitt kopieren :
+
+ IF exists (zwischendatei) THEN
+ IF eja ("""" + zwischendatei + """ löschen") THEN
+ forget (zwischendatei, quiet)
+ ELSE
+ errorstop ("")
+ END IF
+ END IF;
+ bitte warten;
+ PUT zwischendatei
+
+END PROC markierten abschnitt kopieren;
+
+PROC pageform anfang kopieren (FILE VAR ef, INT CONST zeilen) :
+
+ FILE VAR zwischen := sequential file (modify, zwischendatei);
+ INT VAR i;
+ to line (zwischen, 1);
+ to line (ef, 1);
+ FOR i FROM 1 UPTO zeilen REP
+ read record (ef, ezeile);
+ insert record (zwischen);
+ write record (zwischen, ezeile);
+ down (ef); down (zwischen)
+ END REP
+
+END PROC pageform anfang kopieren;
+
+PROC schrifttyp auswaehlen (TEXT VAR typname) :
+
+ alles neu;
+ auswahl anbieten ("TEXT.Fontwahl", fontfenster, 1, "AUSWAHL/Allgemein",
+ PROC (TEXT VAR, INT CONST) aus fonttab);
+ IF wahl (1) <> 0 THEN
+ typname := font (wahl (1))
+ ELSE
+ typname := ""
+ END IF
+
+END PROC schrifttyp auswaehlen;
+
+PROC aus fonttab (TEXT VAR name, INT CONST stelle) :
+
+ IF stelle > 49 THEN
+ name := ""
+ ELSE
+ name := font (stelle)
+ END IF
+
+END PROC aus fonttab;
+
+PROC gewaehlte schriftarten einstellen (TEXT CONST mod) :
+
+ INT VAR
+ zeile := line no (editfile),
+ spalte := col (editfile);
+ FILE VAR edfile := editfile;
+ read record (edfile, ezeile);
+ IF mark (edfile) THEN
+ modifikationen nachher behandeln;
+ modifikationen vorher behandeln
+ ELSE
+ gewaehlte modifikationen einstellen
+ END IF .
+
+modifikationen nachher behandeln :
+ BOOL VAR geloescht;
+ ueber blanks zuruecksetzen;
+ ueber zeilenanfang zuruecksetzen;
+ modifikationen am ende beseitigen;
+ modifikationen am ende einfuegen .
+
+ueber blanks zuruecksetzen :
+ WHILE spalte > 1 CAND (ezeile SUB (spalte - 1)) = " " REP
+ spalte DECR 1
+ END REP .
+
+ueber zeilenanfang zuruecksetzen :
+ INT VAR stelle;
+ IF spalte = 1 CAND zeile > 1 THEN
+ up (edfile);
+ read record (edfile, ezeile);
+ stelle := length (ezeile);
+ IF (ezeile SUB stelle) = " " THEN stelle DECR 1 END IF
+ ELSE
+ stelle := max (spalte - 1, 1)
+ END IF .
+
+modifikationen am ende beseitigen :
+ WHILE (ezeile SUB stelle) = "#" REP
+ ggf anweisung entfernen
+ END REP .
+
+ggf anweisung entfernen :
+ INT VAR anw anf := stelle - 1;
+ WHILE anw anf > 1 CAND (ezeile SUB anw anf) <> "#" REP
+ anw anf DECR 1
+ END REP;
+ anweisung entfernen ("off", anw anf, stelle, geloescht);
+ IF geloescht THEN
+ spalte DECR (stelle - anw anf + 1)
+ END IF;
+ stelle := anw anf - 1 .
+
+modifikationen am ende einfuegen :
+ IF pos (mod, "a") = 0 THEN
+ neue modifikationen nachher
+ END IF;
+ write record (edfile, ezeile) .
+
+neue modifikationen nachher :
+ FOR i FROM length (mod) DOWNTO 1 REP
+ change (ezeile, spalte, spalte - 1, mod param off);
+ spalte INCR mod param laenge
+ END REP .
+
+modifikationen vorher behandeln :
+ to line (edfile, mark line no (edfile));
+ col (edfile, mark col (edfile));
+ read record (edfile, ezeile);
+ stelle := col (edfile);
+ WHILE (ezeile SUB stelle) = "#" REP
+ ggf anfangsanweisung entfernen
+ END REP;
+ neue modifikationen am anfang einfuegen;
+ write record (edfile, ezeile);
+ to line (edfile, zeile);
+ col (edfile, spalte);
+ abschnitt neu (mark line no (edfile), zeile);
+ mark (edfile, 0, 0) .
+
+ggf anfangsanweisung entfernen :
+ INT VAR anw ende := pos (ezeile, "#", stelle + 1);
+ anweisung entfernen ("on", stelle, anw ende, geloescht);
+ IF geloescht THEN
+ IF line no (edfile) = zeile THEN
+ spalte DECR (anw ende - stelle + 1)
+ END IF
+ ELSE
+ stelle := anw ende + 1
+ END IF .
+
+neue modifikationen am anfang einfuegen :
+ IF pos (mod, "a") = 0 THEN
+ neue modifikationen vorher
+ END IF .
+
+neue modifikationen vorher :
+ FOR i FROM length (mod) DOWNTO 1 REP
+ change (ezeile, stelle, stelle - 1, mod param on);
+ IF line no (edfile) = zeile THEN
+ spalte INCR mod param laenge
+ END IF
+ END REP .
+
+gewaehlte modifikationen einstellen :
+ INT VAR i;
+ BOOL VAR mod aus;
+ mod aus := pos (mod, "a") > 0;
+ FOR i FROM length (mod) DOWNTO 1 REP
+ IF (mod SUB i) = "a" THEN
+ ELIF mod aus THEN
+ change (ezeile, spalte, spalte - 1, mod param off)
+ ELSE
+ change (ezeile, spalte, spalte - 1, mod param on)
+ END IF
+ END REP;
+ write record (edfile, ezeile);
+ abschnitt neu (zeile, zeile) .
+
+mod param on :
+ TEXT VAR
+ mod zeichen := mod SUB i,
+ mod text;
+ IF mod zeichen = "h" THEN
+ mod text := "#u#"
+ ELIF mod zeichen = "t" THEN
+ mod text := "#d#"
+ ELSE
+ mod text := "#on(""" + mod zeichen + """)#"
+ END IF;
+ mod text .
+
+mod param off :
+ mod zeichen := mod SUB i;
+ IF mod zeichen = "h" OR mod zeichen = "t" THEN
+ mod text := "#e#"
+ ELSE
+ mod text := "#off(""" + mod zeichen + """)#"
+ END IF;
+ mod text .
+
+mod param laenge :
+ length (mod text) .
+
+END PROC gewaehlte schriftarten einstellen;
+
+PROC modname (TEXT VAR name, INT CONST stelle) :
+
+ SELECT stelle OF
+ CASE 1 : name := "Fett"
+ CASE 2 : name := "Kursiv"
+ CASE 3 : name := "Unterstrichen"
+ CASE 4 : name := "Hoch"
+ CASE 5 : name := "Tief"
+ CASE 6 : name := "Aus"
+ OTHERWISE name := ""
+ END SELECT
+
+END PROC modname;
+
+TEXT PROC gewaehlte modifikationen :
+
+ TEXT VAR ergebnis := "";
+ INT VAR stelle := 1;
+ WHILE wahl (stelle) > 0 REP
+ wahl merken;
+ stelle INCR 1
+ END REP;
+ ergebnis .
+
+wahl merken :
+ SELECT wahl (stelle) OF
+ CASE 1 : ergebnis CAT "b"
+ CASE 2 : ergebnis CAT "i"
+ CASE 3 : ergebnis CAT "u"
+ CASE 4 : ergebnis CAT "h"
+ CASE 5 : ergebnis CAT "t"
+ CASE 6 : ergebnis CAT "a"
+ END SELECT .
+
+END PROC gewaehlte modifikationen;
+
+PROC anweisung entfernen (TEXT CONST anw name, INT CONST beginn, ende,
+ BOOL VAR geloescht) :
+
+ geloescht := FALSE;
+ IF beginn > 0 AND ende > 0
+ CAND (ezeile SUB beginn) = "#" CAND (ezeile SUB ende) = "#" THEN
+ INT CONST vorkommen := pos (ezeile, anw name, beginn, ende);
+ IF vorkommen > 0 AND vorkommen < beginn + 4
+ OR up down anweisung THEN
+ change (ezeile, beginn, ende, "");
+ geloescht := TRUE
+ END IF
+ END IF .
+
+up down anweisung :
+ IF ende = beginn + 2 THEN
+ TEXT CONST alte anweisung := ezeile SUB beginn + 1;
+ IF anw name = "on" THEN
+ alte anweisung = "u" OR alte anweisung = "d"
+ ELSE
+ alte anweisung = "e"
+ END IF
+ ELSE
+ FALSE
+ END IF .
+
+END PROC anweisung entfernen;
+
+PROC textanweisung einfuegen (TEXT CONST anweisung, param,
+ BOOL CONST ab anfang) :
+
+ FILE VAR edfile := editfile;
+ IF ab anfang THEN col (edfile, 1) END IF;
+ INT CONST ce := col (edfile);
+ read record (edfile, ezeile);
+ IF (ezeile SUB ce) = "#" CAND gleiche anweisung THEN
+ anweisung ersetzen
+ ELIF ce = 1 THEN
+ neue zeile einfuegen
+ ELSE
+ an stelle einfuegen
+ END IF .
+
+gleiche anweisung :
+ INT CONST apos := pos (ezeile, anweisung, ce);
+ apos > 0 AND pos (ezeile, "#", ce + 1) > a pos AND
+ (param = "" OR pos (ezeile, "(", ce) > a pos) .
+
+anweisung ersetzen :
+ IF param <> "" THEN
+ INT CONST anf := pos (ezeile, "(", ce),
+ end := pos (ezeile, ")", anf);
+ IF anf > 0 AND end > 0 AND anf < end THEN
+ change (ezeile, anf + 1, end - 1, param);
+ write record (edfile, ezeile);
+ abschnitt neu (line no (edfile), line no(edfile))
+ END IF
+ END IF .
+
+neue zeile einfuegen :
+ insert record (edfile);
+ IF param <> "" THEN
+ write record (edfile, "#" + anweisung + "(" + param + ")# ")
+ ELSE
+ write record (edfile, "#" + anweisung + "# ")
+ END IF;
+ abschnitt neu (line no (edfile), 9999) .
+
+an stelle einfuegen :
+ IF param <> "" THEN
+ change (ezeile, ce, ce - 1, "#" + anweisung + "(" + param + ")#")
+ ELSE
+ change (ezeile, ce, ce - 1, "#" + anweisung + "#")
+ END IF;
+ write record (edfile, ezeile);
+ abschnitt neu (line no (edfile), line no (edfile)) .
+
+END PROC textanweisung einfuegen;
+
+LET
+ global anfang =
+ "#- Globale Einstellungen, nicht verschieben -# ",
+ global ende =
+ "#- Ende der globalen Einstellungen ----------# ";
+
+TEXT VAR
+ e type := "",
+ e limit := "16.0",
+ e x start := "2.5",
+ e y start := "2.25",
+ e pagelength := "25.0",
+ e linefeed := "1.0";
+
+PROC einstellung erfragen :
+
+ REP
+ schrifttyp auswaehlen (e type);
+ IF e type = "" CAND
+ eja ("Typ muß gewaehlt werden, Funktion abbrechen") THEN
+ errorstop ("")
+ END IF
+ UNTIL e type <> "" END REP;
+ eget ("Breite des Schreibfelds in cm:", e limit);
+ eget ("Länge des Schreibfelds in cm:", e pagelength);
+ eget ("Oberer Rand in cm:", e y start);
+ eget ("Linker Rand in cm:", e x start);
+ eget ("Zeilenabstand als relativer Faktor:", e linefeed)
+
+END PROC einstellung erfragen;
+
+PROC einstellung eintragen :
+
+ FILE VAR edfile := editfile;
+ INT VAR
+ zeile := line no (edfile),
+ spalte := col (edfile);
+ col (edfile, 1);
+ to line (edfile, 1);
+ read record (edfile, ezeile);
+ IF pos (ezeile, "type") > 0 THEN
+ down (edfile);
+ read record (edfile, ezeile);
+ alte einstellung suchen
+ END IF;
+ ab hier einfuegen;
+ an alte stelle .
+
+alte einstellung suchen :
+ IF ezeile = global anfang THEN
+ down (edfile, global ende);
+ IF eof (edfile) THEN
+ to line (edfile, 2)
+ ELSE
+ down (edfile)
+ END IF
+ END IF .
+
+ab hier einfuegen :
+ IF line no (edfile) > 1 CAND eja ("Alte Einstellung loeschen") THEN
+ INT CONST zu loeschen := line no (edfile) - 1;
+ to line (edfile, 1);
+ INT VAR i;
+ FOR i FROM 1 UPTO zu loeschen REP
+ delete record (edfile)
+ END REP;
+ zeile DECR zu loeschen
+ END IF;
+ typ und limit einfuegen;
+ global anfang einfuegen;
+ seitenlaenge einfuegen;
+ start einfuegen;
+ linefeed einfuegen;
+ global ende einfuegen .
+
+typ und limit einfuegen :
+ insert record (edfile);
+ write record (edfile,
+ "#type (""" + etype + """)##limit (" + e limit + ")# ");
+ down (edfile) .
+
+global anfang einfuegen :
+ insert record (edfile);
+ write record (edfile, global anfang);
+ down (edfile) .
+
+seitenlaenge einfuegen :
+ insert record (edfile);
+ write record (edfile, "#pagelength (" + e pagelength + ")# ");
+ down (edfile) .
+
+start einfuegen :
+ insert record (edfile);
+ write record (edfile,
+ "#start (" + e x start + ", " + e y start + ")# ");
+ down (edfile) .
+
+linefeed einfuegen :
+ insert record (edfile);
+ write record (edfile, "#linefeed (" + e linefeed + ")# ");
+ down (edfile) .
+
+global ende einfuegen :
+ insert record (edfile);
+ write record (edfile, global ende);
+ zeile INCR 6 .
+
+an alte stelle :
+ to line (edfile, zeile);
+ col (edfile, spalte) .
+
+END PROC einstellung eintragen;
+
+
+(* Editor im EUDAS-Fenster *)
+
+INT VAR return code;
+
+LET
+ edit status = #1003#
+"EDIT: Menü: ESC m, ESC t Abbruch: ESC h Verlassen: ESC q Hilfe: ESC ?";
+
+BOOL VAR status frei;
+
+
+PROC edit status anzeigen :
+ status anzeigen (edit status)
+END PROC edit status anzeigen;
+
+PROC edit (FILE VAR f, FENSTER CONST fenster, TEXT CONST hilfe) :
+
+ INT VAR x, y, x l, y l;
+ fenstergroesse (fenster, x, y, x l, y l);
+ fenster veraendert (fenster);
+ enable stop;
+ fenster datei := "";
+ IF groesster editor = 0 THEN status frei := y > 1 END IF;
+ REP
+ IF status frei THEN status anzeigen (edit status) END IF;
+ open editor (groesster editor + 1, f, TRUE, x, y, x l, y l);
+ edit (groesster editor, "eqvw19dpgn"9"?hFmt", PROC (TEXT CONST) kdo);
+ return code behandeln
+ END REP .
+
+return code behandeln :
+ SELECT return code OF
+ CASE 0 : LEAVE edit
+ CASE 1 : hilfe anbieten (hilfe, fenster)
+ CASE 2 : errorstop ("")
+ END SELECT .
+
+END PROC edit;
+
+PROC kdo (TEXT CONST zeichen) :
+
+ return code := pos ("q?h", zeichen);
+ IF return code > 0 THEN
+ return code DECR 1;
+ quit
+ ELIF zeichen = "m" THEN
+ edit menue;
+ IF status frei THEN status anzeigen (edit status) END IF;
+ ELIF zeichen = "t" THEN
+ text menue;
+ IF status frei THEN status anzeigen (edit status) END IF;
+ ELSE
+ std kommando interpreter (zeichen);
+ IF status frei THEN status anzeigen (edit status) END IF;
+ END IF
+
+END PROC kdo;
+
+
+END PACKET edit menue;
+(*
+FENSTER VAR fe; fenster initialisieren (fe);
+fenstergroesse setzen (fe, 1, 2, 79, 23);
+FILE VAR f := sequential file (modify, "testdatei");
+edit (f, fe, "EDIT/Allgemein")
+*)
+
diff --git a/app/flint/0.4/src/eudas.manager b/app/flint/0.4/src/eudas.manager
new file mode 100644
index 0000000..802a507
--- /dev/null
+++ b/app/flint/0.4/src/eudas.manager
@@ -0,0 +1,216 @@
+PACKET eudas manager (* Autor: Thomas Berlage *)
+ (* Stand: 20.01.88 *)
+ DEFINES
+
+ eudas manager,
+ setze partner,
+ abhaengige task,
+ end partner :
+
+
+LET
+ code dateien = 190,
+ code felder = 191,
+ code positioniere = 192,
+ code satz = 193,
+ end myself code = 197,
+ set controlled code = 198,
+ ask partner code = 200;
+
+LET
+ ack = 0;
+
+LET
+ COM = STRUCT (INT int info,
+ BOOL bool info,
+ TEXT text info,
+ SATZ satz info);
+
+BOUND COM VAR p;
+
+ROW 4 TEXT VAR partner vater;
+ partner vater (1) := "";
+ partner vater (2) := "";
+ partner vater (3) := "";
+ partner vater (4) := "";
+
+TEXT VAR puffer;
+
+LET
+ kein partner =
+ "Kein Partner";
+
+
+PROC setze partner (INT CONST nr, TEXT CONST name des vaters) :
+
+ partner vater (nr) := name des vaters
+
+END PROC setze partner;
+
+PROC eudas manager (DATASPACE VAR ds, INT CONST order, phase,
+ TASK CONST order task) :
+
+ enable stop;
+ SELECT order OF
+ CASE code dateien : code dateien ausfuehren
+ CASE code felder : code felder ausfuehren
+ CASE code positioniere : code positioniere ausfuehren
+ CASE code satz : code satz ausfuehren
+ OTHERWISE andere codes
+ END SELECT .
+
+andere codes :
+ IF order > ask partner code AND order < ask partner code + 4 THEN
+ ask partner code ausfuehren
+ ELSE
+ menue manager (ds, order, phase, order task)
+ END IF .
+
+code dateien ausfuehren :
+ p := ds;
+ p. int info := dateiversion;
+ dateinamen anlegen;
+ send (order task, ack, ds) .
+
+dateinamen anlegen :
+ satz initialisieren (p. satz info);
+ FOR i FROM 1 UPTO anzahl dateien REP
+ feld aendern (p. satz info, i, eudas dateiname (i))
+ END REP .
+
+code felder ausfuehren :
+ p := ds;
+ feldinfo anlegen;
+ feldnamen anlegen;
+ send (order task, ack, ds) .
+
+feldinfo anlegen :
+ INT VAR i;
+ TEXT VAR rep := " ";
+ p. text info := "";
+ FOR i FROM 1 UPTO anzahl felder REP
+ replace (rep, 1, feldinfo (i));
+ p. text info CAT rep
+ END REP .
+
+feldnamen anlegen :
+ satz initialisieren (p. satz info, anzahl felder);
+ FOR i FROM 1 UPTO anzahl felder REP
+ feldnamen lesen (i, puffer);
+ feld aendern (p. satz info, i, puffer)
+ END REP .
+
+code positioniere ausfuehren :
+ p := ds;
+ positionieren;
+ ergebnis ablegen;
+ send (order task, ack, ds) .
+
+positionieren :
+ IF p. bool info THEN
+ relativ positionieren
+ ELSE
+ auf satz (p. int info)
+ END IF .
+
+relativ positionieren :
+ IF p. int info > 0 THEN
+ weiter (p. int info)
+ ELIF p. int info < 0 THEN
+ zurueck (- p. int info)
+ END IF .
+
+ergebnis ablegen :
+ p. int info := satznummer;
+ p. bool info := dateiende .
+
+code satz ausfuehren :
+ p := ds;
+ p. int info := satzkombination;
+ p. bool info := satz ausgewaehlt;
+ satz aufbauen;
+ send (order task, ack, ds) .
+
+satz aufbauen :
+ satz initialisieren (p. satz info, anzahl felder);
+ FOR i FROM 1 UPTO anzahl felder REP
+ feld lesen (i, puffer);
+ feld aendern (p. satz info, i, puffer)
+ END REP .
+
+ask partner code ausfuehren :
+ INT VAR p nr := order - ask partner code;
+ forget (ds); ds := nilspace;
+ BOUND TASK VAR c task := ds;
+ CONCR (c task) := partner mit einrichten (p nr, task index);
+ send (order task, ack, ds) .
+
+task index :
+ FOR i FROM 2 UPTO 4 REP
+ IF partner task (i) = order task THEN
+ LEAVE task index WITH i
+ END IF
+ END REP;
+ errorstop (kein partner);
+ 1 .
+
+END PROC eudas manager;
+
+TASK PROC abhaengige task (INT CONST p nr) :
+
+ partner mit einrichten (p nr, 1)
+
+END PROC abhaengige task;
+
+TASK PROC partner mit einrichten (INT CONST p nr, p von) :
+
+ enable stop;
+ IF NOT exists (partner task (p nr)) THEN
+ partner einrichten
+ END IF;
+ partner task (p nr) .
+
+partner einrichten :
+ TEXT CONST neuer name := name (myself) + "-p" + text (p nr - 1);
+ begin (neuer name, partner vater (p nr));
+ partner task (p nr, task (neuer name));
+ abhaengig setzen .
+
+abhaengig setzen :
+ DATASPACE VAR send ds := nilspace;
+ BOUND STRUCT (INT von, TASK pt) VAR m := send ds;
+ m. von := p von;
+ m. pt := partner task (p von);
+ INT VAR i, reply;
+ FOR i FROM 1 UPTO 5 REP
+ pingpong (partner task (p nr), set controlled code, send ds, reply);
+ IF reply = -2 THEN pause (5) END IF
+ UNTIL reply <> -2 END REP;
+ forget (send ds) .
+
+END PROC partner mit einrichten;
+
+PROC end partner (INT CONST p nr) :
+
+ IF exists (partner task (p nr)) THEN
+ end code senden
+ END IF .
+
+end code senden :
+ DATASPACE VAR send ds := nilspace;
+ INT VAR i, reply;
+ FOR i FROM 1 UPTO 10 REP
+ send (partner task (p nr), end myself code, send ds, reply);
+ IF reply = ack THEN
+ LEAVE end code senden
+ END IF;
+ pause (3)
+ END REP;
+ forget (send ds);
+ errorstop ("END nicht angenommen") .
+
+END PROC end partner;
+
+
+END PACKET eudas manager;
+
diff --git a/app/flint/0.4/src/flint b/app/flint/0.4/src/flint
new file mode 100644
index 0000000..14e0fe1
--- /dev/null
+++ b/app/flint/0.4/src/flint
@@ -0,0 +1,808 @@
+PACKET flint
+
+(*************************************************************************)
+(* *)
+(* EUMEL Menue-Monitor *)
+(* *)
+(* Version 05 *)
+(* *)
+(* Autor: Thomas Berlage *)
+(* Stand: 16.10.88 *)
+(* *)
+(*************************************************************************)
+
+ DEFINES
+
+ flint :
+
+
+TEXT CONST flint vater := name (myself);
+
+setze partner (2, "KAKTUS");
+setze partner (3, "CHART");
+
+
+PROC flint :
+
+ page;
+ fenstergroessen bestimmen;
+ disable stop;
+ REP
+ menue anbieten (ROW 6 TEXT :
+ ("FLINT.Standard", "FLINT.Eigene", "FLINT.System",
+ "EUDAS.Dateien", "EUDAS.Archiv", ""),
+ fenster links, TRUE,
+ PROC (INT CONST, INT CONST) flint inter);
+ bereich wechseln
+ END REP
+
+END PROC flint;
+
+PROC fusszeile aktualisieren :
+
+ arbeitsbereich bestimmen;
+ fussteil (2, "", "")
+
+END PROC fusszeile aktualisieren;
+
+
+(*************************** FLINT Interpreter *****************************)
+
+LET
+ t datum = #1300#
+ ""15"Datum "14"",
+ kb von = #1301#
+ " KB von ",
+ sind belegt = #1302#
+ " KB sind belegt.",
+ p taskname = #1303#
+ "Name des Arbeitsbereichs:",
+ existiert nicht als task = #1304#
+ " ist kein Name eines Bereiches",
+ t loeschen = #1305#
+ " verlassen und löschen",
+ t speicher = #1306#
+ "Speicher:",
+ t cpu zeit = #1307#
+ " KB CPU-Zeit : ",
+ t zustand = #1308#
+ "Zustand : ",
+ t prio = #1309#
+ " Priorität: ",
+ t kanal = #1310#
+ " Kanal: ",
+ t busy = #1311#
+ "Arbeit",
+ t io = #1312#
+ "EinAus",
+ t wait = #1313#
+ "Warten",
+ t busy blocked = #1314#
+ "B(Arb)",
+ t io blocked = #1315#
+ "B(E/A)",
+ t wait blocked = #1316#
+ "B(Wrt)",
+ t dead = #1317#
+ ">>TOT<",
+ bereich neu einrichten = #1318#
+ "Bereich existiert nicht. Neu einrichten",
+ p name vater = #1319#
+ "Unter welchem Vaterbereich (RET -> FLINT):",
+ weitermachen in = #1320#
+ "Weitermachen in Bereich:",
+ task ganz abkoppeln = #1321#
+ "Eigenen Bereich ganz abkoppeln";
+
+TEXT VAR
+ wechsel taskname := "";
+
+SATZ VAR sammel;
+
+
+PROC flint inter (INT CONST menuenr, f nr) :
+
+ SELECT menuenr OF
+ CASE 0: sperren setzen
+ CASE 1: standard interpreter
+ CASE 2: eigene interpreter
+ CASE 3: system interpreter
+ CASE 4: dateiverwaltung (f nr)
+ CASE 5: archivverwaltung (menuenr, f nr)
+ END SELECT .
+
+sperren setzen :
+ fusszeile ("", "", 35, t datum, 64);
+ fussteil (3, date) .
+
+standard interpreter :
+ enable stop;
+ SELECT f nr OF
+ CASE 0 : fusszeile aktualisieren
+ CASE 1 : textverarbeitung
+ CASE 2 : eudas
+ CASE 3 : kaktus
+ CASE 4 : dgs superchart
+ CASE 5 : programme
+ CASE 6 : systemsteuerung
+ OTHERWISE ggf dialogfenster loeschen
+ END SELECT .
+
+kaktus :
+ continue (abhaengige task (2));
+ page; bildschirm neu .
+
+dgs superchart :
+ continue (abhaengige task (3));
+ page; bildschirm neu .
+
+systemsteuerung :
+ continue (task ("OP"));
+ page; bildschirm neu .
+
+ggf dialogfenster loeschen :
+ IF f nr = -1 THEN dialogfenster loeschen END IF .
+
+eigene interpreter :
+ enable stop;
+ SELECT f nr OF
+ CASE 0 : fusszeile aktualisieren
+ OTHERWISE ggf dialogfenster loeschen
+ END SELECT .
+
+system interpreter :
+ enable stop;
+ SELECT f nr OF
+ CASE 0 : fusszeile aktualisieren
+ CASE 1 : bereich wechseln
+ CASE 2 : bereichsuebersicht
+ CASE 3 : speicherbelegung
+ CASE 4 : eigener status
+ CASE 5 : fremder taskstatus
+ CASE 6 : task info (3); bildschirm neu; dialogfenster loeschen
+ CASE 7 : task loeschen
+ OTHERWISE ggf dialogfenster loeschen
+ END SELECT .
+
+bereichsuebersicht :
+ disable stop;
+ bitte warten;
+ DATASPACE VAR list ds := nilspace;
+ FILE VAR f := sequential file (output, list ds);
+ task info (1, f);
+ IF NOT is error THEN
+ edit (f, fenster rechts, "SHOW/Taskinfo", FALSE)
+ END IF;
+ forget (list ds);
+ enable stop .
+
+speicherbelegung :
+ INT VAR size, used;
+ storage (size, used);
+ size := int (real (size + 24) * 64.0 / 63.0);
+ IF l3 THEN
+ size := size DIV 1024;
+ used := used DIV 1024
+ END IF;
+ dialog (text (used) + kb von + text (size) + sind belegt) .
+
+eigener status :
+ task zustand (myself) .
+
+fremder taskstatus :
+ TEXT VAR taskname := "";
+ editget (p taskname, taskname, "GET/Taskname", "");
+ TASK VAR status task := task (task name);
+ IF exists (status task) THEN
+ task zustand (status task)
+ ELSE
+ errorstop (textdarstellung (taskname) + existiert nicht als task)
+ END IF .
+
+task loeschen :
+ IF ja (textdarstellung (name (myself)) + t loeschen,
+ "JA/Task loeschen", FALSE) THEN
+ end partner (2); end partner (3);
+ deferred end;
+ bereich wechseln
+ END IF .
+
+END PROC flint inter;
+
+PROC bereich wechseln :
+
+ enable stop;
+ editget (weitermachen in, wechsel taskname, "z", "GET/wtaskname");
+ IF subtext (wechsel taskname, 1, 2) = ""27"z" THEN
+ bereich auswaehlen
+ ELIF wechsel taskname <> "" THEN
+ ggf task einrichten
+ ELIF ganz abkoppeln THEN
+ continue (niltask)
+ END IF;
+ fenstergroessen bestimmen;
+ page;
+ bildschirm neu .
+
+bereich auswaehlen :
+ bitte warten;
+ alle tasknamen sammeln;
+ auswahl anbieten ("FLINT.Taskauswahl", fenster rechts, 1,
+ "AUSWAHL/Tasks", PROC (TEXT VAR, INT CONST) aus sammel);
+ IF wahl (1) <> 0 THEN
+ feld lesen (sammel, wahl (1), wechsel taskname);
+ continue (task (wechsel taskname))
+ END IF .
+
+alle tasknamen sammeln :
+ access catalogue;
+ satz initialisieren (sammel);
+ wechsel taskname := subtext (wechsel taskname, 3);
+ pattern feststellen;
+ IF exists task (flint vater) THEN
+ sammel tasks (task (flint vater), pattern)
+ ELSE
+ sammel tasks (father, pattern)
+ END IF .
+
+pattern feststellen :
+ TEXT VAR pattern;
+ IF pos (wechsel taskname, "*") = 0 THEN
+ pattern := ""
+ ELSE
+ pattern := wechsel taskname
+ END IF .
+
+ggf task einrichten :
+ IF NOT exists task (wechsel taskname) THEN
+ IF ja (bereich neu einrichten, "JA/task einrichten") THEN
+ vater erfragen;
+ begin (wechsel taskname, name vater);
+ continue (task (wechsel taskname))
+ END IF
+ ELSE
+ continue (task (wechsel taskname))
+ END IF .
+
+vater erfragen :
+ TEXT VAR name vater := "";
+ editget (p name vater, name vater, "", "GET/Vatertask");
+ IF name vater = "" THEN
+ name vater := flint vater
+ END IF .
+
+ganz abkoppeln :
+ ja (task ganz abkoppeln, "JA/abkoppeln") .
+
+END PROC bereich wechseln;
+
+PROC aus sammel (TEXT VAR inhalt, INT CONST pos) :
+
+ IF pos > 200 THEN
+ inhalt := ""
+ ELSE
+ feld lesen (sammel, pos, inhalt)
+ END IF
+
+END PROC aus sammel;
+
+PROC sammel tasks (TASK CONST vater, TEXT CONST pattern) :
+
+ TASK VAR naechste := son (vater);
+ WHILE NOT is niltask (naechste) REP
+ ggf task sammeln;
+ sammel tasks (naechste, pattern);
+ naechste := brother (naechste)
+ END REP .
+
+ggf task sammeln :
+ IF naechste = myself THEN
+ ELIF pattern = "" COR (name (naechste) LIKE pattern) THEN
+ feld aendern (sammel, felderzahl (sammel) + 1, name (naechste))
+ END IF .
+
+END PROC sammel tasks;
+
+PROC task zustand (TASK CONST status task) :
+
+ dialog (t speicher + speicher + t cpu zeit + cpu zeit);
+ out (t zustand); out status; out (t prio); out prio;
+ out (t kanal); out kanal .
+
+speicher :
+ text (storage (status task), 5) .
+
+cpu zeit :
+ disable stop;
+ TEXT VAR result := subtext (time (clock (status task), 12), 1, 10);
+ IF is error THEN
+ clear error; result := "**********"
+ END IF;
+ result .
+
+out status :
+ SELECT status (status task) OF
+ CASE 0 : out (t busy)
+ CASE 1 : out (t io)
+ CASE 2 : out (t wait)
+ CASE 4 : out (t busy blocked)
+ CASE 5 : out (t io blocked)
+ CASE 6 : out (t wait blocked)
+ OTHERWISE out (t dead)
+ END SELECT .
+
+out prio :
+ out (text (pcb (status task, 6))) .
+
+out kanal :
+ IF channel (status task) = 0 THEN
+ out (" -")
+ ELSE
+ out (text (channel (status task), 2))
+ END IF .
+
+END PROC task zustand;
+
+
+(**************************** Textverarbeitung ****************************)
+
+LET
+ t ausnahmen = #1400#
+ "Ausnahmen",
+ t druckertask = #1401#
+ "Name Druckertask: ",
+ task existiert nicht = #1402#
+ "Task existiert nicht",
+ t stationsnummer = #1403#
+ "Stationsnummer der Druckertask: ",
+ falsche stationsnummer = #1404#
+ "Falsche Stationsnummer",
+ t trennfaktor = #1405#
+ "Trennfaktor (4 bis 20): ",
+ t ersten kopf unterdruecken = #1406#
+ "Ersten Kopfteil unterdrücken",
+ t letzten fuss unterdruecken = #1407#
+ "Letzten Fußteil unterdrücken",
+ t fussabstand = #1408#
+ "Anzahl Leerzeilen vor Fußnoten (0 bis 9): ",
+ lineform manuell = #1409#
+ "Trennungen manuell bestimmen",
+ pageform manuell = #1410#
+ "Seitenaufteilung manuell bestimmen",
+ falscher trennfaktor = #1411#
+ "Falscher Trennfaktor (nur 4 bis 20)",
+ name fonttabelle = #1412#
+ "Name der Fonttabelle: ",
+ t neu einrichten = #1413#
+ " neu einrichten",
+ name der datei = #1414#
+ "Name der Datei: ";
+
+LET
+ font file typ = 3009;
+
+INT VAR
+ file typ := 1003;
+
+IF l3 THEN file typ := 1004 END IF .
+
+l3 : maxint DIV 2 > 17000 .
+;
+
+BOOL VAR
+ zeilen manuell := TRUE,
+ seiten manuell := TRUE;
+
+TEXT VAR
+ druckertask := "PRINTER";
+
+INT VAR
+ druckerstation := station (myself);
+
+
+PROC textverarbeitung :
+
+ page; bildschirm neu;
+ BOOL CONST alter umbruch := word wrap;
+ word wrap (TRUE);
+ menue anbieten (ROW 6 TEXT :
+ ("TEXTE.Erstellen", "TEXTE.Bearbeiten", "TEXTE.Einstellungen",
+ "EUDAS.Dateien", "EUDAS.Archiv", ""),
+ fenster links, TRUE,
+ PROC (INT CONST, INT CONST) text inter);
+ word wrap (alter umbruch);
+ page; bildschirm neu
+
+END PROC textverarbeitung;
+
+PROC text inter (INT CONST menuenr, f nr) :
+
+ SELECT menuenr OF
+ CASE 0: sperren setzen
+ CASE 1: erstellen interpreter
+ CASE 2: bearbeiten interpreter
+ CASE 3: einstellungen interpreter
+ CASE 4: dateiverwaltung (f nr)
+ CASE 5: archivverwaltung (menuenr, f nr)
+ END SELECT .
+
+sperren setzen :
+ fusszeile ("", "", 35, t datum, 64);
+ fussteil (3, date) .
+
+erstellen interpreter :
+ enable stop;
+ SELECT f nr OF
+ CASE 0 : fusszeile aktualisieren
+ CASE 1 : editieren
+ CASE 2 : drucken
+ CASE 3 : zeilen formatieren
+ CASE 4 : seiten formatieren
+ CASE 5 : automatik
+ OTHERWISE ggf dialogfenster loeschen
+ END SELECT .
+
+editieren :
+ ausfuehrung (PROC (TEXT CONST) editiere);
+ dialogfenster loeschen .
+
+drucken :
+ ausfuehrung (PROC (TEXT CONST) drucke) .
+
+zeilen formatieren :
+ bildschirm neu;
+ IF zeilen manuell THEN
+ ausfuehrung (PROC (TEXT CONST) lineform)
+ ELSE
+ ausfuehrung (PROC (TEXT CONST) autoform)
+ END IF;
+ dialogfenster loeschen .
+
+seiten formatieren :
+ bildschirm neu;
+ IF seiten manuell THEN
+ ausfuehrung (PROC (TEXT CONST) pageform)
+ ELSE
+ ausfuehrung (PROC (TEXT CONST) autopageform)
+ END IF;
+ dialogfenster loeschen .
+
+automatik :
+ zeilen manuell := ja (lineform manuell,
+ "JA/lineform manuell", zeilen manuell);
+ seiten manuell := ja (pageform manuell,
+ "JA/pageform manuell", seiten manuell) .
+
+ggf dialogfenster loeschen :
+ IF f nr = -1 THEN dialogfenster loeschen END IF .
+
+bearbeiten interpreter :
+ enable stop;
+ SELECT f nr OF
+ CASE 0 : fusszeile aktualisieren
+ CASE 1 : index anlegen
+ CASE 2 : outline anlegen
+ CASE 3 : file sortieren
+ CASE 4 : macros laden
+ CASE 5 : macros anzeigen
+ CASE 6 : ausnahmen erweitern
+ OTHERWISE ggf dialogfenster loeschen
+ END SELECT .
+
+index anlegen :
+ ausfuehrung (PROC (TEXT CONST) index);
+ bildschirm neu; dialogfenster loeschen .
+
+outline anlegen :
+ ausfuehrung (PROC (TEXT CONST) outline);
+ bildschirm neu; dialogfenster loeschen .
+
+file sortieren :
+ bitte warten;
+ ausfuehrung (PROC (TEXT CONST) sort) .
+
+macros laden :
+ page;
+ einzelausfuehrung (PROC (TEXT CONST) load macros);
+ bildschirm neu; dialogfenster loeschen .
+
+macros anzeigen :
+ bitte warten;
+ list macros;
+ bildschirm neu; dialogfenster loeschen .
+
+ausnahmen erweitern :
+ TEXT VAR zwischendatei := t ausnahmen;
+ WHILE exists (zwischendatei) REP zwischendatei CAT " " END REP;
+ create (zwischendatei);
+ bitte warten;
+ entlade ausnahmen (zwischendatei);
+ edit (zwischendatei);
+ bitte warten;
+ lade ausnahmen (zwischendatei);
+ forget (zwischendatei, quiet) .
+
+einstellungen interpreter :
+ enable stop;
+ SELECT f nr OF
+ CASE 0 : fusszeile aktualisieren
+ CASE 1 : fonttabelle laden
+ CASE 2 : fonts anzeigen
+ CASE 3 : druckertask verstellen
+ CASE 4 : trennfaktor einstellen
+ CASE 5 : briefmodus einstellen
+ CASE 6 : abstand fussnoten einstellen
+ OTHERWISE ggf dialogfenster loeschen
+ END SELECT .
+
+fonttabelle laden :
+ TASK VAR fonttask;
+ IF exists task ("configurator") THEN
+ fonttask := task ("configurator")
+ ELSE
+ fonttask := niltask
+ END IF;
+ ausfuehrung (name fonttabelle, TRUE, font file typ, fonttask,
+ PROC (TEXT CONST) font table) .
+
+fonts anzeigen :
+ bitte warten;
+ list fonts;
+ bildschirm neu; dialogfenster loeschen .
+
+druckertask verstellen :
+ editget (t druckertask, druckertask, "GET/Druckertask", "");
+ IF NOT exists task (druckertask) THEN
+ errorstop (task existiert nicht)
+ ELIF station (myself) <> 0 THEN
+ erfrage station
+ ELSE
+ druckerstation := station (myself)
+ END IF .
+
+erfrage station :
+ TEXT VAR st := text (druckerstation);
+ editget (t stationsnummer, st, "GET/Druckstation", "");
+ IF int (st) >= 0 AND last conversion ok THEN
+ druckerstation := int (st)
+ ELSE
+ errorstop (falsche stationsnummer)
+ END IF .
+
+trennfaktor einstellen :
+ TEXT VAR faktor := "";
+ editget (t trennfaktor, faktor, "GET/Trennfaktor", "");
+ IF faktor <> "" THEN
+ INT CONST fa := int (faktor);
+ IF fa < 4 OR fa > 20 THEN
+ errorstop (falscher trennfaktor);
+ ELSE
+ hyphenation width (fa)
+ END IF
+ END IF .
+
+briefmodus einstellen :
+ first head (NOT ja (t ersten kopf unterdruecken, "JA/firsthead", FALSE));
+ last bottom (NOT ja (t letzten fuss unterdruecken, "JA/lastbottom", FALSE)) .
+
+abstand fussnoten einstellen :
+ TEXT VAR anzahl := "";
+ editget (t fussabstand, anzahl, "GET/Fussabstand", "");
+ IF anzahl <> "" THEN
+ number empty lines before foot (int (anzahl))
+ END IF .
+
+END PROC text inter;
+
+PROC drucke (TEXT CONST dateiname) :
+
+ save (dateiname, druckerstation / druckertask)
+
+END PROC drucke;
+
+PROC editiere (TEXT CONST dateiname) :
+
+ IF exists (dateiname) COR neu einrichten THEN
+ IF NOT exists (dateiname) THEN vorher einrichten END IF;
+ FILE VAR f := sequential file (modify, dateiname);
+ edit (f, fenster ganz, "EDIT/Text")
+ END IF .
+
+neu einrichten :
+ ja (textdarstellung (dateiname) + t neu einrichten,
+ "JA/einrichten") .
+
+vorher einrichten :
+ FILE VAR dummy := sequential file (modify, dateiname) .
+
+END PROC editiere;
+
+PROC ausfuehrung (PROC (TEXT CONST) operation) :
+
+ ausfuehrung (name der datei, FALSE, file typ, PROC (TEXT CONST) operation)
+
+END PROC ausfuehrung;
+
+PROC einzelausfuehrung (PROC (TEXT CONST) operation) :
+
+ ausfuehrung (name der datei, TRUE, file typ, PROC (TEXT CONST) operation)
+
+END PROC einzelausfuehrung;
+
+
+(*************************** Programme ***********************************)
+
+LET
+ p name prozedur = #1500#
+ "Name der Prozedur:",
+ p name paket = #1501#
+ "Name des Pakets:",
+ t weiter mit taste = #1502#
+ "*** Weiter mit Taste ***";
+
+
+PROC programme :
+
+ page; bildschirm neu;
+ BOOL CONST alter umbruch := word wrap;
+ word wrap (FALSE);
+ menue anbieten (ROW 6 TEXT : ("ELAN.Erstellen", "ELAN.Permanent",
+ "EUDAS.Dateien", "EUDAS.Archiv", "", ""),
+ fenster links, TRUE,
+ PROC (INT CONST, INT CONST) prog interpreter);
+ word wrap (alter umbruch);
+ page; bildschirm neu
+
+END PROC programme;
+
+PROC prog interpreter (INT CONST menuenr, f nr) :
+
+ SELECT menuenr OF
+ CASE 0 : sperren setzen
+ CASE 1 : erstellen interpreter
+ CASE 2 : permanent interpreter
+ CASE 3 : dateiverwaltung (f nr)
+ CASE 4 : archivverwaltung (menuenr, f nr)
+ END SELECT .
+
+sperren setzen :
+ fusszeile ("", "", 35, t datum, 64);
+ fussteil (3, date) .
+
+erstellen interpreter :
+ enable stop;
+ SELECT f nr OF
+ CASE 0 : fusszeile aktualisieren
+ CASE 1 : editieren
+ CASE 2 : ausfuehren
+ CASE 3 : wiederholen
+ CASE 4 : drucken
+ CASE 5 : testinstallation
+ OTHERWISE ggf dialogfenster loeschen
+ END SELECT .
+
+ggf dialogfenster loeschen :
+ IF f nr = -1 THEN dialogfenster loeschen END IF .
+
+editieren :
+ ausfuehrung (PROC (TEXT CONST) editiere);
+ dialogfenster loeschen .
+
+drucken :
+ ausfuehrung (PROC (TEXT CONST) drucke) .
+
+ausfuehren :
+ ausfuehrung (PROC (TEXT CONST) page and run);
+ dialogfenster loeschen .
+
+wiederholen :
+ page;
+ bildschirm neu;
+ runagain;
+ warten auf antwort;
+ dialogfenster loeschen .
+
+testinstallation :
+ ausfuehrung (PROC (TEXT CONST) page check on insert);
+ dialogfenster loeschen .
+
+permanent interpreter :
+ SELECT f nr OF
+ CASE 0 : fusszeile aktualisieren
+ CASE 1 : installieren
+ CASE 2 : prozedurhilfe
+ CASE 3 : pakethilfe
+ CASE 4 : alle pakete
+ OTHERWISE ggf dialogfenster loeschen
+ END SELECT .
+
+installieren :
+ ausfuehrung (PROC (TEXT CONST) page check off insert);
+ dialogfenster loeschen .
+
+prozedurhilfe :
+ TEXT VAR prozedurname := "";
+ editget (p name prozedur, prozedurname, "", "GET/prozedurname");
+ IF prozedurname <> "" THEN
+ bildschirm neu;
+ bitte warten;
+ help (prozedurname);
+ dialogfenster loeschen
+ END IF .
+
+pakethilfe :
+ prozedurname := "";
+ editget (p name paket, prozedurname, "", "GET/paketname");
+ IF prozedurname <> "" THEN
+ bildschirm neu;
+ bitte warten;
+ bulletin (prozedurname);
+ dialogfenster loeschen
+ END IF .
+
+alle pakete :
+ bildschirm neu;
+ bitte warten;
+ packets;
+ dialogfenster loeschen .
+
+END PROC prog interpreter;
+
+PROC warten auf antwort :
+
+ TEXT VAR taste;
+ line; put (t weiter mit taste);
+ inchar (taste);
+ line
+
+END PROC warten auf antwort;
+
+PROC page and run (TEXT CONST dateiname) :
+
+ bildschirm neu;
+ page; bitte warten;
+ check on;
+ run (dateiname);
+ warten auf antwort
+
+END PROC page and run;
+
+PROC page check on insert (TEXT CONST dateiname) :
+
+ bildschirm neu;
+ page; bitte warten;
+ check on;
+ insert (dateiname);
+ warten auf antwort
+
+END PROC page check on insert;
+
+PROC page check off insert (TEXT CONST dateiname) :
+
+ bildschirm neu;
+ page; bitte warten;
+ check off;
+ insert (dateiname);
+ warten auf antwort
+
+END PROC page check off insert;
+
+
+END PACKET flint;
+
+PACKET flint monitor DEFINES
+
+ monitor :
+
+
+PROC monitor :
+
+ disable stop;
+ partner task (1, myself);
+ continue (niltask);
+ flint
+
+END PROC monitor;
+
+END PACKET flint monitor;
+
diff --git a/app/flint/0.4/src/flint.init b/app/flint/0.4/src/flint.init
new file mode 100644
index 0000000..a743f52
--- /dev/null
+++ b/app/flint/0.4/src/flint.init
@@ -0,0 +1,603 @@
+% MENUE "FLINT.Standard"
+% BILD
+Untermenüs
+Version 0.5
+-
+  Textverarb.
+-
+  Datenbank
+-
+  Kalkulation
+-
+  Grafiken
+-
+  ELAN
+-
+  Steuerung
+% FELD 1 "FLINT/1T" "tT"
+% FELD 2 "FLINT/1D" "dD"
+% FELD 3 "FLINT/1K" "kK"
+% FELD 4 "FLINT/1G" "gG"
+% FELD 5 "FLINT/1P" "eE"
+% FELD 6 "FLINT/1S" "sS"
+% ENDE
+% MENUE "FLINT.Eigene"
+% BILD
+Eigene Fkt.
+  
+
+  
+
+  
+
+  
+
+% FELD 1 "" "aA"
+% FELD 2 "" "bB"
+% FELD 3 "" "cC"
+% FELD 4 "" "dD"
+% ENDE
+% MENUE "FLINT.System"
+% BILD
+Arbeitsbereich
+  Wechseln
+-
+Übersicht
+  Bereiche
+  Speicher
+-
+Taskzustand
+  Eigene
+  Fremde
+  Alle
+-
+Eigene Task
+  Löschen
+% FELD 1 "FLINT/3W" "wW"
+% FELD 2 "FLINT/3B" "bB"
+% FELD 3 "FLINT/3S" "sS"
+% FELD 4 "FLINT/3E" "eE"
+% FELD 5 "FLINT/3F" "fF"
+% FELD 6 "FLINT/3A" "aA"
+% FELD 7 "FLINT/3L" "lL"
+% ENDE
+% MENUE "TEXTE.Erstellen"
+% BILD
+Textdatei
+  Eingeben
+  Drucken
+-
+Formatieren
+  Zeilenweise
+  Seitenweise
+  Automatik
+% FELD 1 "TEXTE/1E" "eE"
+% FELD 2 "TEXTE/1D" "dD"
+% FELD 3 "TEXTE/1Z" "zZ"
+% FELD 4 "TEXTE/1S" "sS"
+% FELD 5 "TEXTE/1A" "aA"
+% ENDE
+% MENUE "TEXTE.Bearbeiten"
+% BILD
+Extrahieren
+  Index
+  Gliederung
+-
+Textdatei
+  Sortieren
+-
+Makros
+  Laden
+  Anzeigen
+-
+Ausnahmen
+  Erweitern
+% FELD 1 "TEXTE/2I" "iI"
+% FELD 2 "TEXTE/2G" "gG"
+% FELD 3 "TEXTE/2S" "sS"
+% FELD 4 "TEXTE/2L" "lL"
+% FELD 5 "TEXTE/2A" "aA"
+% FELD 6 "TEXTE/2E" "eE"
+% ENDE
+% MENUE "TEXTE.Einstellungen"
+% BILD
+Schrifttypen
+  Typtabelle
+  Zeige Typen
+-
+  Drucker
+-
+Silbentrennung
+  Faktor
+-
+Kopf/Fuß
+  Briefmodus
+-
+Fußnoten
+  Abstand
+% FELD 1 "TEXTE/3T" "tT"
+% FELD 2 "TEXTE/3Z" "zZ"
+% FELD 3 "TEXTE/3D" "dD"
+% FELD 4 "TEXTE/3F" "fF"
+% FELD 5 "TEXTE/3B" "bB"
+% FELD 6 "TEXTE/3A" "aA"
+% ENDE
+% MENUE "ELAN.Erstellen"
+% BILD
+ELAN-Programm
+  Editieren
+  Ausführen
+  Wiederholen
+  Drucken
+  Installiern
+ testweise
+% FELD 1 "PROG/1E" "eE"
+% FELD 2 "PROG/1A" "aA"
+% FELD 3 "PROG/1W" "wW"
+% FELD 4 "PROG/1D" "dD"
+% FELD 5 "PROG/1T" "iI"
+% ENDE
+% MENUE "ELAN.Permanent"
+% BILD
+Programm
+  Installiern
+-
+Auskunft
+  Einzelproz.
+  GanzesPaket
+  Paketnamen
+% FELD 1 "PROG/2I" "iI"
+% FELD 2 "PROG/2P" "eE"
+% FELD 3 "PROG/2A" "gG"
+% FELD 4 "PROG/2N" "pP"
+% ENDE
+% MENUE "EDIT MENUE:"
+% BILD
+Zeile Springen auf Zeile nach Nummer
+Such Suchen nach Text
+Ersetze Text suchen und ersetzen
+WortMark Aktuelles Wort markieren
+MarkSatz Aktuellen Satz bis Ende markieren
+Kopiere Block kopieren oder einfügen (PUT, GET)
+Fenster Datei in Teilfenster eröffnen
+Breite Maximale Zeilenbreite (limit) einstellen
+Taste Tastenbelegung abfragen und ändern
+% FELD 1 "" "zZ"
+% FELD 2 "" "sS"
+% FELD 3 "" "eE"
+% FELD 4 "" "wW"
+% FELD 5 "" "mM"
+% FELD 6 "" "kK"
+% FELD 7 "" "fF"
+% FELD 8 "" "bB"
+% FELD 9 "" "tT"
+% ENDE
+% MENUE "TEXT MENUE:"
+% BILD
+Typ Schrifttyp einstellen (type)
+Modifikation Schriftart für markierten Bereich festlegen (on, off)
+Seite Neue Seite beginnen (page)
+Raum Zwischenraum freilassen (free)
+Einstellung Format für diese Datei einstellen
+Formatiere Markierten Abschnitt zeilenweise formatieren
+Drucke Markierten Abschnitt formatieren und drucken
+% FELD 1 "" "tT"
+% FELD 2 "" "mM"
+% FELD 3 "" "sS"
+% FELD 4 "" "rR"
+% FELD 5 "" "eE"
+% FELD 6 "" "fF"
+% FELD 7 "" "dD"
+% ENDE
+% AUSWAHL "FLINT.Taskauswahl"
+Bitte kreuzen Sie den gewünschten Bereich an.
+% ENDE
+% AUSWAHL "TEXT.Fontwahl"
+Bitte Typ auswählen und ankreuzen:
+% ENDE
+% AUSWAHL "TEXT.Modwahl"
+Art(en) ankreuzen:
+% ENDE
+% HILFE "FLINT/Allgemein"
+% SEITE 1 "EUDAS/Allgemein"
+% ENDE
+% HILFE "FLINT1/T"
+% SEITE 1
+Textverarbeitung
+-
+Aufruf der EUMEL-Textverarbeitung mit Menü.
+% SEITE 1 "FLINT/Allgemein"
+% ENDE
+% HILFE "FLINT/1D"
+% SEITE 1
+EUDAS
+-
+Aufruf des Datenverwaltungssystems EUDAS.
+% SEITE 1 "FLINT/Allgemein"
+% ENDE
+% HILFE "FLINT/1K"
+% SEITE 1
+KAKTUS
+-
+Aufruf der Tabellenkalkulation KAKTUS.
+% SEITE 1 "FLINT/Allgemein"
+% ENDE
+% HILFE "FLINT/1G"
+% SEITE 1
+dgs-CHART
+-
+Aufruf des Geschäftsgrafikprogramms dgs-Superchart.
+% SEITE 1 "FLINT/Allgemein"
+% ENDE
+% HILFE "FLINT/1P"
+% SEITE 1
+Programmerstellung
+-
+Aufruf eines Menüs zur Programmierung in ELAN.
+% SEITE 1 "FLINT/Allgemein"
+% ENDE
+% HILFE "FLINT/1S"
+% SEITE 1
+Systemsteuerung
+-
+Aufruf eines Menüs zur Systemsteuerung (Abschalten,
+Druckersteuerung, Konfiguration usw.).
+% SEITE 1 "FLINT/Allgemein"
+% ENDE
+% HILFE "FLINT/3B"
+% SEITE 1
+Übersicht Arbeitsbereiche
+-
+Verlassen der Übersicht mit ESC 'q'.
+% SEITE 1 "FLINT/Allgemein"
+% ENDE
+% HILFE "FLINT/3S"
+% SEITE 1
+Speicherbelegung
+-
+Anzeige des belegten Hintergrundspeichers.
+% SEITE 1 "FLINT/Allgemein"
+% ENDE
+% HILFE "FLINT/3E"
+% SEITE 1
+Eigener Taskzustand
+-
+Ausgabe des Zustands des eigenen Arbeitsbereichs.
+% SEITE 1 "FLINT/Allgemein"
+% ENDE
+% HILFE "FLINT/3F"
+% SEITE 1
+Fremder Taskzustand
+-
+Ausgabe des Zustandes eines anderen Arbeitsbereichs.
+% SEITE 1 "FLINT/Allgemein"
+% ENDE
+% HILFE "FLINT/3A"
+% SEITE 1
+Taskzustand aller Bereiche
+-
+Verlassen mit ESC 'q'.
+% SEITE 1 "FLINT/Allgemein"
+% ENDE
+% HILFE "TEXTE/Allgemein"
+% SEITE 1 "EUDAS/Allgemein"
+% ENDE
+% HILFE "TEXTE/1E"
+% SEITE 1
+Textdatei eingeben
+-
+Aufruf des Editors.
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "TEXTE/1D"
+% SEITE 1
+Textdatei drucken
+-
+Erstellte Datei ausdrucken lassen.
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "TEXTE/1Z"
+% SEITE 1
+Zeilenweise formatieren
+-
+Aufruf von 'lineform' oder 'autoform', je nach Einstellung.
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "TEXTE/1S"
+% SEITE 1
+Seitenweise formatieren
+-
+Aufruf von 'pageform' oder 'autopageform', je nach
+Einstellung.
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "TEXTE/1A"
+% SEITE 1
+Einstellen automatische Formatierung
+-
+Abfrage, ob Zeilen- bzw. Seitenformatierung automatisch oder
+interaktiv erfolgen sollen.
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "TEXTE/2I"
+% SEITE 1
+Index extrahieren
+-
+Aufruf von 'index'
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "TEXTE/2G"
+% SEITE 1
+Gliederung extrahieren
+-
+Aufruf von 'outline'
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "TEXTE/2S"
+% SEITE 1
+Textdatei sortieren
+-
+Aufruf von 'sort' bzw. 'lexsort'.
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "TEXTE/2L"
+% SEITE 1
+Makros laden
+-
+Aufruf von 'load macros'.
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "TEXTE/2A"
+% SEITE 1
+Makros anzeigen
+-
+Aufruf von 'list macros'
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "TEXTE/2E"
+% SEITE 1
+Ausnahmen erweitern
+-
+Anzeigen des Ausnahmelexikons für die Silbentrennung und
+Erfassung neuer Ausnahmen
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "TEXTE/3T"
+% SEITE 1
+Schrifttypentabelle einstellen
+-
+Einstellen der Schrifttyptabelle für den Drucker, mit dem
+der Text ausgedruckt werden soll.
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "TEXTE/3Z"
+% SEITE 1
+Schrifttypen zeigen
+-
+Anzeige der zur Verfügung stehenden Schriften.
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "TEXTE/3D"
+% SEITE 1
+Drucker einstellen
+-
+Einstellen der Druckertask, auf der ausgedruckt werden soll.
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "TEXTE/3F"
+% SEITE 1
+Trennfaktor Silbentrennung
+-
+Setzt 'hyphenation width'.
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "TEXTE/3B"
+% SEITE 1
+Briefmodus Kopf/Fußzeilen
+-
+Erfragt ob der erste Kopf und der letzte Fuß wie in einem
+Brief unterdrückt werden sollen.
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "TEXTE/3A"
+% SEITE 1
+Abstand Fußnoten
+-
+Setzt Anzahl Zeilen zwischen Text und Fußnoten.
+% SEITE 1 "TEXTE/Allgemein"
+% ENDE
+% HILFE "PROG/Allgemein"
+% SEITE 1 "EUDAS/Allgemein"
+% ENDE
+% HILFE "PROG/1E"
+% SEITE 1
+Programm editieren
+-
+Erstellen und Ändern im Editor.
+% SEITE 1 "PROG/Allgemein"
+% ENDE
+% HILFE "PROG/1A"
+% SEITE 1
+Programm ausführen
+-
+'run'
+% SEITE 1 "PROG/Allgemein"
+% ENDE
+% HILFE "PROG/1W"
+% SEITE 1
+Programmausführeung wiederholen
+-
+'runagain'
+% SEITE 1 "PROG/Allgemein"
+% ENDE
+% HILFE "PROG/1D"
+% SEITE 1
+Programm drucken
+-
+'print'
+% SEITE 1 "PROG/Allgemein"
+% ENDE
+% HILFE "PROG/1T"
+% SEITE 1
+Testinstallation
+-
+'insert' mit check on.
+% SEITE 1 "PROG/Allgemein"
+% ENDE
+% HILFE "PROG/2I"
+% SEITE 1
+Programm installieren
+-
+'insert' mit check off
+% SEITE 1 "PROG/Allgemein"
+% ENDE
+% HILFE "PROG/2P"
+% SEITE 1
+Übersicht Prozeduren
+-
+'help (TEXT)'
+% SEITE 1 "PROG/Allgemein"
+% ENDE
+% HILFE "PROG/2A"
+% SEITE 1
+Übersicht Paket
+-
+'bulletin (TEXT)'
+% SEITE 1 "PROG/Allgemein"
+% ENDE
+% HILFE "PROG/2N"
+% SEITE 1
+Übersicht Paketnamen
+-
+packets
+% SEITE 1 "PROG/Allgemein"
+% ENDE
+% HILFE "AUSWAHL/Tasks"
+% SEITE 1
+Auswahl der Arbeitsbereiche
+-
+Den Bereich ankreuzen, in dem forgefahren werden soll.
+% SEITE 1 "AUSWAHL/Allgemein"
+% ENDE
+% HILFE "GET/Taskname"
+% SEITE 1
+Name des Bereichs:
+-
+Namen des Bereichs eingeben, dessen Status abgefragt werden
+soll.
+% SEITE 1 "GET/Allgemein"
+% ENDE
+% HILFE "GET/wtaskname"
+% SEITE 1
+Name des Bereichs, in dem weitergemacht werden soll:
+-
+Existiert der Bereich noch nicht, wird er nach Anfrage
+eingerichtet.
+% SEITE 1 "GET/Allgemein"
+% ENDE
+% HILFE "GET/Vatertask"
+% SEITE 1
+Name des Vaterbereichs:
+-
+Jeder Bereich muß einen Vaterbereich haben, der angibt,
+welche Programme zur Verfügung stehen. Geben Sie keinen
+Namen an, wird FLINT als der allgemeine Vater genommen.
+% SEITE 1 "GET/Allgemein"
+% ENDE
+% HILFE "GET/Druckertask"
+% SEITE 1
+Name der Druckertask:
+-
+Ist normalerweise PRINTER. Die Station bei Netzbetrieb kann
+später eingegeben werden.
+% SEITE 1 "GET/Allgemein"
+% ENDE
+% HILFE "GET/Druckstation"
+% SEITE 1
+Stationsnummer der Druckertask:
+-
+Bei Netzbetrieb zum Drucken auf einem anderen Rechner.
+% SEITE 1 "GET/Allgemein"
+% ENDE
+% HILFE "GET/Trennfaktor"
+% SEITE 1
+Trennfaktor:
+-
+s. 'hyphenation width'
+% SEITE 1 "GET/Allgemein"
+% ENDE
+% HILFE "GET/Fussabstand"
+% SEITE 1
+Leerzeilen vor Fuß:
+-
+s. 'no empty lines before foot'
+% SEITE 1 "GET/Allgemein"
+% ENDE
+% HILFE "GET/prozedurname"
+% SEITE 1
+Name der Prozedur:
+-
+kann auch '*' enthalten.
+% SEITE 1 "GET/Allgemein"
+% ENDE
+% HILFE "GET/paketname"
+% SEITE 1
+Name des Paketes:
+-
+Angabe des Namens eines insertierten Pakets.
+% SEITE 1 "GET/Allgemein"
+% ENDE
+% HILFE "JA/Task loeschen"
+% SEITE 1
+Bereich verlassen und löschen ?
+-
+Bei Bejahen wird ein neuer Bereich erfragt und der jetzige
+Bereich nach dem Verlassen mit allen Dateien und Söhnen
+gelöscht.
+% SEITE 1 "JA/Allgemein"
+% ENDE
+% HILFE "JA/task einrichten"
+% SEITE 1
+Bereich neu einrichten ?
+-
+Bei Tippfehler oder Irrtum verneinen.
+% SEITE 1 "JA/Allgemein"
+% ENDE
+% HILFE "JA/abkoppeln"
+% SEITE 1
+Ganz abkoppeln ?
+-
+Bei Tippfehler oder Irrtum verneinen. Ansonsten weiter mit
+SV.
+% SEITE 1 "JA/Allgemein"
+% ENDE
+% HILFE "JA/lineform manuell"
+% SEITE 1
+Zeilen manuell formatieren ?
+-
+Bei Bejahen muß jede Trennung von Hand bestätigt werden.
+% SEITE 1 "JA/Allgemein"
+% ENDE
+% HILFE "JA/pageform manuell"
+% SEITE 1
+Seiten manuell formatieren ?
+-
+Bei Bejahen muß jede Seitentrennung von Hand bestätigt
+werden.
+% SEITE 1 "JA/Allgemein"
+% ENDE
+% HILFE "JA/firsthead"
+% SEITE 1
+Ersten Kopf unterdrücken ?
+-
+s. 'firsthead'
+% SEITE 1 "JA/Allgemein"
+% ENDE
+% HILFE "JA/lastbottom"
+% SEITE 1
+Letzten Fuß unterdrücken ?
+-
+s. 'last bottom'
+% SEITE 1 "JA/Allgemein"
+% ENDE
+
diff --git a/app/flint/0.4/src/flint.manager b/app/flint/0.4/src/flint.manager
new file mode 100644
index 0000000..610d70f
--- /dev/null
+++ b/app/flint/0.4/src/flint.manager
@@ -0,0 +1,16 @@
+PACKET flint manager (* Autor: Thomas Berlage *)
+ (* Stand: 15.01.88 *)
+ DEFINES
+
+ continue :
+
+
+PROC continue (TASK CONST t) :
+
+ continue (t,
+ PROC (DATASPACE VAR, INT CONST, INT CONST, TASK CONST) eudas manager)
+
+END PROC continue;
+
+END PACKET flint manager;
+
diff --git a/app/flint/0.4/src/isub.replace b/app/flint/0.4/src/isub.replace
new file mode 100644
index 0000000..3c48009
--- /dev/null
+++ b/app/flint/0.4/src/isub.replace
@@ -0,0 +1,19 @@
+PACKET isub replace DEFINES ISUB, replace :
+
+INT OP ISUB (TEXT CONST t, INT CONST i) :
+
+ INT CONST ii := i + i;
+ code (t SUB ii - 1) + 256 * code (t SUB ii)
+
+END OP ISUB;
+
+PROC replace (TEXT VAR t, INT CONST i, wert) :
+
+ INT CONST ii := i + i;
+ replace (t, ii - 1, code (wert MOD 256));
+ replace (t, ii, code (wert DIV 256 MOD 256))
+
+END PROC replace
+
+END PACKET isub replace;
+
diff --git a/app/flint/0.4/src/klartextbelegung b/app/flint/0.4/src/klartextbelegung
new file mode 100644
index 0000000..efe4b08
--- /dev/null
+++ b/app/flint/0.4/src/klartextbelegung
@@ -0,0 +1,304 @@
+(*************************************************************************)
+(* *)
+(* K L A R T E X T *)
+(* =============== *)
+(* *)
+(* Tastenbelegungen im Klartext fuer Steuertasten *)
+(* *)
+(* Autor: Thomas Berlage *)
+(* Stand: 27.04.88 *)
+(* Version 1.0 *)
+(* *)
+(* Zweck: Lernsequenzen koennen editiert werden, wobei fuer *)
+(* die Steuertasten symbolische Namen in spitzen *)
+(* Klammern verwendet werden. Folgende Namen sind *)
+(* zulaessig: *)
+(* *)
+(* <hop> <links> <rechts> <oben> <unten> <tab> *)
+(* <rubin> <rubout> <mark> <esc> *)
+(* *)
+(* Aufruf: *)
+(* PROC lernsequenz editieren (TEXT CONST taste) *)
+(* *)
+(**************************************************************************)
+PACKET case conversion (* Stand: 07.02.88 *)
+
+ DEFINES
+
+ to lowercase,
+ to uppercase :
+
+
+PROC to uppercase (TEXT VAR line) :
+
+ INT VAR p := 0;
+ REP
+ p := pos (line, "a", "z", p + 1);
+ IF p = 0 THEN LEAVE to uppercase END IF;
+ replace (line, p, code (code (line SUB p) - 32))
+ END REP
+
+END PROC to uppercase;
+
+PROC to lowercase (TEXT VAR line) :
+
+ INT VAR p := 0;
+ REP
+ p := pos (line, "A", "Z", p + 1);
+ IF p = 0 THEN LEAVE to lowercase END IF;
+ replace (line, p, code (code (line SUB p) + 32))
+ END REP
+
+END PROC to lowercase;
+
+END PACKET case conversion;
+
+PACKET klartextbelegung
+
+ DEFINES
+
+ sieben bit modus,
+ klartext,
+ kodierung :
+
+
+BOOL VAR sieben bit := TRUE;
+
+ROW 33 TEXT CONST tasten := ROW 33 TEXT : (
+ "nul", "hop", "rechts", "oben", "-(4)", "fkt1", "fkt2", "-(7)", "links",
+ "tab", "unten", "rubin", "rubout", "return", "fkt3", "fkt4", "mark",
+ "-(17)", "-(18)", "-(19)", "-(20)", "fkt5", "fkt6", "-(23)", "fkt7",
+ "fkt8", "fkt9", "esc", "fkt10", "fkt11", "fkt12", "fkt13", "blank");
+
+LET
+ separator anfang = "<",
+ separator ende = ">";
+
+TEXT VAR ergebnis;
+
+
+BOOL PROC sieben bit modus :
+
+ sieben bit
+
+END PROC sieben bit modus;
+
+PROC sieben bit modus (BOOL CONST modus) :
+
+ sieben bit := modus
+
+END PROC sieben bit modus;
+
+TEXT PROC klartext (TEXT CONST t) :
+
+ INT VAR i;
+ ergebnis := "";
+ FOR i FROM 1 UPTO length (t) REP
+ klartext eines zeichens bestimmen
+ END REP;
+ ergebnis .
+
+klartext eines zeichens bestimmen :
+ INT CONST c := code (t SUB i);
+ IF c < 33 THEN
+ ergebnis CAT separator anfang + tasten (c + 1) + separator ende
+ ELIF c >= 127 CAND sieben bit CAND kein umlaut THEN
+ ergebnis CAT separator anfang + text (c) + separator ende
+ ELSE
+ ergebnis CAT code (c)
+ END IF .
+
+kein umlaut :
+ pos (eumel sonderzeichen, code (c)) = 0 .
+
+eumel sonderzeichen :
+ ""214""215""216""217""218""219""220""221""222""223""251""252"" .
+
+END PROC klartext;
+
+TEXT PROC kodierung (TEXT CONST t) :
+
+ INT VAR
+ sep pos := pos (t, separator anfang),
+ sep ende := 0;
+
+ enable stop;
+ ergebnis := "";
+ WHILE sep pos > 0 REP
+ text vor separator uebernehmen;
+ separiertes zeichen behandeln;
+ sep pos := pos (t, separator anfang, sep ende)
+ END REP;
+ restliche zeichen uebernehmen;
+ ergebnis .
+
+text vor separator uebernehmen :
+ ergebnis CAT subtext (t, sep ende + 1, sep pos - 1) .
+
+separiertes zeichen behandeln :
+ sep ende := pos (t, separator ende, sep pos);
+ IF sep ende = 0 THEN
+ errorstop ("""" + separator ende + """ fehlt.")
+ ELSE
+ separiertes zeichen kodieren
+ END IF .
+
+separiertes zeichen kodieren :
+ TEXT VAR bezeichnung := subtext (t, sep pos + 1, sep ende - 1);
+ change all (bezeichnung, " ", "");
+ to lowercase (bezeichnung);
+ INT VAR c := int (bezeichnung);
+ IF keine zahl THEN
+ mit tabelle vergleichen
+ END IF;
+ ergebnis CAT code (c) .
+
+keine zahl :
+ NOT last conversion ok .
+
+mit tabelle vergleichen :
+ INT VAR i;
+ FOR i FROM 1 UPTO 33 REP
+ IF bezeichnung = tasten (i) THEN
+ c := i - 1;
+ LEAVE mit tabelle vergleichen
+ END IF
+ END REP;
+ errorstop ("unbekannte Tastenbezeichnung: """ + bezeichnung + """") .
+
+restliche zeichen uebernehmen :
+ ergebnis CAT subtext (t, sep ende + 1) .
+
+END PROC kodierung;
+
+END PACKET klartextbelegung;
+
+PACKET klartext anwendung
+
+ DEFINES
+
+ klartext auf taste,
+ klartext auf taste legen,
+ klartext aus file,
+ klartext in file,
+ lernsequenz editieren :
+
+
+LET
+ separator anfang = "<",
+ separator ende = ">";
+
+TEXT VAR
+ zeile,
+ sequenz,
+ aenderung;
+
+DATASPACE VAR
+ ds;
+
+
+TEXT PROC klartext auf taste (TEXT CONST taste) :
+
+ klartext (lernsequenz auf taste (kodierung (taste)))
+
+END PROC klartext auf taste;
+
+PROC klartext auf taste legen (TEXT CONST taste, belegung) :
+
+ lernsequenz auf taste legen (kodierung (taste), kodierung (belegung))
+
+END PROC klartext auf taste legen;
+
+PROC klartext in file (FILE VAR f, TEXT CONST belegung) :
+
+ INT VAR
+ ende,
+ anfang := 1;
+
+ output (f);
+ zeile := klartext (belegung);
+ REP
+ ende der zeile bestimmen;
+ putline (f, subtext (zeile, anfang, ende - 1));
+ anfang := ende
+ UNTIL anfang > length (zeile) END REP .
+
+ende der zeile bestimmen :
+ TEXT CONST zeichen := subtext (zeile, anfang, anfang + 4);
+ IF zeichen = "<hop>" OR zeichen = "<esc>" THEN
+ ende := pos (zeile, separator anfang, anfang + 6)
+ ELSE
+ ende := pos (zeile, separator anfang, anfang + 1)
+ END IF;
+ IF ende = 0 THEN ende := length (zeile) + 1 END IF;
+ ende := min (anfang + maxlinelength (f), ende) .
+(*
+ IF (ende - anfang) > maxlinelength (f) THEN
+ ende := anfang + maxlinelength (f)
+ ELIF ende > 5 THEN
+ letzten separator bestimmen
+ END IF .
+
+letzten separator bestimmen :
+ TEXT CONST zeichen := subtext (zeile, ende - 4, ende - 2);
+ IF zeichen = "esc" OR zeichen = "hop" THEN
+ ende verschieben
+ ELSE
+ ende := pos (zeile, separator ende, ende)
+ END IF .
+
+ende verschieben :
+ IF (zeile SUB ende + 5) = separator anfang THEN
+ ende := pos (zeile, separator ende, ende + 5);
+ IF ende = 0 THEN ende := length (zeile) END IF
+ ELSE
+ ende := ende + 5
+ END IF .
+ *)
+END PROC klartext in file;
+
+PROC klartext aus file (FILE VAR f, TEXT VAR belegung) :
+
+ input (f);
+ belegung := "";
+ WHILE NOT eof (f) REP
+ getline (f, zeile);
+ IF (zeile SUB LENGTH zeile) = " " THEN
+ zeile := subtext (zeile, 1, length (zeile) - 1)
+ END IF;
+ belegung CAT kodierung (zeile)
+ END REP .
+
+END PROC klartext aus file;
+
+PROC lernsequenz editieren (TEXT CONST taste) :
+
+ disable stop;
+ ds := nilspace;
+ editieren (taste);
+ forget (ds)
+
+END PROC lernsequenz editieren;
+
+PROC editieren (TEXT CONST taste) :
+
+ enable stop;
+ FILE VAR f := sequential file (output, ds);
+ sequenz := lernsequenz auf taste (taste);
+ klartext in file (f, sequenz);
+ headline (f, "Tastenbelegung");
+ edit (f);
+ klartext aus file (f, aenderung);
+ IF aenderung <> sequenz CAND wirklich aendern THEN
+ lernsequenz auf taste legen (taste, aenderung)
+ END IF .
+
+wirklich aendern :
+ yes ("Lernsequenz aendern") .
+
+END PROC editieren;
+
+END PACKET klartext anwendung;
+
+
+
diff --git a/app/flint/0.4/src/offline.1 b/app/flint/0.4/src/offline.1
new file mode 100644
index 0000000..0e3e097
--- /dev/null
+++ b/app/flint/0.4/src/offline.1
@@ -0,0 +1,5 @@
+PACKETofflinemanagerDEFINESbegin,deferredend,owntaskpassword,continuedfrom,continue,partnertask:LETb0=0,c0=1,d0=2,e0=5,f0=6,g0=4,h0=9,i0=100,j0=199;LETk0="Taskname ungültig",l0="Vater antwortet nicht",m0="Zieltask kann nicht direkt angekoppelt werden",n0="Passwort:",o0="Falsches Passwort",p0="Ankoppeln nur für Partnertasks",q0="Nur Partner können angekoppelt werden";BOOL VARr0:=FALSE,s0:=FALSE;TEXT VARt0:="";DATASPACE VARu0:=nilspace;INT VARv0,w0,x0,y0,z0;BOUND TEXT VARa1;BOUND STRUCT(TEXTb1,c1,TASKtask,PROCAd1)VARe1;TASK VARf1,g1:=niltask;ROW4TASK VARh1;INITFLAG VARi1;PROCbegin(TEXT CONSTj1,k1):enablestop;l1;IFj1="-"THENerrorstop(k0)END IF;m1;IFv0=h0THENe1:=u0;n1;call(task(k1),g0,u0,v0)END IF;IFv0=b0THEN TASK CONSTo1:=task(j1);forget(u0);p1ELIFv0=d0THENa1:=u0;disablestop;errorstop(CONCR(a1));forget(u0)ELSEforget(u0)END IF.m1:INT VARq1;forget(u0);u0:=nilspace;e1:=u0;CONCR(e1).b1:=j1;CONCR(e1).c1:="";FORq1FROM1UPTO5REPpingpong(task(k1),g0,u0,v0);IFv0=-2THENpause(5)END IF UNTILv0<>-2END
+REP;IFv0=-2THENerrorstop(l0)END IF.n1:dialog(n0);getsecretline(CONCR(e1).c1);covertracks.p1:WHILEstatus(o1)<>2REPpause(10)END REP.END PROCbegin;PROCdeferredend:s0:=TRUE END PROCdeferredend;PROCowntaskpassword(TEXT CONSTword):t0:=length(t0)*" ";t0:=word;covertracksEND PROCowntaskpassword;TASK PROCcontinuedfrom:g1END PROCcontinuedfrom;PROCr1(TASK CONSTs1,PROC(DATASPACE VAR,INT CONST,INT CONST,TASK CONST)t1):enablestop;IFisniltask(s1)THENbreak;disablestopELSEu1END IF;v1;WHILE NOTonlineREPw1;x1;y1END REP;z1.u1:INT CONSTa2:=channel;b2;break(quiet);c2.b2:INT VARq1;forget(u0);u0:=nilspace;FORq1FROM1UPTO5REPpingpong(s1,j0,u0,v0);IFv0=-2THENpause(5)END IF UNTILv0<>-2END REP;d2;IFv0=f0THENe2ELIFv0=b0THENf2ELSEerrorstop(m0)END IF.d2:forget(u0);u0:=nilspace;a1:=u0.e2:dialog(n0);getsecretline(CONCR(a1));covertracks.f2:CONCR(a1):="".c2:FORq1FROM1UPTO5REPpingpong(s1,i0+a2,u0,v0);IFv0=-2THENpause(5)END IF UNTILv0<>-2END REP;disablestop;forget(u0);IFv0<>b0THENcontinue(a2)END IF.v1:IFs0OR(r0CAND NOT
+exists(h1(1)))THENend(myself)END IF.w1:TEXT VARg2;IFiserrorTHENg2:=errormessage;clearerrorELSEg2:=""END IF.x1:setautonom;commanddialogue(FALSE);INT VARh2:=heapsize;g1:=niltask.y1:DATASPACE VARi2:=nilspace;REPwait(i2,w0,f1);IFw0<>e0THENj2;k2ELIFf1=g1THENl2;t1(i2,w0,z0,f1)ELSEm2END IF;n2;o2END REP.j2:z0:=1;y0:=w0;g1:=f1.l2:z0INCR1;w0:=y0.m2:forget(i2);i2:=nilspace;send(f1,c0,i2).n2:IFiserrorTHENforget(i2);i2:=nilspace;a1:=i2;CONCR(a1):=errormessage;clearerror;send(f1,d0,i2)END IF.o2:IFheapsize>h2+8THENcollectheapgarbage;h2:=heapsizeEND IF.k2:IFw0=j0THENp2ELIFw0>i0ANDw0<i0+16THENq2ELSEt1(i2,w0,z0,f1)END IF.p2:IFr2THENsend(f1,f0,i2)ELSEsend(f1,b0,i2)END IF.r2:t0<>"".q2:s2;t2;call(supervisor,w0,i2,v0);IF NOT(f1=supervisor)THENsend(f1,v0,i2)END IF;IFv0=b0THENforget(i2);LEAVEy1END IF.s2:IFr0CAND NOTu2(f1)ORx0>0CANDw0-i0<>x0THENerrorstop(p0);LEAVEq2END IF.t2:IF NOT(f1=supervisor)THENa1:=i2;IF CONCR(a1)<>t0THENerrorstop(o0);LEAVEq2END IF END IF.z1:IFg2<>""THENerrorstop(g2)END IF;commanddialogue
+(TRUE).END PROCr1;PROCcontinue(TASK CONSTs1,PROC(DATASPACE VAR,INT CONST,INT CONST,TASK CONST)t1):enablestop;l1;x0:=0;IFs1=myselfTHEN ELIFr0THEN IF NOTu2(s1)THENerrorstop(q0)END IF ELIFu2(s1)THENx0:=channelEND IF;r1(s1,PROC(DATASPACE VAR,INT CONST,INT CONST,TASK CONST)t1)END PROCcontinue;BOOL PROCu2(TASK CONSTs1):NOTisniltask(s1)CAND(s1=h1(1)ORs1=h1(2)ORs1=h1(3)ORs1=h1(4))END PROCu2;TASK PROCpartnertask(INT CONSTindex):l1;h1(index)END PROCpartnertask;PROCpartnertask(INT CONSTindex,TASK CONSTs1):l1;h1(index):=s1;IFindex=1CAND NOT(s1=myself)THENr0:=TRUE END IF END PROCpartnertask;PROCl1:IF NOTinitialized(i1)THENv2END IF.v2:h1(1):=niltask;h1(2):=niltask;h1(3):=niltask;h1(4):=niltask.END PROCl1;END PACKETofflinemanager;
+
diff --git a/app/flint/0.4/src/offline.manager b/app/flint/0.4/src/offline.manager
new file mode 100644
index 0000000..7f97421
--- /dev/null
+++ b/app/flint/0.4/src/offline.manager
@@ -0,0 +1,383 @@
+PACKET offline manager (* Autor: Thomas Berlage *)
+ (* Stand: 20.01.88 *)
+ DEFINES
+
+ begin,
+ deferred end,
+ own task password,
+ continued from,
+ continue,
+ partner task :
+
+
+LET
+ ack = 0,
+ nak = 1,
+ error nak = 2,
+ second phase ack = 5,
+ password ack = 6,
+
+ begin code = 4,
+ password code = 9,
+
+ continue code = 100,
+ ask for password code = 199;
+
+LET
+ taskname invalid =
+ "Taskname ungültig",
+ task not ready =
+ "Vater antwortet nicht",
+ direct continue impossible =
+ "Zieltask kann nicht direkt angekoppelt werden",
+ t password =
+ "Passwort:",
+ t wrong password =
+ "Falsches Passwort",
+ order task no partner =
+ "Ankoppeln nur für Partnertasks",
+ continue not partner =
+ "Nur Partner können angekoppelt werden";
+
+
+BOOL VAR
+ controlled mode := FALSE,
+ end myself := FALSE;
+
+TEXT VAR
+ own password := "";
+
+DATASPACE VAR ds := nilspace;
+
+INT VAR
+ reply,
+ order,
+ control channel,
+ last order,
+ phase number;
+
+BOUND TEXT VAR reply message;
+
+BOUND STRUCT (TEXT tname, tpass, TASK task, PROCA start proc) VAR sv msg;
+
+TASK VAR
+ order task,
+ last order task := niltask;
+
+ROW 4 TASK VAR pt;
+
+INITFLAG VAR pt init;
+
+
+
+PROC begin (TEXT CONST task name, father name) :
+
+ enable stop;
+ init partner;
+ IF task name = "-" THEN
+ errorstop (taskname invalid)
+ END IF;
+ call begin code;
+ IF reply = password code THEN
+ sv msg := ds;
+ get password;
+ call (task (father name), begin code, ds, reply)
+ END IF;
+ IF reply = ack THEN
+ TASK CONST new task := task (task name);
+ forget (ds);
+ wait for init
+ ELIF reply = error nak THEN
+ reply message := ds;
+ disable stop;
+ errorstop (CONCR (reply message));
+ forget (ds)
+ ELSE
+ forget (ds)
+ END IF .
+
+call begin code :
+ INT VAR i;
+ forget (ds); ds := nilspace;
+ sv msg := ds;
+ CONCR (sv msg). tname := task name;
+ CONCR (sv msg). tpass := "";
+ FOR i FROM 1 UPTO 5 REP
+ pingpong (task (father name), begin code, ds, reply);
+ IF reply = -2 THEN pause (5) END IF
+ UNTIL reply <> -2 END REP;
+ IF reply = -2 THEN
+ errorstop (task not ready)
+ END IF .
+
+get password :
+ dialog (t password);
+ get secret line (CONCR (sv msg). tpass);
+ cover tracks .
+
+wait for init :
+ WHILE status (new task) <> 2 REP pause (10) END REP .
+
+END PROC begin;
+
+PROC deferred end :
+
+ end myself := TRUE
+
+END PROC deferred end;
+
+PROC own task password (TEXT CONST word) :
+
+ own password := length (own password) * " ";
+ own password := word;
+ cover tracks
+
+END PROC own task password;
+
+TASK PROC continued from :
+
+ last order task
+
+END PROC continued from;
+
+PROC i continue (TASK CONST t,
+ PROC (DATASPACE VAR, INT CONST, INT CONST, TASK CONST) manager) :
+
+ enable stop;
+ IF is niltask (t) THEN
+ break;
+ disable stop
+ ELSE
+ ask for continue
+ END IF;
+ end if required;
+ WHILE NOT online REP
+ remember error message;
+ prepare manager;
+ wait for order
+ END REP;
+ repeat error message .
+
+ask for continue :
+ INT CONST my channel := channel;
+ ask if password required;
+ break (quiet);
+ send continue request .
+
+ask if password required :
+ INT VAR i;
+ forget (ds); ds := nilspace;
+ FOR i FROM 1 UPTO 5 REP
+ pingpong (t, ask for password code, ds, reply);
+ IF reply = -2 THEN pause (5) END IF
+ UNTIL reply <> -2 END REP;
+ init password ds;
+ IF reply = password ack THEN
+ get password from user
+ ELIF reply = ack THEN
+ set password empty
+ ELSE
+ errorstop (direct continue impossible)
+ END IF .
+
+init password ds :
+ forget (ds);
+ ds := nilspace;
+ reply message := ds .
+
+get password from user :
+ dialog (t password);
+ get secret line (CONCR (reply message));
+ cover tracks .
+
+set password empty :
+ CONCR (reply message) := "" .
+
+send continue request :
+ FOR i FROM 1 UPTO 5 REP
+ pingpong (t, continue code + my channel, ds, reply);
+ IF reply = -2 THEN pause (5) END IF
+ UNTIL reply <> -2 END REP;
+ disable stop;
+ forget (ds);
+ IF reply <> ack THEN
+ continue (my channel)
+ END IF .
+
+end if required :
+ IF end myself OR (controlled mode CAND NOT exists (pt (1))) THEN
+ end (myself)
+ END IF .
+
+remember error message :
+ TEXT VAR stored error;
+ IF is error THEN
+ stored error := error message;
+ clear error
+ ELSE
+ stored error := ""
+ END IF .
+
+prepare manager :
+ set autonom;
+ command dialogue (FALSE);
+ INT VAR old heap size := heap size;
+ last order task := niltask .
+
+wait for order :
+ DATASPACE VAR local ds := nilspace;
+ REP
+ wait (local ds, order, order task);
+ IF order <> second phase ack THEN
+ prepare first phase;
+ manager with end check
+ ELIF order task = last order task THEN
+ prepare second phase;
+ manager (local ds, order, phase number, order task)
+ ELSE
+ send nak
+ END IF;
+ send error if necessary;
+ collect heap garbage if necessary
+ END REP .
+
+prepare first phase :
+ phase number := 1;
+ last order := order;
+ last order task := order task .
+
+prepare second phase :
+ phase number INCR 1;
+ order := last order .
+
+send nak :
+ forget (local ds);
+ local ds := nilspace;
+ send (order task, nak, local ds) .
+
+send error if necessary :
+ IF is error THEN
+ forget (local ds);
+ local ds := nilspace;
+ reply message := local ds;
+ CONCR (reply message) := error message;
+ clear error;
+ send (order task, error nak, local ds)
+ END IF .
+
+collect heap garbage if necessary :
+ IF heap size > old heap size + 8 THEN
+ collect heap garbage;
+ old heap size := heap size
+ END IF .
+
+manager with end check :
+ IF order = ask for password code THEN
+ answer if password required
+ ELIF order > continue code AND order < continue code + 16 THEN
+ try continue channel
+ ELSE
+ manager (local ds, order, phase number, order task)
+ END IF .
+
+answer if password required :
+ IF password required THEN
+ send (order task, password ack, local ds)
+ ELSE
+ send (order task, ack, local ds)
+ END IF .
+
+password required :
+ own password <> "" .
+
+try continue channel :
+ check control;
+ check password;
+ call (supervisor, order, local ds, reply);
+ IF NOT (order task = supervisor) THEN
+ send (order task, reply, local ds)
+ END IF;
+ IF reply = ack THEN
+ forget (local ds);
+ LEAVE wait for order
+ END IF .
+
+check control :
+ IF controlled mode CAND NOT is partner (order task) OR
+ control channel > 0 CAND order - continue code <> control channel THEN
+ errorstop (order task no partner);
+ LEAVE try continue channel
+ END IF .
+
+check password :
+ IF NOT (order task = supervisor) THEN
+ reply message := local ds;
+ IF CONCR (reply message) <> own password THEN
+ errorstop (t wrong password);
+ LEAVE try continue channel
+ END IF
+ END IF .
+
+repeat error message :
+ IF stored error <> "" THEN errorstop (stored error) END IF;
+ command dialogue (TRUE) .
+
+END PROC i continue;
+
+PROC continue (TASK CONST t,
+ PROC (DATASPACE VAR, INT CONST, INT CONST, TASK CONST) manager) :
+
+ enable stop;
+ init partner;
+ control channel := 0;
+ IF t = myself THEN
+ (* do nothing *)
+ ELIF controlled mode THEN
+ IF NOT is partner (t) THEN errorstop (continue not partner) END IF
+ ELIF is partner (t) THEN
+ control channel := channel
+ END IF;
+ i continue (t,
+ PROC (DATASPACE VAR, INT CONST, INT CONST, TASK CONST) manager)
+
+END PROC continue;
+
+BOOL PROC is partner (TASK CONST t) :
+
+ NOT is niltask (t) CAND
+ (t = pt (1) OR t = pt (2) OR t = pt (3) OR t = pt (4))
+
+END PROC is partner;
+
+TASK PROC partner task (INT CONST index) :
+
+ init partner;
+ pt (index)
+
+END PROC partner task;
+
+PROC partner task (INT CONST index, TASK CONST t) :
+
+ init partner;
+ pt (index) := t;
+ IF index = 1 CAND NOT (t = myself) THEN
+ controlled mode := TRUE
+ END IF
+
+END PROC partner task;
+
+PROC init partner :
+
+ IF NOT initialized (pt init) THEN
+ do init
+ END IF .
+
+do init :
+ pt (1) := niltask; pt (2) := niltask;
+ pt (3) := niltask; pt (4) := niltask .
+
+END PROC init partner;
+
+
+END PACKET offline manager;
+
diff --git a/app/flint/0.4/src/operator b/app/flint/0.4/src/operator
new file mode 100644
index 0000000..029b32c
--- /dev/null
+++ b/app/flint/0.4/src/operator
@@ -0,0 +1,381 @@
+PACKET operator DEFINES (* Autor: Thomas Berlage *)
+ (* Stand: 15.01.88 *)
+ operator :
+
+
+
+LET
+ p neuer taskname = #2001#
+ "Weitermachen in Bereich:",
+ p name vater = #2002#
+ "Unter welchem Vater:",
+ t bereich = #2003#
+ ""15"Bereich "14"",
+ t datum = #2004#
+ ""15"Datum "14"",
+ f ganz abkoppeln = #2005#
+ "Arbeitsbereich ganz abkoppeln",
+ f arbeitsbereich neu einrichten = #2006#
+ "Arbeitsbereich existiert nicht. Neu einrichten",
+ f trotzdem abschalten = #2007#
+ "Nicht auf Terminal 1. Trotzdem abschalten",
+ kb von = #2008#
+ " KB von ",
+ sind belegt = #2009#
+ " KB sind belegt.",
+ p taskname = #2010#
+ "Name des Arbeitsbereichs:",
+ existiert nicht als task = #2011#
+ " ist kein Name eines Bereiches",
+ t loeschen = #2012#
+ " löschen",
+ t speicher = #2013#
+ "Speicher:",
+ t cpu zeit = #2014#
+ " KB CPU-Zeit : ",
+ t zustand = #2015#
+ "Zustand : ",
+ t prio = #2016#
+ " Priorität: ",
+ t kanal = #2017#
+ " Kanal: ",
+ t busy = #2018#
+ "Arbeit",
+ t io = #2019#
+ "EinAus",
+ t wait = #2020#
+ "Warten",
+ t busy blocked = #2021#
+ "B(Arb)",
+ t io blocked = #2022#
+ "B(E/A)",
+ t wait blocked = #2023#
+ "B(Wrt)",
+ t dead = #2024#
+ ">>TOT<",
+ t gestoppt = #2025#
+ "Druckertreiber gestoppt.",
+ t gestartet = #2026#
+ "Druckertreiber gestartet.",
+ t angehalten = #2027#
+ "Druckertreiber angehalten.",
+ f auf anhalten warten = #2028#
+ "Auf Anhalten des Treibers warten",
+ t drucker = #2029#
+ ""15"Drucker "14"",
+ p neuer printer = #2030#
+ "Welche Druckertask soll eingestellt werden:",
+ t bitte warten = #2031#
+ "Bitte warten .. ";
+
+
+FENSTER VAR links, rechts;
+fenster initialisieren (links);;
+fenstergroesse setzen (links, 1, 2, 16, 22);
+fenster initialisieren (rechts);
+fenstergroesse setzen (rechts, 17, 2, 63, 22);
+dialogfenster (rechts);
+
+TEXT VAR
+ druckertask := "PRINTER";
+
+
+PROC operator :
+
+ TASK VAR letzte task;
+ TEXT VAR neuer name := "";
+ continue (niltask);
+ REP
+ letzte task := continued from;
+ page; bildschirm neu;
+ disable stop;
+ operatormenue;
+ umschalten auf letzte task
+ END REP .
+
+operatormenue :
+ menue anbieten (ROW 6 TEXT :
+ ("OPERATOR.Abschalten", "OPERATOR.Systemzustand", "OPERATOR.Drucker",
+ "OPERATOR.Netz", "OPERATOR.Konfiguration", ""),
+ links, TRUE, PROC (INT CONST, INT CONST) op interpreter) .
+
+umschalten auf letzte task :
+ BOOL VAR first try;
+ IF exists (letzte task) CAND NOT (letzte task = supervisor) THEN
+ first try := TRUE;
+ continue (letzte task)
+ ELSE
+ first try := FALSE
+ END IF;
+ IF is error OR NOT first try THEN
+ REP
+ IF is error THEN fehler ausgeben END IF;
+ nach neuer task fragen;
+ zurueck in task
+ UNTIL NOT is error END REP
+ END IF .
+
+nach neuer task fragen :
+ REP
+ editget (p neuer taskname, neuer name, "", "GET/neuer taskname");
+ UNTIL taskname akzeptiert END REP .
+
+taskname akzeptiert :
+ IF neuer name = "" THEN
+ ganz abkoppeln
+ ELSE
+ exists task (neuer name) COR neu einrichten
+ END IF .
+
+zurueck in task :
+ IF neuer name = "" THEN
+ continue (niltask)
+ ELIF exists task (neuer name) THEN
+ continue (task (neuer name))
+ ELSE
+ TEXT VAR vater := "";
+ editget (p name vater, vater, "", "GET/name vatertask");
+ begin (neuer name, vater);
+ continue (task (neuer name))
+ END IF .
+
+ganz abkoppeln :
+ ja (f ganz abkoppeln, "JA/ganz") .
+
+neu einrichten :
+ ja (f arbeitsbereich neu einrichten, "JA/task einrichten") .
+
+END PROC operator;
+
+PROC op interpreter (INT CONST menue nr, f nr) :
+
+ enable stop;
+ SELECT menuenr OF
+ CASE 0 : sperren setzen
+ CASE 1 : abschalten inter
+ CASE 2 : systemzustand inter
+ CASE 3 : drucker inter
+ CASE 4 : netz inter
+ CASE 5 : konfiguration inter
+ END SELECT;
+ IF f nr = -1 THEN dialogfenster loeschen END IF .
+
+sperren setzen :
+ fusszeile (t bereich, "", 35, t datum, 64);
+ fussteil (1, name (myself));
+ fussteil (3, date) .
+
+abschalten inter :
+ SELECT f nr OF
+ CASE 1 : abschalten
+ CASE 2 : (* nach DOS *) ni
+ CASE 3 : page; bildschirm neu; set date; dialogfenster loeschen
+ CASE 4 : page; bildschirm neu; save system
+ END SELECT .
+
+abschalten :
+ IF channel = 1 COR trotzdem abschalten THEN
+ page;
+ cursor (20, 11); out (t bitte warten);
+ cursor (20, 13);
+ shutup;
+ fenster veraendert (links);
+ push (""27"q")
+ END IF .
+
+trotzdem abschalten :
+ ja (f trotzdem abschalten, "JA/trotz shutup") .
+
+systemzustand inter :
+ SELECT f nr OF
+ CASE 1 : bereichsuebersicht
+ CASE 2 : speicherbelegung
+ CASE 3 : fremder taskstatus
+ CASE 4 : zustandsuebersicht
+ CASE 5 : task loeschen
+ END SELECT .
+
+bereichsuebersicht :
+ bitte warten;
+ disable stop;
+ DATASPACE VAR list ds := nilspace;
+ FILE VAR f := sequential file (output, list ds);
+ task info (1, f);
+ IF NOT is error THEN
+ show (f); bildschirm neu
+ END IF;
+ forget (list ds);
+ enable stop;
+ dialogfenster loeschen .
+
+speicherbelegung :
+ INT VAR size, used;
+ storage (size, used);
+ size := int (real (size + 24) * 64.0 / 63.0);
+ dialog (text (used) + kb von + text (size) + sind belegt) .
+
+fremder taskstatus :
+ TEXT VAR taskname := "";
+ editget (p taskname, taskname, "GET/Taskname", "");
+ TASK VAR status task := task (task name);
+ IF exists (status task) THEN
+ task zustand (status task)
+ ELSE
+ errorstop ("""" + taskname + """" + existiert nicht als task)
+ END IF .
+
+zustandsuebersicht :
+ bitte warten; task info (3); bildschirm neu; dialogfenster loeschen .
+
+task loeschen :
+ taskname := "";
+ editget (p taskname, taskname, "GET/Taskname", "");
+ IF ja ("""" + taskname + """" + t loeschen,
+ "JA/Task loeschen", FALSE) THEN
+ end (task (taskname))
+ END IF .
+
+drucker inter :
+ SELECT f nr OF
+ CASE 0 : druckertask in fuss
+ CASE 1 : start (task (druckertask)); dialog (t gestartet)
+ CASE 2 : stop (task (druckertask)); dialog (t gestoppt)
+ CASE 3 : halt kommando
+ CASE 4 : list (task (druckertask)); bildschirm neu; dialogfenster loeschen
+ CASE 5 : first (task (druckertask))
+ CASE 6 : killer (task (druckertask))
+ CASE 7 : druckertask setzen
+ OTHERWISE ggf druckertask aus fuss
+ END SELECT .
+
+druckertask in fuss :
+ fussteil (2, t drucker, druckertask) .
+
+halt kommando :
+ IF ja (f auf anhalten warten, "JA/halt warten", FALSE) THEN
+ wait for halt (task (druckertask))
+ ELSE
+ halt (task (druckertask))
+ END IF;
+ dialog (t angehalten) .
+
+druckertask setzen :
+ TEXT VAR neuer printer := druckertask;
+ editget (p neuer printer, neuer printer, "", "GET/neuer printer");
+ TASK CONST dummy := task (neuer printer);
+ druckertask := neuer printer;
+ fussteil (2, druckertask) .
+
+ggf druckertask aus fuss :
+ IF f nr = -1 THEN
+ fussteil (2, "", "")
+ END IF .
+
+netz inter :
+ SELECT f nr OF
+ CASE 1 : (* start *) ni
+ CASE 2 : (* stop *) ni
+ CASE 3 : (* zustand *) ni
+ CASE 4 : (* list (net.io) *) ni
+ END SELECT .
+
+konfiguration inter :
+ SELECT f nr OF
+ CASE 1 : konfigurieren
+ CASE 2 : (* drucker installieren *) ni
+ CASE 3 : (* netz installieren *) ni
+ CASE 4 : (* anwendung installieren *) ni
+ CASE 5 : (* systemprogramm installieren *) ni
+ END SELECT .
+
+konfigurieren :
+ THESAURUS VAR conf := ALL /"configurator";
+ page; bildschirm neu;
+ forget quiet (conf);
+ fetch (conf, /"configurator");
+ configurate;
+ line;
+ save ("configuration", /"configurator");
+ forget quiet (conf);
+ dialogfenster loeschen .
+
+END PROC op interpreter;
+
+PROC task zustand (TASK CONST status task) :
+
+ dialog (t speicher + speicher + t cpu zeit + cpu zeit);
+ out (t zustand); out status; out (t prio); out prio;
+ out (t kanal); out kanal .
+
+speicher :
+ text (storage (status task), 5) .
+
+cpu zeit :
+ disable stop;
+ TEXT VAR result := subtext (time (clock (status task), 12), 1, 10);
+ IF is error THEN
+ clear error; result := "**********"
+ END IF;
+ result .
+
+out status :
+ SELECT status (status task) OF
+ CASE 0 : out (t busy)
+ CASE 1 : out (t io)
+ CASE 2 : out (t wait)
+ CASE 4 : out (t busy blocked)
+ CASE 5 : out (t io blocked)
+ CASE 6 : out (t wait blocked)
+ OTHERWISE out (t dead)
+ END SELECT .
+
+out prio :
+ out (text (pcb (status task, 6))) .
+
+out kanal :
+ IF channel (status task) = 0 THEN
+ out (" -")
+ ELSE
+ out (text (channel (status task), 2))
+ END IF .
+
+END PROC task zustand;
+
+PROC forget quiet (TEXT CONST datei) :
+ forget (datei, quiet)
+END PROC forget quiet;
+
+PROC forget quiet (THESAURUS CONST t) :
+ do (PROC (TEXT CONST) forget quiet, t)
+END PROC forget quiet;
+
+PROC bitte warten :
+
+ cursor (1, 1);
+ out (t bitte warten);
+ out (""5"")
+
+END PROC bitte warten;
+
+PROC ni :
+
+ dialog ("Zur Zeit nicht implementiert.")
+
+END PROC ni;
+
+END PACKET operator;
+
+PACKET operator monitor
+
+ DEFINES
+
+ monitor :
+
+
+PROC monitor :
+ disable stop;
+ operator
+END PROC monitor;
+
+END PACKET operator monitor;
+
diff --git a/app/flint/0.4/src/operator.1 b/app/flint/0.4/src/operator.1
new file mode 100644
index 0000000..b2235b2
--- /dev/null
+++ b/app/flint/0.4/src/operator.1
@@ -0,0 +1,39 @@
+PACKEToperatormanagerDEFINESoperatormanager,continue:LETb0="Nur für Systemtasks zugelassen";PROCoperatormanager(DATASPACE VARc0,INT CONSTd0,e0,TASK CONSTf0):enablestop;IFf0=supervisorORf0<supervisorTHENmenuemanager(c0,d0,e0,f0)ELSEerrorstop(b0)END IF END PROCoperatormanager;PROCcontinue(TASK CONSTg0):continue(g0,PROC(DATASPACE VAR,INT CONST,INT CONST,TASK CONST)operatormanager)END PROCcontinue;END PACKEToperatormanager;
+PACKETspoolcmdDEFINESkiller,first,start,stop,halt,waitforhalt:LETb0=2,c0=23,d0=24,e0=25,f0=26,g0=27,h0=28,i0=29;DATASPACE VARj0;BOUND STRUCT(TEXTk0,INTindex)VARl0;BOUND TEXT VARm0;INT VARn0;INITFLAG VARo0:=FALSE;PROCp0(TASK CONSTq0,INT CONSTr0,TEXT CONSTs0,BOOL CONSTt0):enablestop;u0;WHILEv0REP IFw0THENx0FI PER;.u0:IF NOTinitialized(o0)THENj0:=nilspaceFI;forget(j0);j0:=nilspace;l0:=j0;l0.k0:="";l0.index:=0;.v0:call(q0,c0,j0,n0);IFn0=b0THENm0:=j0;errorstop(m0);FI;l0.index<>0.w0:ja(l0.k0+s0,"JA/spool control",t0).x0:call(q0,r0,j0,n0);IFn0=b0THENm0:=j0;errorstop(m0);FI;IFt0THEN LEAVEp0FI;END PROCp0;PROCkiller(TASK CONSTq0):p0(q0,d0," loeschen",FALSE)END PROCkiller;PROCfirst(TASK CONSTq0):p0(q0,e0," als erstes",TRUE)END PROCfirst;PROCstart(TASK CONSTq0):call(g0,"",q0);call(f0,"",q0);END PROCstart;PROCstop(TASK CONSTq0):call(g0,"",q0);END PROCstop;PROChalt(TASK CONSTq0):call(h0,"",q0);END PROChalt;PROCwaitforhalt(TASK CONSTq0):call(i0,"",q0);END PROCwaitforhalt;END PACKETspoolcmd;
+PACKEToperatorDEFINESoperator:LETb0=
+#2001#"Weitermachen in Bereich:",c0=
+#2002#"Unter welchem Vater:",d0=
+#2003#""15"Bereich "14"",e0=
+#2004#""15"Datum "14"",f0=
+#2005#"Arbeitsbereich ganz abkoppeln",g0=
+#2006#"Arbeitsbereich existiert nicht. Neu einrichten",h0=
+#2007#"Nicht auf Terminal 1. Trotzdem abschalten",i0=
+#2008#" KB von ",j0=
+#2009#" KB sind belegt.",k0=
+#2010#"Name des Arbeitsbereichs:",l0=
+#2011#" ist kein Name eines Bereiches",m0=
+#2012#" löschen",n0=
+#2013#"Speicher:",o0=
+#2014#" KB CPU-Zeit : ",p0=
+#2015#"Zustand : ",q0=
+#2016#" Priorität: ",r0=
+#2017#" Kanal: ",s0=
+#2018#"Arbeit",t0=
+#2019#"EinAus",u0=
+#2020#"Warten",v0=
+#2021#"B(Arb)",w0=
+#2022#"B(E/A)",x0=
+#2023#"B(Wrt)",y0=
+#2024#">>TOT<",z0=
+#2025#"Druckertreiber gestoppt.",a1=
+#2026#"Druckertreiber gestartet.",b1=
+#2027#"Druckertreiber angehalten.",c1=
+#2028#"Auf Anhalten des Treibers warten",d1=
+#2029#""15"Drucker "14"",e1=
+#2030#"Welche Druckertask soll eingestellt werden:",f1=
+#2031#"Bitte warten .. ";
+FENSTER VARg1,h1;fensterinitialisieren(g1);;fenstergroessesetzen(g1,1,2,16,22);fensterinitialisieren(h1);fenstergroessesetzen(h1,17,2,63,22);dialogfenster(h1);TEXT VARi1:="PRINTER";PROCoperator:TASK VARj1;TEXT VARk1:="";continue(niltask);REPj1:=continuedfrom;page;bildschirmneu;disablestop;l1;m1END REP.l1:menueanbieten(ROW6TEXT:("OPERATOR.Abschalten","OPERATOR.Systemzustand","OPERATOR.Drucker","OPERATOR.Netz","OPERATOR.Konfiguration",""),g1,TRUE,PROC(INT CONST,INT CONST)n1).m1:BOOL VARo1;IFexists(j1)CAND NOT(j1=supervisor)THENo1:=TRUE;continue(j1)ELSEo1:=FALSE END IF;IFiserrorOR NOTo1THEN REP IFiserrorTHENfehlerausgebenEND IF;p1;q1UNTIL NOTiserrorEND REP END IF.p1:REPeditget(b0,k1,"","GET/neuer taskname");UNTILr1END REP.r1:IFk1=""THENs1ELSEexiststask(k1)CORt1END IF.q1:IFk1=""THENcontinue(niltask)ELIFexiststask(k1)THENcontinue(task(k1))ELSE TEXT VARu1:="";editget(c0,u1,"","GET/name vatertask");begin(k1,u1);continue(task(k1))END IF.s1:ja(f0,"JA/ganz").t1:ja(g0,"JA/task einrichten").END
+PROCoperator;PROCn1(INT CONSTv1,w1):enablestop;SELECTv1OF CASE0:x1CASE1:y1CASE2:z1CASE3:a2CASE4:b2CASE5:c2END SELECT;IFw1=-1THENdialogfensterloeschenEND IF.x1:fusszeile(d0,"",35,e0,64);fussteil(1,name(myself));fussteil(3,date).y1:SELECTw1OF CASE1:d2CASE2:e2CASE3:page;bildschirmneu;setdate;dialogfensterloeschenCASE4:page;bildschirmneu;savesystemEND SELECT.d2:IFchannel=1CORf2THENpage;cursor(20,11);out(f1);cursor(20,13);shutup;fensterveraendert(g1);push(""27"q")END IF.f2:ja(h0,"JA/trotz shutup").z1:SELECTw1OF CASE1:g2CASE2:h2CASE3:i2CASE4:j2CASE5:k2END SELECT.g2:bittewarten;disablestop;DATASPACE VARl2:=nilspace;FILE VARf:=sequentialfile(output,l2);taskinfo(1,f);IF NOTiserrorTHENshow(f);bildschirmneuEND IF;forget(l2);enablestop;dialogfensterloeschen.h2:INT VARm2,n2;storage(m2,n2);m2:=int(real(m2+24)*64.0/63.0);dialog(text(n2)+i0+text(m2)+j0).i2:TEXT VARo2:="";editget(k0,o2,"GET/Taskname","");TASK VARp2:=task(o2);IFexists(p2)THENq2(p2)ELSEerrorstop(""""+o2+""""+l0)END IF.j2:bittewarten;
+taskinfo(3);bildschirmneu;dialogfensterloeschen.k2:o2:="";editget(k0,o2,"GET/Taskname","");IFja(""""+o2+""""+m0,"JA/Task loeschen",FALSE)THENend(task(o2))END IF.a2:SELECTw1OF CASE0:r2CASE1:start(task(i1));dialog(a1)CASE2:stop(task(i1));dialog(z0)CASE3:s2CASE4:list(task(i1));bildschirmneu;dialogfensterloeschenCASE5:first(task(i1))CASE6:killer(task(i1))CASE7:t2OTHERWISEu2END SELECT.r2:fussteil(2,d1,i1).s2:IFja(c1,"JA/halt warten",FALSE)THENwaitforhalt(task(i1))ELSEhalt(task(i1))END IF;dialog(b1).t2:TEXT VARv2:=i1;editget(e1,v2,"","GET/neuer printer");TASK CONSTdummy:=task(v2);i1:=v2;fussteil(2,i1).u2:IFw1=-1THENfussteil(2,"","")END IF.b2:SELECTw1OF CASE1:e2CASE2:e2CASE3:e2CASE4:e2END SELECT.c2:SELECTw1OF CASE1:w2CASE2:e2CASE3:e2CASE4:e2CASE5:e2END SELECT.w2:THESAURUS VARx2:=ALL/"configurator";page;bildschirmneu;y2(x2);fetch(x2,/"configurator");configurate;line;save("configuration",/"configurator");y2(x2);dialogfensterloeschen.END PROCn1;PROCq2(TASK CONSTp2):dialog(n0+z2+o0+a3);out(p0);b3
+;out(q0);c3;out(r0);d3.z2:text(storage(p2),5).a3:disablestop;TEXT VARe3:=subtext(time(clock(p2),12),1,10);IFiserrorTHENclearerror;e3:="**********"END IF;e3.b3:SELECTstatus(p2)OF CASE0:out(s0)CASE1:out(t0)CASE2:out(u0)CASE4:out(v0)CASE5:out(w0)CASE6:out(x0)OTHERWISEout(y0)END SELECT.c3:out(text(pcb(p2,6))).d3:IFchannel(p2)=0THENout(" -")ELSEout(text(channel(p2),2))END IF.END PROCq2;PROCy2(TEXT CONSTf3):forget(f3,quiet)END PROCy2;PROCy2(THESAURUS CONSTg3):do(PROC(TEXT CONST)y2,g3)END PROCy2;PROCbittewarten:cursor(1,1);out(f1);out(""5"")END PROCbittewarten;PROCe2:dialog("Zur Zeit nicht implementiert.")END PROCe2;END PACKEToperator;PACKEToperatormonitorDEFINESmonitor:PROCmonitor:disablestop;operatorEND PROCmonitor;END PACKEToperatormonitor;
+
diff --git a/app/flint/0.4/src/operator.init b/app/flint/0.4/src/operator.init
new file mode 100644
index 0000000..99d7c08
--- /dev/null
+++ b/app/flint/0.4/src/operator.init
@@ -0,0 +1,390 @@
+% MENUE "OPERATOR.Abschalten"
+% BILD
+Arbeit
+  Beenden
+-
+Umschalten
+  Neustart
+-
+Zeit/Datum
+  Einstellen
+-
+Systemzustand
+  Sichern auf
+ Diskette
+% FELD 1 "OP/1B" "bB"
+% FELD 2 "OP/1D" "nN"
+% FELD 3 "OP/1E" "eE"
+% FELD 4 "OP/1S" "sS"
+% ENDE
+% MENUE "OPERATOR.Systemzustand"
+% BILD
+Übersicht
+  Bereiche
+  Speicher
+-
+Taskzustand
+  Ein Bereich
+  Alle Tasks
+-
+Arbeitsbereich
+  Löschen
+% FELD 1 "OP/2B" "bB"
+% FELD 2 "OP/2S" "sS"
+% FELD 3 "OP/2E" "eE"
+% FELD 4 "OP/2A" "aA"
+% FELD 5 "OP/2L" "lL"
+% ENDE
+% MENUE "OPERATOR.Drucker"
+% BILD
+Druckertreiber
+  Starten
+  Abbrechen
+  Halten
+-
+Aufträge
+  Übersicht
+  Vorziehen
+  Löschen
+-
+Zieltreiber
+  Einstellen
+% FELD 1 "OP/3S" "sS"
+% FELD 2 "OP/3A" "aA"
+% FELD 3 "OP/3H" "hH"
+% FELD 4 "OP/3U" "uUüÜ"
+% FELD 5 "OP/3V" "vV"
+% FELD 6 "OP/3L" "lL"
+% FELD 7 "OP/3E" "eE"
+% ENDE
+% MENUE "OPERATOR.Netz"
+% BILD
+Netztreiber
+  Starten
+  Abbrechen
+  Zustand
+-
+Übertragungen
+  Übersicht
+% FELD 1 "OP/4S" "sS"
+% FELD 2 "OP/4A" "aA"
+% FELD 3 "OP/4Z" "zZ"
+% FELD 4 "OP/4U" "uUüÜ"
+% ENDE
+% MENUE "OPERATOR.Konfiguration"
+% BILD
+Konfigurieren
+  Kanäle
+-
+Installieren
+  Drucker
+  Netz
+  Anwendung
+  Systemprog
+% FELD 1 "OP/5K" "kK"
+% FELD 2 "OP/5D" "dD"
+% FELD 3 "OP/5N" "nN"
+% FELD 4 "OP/5A" "aA"
+% FELD 5 "OP/5S" "sS"
+% ENDE
+% HILFE "OP/Allgemein"
+% SEITE 1
+MENÜBEDIENUNG
+-
+Das Menü dient zur Auswahl von Funktionen. Die Funktionen
+sind durch einen vorangestellten Buchstaben gekennzeichnet.
+Mit den Pfeiltasten können Sie die Markierung zu einer be­
+liebigen Position auf und ab bewegen. Diese Funktion können
+Sie dann durch Drücken der Leertaste ausführen. Durch ESC '?'
+(nachein-ander gedrückt) erhalten Sie Informationen zur
+gerade markierten Funktion.
+Funktionen, die im momentanen Zustand nicht ausgeführt werden
+können, sind durch ein Minuszeichen gekennzeichnet.
+In der obersten Bildschirmzeile sind weitere Menüs aufge­
+führt, die Sie aufrufen können. Das aktuelle Menü ist invers
+markiert. Ein anderes Menü wählen Sie durch Drücken der
+Pfeiltasten RECHTS oder LINKS. Wollen Sie das Programm wieder
+verlassen, drücken Sie die ESC-Taste und 'q' hintereinander.
+% ENDE
+% HILFE "GET/Allgemein"
+% SEITE 1
+EINGABE:
+-
+Die Eingabe erwartet von Ihnen eine bestimmte Information,
+die Sie eingeben sollen. Die Art der Information wird durch
+den Anforderungstext angegeben. Wenn Sie sich beim Eintippen
+verschrieben haben, können Sie mit den Pfeiltasten zurück­
+gehen und den Text korrigieren. Eine bereits dastehende
+Information können Sie überschreiben. RUBOUT löscht ein
+Zeichen, RUBIN schaltet in den Einfügemodus (Zeichen werden
+nicht mehr überschrieben). Beenden Sie die Eingabe mit
+RETURN. ESC 'h' bricht die Eingabe und die folgende Funktion
+ab. Wenn in der Statuszeile angegeben, können Sie mit ESC 'z'
+eine Auswahl verfügbarer Namen abrufen, die Sie dann Ankreu­
+zen können.
+% ENDE
+% HILFE "FEHLER/Allgemein"
+% SEITE 1
+FEHLERMELDUNGEN:
+-
+Fehlermeldungen werden von einem Programm abgesetzt, wenn es
+seine Funktion nicht durchführen kann. Der Text der Meldung
+identifiziert die Ursache des Problems. Zur Zeit liegen noch
+keine meldungsspezifischen Informationen vor, schauen Sie
+ggf. in das Benutzerhandbuch.
+% ENDE
+% HILFE "JA/Allgemein"
+% SEITE 1
+FRAGEN:
+-
+Das Programm stellt Ihnen eine Frage, die Sie bejahen oder
+verneinen können. Sie bejahen die Frage, indem Sie 'j' drük­
+ken und verneinen Sie mit 'n' (beides groß oder klein). Mit
+ESC 'h' können Sie die Funktion abbrechen.
+% ENDE
+% HILFE "OP/1B"
+% SEITE 1
+Arbeit Beenden
+-
+Führt 'shutup' aus. Nach dem Neustart wird das Operatormenü
+automatisch verlassen und die Arbeit im letzten Bereich
+wieder aufgenommen.
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/1D"
+% SEITE 1
+Umschalten nach DOS
+-
+Macht 'shutup' mit gleichzeitigem Neustart einer
+DOS-Partition.
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/1E"
+% SEITE 1
+Zeit/Datum einstellen
+-
+Aufruf von 'set date'.
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/1S"
+% SEITE 1
+Sichern auf Diskette
+-
+Aufruf von 'save system'.
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/2B"
+% SEITE 1
+Übersicht Bereiche
+-
+Aufruf von 'task info'.
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/2S"
+% SEITE 1
+Übersicht Speicher
+-
+wie 'storage info'.
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/2E"
+% SEITE 1
+Taskzustand einer Task
+-
+'task status' einer Task.
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/2A"
+% SEITE 1
+Taskzustand aller Tasks
+-
+'task info (3)'.
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/2L"
+% SEITE 1
+Arbeitsbereich löschen
+-
+'end'
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/3S"
+% SEITE 1
+Druckertreiber starten
+-
+'start' für die angezeigte Druckertask.
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/3A"
+% SEITE 1
+Druckertreiber abbrechen
+-
+'stop' für die angezeigte Druckertask
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/3H"
+% SEITE 1
+Druckertreiber anhalten
+-
+'halt' bzw. 'wait for halt' für die angezeigte Druckertask.
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/3U"
+% SEITE 1
+Aufträge Übersicht
+-
+Übersicht über die Warteschlange der angezeigten
+Druckertask.
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/3V"
+% SEITE 1
+Auftrag Vorziehen
+-
+'first'
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/3L"
+% SEITE 1
+Auftrag Löschen
+-
+'killer'
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/3E"
+% SEITE 1
+Zieltreiber einstellen
+-
+Angabe der Spooltask, die mit den Kommandos dieses Menüs
+gesteuert werden soll.
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/4S"
+% SEITE 1
+Netztreiber starten
+-
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/4A"
+% SEITE 1
+Netztreiber Abbrechen
+-
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/4Z"
+% SEITE 1
+Zustand des Netztreibers
+-
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/4U"
+% SEITE 1
+Übersicht der laufenden Übertragungen
+-
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/5K"
+% SEITE 1
+Kanäle Konfigurieren
+-
+'configurate', ohne "configurator" zu betreten.
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/5D"
+% SEITE 1
+Drucker Installieren
+-
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/5N"
+% SEITE 1
+Netz Installieren
+-
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/5A"
+% SEITE 1
+Anwendungsprogramm Installieren
+-
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "OP/5S"
+% SEITE 1
+Systemprogramm Installieren
+-
+% SEITE 1 "OP/Allgemein"
+% ENDE
+% HILFE "GET/neuer taskname"
+% SEITE 1
+Name des gewünschten Arbeitsbereichs
+-
+Geben Sie den Namen des Arbeitsbereichs an, in dem Sie
+arbeiten wollen. Falls der Bereich noch nicht existiert,
+kann er eingerichtet werden.
+% SEITE 1 "GET/Allgemein"
+% ENDE
+% HILFE "GET/name vatertask"
+% SEITE 1
+Name des Vaterbereichs
+-
+Ein neuer Arbeitsbereich muß unterhalb eines existierenden
+Bereichs eingerichtet werden, der die zur Verfügung
+stehenden Programme festlegt.
+% SEITE 1 "GET/Allgemein"
+% ENDE
+% HILFE "GET/Taskname"
+% SEITE 1
+Name des Arbeitsbereichs
+-
+Geben Sie den Namen des Arbeitsbereichs ein, dessen Status
+Sie erfahren wollen.
+% SEITE 1 "GET/Allgemein"
+% ENDE
+% HILFE "GET/neuer printer"
+% SEITE 1
+Name der Druckertask
+-
+Geben Sie den Namen des Bereichs an, der durch die Befehle
+dieses menüs gesteuert werden kann.
+% SEITE 1 "GET/Allgemein"
+% ENDE
+% HILFE "JA/ganz"
+% SEITE 1
+Ganz abkoppeln ?
+-
+Wenn Sie keinen neuen Arbeitsbereich wollen oder spezielle
+Arbeitsbereiche betreten wollen, können Sie sich jetzt
+abkoppeln. Sie müssen dann mit SV fortfahren.
+% SEITE 1 "JA/Allgemein"
+% ENDE
+% HILFE "JA/task einrichten"
+% SEITE 1
+Arbeitsbereich existiert nicht. Neu einrichten ?
+-
+% SEITE 1 "JA/Allgemein"
+% ENDE
+% HILFE "JA/trotz shutup"
+% SEITE 1
+Nicht auf Kanal 1.
+-
+Wenn Sie nicht auf Kanal 1 abschalten, meldet sich das
+System später auch wieder auf dem jetzigen Kanal. Das kann
+Sie dann irritieren.
+% SEITE 1 "JA/Allgemein"
+% ENDE
+% HILFE "JA/Task loeschen"
+% SEITE 1
+Arbeitsbereich wirklich löschen
+-
+Zur Kontrolle.
+% SEITE 1 "JA/Allgemein"
+% ENDE
+% HILFE "JA/halt warten"
+% SEITE 1
+Auf Anhalten warten ?
+-
+Wenn Sie die Frage bejahen, wartet das Programm bis zur
+Abarbeitung des aktuellen Druckauftrags.
+% SEITE 1 "JA/Allgemein"
+% ENDE
+
diff --git a/app/flint/0.4/src/operator.manager b/app/flint/0.4/src/operator.manager
new file mode 100644
index 0000000..fc9c31a
--- /dev/null
+++ b/app/flint/0.4/src/operator.manager
@@ -0,0 +1,34 @@
+PACKET operator manager (* Autor: Thomas Berlage *)
+ (* Stand: 14.01.88 *)
+ DEFINES
+
+ operator manager,
+ continue :
+
+
+LET
+ only privileged =
+ "Nur für Systemtasks zugelassen";
+
+
+PROC operator manager (DATASPACE VAR ds, INT CONST order, phase,
+ TASK CONST order task) :
+
+ enable stop;
+ IF order task = supervisor OR order task < supervisor THEN
+ menue manager (ds, order, phase, order task)
+ ELSE
+ errorstop (only privileged)
+ END IF
+
+END PROC operator manager;
+
+PROC continue (TASK CONST t) :
+
+ continue (t,
+ PROC (DATASPACE VAR, INT CONST, INT CONST, TASK CONST) operator manager)
+
+END PROC continue;
+
+END PACKET operator manager;
+
diff --git a/app/flint/0.4/src/operator.spoolcmd b/app/flint/0.4/src/operator.spoolcmd
new file mode 100644
index 0000000..921f1e3
--- /dev/null
+++ b/app/flint/0.4/src/operator.spoolcmd
@@ -0,0 +1,113 @@
+PACKET spool cmd (* Autor: R. Ruland *)
+ (* Stand: 01.04.86 *)
+ DEFINES killer, (* Be 14.01.88 *)
+ first, (* Umstellung Menue *)
+ start,
+ stop,
+ halt,
+ wait for halt :
+
+LET error nak = 2 ,
+
+ entry line code = 23 ,
+ killer code = 24 ,
+ first code = 25 ,
+ start code = 26 ,
+ stop code = 27 ,
+ halt code = 28 ,
+ wait for halt code = 29 ;
+
+DATASPACE VAR ds;
+
+BOUND STRUCT (TEXT entry line, INT index) VAR control msg;
+BOUND TEXT VAR error msg ;
+
+INT VAR reply;
+
+INITFLAG VAR in this task := FALSE;
+
+
+PROC control spool (TASK CONST spool, INT CONST control code,
+ TEXT CONST question, BOOL CONST leave) :
+
+ enable stop;
+ initialize control msg;
+ WHILE valid spool entry
+ REP IF control question THEN control spool entry FI PER;
+
+ . initialize control msg :
+ IF NOT initialized (in this task) THEN ds := nilspace FI;
+ forget (ds); ds := nilspace; control msg := ds;
+ control msg. entry line := "";
+ control msg. index := 0;
+ (* say (""13""10"");*)
+
+ . valid spool entry :
+ call (spool, entry line code, ds, reply);
+ IF reply = error nak
+ THEN error msg := ds;
+ errorstop (error msg);
+ FI;
+ control msg. index <> 0
+
+ . control question :
+ (* say (control msg. entry line);
+ yes (question) *)
+ ja (control msg. entry line + question, "JA/spool control", leave)
+
+ . control spool entry :
+ call (spool, control code, ds, reply);
+ IF reply = error nak
+ THEN error msg := ds;
+ errorstop (error msg);
+ FI;
+ IF leave THEN LEAVE control spool FI;
+
+END PROC control spool;
+
+
+PROC killer (TASK CONST spool) :
+
+ control spool (spool, killer code, " loeschen", FALSE)
+
+END PROC killer;
+
+
+PROC first (TASK CONST spool) :
+
+ control spool (spool, first code, " als erstes", TRUE)
+
+END PROC first;
+
+
+PROC start (TASK CONST spool) :
+
+ call (stop code, "", spool);
+ call (start code, "", spool);
+
+END PROC start;
+
+
+PROC stop (TASK CONST spool) :
+
+ call (stop code, "", spool);
+
+END PROC stop;
+
+
+PROC halt (TASK CONST spool) :
+
+ call (halt code, "", spool);
+
+END PROC halt;
+
+
+PROC wait for halt (TASK CONST spool) :
+
+ call (wait for halt code, "", spool);
+
+END PROC wait for halt;
+
+
+END PACKET spool cmd;
+