.ds LH Anwendung
.ds RH \f3Monitor\f1
.ds CH - % -
.LP
.bp
.NH 2
.ft B
Monitor **
.ft R
.LP
.sp 10
.NH 3
.ft B
Einf\o'u"'hrung
.ft R
.LP
Der Monitor realisiert die interaktive
Arbeit mit dem DBS \*(yy\.
Die Monitor-Kommandos erlauben in Zusammenarbeit
mit einem Editor und dem \*(yy\-Makro-Prozessor
gewisse Manipulationen an einem Text
von QUEL-Statements, bevor diese aus dem Monitor-Puffer
an den \*(yy\-Parser zur Analyse und zur Veranlassung
ihrer Ausf\o'u"'hrung \o'u"'bergeben werden.
Die Monitor-Kommandos erlauben die Steuerung
der Arbeit mit \*(yy\ aus vorgefertigten Kommandofiles,
die Monitor-Kommandos, Makro-Anweisungen und QUEL-Statements
enthalten k\o'o"'nnen.
.br
Der Monitor ist der front_end_process
des DBS \*(yy\.
Er liest einen Eingabetext
- prim\o'a"'r von standard_input -
und analysiert diesen auf Monitor-Kommandos.
Der Monitor f\o'u"'hrt in seinem Eingabetext gefundene
Monitor-Kommandos sofort aus,
anderer Text wird
in den Monitor-Puffer gestellt.
.br
Beispiele f\o'u"'r eine komplexe Anwendung des Monitors
sind erst in Verbindung mit Makros interessant und
finden sich in der
"Beschreibung des Makro-Prozessors"
und dem Kapitel
"Beispiele f\o'u"'r Monitor und Makro-Prozessor".
.NH 3
.ft B
Modifikationen durch Optionen
.ft R
.LP
Der Monitor wird durch folgende Optionen gesteuert:
.DS I
-d Unterdr\o'u"'ckung der Ausgabe des dayfile
   (s. Startvorgang und Arbeitszyklus)
-s Unterdr\o'u"'ckung der Ausgabe von Prompt-Meldungen
   (s. Startvorgang und Arbeitszyklus)
-a Unterdr\o'u"'ckung des automatischen L\o'o"'schens des
   Monitor-Puffers
   (Ausschalten des autoclear_modus)
   (s.Arbeit mit dem Monitor-Puffer)
.DE
.NH 3
.ft B
Startvorgang und Arbeitszyklus
.ft R
.LP
Beim Start von \*(yy\ wird neben dem 
DBS der Monitor ge\%startet.
.sp 1
Der Monitor definiert den Makro
.DS C
"{pathname}"
.DE
mit dem Pfadnamen des \*(yy\-File-Systems.
(Folgend wird in diesem Kapitel ein File_name
unter diesem Pfadnamen mit
.DS C
ing_db/<file_name>
.DE
symbolisiert.)
.LP
Der Monitor definiert weiter den Makro
.DS C
"{usercode}"
.DE
mit dem 2-Byte-\\*(yy\-Usercode
(s. usersfile des arbeitenden Nutzers.
.sp 1
Der Monitor meldet sich durch Ausgabe der
.DS I
\*(yy\-login-Meldung
.sp 1
"ing_db version <Versions_nummer> login
 <aktuelle_Zeitangabe>"
.DE
.LP
Diese Ausgabe wird durch die
Option "-s" unterdr\o'u"'ckt.
Anschliessend wird das
.DS C
ing_db/sys/etc/dayfile
.DE
angelistet,
was durch die Option "-d"
unterdr\o'u"'ckt werden kann.
Mit der Ausgabe des dayfile sollen den \*(yy\-Nutzern
aktuelle Informationen vermittelt werden.
Da es allen Nutzern angeboten wird,
ist es nicht zur Aufnahme nutzerspezifischer
Informationen geeignet.
.sp 1
Durch den Monitor werden danach
nacheinander die Monitor-Kommandos
.DS B
\einclude ing_db/sys/etc/startup
\einclude <initfile>
.DE
automatisch ausgef\o'u"'hrt,
was zur Abarbeitung von Kommandofolgen f\o'u"'hren
kann,
falls generell im startupfile f\o'u"'r \*(yy\,
oder spezifisch f\o'u"'r den Nutzer
(Angabe im 7.Feld der Nutzerzeile des
ing_db/sys/etc/users)
solche Files angelegt wurden
(s. auch \einclude-Kommando).
.sp 1
Danach geht der Monitor in den Eingabe-Status
und beginnt seinen Arbeitszyklus.
.sp 1
Zu Beginn des Eingabe-Status
meldet sich der Monitor mit den Prompt-Meldungen
.DS C
"<bell_signal> ING_db>"
.DE
wenn der Monitor-Puffer leer ist, oder mit
.DS C
"<bell_signal> ING_db:"
.DE
wenn der Monitor-Puffer nicht leer ist
und zeigt seine Eingabebereitschaft durch das
.DS C
Prompt-Symbol "* "
.DE
zu jedem Zeilenanfang.
Die Ausgabe der Prompt-Meldungen und auch des Prompt-Symbols
wird durch die Option "-s" unterdr\o'u"'ckt.
Davon unber\o'u"'hrt bleibt die Ausgabe
aller anderen folgend aufgez\o'a"'hlten Meldungen
zur Fehleranzeige.
.sp 1
Der Monitor liest den Eingabetext in den Monitor-Puffer,
filtert die Monitor-Kommandos heraus
und f\o'u"'hrt diese sofort aus.
.sp 1
Das spezielle Monitor-Kommando \ego (s.dort)
\o'u"'bergibt den Monitor-Puffer an den Parser,
der die QUEL-Statements analysiert und ausf\o'u"'hren l\o'a"'sst.
Mit \o'U"'bernahme dieses Kommendos meldet der Monitor
.DS C
"I N G _ d b . . . "
.DE
(diese Meldung unterbleibt, wenn die Option "-s" gesetzt ist)
und versetzt sich in einen Warte-Status.
.sp 1
Der Monitor wird nach Abschluss der
Arbeiten des Parsers und den, diesen nachgelagerten
weiteren \*(yy\-Prozessen, wieder in den Eingabe-Status versetzt
und beginnt erneut seinen Arbeitszyklus.
.sp 1
Nach Start von \*(yy\
arbeitet der Monitor von standard_input
(i.d.R. also vom Terminal).
Durch ein \einclude-Kommando (s. dort)
arbeitet er danach file-gesteuert,
sein included_file ist der
Eingabetextspender.
Da man die Files hintereinander liegender
\einclude-Kommandos als Programm-Ebenen
betrachten kann, sagen wir,
der Monitor arbeitet nach Start in der
Basis-Terminal-Ebene
und durch \einclude-Kommandos
in darunter liegenden Programm-Ebenen.
.sp 1
Die Ausgaben des Monitor
erfolgen immer auf standard_output
(i.d.R. also ebenfalls auf dem Terminal).
Die Eingaben der Funktions-Makros
{read...}, {readdefine...} (s.Makro-Prozessor)
erfolgen in allen Programm-Ebenen von standard_input.
.sp 1
Der Arbeitszyklus des Monitor
und damit auch die \*(yy\-Sitzung
wird mit Ausf\o'u"'hrung eines \equit-Monitor-Kommandos (s.dort)
oder nach Einlesen eines <eof> in der Basis-Terminal-Ebene
(s. \einclude-Kommando)
beendet.
.sp 1
Bei der Ausf\o'u"'hrung von Monitor-Kommandos wird der
Makroprozessor (s. dessen Kapitel) benutzt.
Folgend wird der Output-Text, den der Makroprozessor
aus einem Input-Text erzeugt, als
.DS C
< MACRO ( <Input_Text> ) >
.DE
symbolisiert.
.NH 3
.ft B
Arbeit mit dem Monitor-Puffer
.ft R
.LP
Bei der Eingabe vom Terminal wird der Eingabetext
vom Monitor erst als vollst\o'a"'ndige Zeile
(also erst nach Eintasten des <nl> ) \o'u"'bernommen.
Vorher sind Korrekturen mit <kill>
oder <erase> m\o'o"'glich.
Nach \o'U"'bernahme der Zeile k\o'o"'nnen Korrekturen
im Monitor-Puffer nur noch durch die Monitor-Kommandos
\ereset oder \eeditor ausgef\o'u"'hrt werden.
.sp 1
Der Monitor lehnt die Eingabe aller Zeichen,
deren Codewert kleiner als oktal 040 ist,
ausser <tab>, <nl> und <escape>, ab.
Genauer gesagt,
er wandelt sie in ein <blank> um und signalisiert
das durch die Meldung
.DS C
"Zeichen 0** konvertiert in blanks"
.DE
Die im Monitor-Puffer formulierten QUEL-Statements
werden mit einem \ego-Kommando zur Ausf\o'u"'hrung
angewiesen.
Danach kann der Monitor-Puffer
in der Regel gel\o'o"'scht werden.
Das passiert auch im sogenannten autoclear_mode.
Das L\o'o"'schen erfolgt nicht, wenn man sich
nach R\o'u"'ckkehr in den Eingabe-Status des Monitor
sofort noch einmal f\o'u"'r den alten Inhalt
des Monitor-Puffers interessiert.
.sp
Der autoclear_mode wird durch die Option "-a"
abgeschaltet. Mit dieser Option muss man in allen
F\o'a"'llen selbst\o'a"'ndig - durch ein \ereset-Kommando -
den Monitor-Puffer l\o'o"'schen.
.sp 1
Genauer gesagt, l\o'a"'uft folgendes ab:
.br
Nach einem \ego-Kommando
ist der Monitor-Puffer zun\o'a"'chst noch unver\o'a"'ndert.
Er wird jetzt aber zur L\o'o"'schung vorgemerkt.
Diese Vormerkung kann durch die Option "-a"
unterdr\o'u"'ckt werden.
Die Ausf\o'u"'hrung eines vorgemerkten L\o'o"'schens h\o'a"'ngt davon
ab, welches Monitor-Kommando folgt:
.br
Die Kommandos \eappend, \eprint, \elist, \eedit
machen die Vormerkung r\o'u"'ckg\o'a"'ngig;
das Kommando \ereset f\o'u"'hrt ohnehin ein L\o'o"'schen
aus, alle anderen Kommandos ber\o'u"'cksichtigen die
Vormerkung nicht, \eeval setzt sie selbst.
Die Ausf\o'u"'hrung der vorgemerkten L\o'o"'schung
erfolgt unmittelbar vor und anl\o'a"'sslich der Eintragung
des ersten Nicht-Kommando-Zeichens des Eingabetextes in
den Monitor-Puffer.
.sp 1
Durch dieses automatische L\o'o"'schen des Monitor-Puffers
sollen die normalen Arbeitszyklen
.DS I
<QUEL-Statement>
\ego
<neues_QUEL-Statement>
\ego
.DE
oder z.B.
.DS I
<QUEL-Statement>
\ego
\eappend | \eeditor
<Qualifizierung des alten QUEL-Statements>
\ego
.DE
unterst\o'u"'tzt werden.
.NH 3
.ft B
Synchrone Beendigung und
.br
	  asynchrone Unterbrechung
.ft R
.LP
Durch Abgabe eines Interruptsignals
wird der Warte-Status des Monitor beendet.
Das bedeutet, dass die vom Parser initiierten \*(yy\-Prozesse
asynchron zum Abbrechen veranlasst werden
(Achtung: Bei QUEL-Statements, die die Datenbasis \o'a"'ndern,
besteht darin eine gewisse Gefahr!).
Die Abgabe eines Interruptsignals, w\o'a"'hrend sich der Monitor
im Eingabe-Status
befindet,
ist wirkungslos.
.sp 1
Die Abgabe eines Interruptsignals
w\o'a"'hrend der file-gesteuerten Arbeit des
Monitor f\o'u"'hrt zur R\o'u"'ckkehr in die
Basis-Terminal-Ebene.
.sp 1
Ein <EOF> in einer,
unter der Basis-Terminal-Ebene
liegenden Programmebene
(s. \einclude-Kommando)
f\o'u"'hrt zur R\o'u"'ckkehr
in die dar\o'u"'ber liegende Programm-Ebene
und die der letzten zur Beendigung des Monitors
( wie Monitor-\quit-Kommandos ).
.sp 1
.NH 3
.ft B
Struktur der Monitor-Kommandos
.ft R
.LP
Ein Monitor-Kommando ist eine Zeichenfolge der Form
.DS L
        "\e" {<blank>|<tab>} <m_c_name> [<parm>]
.sp 1
mit
.sp 1
        <parm> = 
             {<blank>|<tab>}<Zeichenfolge> <nl> ;
.DE
.DS L
und
        <m_c_name> = 
.sp 1
.DE
.DS
         "H"    | "help"    |
         "a"    | "append"  |
         "b"    | "branch"  |
         "cd"   | "chdir"   |
         "e"    | "ed"      | "edit"  | "editor" |
         "g"    | "go"      |
         "h"    | "help"    |
         "i"    | "include" | "read"  |
         "k"    | "mark"    |
         "l"    | "list"    |
         "p"    | "print"   |
         "q"    | "quit"    |
         "r"    | "reset"   |
         "s"    | "sh"      | "shell" |
         "d"    | "time" | "date"  |
         "v"    | "eval"    |
         "w"    | "write"   |
         "m"    | "monitor";
.DE
.LP
Das sind die Monitor-Kommando-Namen mit ihren Alias-Namen.
.sp 1
Die <parm> sind abh\o'a"'ngig vom jeweiligen Kommandotyp
und werden dort beschrieben.
Es gibt grunds\o'a"'tzlich drei Gruppen von Kommandos:
solche, die
.br
	keinen <parm> haben,
.br
	wahlweise einen <parm> haben,
.br
	unbedingt einen <parm> haben m\o'u"'ssen.
.br
Da <parm> mit <nl> abgeschlossen wird, k\o'o"'nnen Kommandos
der letztgenannten beiden Gruppen nur am Ende einer Zeile
formuliert werden.
Das Zeilenende kann f\o'u"'r einen Monitor-Parameter
nicht durch <backslash><nl> kaschiert werden !
.sp 1
Eine genaue Darstellung der Verwendung der <parm>
in den Monitor-Kommandos ist folgende:
.br
Zur Auswertung des Kommandoparameters wird die Zeichenkette
.DS I
< MACRO( <parm> ) >
.DE
herangezogen.
Input-Text f\o'u"'r den Makro-Prozessor
ist der, im Kommando formulierte Text bis zum <nl>.
Beim \ebranch-Kommando
m\o'u"'ssen beide Parameterteile <b_label> und <b_expr>
vor dem <nl> untergebracht werden.
Vom Output-Text des Makro-Prozessors werden die
Zeichen nach den f\o'u"'hrenden <blank> oder <tab>
bis zum Ende, aber maximal nur 100 Zeichen
genommen (beim \ebranch-Kommando 100 Zeichen f\o'u"'r beide Parameter).
.sp 1
Bei der Analyse des Eingabetextes
versucht der Monitor jede, einem <backslash> ("\e") folgende
Zeichenfolge als Monitor-Kommando zu interpretieren,
unabh\o'a"'ngig davon, ob dem <backslash>
Klammern ( (... oder {... )
oder Quoting-Symbole ( "... oder `... oder /*... )
vorausgegangen sind.
Auch die Formulierung von "\e\e"
f\o'u"'hrt nur dazu, dass das erste "\e" in den Monitor-Puffer
\o'u"'bernommen wird, dann aber die dem zweiten "\e" folgenden
Zeichen auf ein Monitor-Kommando analysiert w\o'u"'rden.
.sp 1
Eine als Monitor-Kommando identifizierte Zeichenfolge
gelangt nicht in den Monitor-Puffer;
wohl aber sonst die gesamte Zeichenfolge
einschliesslich des <backslash>.
.sp 1
Der Monitor liest seine Kommandos nur aus dem Eingabetext;
er kann nicht dazu gebracht werden,
den Monitor-Puffer als Eingabetext zu lesen.
.NH 3
.ft B
Beschreibung der Monitor-Kommandos
.ft R
.LP
Der folgende Abschnitt beschreibt die einzelnen
Monitor-Kommandos. Die Kommando-Schreibweise
in den Zwischen\o'u"'berschriften ist als plausible
Abk\o'u"'rzung der vorn exakt definierten Notation
zu verstehen.
.NH 4
.ft B
Append
.ft R
.LP
.sp 1
\ea
.br
\eappend
.IP
Eine ggf. eingetragene L\o'o"'schvormerkung des Monitor-Puffers
(autoclear_mode)
wird ausgetragen, sodass ein folgender
Eingabetext - jedenfalls beginnend als neue Zeile -
dem bisherigen Monitor-Puffer angef\o'u"'gt wird.
.NH 4
.ft B
Branch
.ft R
.LP
.sp 1
\eb <b_parm>
.br
\ebranch <b_parm>
.IP
	<b_parm> = 
.br
             {<blanc>|<tab>} ["?"<b_expr>]
.br
             {<blanc>|<tab>} <b_label> <nl> ;
.br
.sp 1
Durch das Kommando erfolgt ein bedingter oder unbedingter
Sprung im Eingabetext.
Die Ausf\o'u"'hrung eines Sprungs wird mit der Meldung
.DS C
"Kein Sprung am Terminal"
.DE
abgelehnt, wenn der Eingabetext vom Terminal gelesen wird.
Andernfalls wird im Falle eines auszuf\o'u"'hrenden Sprungs
im Eingabetext
- also im included_file -
die Marke
.DS C
\ek <mark>
.DE
gesucht (s. \ek-Kommando), f\o'u"'r die
.DS C
<MACRO(<label>)> = <mark>
.DE
ist. Wird eine solche Marke gefunden, wird anschliessend
die Eingabe des Eingabetextes mit der, dieser Marke folgenden
Textposition fortgesetzt. Wird keine solche Marke gefunden,
wird versucht, einen Sprung
.DS C
\ebranch {default}
.DE
auszuf\o'u"'hren. Gelingt auch das nicht
(weil der Makro "{default}" nicht definiert ist,
oder im included_file nicht addressiert),
wird darauf mit der Meldung
.DS C
" ? Label <MACRO(<b_label>)>"
" ? Label < MACRO ({default}) > ({default}) " 
.DE
hingewiesen und das included_file folgend verlassen
(folgend wird aus dem Eingabetext <EOF> gelesen (s. \einclude-Kommando)).
.sp 1
Ein unbedingter Sprung ohne die Angabe
"?"<b_expr>
wird in jedem Falle auszuf\o'u"'hren versucht.
Bei einem bedingten Sprung wird der Ausdruck
.DS C
<MACRO(<b_expr>)>
.DE
ausgewertet.
Dieser Ausdruck darf Operatoren und Operanden enthalten.
Operatoren sind:
.DS
**         Potenzieren
- !        Vorzeichen, logische Negation
* / %      Multiplikation, Division, Divisionsrest
+ -        als zweistellige Operationen
> >= < <=  Vergleichsoperatoren
= !=       Gleichheit, Ungleichheit
&          logisches UND
|          logisches inclusives ODER
.DE
.sp 1
Operationen auf gleicher Zeile
sind von gleicher Bindungsst\o'a"'rke, sonst gilt
absteigende Bindung entsprechend der Aufz\o'a"'hlung
zur Festlegung der Bindung von Operationen.
.sp 1
Der Ausdruck
darf als Operanden nur noch ganzzahlig numerische Werte
mit einem Wertebereich zwischen -32768 bis 32767
enthalten, sonst erfolgt nach entsprechenden Meldungen
(s. unten)
ein Abbruch der weiteren Ausdrucksberechnung.
Die Ausdrucksauswertung wird durch die Zeichen
.DS C
<blank>, <tab>, <nl> oder <eof>
.DE
beendet.
.sp 1
Die arithmetischen Operationen werden in \o'u"'blicher
Ganzzahlarithmetik (/: ganzer Teil der Division,
%: Divisionsrest; Division durch 0 ergibt nach Warnung den Wert 0)
berechnet. Die logischen Operationen ( !,=,>,<,| )
deuten bei ihren Operanden <=0 als FALSE und >0 als TRUE.
Die logischen Operationen und die Vergleichsoperationen
liefern den arithmetischen Wert 0 f\o'u"'r FALSE und 1 f\o'u"'r TRUE.
Die Ausdrucksberechnung erfolgt
von links nach rechts,
entsprechend den Bindungsregeln,
geklammerte Teile werden ge- und entkellert.
.sp 1
Bei der Ausdrucksauswertung (nach Makro-Aufl\o'o"'sung)
werden folgende Fehler im Ausdruck erkannt:
.DS B
\ \ \ \ zus\o'a"'tzliche schliessende Klammern
\ \ \ \ am Ende werden ignoriert

\ \ \ \ zus\o'a"'tzliche \o'o"'ffnende Klammern
\ \ \ \ am Ende, ergeben 0 als Ausdruckswert

\ \ \ \ der Ausdruck ist leer,
\ \ \ \ sein Wert ist 0

\ \ \ \ der Ausdruck enth\o'a"'lt nur das
\ \ \ \ nicht akzeptable Zeichen <c>,
\ \ \ \ sein Wert wird 0

\ \ \ \ das gefundene <c> ist kein Operator
\ \ \ \ der Wert wird 0

\ \ \ \ Division durch 0 ergibt den Wert 0
.DE
Ein bedingter Sprung wird ausgef\o'u"'hrt,
wenn die Auswertung des Ausdrucks einen Wert > 0
erbringt. Andernfalls wird die Eingabe des Eingabetextes
hinter <b_label> folgend fortgesetzt.
.NH 4
.ft B
Chdir
.ft R
.LP
.sp 1
\ecd <parm>
.br
\echdir <parm>
.IP
Das vom Nutzer bei Start von \*(yy\
von ihm eingestellte
working_directory bleibt auch
w\o'a"'hrend der Arbeit von \*(yy\ erhalten.
Unter diesem Pfadnamen bestimmte Files
werden im Unterschied zu dem,
durch {Pathname} mit "ing_db" symbolisierten Files,
in diesem Kapitel
als
.DS I
<user_cd> / <file_name>
.DE
symbolisiert.
.sp 1
Das f\o'u"'r den Nutzer vor Start von \*(yy\
eingestellte working_directory wird durch das
\echdir-Monitor-Kommando auf
.DS I
<user_cd> = <MACRO(<parm>)>
.DE
ver\o'a"'ndert;
\o'u"'ber einen Misserfolg dabei informiert die Meldung
.DS C
"cannot access directory  <MACRO(<parm>)>  "
.DE
Der Monitor meldet sich nach Kommando-Ausf\o'u"'hrung
wieder mit einer Prompt-Meldung "ING_db>" oder "ING_db:".
.NH 4
.ft B
Editor
.ft R
.LP
.sp 1
\ee [<parm>]
.br
\eed [<parm>]
.br
\eedit [<parm>]
.br
\eeditor [<parm>]
.IP
Es wird ein Editor aus dem File
.DS C
<MACRO("{editor}")>
.DE
zu laden versucht.
Ist der Makro nicht definiert, wird gleich
ein installationsabh\o'a"'ngiger System-Editor, z.B.
.ft B
ed, vi, rand, 
.ft R
geladen. Gelingt das nicht, erfolgt eine Fehlerausschrift.
Ausserdem wird der Makro {errorcount} mit dem Wert -1 
gef\o'u"'llt und der Macro {exectrap}
mit der Meldung
.DS C
"edit: exec"
.DE
ausgef\o'u"'hrt.
.sp 1
Der Monitor meldet
.DS C
">> <editor_file_name> "
.DE
Danach arbeitet man unter Steuerung des geladenen Editors,
ihm wird als Parameter
.DS C
<MACRO(<parm>)>
.DE
oder falls das Kommando keinen Parameter hatte, der
File-Name des Monitor-Puffers \o'u"'bergeben.
Das bedeutet, dass der Editor das File l\o'a"'dt
und als currentfile einstellt.
.sp 1
Im Falle der Arbeit auf dem Monitor-Puffer kommen mit
dem Editor ausgef\o'u"'hrte \o'A"'nderungen nur dann dort an,
wenn dem Editor ein w-Editor-Kommando vor \o'A"'nderung
seines currentfile gegeben wird. Jedenfalls wird bei Ausf\o'u"'hrung
eines \ee-Monitor-Kommandos eine ggf. eingetragene L\o'o"'schvormerkung
f\o'u"'r den Monitor-Puffer (autoclear_mode) ausgetragen.
.sp 1
Nat\o'u"'rlich kann nach der Arbeit auf dem Monitor-Puffer
oder \o'u"'berhaupt auch in anderen Files editiert werden.
Beachten sie bei der Formulierung von File-Namen,
dass user_cd als current_directory (s. \echdir-Kommando)
eingestellt ist.
.sp 1
Nach einem q-Editor-Kommando f\o'u"'r 
den System-Editor oder einer anderen Beendigung des
geladenen Editors erfolgt die
R\o'u"'ckkehr zum \*(yy\-Monitor.
Der Monitor ruft f\o'u"'r den Fall,
dass der Editor einen R\o'u"'ckkehrcode\ !=\ 0 lieferte,
den Makro {exectrap}. Vorher wird der Makro {errorcount}
mit dem exit-Status des Editors gef\o'u"'llt. Das erfolgt so,
als g\o'a"'be man selbst das Monitor-Kommando
.DS C
{exectrap}\eeval
.DE
.NH 4
.ft B
Go
.ft R
.LP
.sp 1
\eg
.br
\ego
.IP
Mit diesem Kommando werden QUEL-Statements zur Ausf\o'u"'hrung
angewiesen.
Der Monitor zeigt die Kommando\o'u"'bernahme mit der Prompt-Meldung
.DS C
"I N G - d b . . ."
.DE
an und beendet damit seinen Eingabe-Status f\o'u"'r die Dauer der
Arbeit des Parsers und der diesem nachgelagerter Prozesse.
.sp 1
Dem Parser wird die vom Makro-Prozessor verarbeitete Verkettung
folgender Texte \o'u"'bergeben:
.DS I
< MACRO ( <MACRO("{begintrap}")>,
          <Monitor-Puffer>,
          <MACRO("{endtrap"})> ) >
.DE
Man achte darauf,
dass der Monitor-Puffer so bereinigt wurde,
dass dem Parser nur QUEL-Statements
\o'u"'bergeben werden, er signalisiert sonst Fehler.
.sp 1
Nachdem die Arbeit des Parsers und dessen nach\%gelagerter Prozesse
bei der Ausf\o'u"'hrung der QUEL-Statements beendet ist,
arbeitet der Monitor weiter.
Der Monitor \o'u"'bernimmt N als Anzahl der
bearbeiteten Tupel und definiert den Makro {tuplecount} als
.DS C
{define; {tuplecount}; N}
.DE
Der Monitor arbeitet den Makro {continuetrap} ab,
als h\o'a"'tte man das Monitor-Kommando
.DS C
{continuetrap} \eeval
.DE
(s. Makroprozessor) gegeben. Der Monitor zeigt seine
Eingabebereitschaft durch die Prompt-Meldungen "ING_db>" oder "ING_db:"
an.
.sp 1
Nach einem \ego-Kommando ist der Monitor-Puffer zun\o'a"'chst
noch unver\o'a"'ndert;
er ist jetzt aber zur L\o'o"'schung vorgemerkt
(autoclear_mode).
Diese L\o'o"'schvormerkung wird durch die Option "-a"
unterdr\o'u"'ckt.
.sp 1
Wenn die Er\o'o"'ffnung des Monitor-Puffers f\o'u"'r den Makro-Prozessor
nicht gelingt, erfolgt ein Systemabbruch mit der Meldung
.DS C
"go: open 1"
.DE
.NH 4
.ft B
Help
.ft R
.LP
.sp 1
\eh [<parm>]
.br
\ehelp [<parm>]
.br
.IP
Der Monitor w\o'a"'hlt mit Angabe <parm> aus ../sys/ref die
Kurzdokumentation zum \*(yy\-Kommando und schreibt auf "std_out".
Ohne <parm> wird das Inhaltsverzeichnis ausgegeben.
.NH 4
.ft B
Include und Read
.ft R
.LP
.sp 1
\ei <parm>
.br
\einclude <parm>
.br
\eread <parm>
.IP
Dem Monitor wird das File
.DS I
<user_cd> / <MACRO(<parm>)>
.DE
als Eingabetextspender zugeordnet. Das Kommando wirkt wie ein
Sprung an den Anfang dieses File.
.sp 1
Fehlt <parm> oder ist <MACRO(<parm>)> leer, wirkt das
Kommando so, dass das folgende Zeichen des dem Monitor
angeschlossenen Eingabetextes <eof> wird.
Das bedeutet, dass ein included_file folgend verlassen wird;
in der Basis-Terminal-Ebene tritt der Effekt
wie nach einem \equit-Kommando ein.
.sp 1
Andernfalls wird das durch <MACRO(<parm>)> bezeichnete File
zum k\o'u"'nftigen Eingabetextspender f\o'u"'r den Monitor (es sei denn
die Meldung
.DS C
"open INCLUDE file <MACRO(<parm>)> "
.DE
zeigt den Abbruch der Kommandobearbeitung an).
Solange der Monitor "file-gesteuert" arbeitet,
werden die Prompt-Meldungen wie durch die \*(yy\-Option "-s"
unterdr\o'u"'ckt.
.sp 1
F\o'u"'r die Funktions-Makros {read...}, {readdefine...}
(s. Makro-Prozessor) bleibt auch bei dieser Arbeitsweise
des Monitor
das Terminal (genauer standard_input) das Eingabemedium.
.sp 1
Das angeschlossene File darf weitere \einclude-Kommandos
enthalten; diese sind bis zu einer Schachtelungstiefe
von 5 (diese Anzahl ist generierungsf\o'a"'hig)
hierarchisch hintereinander liegender \einclude-Kommandos
erlaubt.
Ggf. erfolgt eine Kommandoabweisung durch die Meldung
.DS C
"Mehr als 5 INCLUDE'S"
.DE
Liest der Monitor aus dem included_file <eof>
(nachdem es sequentiell durchlesen wurde, oder bei
Nichterfolg eines dort enthaltenen Monitor-Kommandos),
wird das File verlassen; die Monitoreingabe wird mit
dem Text des File hinter dem letztwirksamen \einclude-Kommando
fortgesetzt.
.sp 1
Bei R\o'u"'ckkehr in die Basis-Terminal-Ebene
meldet sich der Monitor - falls nicht "-s" gesetzt war -
wieder mit einer Prompt-Meldung "ING_db>" oder "ING_db:".
Die Abgabe eines <eof> in der Basis-Terminal-Ebene
hat die gleiche Wirkung wie das \equit-Kommando:
die \*(yy\-Sitzung wird synchron beendet.
.sp 1
Ist <MACRO(<parm>)> das einzelne Zeichen "-",
erfolgt die Meldung
.DS C
"<Eingabe>"
.DE
und der k\o'u"'nftige Eingabetext f\o'u"'r den Monitor wird
wieder vom Terminal (standard_input) gelesen. Das ist nicht die oben
erw\o'a"'hnte Basis-Terminal-Ebene; durch Abgabe eines
<eof> vom Terminal erfolgt kein Sitzungs\%abbruch, sondern es
wird wieder das File zum Eingabetextspender,
aus dem das "\einclude -" abgesetzt worden war.
Das er\o'o"'ffnet die M\o'o"'glichkeit, unter grunds\o'a"'tzlicher
Steuerung durch ein File, zwischenzeitlich in freiem Format
vom Terminal zu lesen. Das Nachrichtenlevel f\o'u"'r die
Promptmeldungen ("-s" oder nicht) ist w\o'a"'hrend dieser Arbeit am Terminal
wieder so, wie f\o'u"'r die \*(yy\-Sitzung eingestellt.
.NH 4
.ft B
Mark
.ft R
.LP
.sp 1
\ek <parm>
.br
\emark <parm>
.IP
Der Eingabetext enth\o'a"'lt eine Marke als Zielangabe
eines ggf. auszuf\o'u"'hrenden \ebranch-Kommandos.
Das Kommando selbst ist wirkungslos.
Der Eingabetext wird bis hinter <parm> \o'u"'berlesen;
der Monitor-Puffer wird folgend jedenfalls mit einer
neuen Zeile weiter beschrieben,
der Monitor meldet sich wieder mit einem Prompt-Symbol.
Anl\o'a"'sslich der Ausf\o'u"'hrung eines \ebranch-Kommandos
wird das included_file von vorn beginnend nach der
zutreffenden Marke abgesucht.
.NH 4
.ft B
List
.ft R
.LP
.sp 1
\el
.br
\elist
.IP
Der vom Makro-Prozessor aus dem verketteten Text erzeugte Text
.DS B
< MACRO( <MACRO("{begintrap}")>,
         <Monitor-Puffer>,
         <MACRO("{endtrap}")> ) >
.DE
wird auf dem Terminal angelistet. Man erh\o'a"'lt dadurch
Auskunft, welcher Text tats\o'a"'chlich dem Parser mit einem
\ego-Kommando angeboten w\o'u"'rde. Weiterhin werden durch die
Arbeit des Makro-Prozessors die
Funktions-Makros
(s. Makro-Prozessor) bearbeitet.
Der Monitor-Puffer bleibt unver\o'a"'ndert.
(Achtung: Dadurch, dass bei der ersten Verwendung des Kommandos
ggf. Substitutions-Makros definiert werden, kann die wiederholte Anwendung
des Kommandos andere Ergebnisse bringen.)
.sp 1
Eine ggf. eingetragene L\o'o"'schvormerkung f\o'u"'r den Monitor-Puffer
wird ausgetragen (autoclear_mode).
.NH 4
.ft B
Monitor
.ft R
.LP
Mit dem Monitor-Kommando l\o'a"'sst sich das standardm\o'a"'ssige
Kommandokennzeichen 
.ft B
"\e"
.ft R
umdefinieren. Fehlt das Argument <parm>, wird wieder auf den 
Standard zur\o'u"'ckgeschaltet. 
.br
Die Neudefinition des Kommandokennzeichens sollte nur dann vorgenommen 
werden, wenn das Zeichen
.ft B
"\e"
.ft R
nicht oder nur umst\o'a"'ndlich erreicht werden kann.
.br
Es wird darauf hingewiesen, dass bei Neudefinition des 
Kommandokennzeichens Monitor-Kommandodateien unter 
Umst\o'a"'nden nicht mehr abarbeitungsf\o'a"'hig sind.
.NH 4
.ft B
Print
.ft R
.LP
.sp 1
\ep
.br
\eprint
.IP
Der Inhalt des Monitor-Puffers
wird ohne Ver\o'a"'nderung durch den Makro-Prozessor
auf dem Terminal
angelistet. Eine ggf. eingetragene L\o'o"'schvormerkung f\o'u"'r den
Monitor-Puffer wird ausgetragen (autoclear_mode).
Der Monitor meldet sich nach Kommandoausf\o'u"'hrung wieder
mit einer Prompt-Meldung "ING_db>" oder "ING_db:".
.NH 4
.ft B
Quit
.ft R
.LP
.sp 1
\eq
.br
\equit
.IP
Die \*(yy\-Sitzung wird synchron beendet. Falls nicht die \*(yy\ 6.3-Option "-s"
gesetzt war, erfolgt abschliessend die
.DS
\*(yy\-logout-Meldung
.sp 1
"ing_db vers <Versionsnummer> logout
 <Zeitangabe>
 Auf Wiedersehen [<Nutzername>] -- Kommen Sie bald wieder"
.DE
.NH 4
.ft B
Reset
.ft R
.LP
.sp 1
\er
.br
\ereset
.IP
Der Inhalt des Monitor-Puffers wird gel\o'o"'scht.
.NH 4
.ft B
Shell
.ft R
.LP
.sp 1
\es [<parm>]
.br
\esh [<parm>]
.br
\eshell [<parm>]
.IP
Das Kommando dient der Ausf\o'u"'hrung von \*(xx\-Programmen
w\o'a"'hrend der \*(yy\-Sitzung, insbesondere unter
Steuerung des \*(xx\-Kommandointerpreters SHELL.
Das Kommando kann weitreichender benutzt werden.

Es wird ein neuer process "geforkt" (Systemabbruch mit Meldung
"shell: fork", wenn das nicht gelingt),
ein Programm geladen und
die Meldung
.DS C
">> <loaded_file_name> "
.DE
gebracht.
Das Programm wird als File
.DS C
<MACRO("{shell}")>
.DE
zu laden versucht. Ist dieser Makro definiert und ge\%lingt der
Ladevorgang nicht, wird der Makro
{errorcount} auf -1 gesetzt und der Makro {exetrap} ausgef\o'u"'hrt.
.IP
Gelingt der Ladevorgang,
wurde dem gerufenen Programm als 0.Parameter
der Programmname,
als 1.Parameter der File_name
des Monitor-Puffers
und als 2.Parameter
der Wert des ggf. durch den Makro-Prozessor transformierten
\eshell-Kommandoparameters \o'u"'bergeben.
.LP
Ist der Makro nicht definiert,
wird eine instal\%lation\%sab\%h\o'a'n\%gige
SHELL aufgerufen.
.DS C
//sh//csh//vsh
.DE
geladen.
.br
Gelingt das nicht, erfolgt ein Systemabbruch mit der Meldung
.DS C
"shell: exec"
.DE
.sp 1
Falls in diesem Falle das \eshell-Kommando keinen <parm> hatte,
wird die geladene SHELL als interaktive SHELL gestartet;
durch Abgabe eines quit-SHELL-Signals kommt man in den
Monitor zur\o'u"'ck.
Falls das \eshell-Kommando <parm> hatte,
wird \o'u"'ber eine SHELL das, durch MACRO(<parm>)
bezeichnete, SHELL-Kommando aufgerufen.
Man beachte, dass <parm> aus mehreren
durch <blank> getrennten W\o'o"'rtern bestehen darf
(<parm> reicht bis zum nicht kaschierbaren Zeilenende
des Monitor-Kommandos !).
Dadurch k\o'o"'nnen dem SHELL-Kommando Parameter
\o'u"'bermittelt werden.
Die R\o'u"'ckkehr zum Monitor erfolgt automatisch mit
Beendigung des aufgerufenen SHELL-Kommandos.
.sp 1
In Auswertung eines R\o'u"'ckkehrcodes
des aufgerufenen Programms,
der interaktiven SHELL oder des SHELL-Kommandos
erfolgt
durch den \*(yy\-Monitor
die Ausf\o'u"'hrung des {exectrap}, wenn der
R\o'u"'ckkehrcode\ !=\ 0 war.
Das erfolgt in einer Form, als g\o'a"'be man selbst
das Monitor-Kommando
.DS C
{exectrap}\eeval
.DE
Nach R\o'u"'ckkehr aus der SHELL ist der Monitor wieder im vorangehend
verlassenen Eingabe-Status.
.NH 4
.ft B
Time und Date
.ft R
.LP
.sp 1
\ed
.br
\etime
.br
\edate
.IP
Die aktuelle Zeit wird auf dem Terminal ausgegeben.
Im Monitor-Puffer wird ein Zeilenwechsel eingetragen.
.NH 4
.ft B
Eval
.ft R
.LP
.sp 1
\ev
.br
\eeval
.IP
Dem Makro-Prozessor wird der 
Monitor-Puffer als Eingabetext
angeboten, wodurch insbesondere die define-Makros
in die Makro-Tabelle \o'u"'bernommen (s. Makro-Prozessor),
aber ggf. auch andere Funktions-Makros abgearbeitet werden.
.sp 1
Im Unterschied zum \elist-Kommando erfolgt
keine Einbe\%ziehung von {begintrap} und {endtrap}
und keine Anli\%stung des
Makro-Ausgabetextes.
Es erfolgen aber die auf standard_output
wirkenden Ausgaben der
{dump;...}-, {type;...}- und {read....}-Makros.
Weiterhin wird anschliessend der Monitor-Puffer
zum L\o'o"'schen vorgemerkt (falls nicht "-a" gesetzt war,
autoclear_mode).
.sp 1
Damit ist das \eeval-Kommando
das f\o'u"'r die Abarbeitung von Funktions-Makros
zu bevorzugende Kommando (s. Makro-Prozessor)
.sp 1
Der Monitor meldet sich nach Kommando-Ausf\o'u"'hrung mit einer
Prompt-Meldung "ING_db>" oder "ING_db:".
.NH 4
.ft B
Write
.ft R
.LP
.sp 1
\ew <parm>
.br
\ewrite <parm>
.IP
Der Monitor-Puffer wird auf das File
.DS C
<user_cd> / <MACRO(<parm>)>
.DE
(s. \echdir-Kommando) ausgeschrieben
(das File wird mit Modus 0644 cre\o'i"'ert).
.sp 1
Es k\o'o"'nnen folgende Fehlermeldungen den Misserfolg anzeigen:
.DS B
"unakzeptabler file name <MACRO(<parm>)>"
"create WRITE-file <MACRO(<parm>)>"
.DE
.sp 1
Nach Ausf\o'u"'hrung des Kommandos meldet sich der Monitor
wieder mit einer Prompt-Meldung "ING_db>" oder "ING_db:".
.sp 1
.LP
Der Monitor als Programm-Prozess bringt einige Fehlermeldungen,
die sich auf die Ausgabe von Fehlertexten aus anderen
\*(yy\-Prozessen beziehen, wenn die dazu n\o'o"'tigen Fehlertext-Files
nicht lesbar, oder syntaktisch regelwidrig sind.

