PACKET rts DEFINES constant, vdt, get pltper, get prtper, was print, println, print output, plot output, print line, sys page, pagefeed necessary, print suppressed output, asterisk, protokoll, default, set pagelength, run time system, b stop request, scroll, run card : (* Runtime - System *) (* Autor : R. Keil *) (* Datum : 12.07.83 Aenderung: 19.06.84 D. Craemer *) (* 2.Aenderung: 6.05.85 D. Craemer *) (* Ă„nderung auf 1.8.2: Z. 288, Christian Szymanski, 10.08.88 *) (* In der 2. Aenderung wurde dyn.const in zzdyn.const umbenannt*) (* und alle Konstanten-Datenraeume bekommen ".const" angehaengt*) (* Wird im rts das Kommando run name gegeben, so wird der *) (* augenblickliche Konstanten-Datenraum gerettet im Datenraum *) (* mit dem Namen: "name.const" *) LET esc = ""27"", max tab size = 50, bold = 1, number = 2, delimiter = 3; TYPE CONSTANT = STRUCT (ROW max tab size TEXT name, ROW max tab size REAL value, INT tab size); BOUND CONSTANT VAR constants; FILE VAR sysout; TEXT VAR print buf, asterisk buffer, sym, const name, const space name::"zzdyn.const"; REAL VAR dt, length, prtper, pltper; INT VAR line no, page no, max pagelength, type; BOOL VAR vdt on, print, protocoll, terminal stop, is scroll, is not first, run specified; default; PROC default : protocoll := FALSE; max pagelength := 23; is scroll := TRUE; run specified := FALSE END PROC default; PROC set pagelength (INT CONST i) : max pagelength := i END PROC set pagelength; PROC run card (TEXT CONST run name) : IF exists (actual constants) THEN constants := old (actual constants) ELIF run name="zzdyn" THEN constants := new (actual constants); CONCR (constants).tab size := 0 ELSE copy (const space name, actual constants); constants := old (actual constants) FI; const space name := actual constants. actual constants: run name + ".const". END PROC run card; REAL PROC constant (TEXT CONST name, REAL CONST val) : REAL VAR value; INT VAR tab pos; value := actual value; set system consts. actual value : search constant (name, tab pos); IF tab pos > 0 THEN CONCR (constants).value (tab pos) ELSE new constant (name, val); val FI. set system consts : SELECT pos ("dt length prtper pltper ", name + " ") OF CASE 1 : dt := value CASE 4 : length := value CASE 11 : prtper := value CASE 18 : pltper := value END SELECT; value. END PROC constant; PROC new constant (TEXT CONST name, REAL CONST val) : CONCR (constants).tab size INCR 1; IF CONCR (constants).tab size > max tab size THEN errorstop ("ZUVIELE KONSTANTEN") FI; CONCR (constants).name (CONCR (constants).tab size) := name; CONCR (constants).value (CONCR (constants).tab size) := val END PROC new constant; PROC search constant (TEXT CONST name, INT VAR tab pos) : INT VAR i; FOR i FROM 1 UPTO CONCR (constants).tab size REP IF name = CONCR (constants).name (i) THEN tab pos := i; LEAVE search constant FI END REP; tab pos := 0 END PROC search constant; REAL PROC get pltper : (* Reicht 'pltper' (Plotperiode) heraus *) pltper END PROC get pltper; REAL PROC get prtper : (* Reicht 'prtper' (Printperiode) heraus *) prtper END PROC get prtper; PROC scroll (BOOL CONST b) : is scroll := b END PROC scroll; PROC next sym : next sym (sym, type) END PROC next sym; PROC rts err (TEXT CONST err mess) : outline ("FEHLER BEI >>>" + sym + "<<< : " + err mess) END PROC rts err; PROC run time system (PROC target program) : IF protocoll THEN kill ("dyn.out"); sysout := sequential file (output, "dyn.out") FI; init rts; REP get command; execute command END REP. get command : TEXT VAR command; print suppressed output; line; putline (" dynamo runtime system :"); shift; getline (command); printline (command). execute command : scanner (command); next sym; TEXT VAR start := sym; skip blanks; SELECT pos ("run rerun quit help c ? EOL ", start + " ") OF CASE 1, 5 : run CASE 11 : quit CASE 16 : show ("dyn.help") CASE 21 : const equ CASE 23 : dump consts CASE 25 : OTHERWISE : rts err ("KOMMANDO UNBEKANNT") END SELECT. run : init rts; IF type = bold OR type = delimiter THEN run card (sym) FI; target program. quit : IF const space name = "zzdyn.const" THEN kill (const space name) FI; LEAVE runtime system. skip blanks : REP next sym UNTIL sym <> " " END REP. const equ : REAL VAR value, dummy; INT VAR tab pos; REP analyze constant equ; search constant (const name, tab pos); IF tab pos = 0 THEN sym := const name; rts err ("KONSTANTE NICHT DEFINIERT") ELSE CONCR (constants).value (tab pos) := value FI UNTIL end of constants END REP. analyze constant equ : IF type <> bold THEN rts err ("NAME ERWARTET") FI; const name := sym; next sym; IF sym <> "=" THEN rts err ("^=^ ERWARTET") FI; get constant. end of constants : next sym; IF sym = "/" OR sym = "," THEN next sym; FALSE ELSE TRUE FI. get constant : next sym; value := 1.0; IF sym = "-" THEN value := -1.0; next sym ELIF sym = "+" THEN next sym FI; IF type = number THEN value := value * real (sym) ELSE rts err ("ZAHL ERWARTET") FI. dump consts : INT VAR i; FOR i FROM 1 UPTO CONCR (constants).tab size REP IF (i MOD 2) = 1 THEN line; shift FI; out (text (CONCR (constants).name (i), 14), " = ", text (text (CONCR (constants).value (i)), 13)) END REP; line. END PROC run time system; PROC shift : out (" ") END PROC shift; PROC init rts : line no := 0; page no := 0; asterisk buffer := ""; print buf := ""; print := FALSE; terminal stop := FALSE; is not first := FALSE; vdt on := TRUE END PROC init rts; PROC protokoll (BOOL CONST b) : protocoll := b END PROC protokoll; PROC print line : BOOL VAR b := print; (* Druckt Ausgabe - Puffer und *) println (print buf); (* loescht anschliessend den Inhalt *) print buf := ""; print := b END PROC print line; PROC print suppressed output : IF print buf <> "" (* Druckt Ausgabe - Puffer, *) THEN println (print buf); (* falls gefuellt *) print buf := "" FI END PROC print suppressed output; PROC print output (TEXT CONST t) : print buf CAT t; (* Fuellt Ausgabe - Puffer *) print buf CAT " " END PROC print output; PROC println (TEXT CONST t) : print := TRUE; (* Verteilt Ausgabe auf Bildschirm *) line no INCR 1; (* und Datei *) outline (t); IF line no = max page length THEN line no := 0 FI; IF is getcharety (esc) (* bis einschl. 1.8.1: 'is incharety' *) THEN terminal stop := TRUE FI. END PROC println; PROC outline (TEXT CONST t) : printline (t); putline (actual line). actual line : IF LENGTH (t) > 78 THEN text (t, 78) ELSE t FI. END PROC outline; PROC printline (TEXT CONST t) : IF protocoll THEN putline (sysout, t) FI END PROC print line; PROC sys page : (* Seitenvorschub auf Bildschirm und Datei *) IF vdt on AND NOT is scroll AND is not first THEN page ELSE is not first := TRUE FI; IF protocoll THEN putline (sysout, "#page#") FI; IF asterisk buffer <> "" THEN page no INCR 1; println ("PAGE " + text (page no, 3) + " : " + asterisk buffer); FI; line no := 0 END PROC sys page; BOOL PROC pagefeed necessary : line no = 0 (* Liefert TRUE, wenn Seitenende erreicht *) END PROC pagefeed necessary; (* ist *) PROC plot output (TEXT CONST t) : println (t); (* Ausgabeprozedur fuer das Plot - Programm *) print := FALSE END PROC plot output; BOOL PROC b stop request : (* Liefert TRUE, wenn 'End'-Kommando im VDT *) terminal stop (* - Modus gegeben wird *) END PROC b stop request; BOOL PROC was print : (* Liefert TRUE, falls Druckerprogramm *) print. (* vorher eine Zeile gedruckt hat *) END PROC was print; PROC vdt : IF vdt on AND is not first (* VDT = Video Data Termination *) THEN do vdt (* Verhindert Scrolling des Bildschirms *) FI. do vdt : TEXT VAR t; out ("TIPPEN SIE : '+'; 'o'; 'e' : "); inchar (t); out (t); IF t = "+" (* '+' = Seitenvorschub *) THEN ELIF t = "o" (* 'o' = Off; VDT wird abgeschaltet *) THEN vdt on := FALSE ELIF t = "e" (* 'e' = End; Programm wird abgebrochen *) THEN terminal stop := TRUE ELSE out (""13""); vdt FI; line. END PROC vdt; PROC asterisk (TEXT CONST t) : asterisk buffer := t END PROC asterisk; PROC out(TEXT CONST a,b,c) : out(a); out(b); out(c) END PROC out; END PACKET rts;