summaryrefslogtreecommitdiff
path: root/app/flint/0.4/src/eudas.manager
diff options
context:
space:
mode:
Diffstat (limited to 'app/flint/0.4/src/eudas.manager')
-rw-r--r--app/flint/0.4/src/eudas.manager216
1 files changed, 216 insertions, 0 deletions
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;
+