hodza/BlackBox.Shkola.2014 huggingface dataset:
Comm/Docu/ru/TCP.odc

CommTCP

Драйвер для CommStreams.
Он реализует каналы TCP/IP, используя механизм сокетов операционной системы. Предоставляются фабрики-функции NewListener и NewStream, которые вызываются из CommStreams. Не импортируйте CommTCP напрямую; вместо этого используйте CommStreams и задавайте "CommTCP" в качестве имени протокола.

Параметры localAdr и remoteAdr:
Процедуры CommStreams.NewStream и NewListener используют строковые параметры remoteAdr и localAdr. Интерпретация передаваемых строк зависит от реализации конкретного модуля драйвера. Для CommTCP это выглядит так.

remoteAdr (используется только с NewStream) должен быть или IP-адресом, или именем узла, за которым следует двоеточие (":") и номер порта. (Примеры: "127.0.0.1:2", "loopback:2".)

Параметр localAdr идентифицирует порт, на котором устанавливается слушатель (NewListener) или принимается удаленное подключение (NewStream). Корректными значениями могут быть
-	пустая строка
-	IP-адрес или имя узла
-	IP-адрес или имя узла, за которыми следует многоточие и номер порта
-	номер порта (Примеры: "2")
В случае, когда IP-адреса / имена узлов и/или номера портов неопределены, используется шаблон, предписывающий операционной системе выбрать их произвольным образом. Если при вызове NewListener для localAdr не указано ни IP-адреса, ни имени узла, слушатель будет работать для всех IP-адресов, доступных на локальной машине.
Comm/Mod/ObxStreamsServer.odc

MODULE CommObxStreamsServer;
(**
	project	= "BlackBox"
	organization	= "www.oberon.ch"
	contributors	= "Oberon microsystems"
	version	= "System/Rsrc/About"
	copyright	= "System/Rsrc/About"
	license	= "Docu/BB-License"
	changes	= "
	- YYYYMMDD, nn, ...
	"
	issues	= "
	- ...
	"

**)

	IMPORT Services, CommStreams, Views, TextModels, TextViews, StdLog;

	CONST
		protocol = "CommTCP";			(* driver for TCP/IP communication, over Winsock *)
		localAdr = "900";					(* this is the port on which the server listens *)

	TYPE
		Server = POINTER TO RECORD (Services.Action)
			listener: CommStreams.Listener	(* the server listens using this object and accepts incoming connections*)
		END;

		Processor = POINTER TO RECORD (Services.Action)
			prev, succ: Processor;	(* linked to allow stopping of all active processors with Stop command *)
			stream: CommStreams.Stream;	(* for each connection, a receiver communicates through this object *)
			writer: TextModels.Writer
		END;

	VAR
		server: Server;
		processors: Processor;

	PROCEDURE (server: Server) Do;
		VAR s: CommStreams.Stream; p: Processor; t: TextModels.Model;
	BEGIN
		server.listener.Accept(s);	(* poll for a connection *)
		IF s # NIL THEN	(* upon accept create and start processor for new connection *)
			NEW(p); p.prev := NIL; p.succ := processors; processors := p;
			IF p.succ # NIL THEN p.succ.prev := p END;
			p.stream := s;
			t := TextModels.dir.New(); p.writer := t.NewWriter(NIL);
			Views.OpenAux(TextViews.dir.New(t), "Message");
			Services.DoLater(p, Services.now)
		END;
		Services.DoLater(server, Services.now)
	END Do;

	PROCEDURE (p: Processor) Do;
		VAR buf: ARRAY 256 OF BYTE; read, i: INTEGER;
	BEGIN
		p.stream.ReadBytes(buf, 0, LEN(buf), read);	(* poll for incoming data *)
		IF read > 0 THEN	(* write received data into log *)
			i := 0; WHILE i # read DO p.writer.WriteChar(CHR(buf[i])); INC(i) END;
			Services.DoLater(p, Services.now)
		ELSIF p.stream.IsConnected() THEN
			Services.DoLater(p, Services.now)
		ELSE
			IF p.prev # NIL THEN p.prev.succ := p.succ ELSE processors := p.succ END;
			IF p.succ # NIL THEN p.succ.prev := p.prev END
		END
	END Do;


	PROCEDURE Start*;
		VAR l: CommStreams.Listener; res: INTEGER;
	BEGIN
		IF server = NIL THEN
			CommStreams.NewListener(protocol, localAdr, l, res);
			IF l # NIL THEN
				NEW(server); server.listener := l; Services.DoLater(server, Services.now);
				StdLog.String("server: server started"); StdLog.Ln
			ELSE
				StdLog.String("server: error starting the server ("); StdLog.Int(res); StdLog.Char(")"); StdLog.Ln
			END
		END
	END Start;

	PROCEDURE Stop*;
	BEGIN
		WHILE processors # NIL DO
			processors.stream.Close; Services.RemoveAction(processors);
			processors := processors.succ
		END;
		IF server # NIL THEN
			Services.RemoveAction(server);
			server.listener.Close;
			server := NIL;
			StdLog.String("server: server stopped"); StdLog.Ln
		END
	END Stop;

CLOSE
	Stop	(* prevent the server from trapping after module unloading *)
END CommObxStreamsServer.

 CommObxStreamsServer.Start
 CommObxStreamsServer.Stop
Comm/Mod/Streams.odc

MODULE CommStreams; 
(**
	project	= "BlackBox"
	organization	= "www.oberon.ch"
	contributors	= "Oberon microsystems"
	version	= "System/Rsrc/About"
	copyright	= "System/Rsrc/About"
	license	= "Docu/BB-License"
	changes	= "
	- YYYYMMDD, nn, ...
	"
	issues	= "
	- ...
	"

**)

	IMPORT Meta;

	CONST
		(* portable error codes: *)
		done* = 0; noSuchProtocol* = 1; invalidLocalAdr* = 2; invalidRemoteAdr* = 3; networkDown* = 4;
		localAdrInUse* = 5; remoteAdrInUse* = 6;

	TYPE
		Adr* = POINTER TO ARRAY OF CHAR;
		
		Stream* = POINTER TO ABSTRACT RECORD END;
		
		StreamAllocator* = PROCEDURE
			(localAdr, remoteAdr: ARRAY OF CHAR; OUT s: Stream; OUT res: INTEGER);

		Listener* = POINTER TO ABSTRACT RECORD END;
		
		ListenerAllocator* = PROCEDURE
			(localAdr: ARRAY OF CHAR; OUT l: Listener; OUT res: INTEGER);


	PROCEDURE (s: Stream) RemoteAdr* (): Adr, NEW, ABSTRACT;
	PROCEDURE (s: Stream) IsConnected* (): BOOLEAN, NEW, ABSTRACT;
	PROCEDURE (s: Stream) WriteBytes* (
		IN x: ARRAY OF BYTE; beg, len: INTEGER; OUT written: INTEGER), NEW, ABSTRACT;
	PROCEDURE (s: Stream) ReadBytes* (
		VAR x: ARRAY OF BYTE; beg, len: INTEGER; OUT read: INTEGER), NEW, ABSTRACT;
	PROCEDURE (s: Stream) Close*, NEW, ABSTRACT;

	PROCEDURE NewStream* (protocol, localAdr, remoteAdr: ARRAY OF CHAR; OUT s: Stream; OUT res: INTEGER);
		VAR ok: BOOLEAN; m, p: Meta.Item; mod: Meta.Name;
			v: RECORD (Meta.Value)
				p: StreamAllocator
			END;
	BEGIN
		ASSERT(protocol # "", 20);
		res := noSuchProtocol;
		mod := protocol$; Meta.Lookup(mod, m);
		IF m.obj = Meta.modObj THEN
			m.Lookup("NewStream", p);
			IF p.obj = Meta.procObj THEN
				p.GetVal(v, ok);
				IF ok THEN v.p(localAdr, remoteAdr, s, res) END
			END
		END
	END NewStream;

	PROCEDURE (l: Listener) LocalAdr* (): Adr, NEW, ABSTRACT;
	PROCEDURE (l: Listener) Accept* (OUT s: Stream), NEW, ABSTRACT;
	PROCEDURE (l: Listener) Close*, NEW, ABSTRACT;

	PROCEDURE NewListener* (protocol, localAdr: ARRAY OF CHAR; OUT l: Listener; OUT res: INTEGER);
		VAR ok: BOOLEAN; m, p: Meta.Item; mod: Meta.Name;
			v: RECORD(Meta.Value)
				p: ListenerAllocator
			END;
	BEGIN
		ASSERT(protocol # "", 20);
		res := noSuchProtocol;
		mod := protocol$; Meta.Lookup(mod, m);
		IF m.obj = Meta.modObj THEN
			m.Lookup("NewListener", p);
			IF p.obj = Meta.procObj THEN
				p.GetVal(v, ok);
				IF ok THEN v.p(localAdr, l, res) END
			END
		END
	END NewListener;

END CommStreams.
Dev/Docu/AlienTool.odc

DevAlienTool

DEFINITION DevAlienTool;

	PROCEDURE Analyze;

END DevAlienTool.


Alien views are views which, for some reason, cannot be loaded correctly. The reason may be a programming error, e.g. a different number of bytes is read than was written, or it may be a version problem (an unknown version was detected). Usually however, the problem is that some code for the view cannot be loaded, because it is missing or inconsistent. The alien tool helps to analyze such problems.

PROCEDURE Analyze
Guard: StdCmds.SingletonGuard
This command analyzes the singleton alien view, and opens a window with the textual analysis.
Dev/Docu/Cmds.odc

DevCmds

DEFINITION DevCmds;

	IMPORT Dialog;

	PROCEDURE FlushResources;
	PROCEDURE OpenModuleList;
	PROCEDURE OpenFileList;
	PROCEDURE RevalidateViewGuard (VAR par: Dialog.Par);
	PROCEDURE RevalidateView;
	PROCEDURE SetCancelButton;
	PROCEDURE SetDefaultButton;
	PROCEDURE ShowControlList;

END DevCmds.


Possible menu:

MENU
	"&Open Module List"	""	"DevCmds.OpenModuleList"	"TextCmds.SelectionGuard"
	"Open &File List"	""	"DevCmds.OpenFileList"	"TextCmds.SelectionGuard"
	"Flus&h Resources"	""	"DevCmds.FlushResources"	""
	"Re&validate View"	""	"DevCmds.RevalidateView"	"DevCmds.RevalidateViewGuard"
	SEPARATOR
	"&Control List"	""	"DevCmds.ShowControlList"	"StdCmds.ContainerGuard"
	"Set &Default Button"	""	"DevCmds.SetDefaultButton"	"StdCmds.ContainerGuard"
	"Set Canc&el Button"	""	"DevCmds.SetCancelButton"	"StdCmds.ContainerGuard"
END


PROCEDURE FlushResources
Flush menu guard and string translation resources. This command is needed when a menu item is disabled because its code could not be executed, but since then the code has become executable (e.g., due to a recompilation of a module, and possibly unloading an old module version). It is also needed if the string resource texts have been edited and saved, if the changes should become effective immediately, rather than only when BlackBox is started the next time.

PROCEDURE OpenModuleList
Guard: TextCmds.SelectionGuard
Opens the modules whose names are selected, e.g.,
"FormModels FormViews".

PROCEDURE OpenFileList
Guard: TextCmds.SelectionGuard
Opens the files whose names are selected. The names must use the portable path name syntax, e.g.,
"Form/Mod/Models Form/Mod/Views".

PROCEDURE RevalidateViewGuard (VAR par: Dialog.Par)
Menu guard for Revalidate View.

PROCEDURE RevalidateView
Guard: RevalidateViewGuard
A view may have become invalid after a trap occurred. As a result, the view is greyed out and made passive (so that the same trap cannot occur anymore, thus preventing trap avalanches). However, sometimes it can be useful to revalidate the view and continue to work with it.

PROCEDURE SetCancelButton
Guard: StdCmds.ContainerGuard
Makes the selected view in the focus container a "cancel" button, i.e., in mask mode (-> Containers) it is considered pressed when the user enters the escape character.

PROCEDURE SetDefaultButton
Guard: StdCmds.ContainerGuard
Makes the selected view in the focus container a "default" button, i.e., in mask mode (-> Containers) it is considered pressed when the user enters a carriage return character.

PROCEDURE ShowControlList
Guard: StdCmds.ContainerGuard
Lists the properties of all views in the focus container which return control properties (-> Controls).
Dev/Docu/Commanders.odc

DevCommanders

DEFINITION DevCommanders;

	TYPE
		Par = POINTER TO RECORD 
			text: TextModels.Model;
			beg, end: INTEGER
		END;

	VAR
		par: Par;

	PROCEDURE Deposit;
	PROCEDURE DepositEnd;
	... plus some private items ...

END DevCommanders.


A commander is a view which interprets and executes the command or command sequence written behind the commander. It only operates when embedded in a text.
Commanders can be useful during development; e.g., they may be embedded directly in the source code of a program. They are not intended for use in end-user applications, due to their non-standard user interface experience.

Typical menu:
"Insert Commander"	""	"DevCommanders.Deposit; StdCmds.PasteView"	"StdCmds.PasteViewGuard"
"Insert EndCommander"	""	"DevCommanders.DepositEnd; StdCmds.PasteView"	"StdCmds.PasteViewGuard"


TYPE Par
Parameter context of a command's execution. This is used with commands such as
	DevCompiler.CompileThis ObxViews1 ObxViews2

text: TextModels.Model
The text containing the activated commander and command.

beg: INTEGER
Begin of the parameters to the command, that is, the text position immediately behind the last character of the command itself.

end: INTEGER
End of the parameters to the command. This is either the end of the text or the position of the next commander or EndView in the text.


VAR par-: Par	par # NIL exactly during the currently executed command
A command can get access to the text, and thus to its context, via this variable during the execution of the command.


PROCEDURE Deposit
Deposit command for commanders.

PROCEDURE DepositEnd
Deposit command for a DevCommanders.EndView. Marks the end of the command for the preceding commander. If no end view is present the commander reads until another commander is found or until the text ends.

This module contains several other items which are used internally.
Dev/Docu/Compiler.odc

DevCompiler

DEFINITION DevCompiler;

	PROCEDURE Compile;
	PROCEDURE CompileAndUnload;
	PROCEDURE CompileModuleList;
	PROCEDURE CompileSelection;
	PROCEDURE CompileThis;
	... plus some private commands ...

END DevCompiler.


Command package for the Component Pascal compiler. The compiler has no compiler options. Safety-critical runtime checks are always performed (type guards, array range checks, etc.), while non-critical runtime checks may not be generated (SHORT, integer overflows, testing of set membership). "Critical" means that non-local memory may be destroyed, with unknown global effects.

Typical menu:

MENU
	"&Compile"	""	"DevCompiler.Compile"	"TextCmds.FocusGuard"
	"Compile and Unload"	""	"DevCompiler.CompileAndUnload"	"TextCmds.FocusGuard"
	"Compile &Selection"	""	"DevCompiler.CompileSelection"	"TextCmds.SelectionGuard"
	"Com&pile Module List"	""	"DevCompiler.CompileModuleList"	"TextCmds.SelectionGuard"
END


PROCEDURE Compile
Guard: TextCmds.FocusGuard
Compile the Component Pascal module whose source is in the focus view.

PROCEDURE CompileAndUnload
Guard: TextCmds.FocusGuard
Compile the module whose source is in the focus view. If compilation is successful, it is attempted to unload the old version of this module. CompileAndUnload is convenient when developing top-level modules, i.e., modules which are not imported by any other modules, and thus can be unloaded individually.

PROCEDURE CompileModuleList
Guard: TextCmds.SelectionGuard
Compile the list of modules whose names are selected. When the first error is detected, the offending source is opened to show the error.

PROCEDURE CompileSelection
Guard: TextCmds.SelectionGuard
Compile the module, whose beginning is selected.

PROCEDURE CompileThis
Used in a text with a DevCommanders.View. This command takes the text following it and interprets it as a list of modules that should be compiled. Similar to CompileModuleList except that no selection is necessary.

... plus some private commands ...
Dev/Docu/HeapSpy.odc

DevHeapSpy

DEFINITION DevHeapSpy;

	VAR
		par-: RECORD 
			allocated-, clusters-, heapsize-: INTEGER
		END;

	PROCEDURE GetAnchor (adr: INTEGER; OUT anchor: ARRAY OF CHAR);
	PROCEDURE ShowAnchor (adr: INTEGER);
	PROCEDURE ShowHeap;

END DevHeapSpy.


DevHeapSpy is a tool that visualizes the contents of heap memory. The dynamically allocated memory blocks are shown in an "interactive memory map" that is updated periodically. DevHeapSpy displays symbolic information about every memory block you point to with the mouse. This allows you to inspect the values of record fields in objects and browse through complex data structures.
The BlackBox heap is partitioned into clusters. Clusters are contiguous blocks of memory. Each cluster contains a number of heap objects. DevHeapSpy visualizes clusters with large grey blocks. The heap objects within a cluster are visualized by red and blue areas. The red areas represent portions of memory allocated to variables of some record type. The blue areas represent portions of memory allocated to dynamic arrays.

To display heap information, choose Heap Spy... from menu Info. This openes a small dialog box showing summary information about the heap.
To open a DevHeapSpy window, click on button Show Heap in the dialog box opened with Heap Spy.... This opens a window similar to the one shown in Figure 1. When you press the left mouse button within the area of a cluster, DevHeapSpy gives information about the object the mouse points to. If the mouse points to a heap object, i.e., to a red or blue area, the object is highlighted. If you release the mouse button while a heap object is highlighted, a debugger window will be opened that shows detailed symbolic information about the object.

The following command can be used:
	"Heap Spy..."	""	"StdCmds.OpenAuxDialog('Dev/Rsrc/HeapSpy', 'Heap Spy')"	""

VAR par-: RECORD
Interactor for the heap spy dialog.

allocated-: INTEGER
The number of currently allocated bytes.

clusters-: INTEGER
The number of currently allocated clusters.

heapsize-: INTEGER
The number of currently used bytes (the number of clusters times the size of one cluster).


PROCEDURE GetAnchor (adr: INTEGER; OUT anchor: ARRAY OF CHAR)
PROCEDURE ShowAnchor (adr: INTEGER)
PROCEDURE ShowHeap
Various procedures used in the heap spy dialog.
Dev/Docu/Inspector.odc

DevInspector

DEFINITION DevInspector;

	IMPORT Dialog;

	VAR
		inspect: RECORD
			control-: Dialog.String;
			label: ARRAY 40 OF CHAR;
			link, guard, notifier: Dialog.String;
			level: INTEGER;
			opt0, opt1, opt2, opt3, opt4: BOOLEAN
		END;

	PROCEDURE GetNext;
	PROCEDURE Set;
	PROCEDURE InitDialog;
	PROCEDURE ControlGuard (VAR par: Dialog.Par);
	PROCEDURE GuardGuard (VAR par: Dialog.Par);
	PROCEDURE LabelGuard (VAR par: Dialog.Par);
	PROCEDURE LevelGuard (VAR par: Dialog.Par);
	PROCEDURE LinkGuard (VAR par: Dialog.Par);
	PROCEDURE OptGuard (opt: INTEGER; VAR par: Dialog.Par);
	PROCEDURE NotifierGuard (VAR par: Dialog.Par);
	PROCEDURE Notifier (idx, op, from, to: INTEGER);

END DevInspector.


The inspector makes it possible to inspect and modify properties of a control. Currently, various types of controls are supported: command buttons, check boxes, radio buttons, edit fields, date fields, time fields, color fields, up/down-fields list boxes, selection boxes, combo boxes, and groups.

The inspector is opened with the Edit->ObjectProperties... command (Windows) / Edit->PartInfo command (Mac OS). It takes a singleton control as input (-> Controls). Starting the inspector is done indirectly by the framework, using the StdCmds.ShowProp command.


VAR inspect: RECORD
Interactor for a control view property dialog.

control-: Dialog.String
The control's name. This is the (possibly mapped) name of the control type.

label: ARRAY 40 OF CHAR
Label string of the control.

link: Dialog.String
Link to the interactor field, in the form module.variable.field.

guard: Dialog.String
Name of the control's guard command.

notifier: Dialog.String
Name of the control's notifier command.

level: INTEGER
Iff the value of a radio button is equal to level, the radio button is "on".

opt0, opt1, opt2, opt3, opt3: BOOLEAN
Various options which depend on the currently selected control. For example, a command button uses opt0 and opt1 to indicate the "default" or "cancel" properties.

PROCEDURE GetNext
Show the next control in this container. After the last control, GetNext wraps around to the first control.

PROCEDURE Set
Set the control's properties to the currently displayed values.

PROCEDURE InitDialog
Sets up the interactor according to the currently selected control.

PROCEDURE ControlGuard (VAR par: Dialog.Par)
PROCEDURE GuardGuard (VAR par: Dialog.Par)
PROCEDURE LabelGuard (VAR par: Dialog.Par)
PROCEDURE LevelGuard (VAR par: Dialog.Par)
PROCEDURE LinkGuard (VAR par: Dialog.Par)
PROCEDURE OptGuard (opt: INTEGER; VAR par: Dialog.Par)
PROCEDURE NotifierGuard (VAR par: Dialog.Par)
PROCEDURE Notifier (idx, op, from, to: INTEGER)
Various guards and notifiers used in the inspector dialog.
Dev/Docu/LinkChk.odc

DevLinkChk

DEFINITION DevLinkChk;

	IMPORT Dialog;

	CONST oneSubsystem = 0; globalSubsystem = 1; allSubsystems = 2;

	VAR
		par: RECORD 
			scope: INTEGER;
			subsystem: ARRAY 9 OF CHAR
		END;

	PROCEDURE Check (subsystem: ARRAY OF CHAR; scope: INTEGER; check: BOOLEAN);
	PROCEDURE CheckLinks;
	PROCEDURE ListLinks;
	PROCEDURE Open (path, file: ARRAY OF CHAR; pos: INTEGER);
	PROCEDURE SubsystemGuard (VAR p: Dialog.Par);
	PROCEDURE CommandGuard (VAR p: Dialog.Par);
	PROCEDURE SubsystemNotifier (op, from, to: INTEGER);

END DevLinkChk.


This tool module allows to check whether a hyperlink (-> StdLinks) points to an existing BlackBox document. this allows to find most "stale" links, i.e., links to non-existing files.

Menu command:
	"Check Links..."	""	"StdCmds.OpenAuxDialog('Dev/Rsrc/LinkChk', 'Check Links')"	""


CONST oneSubsystem , globalSubsystem, allSubsystems
Checking can occur in one specific subsystem (more exactly, in the files contained in the subsystem's Docu and Mod subdirectories); in the global Docu and Mod directories, or in these directories plus the Docu and Mod directories of all subsystems.


VAR par: RECORD 
Interactor for CheckLinks and ListLinks. It defines what documents these commands operate on.

scope: INTEGER	scope IN {oneSubsystem, globalSubsyste, allSubsystems}
The scope in which checking will occur, i.e., the directory or directories whose Docu and Mod subdirectories will be searched for files with links.

subsystem: ARRAY 9 OF CHAR	valid iff scope = oneSubsystem
Subsystem name. Only legal if scope = oneSubsystem.

PROCEDURE Check (subsystem: ARRAY OF CHAR; scope: INTEGER; check: BOOLEAN)
Used internally.

PROCEDURE CheckLinks
Guard: CommandGuard
Check all links in the scope defined by the par interactor. Checking means that it is tested whether the target file of the following link-commands exists:
	StdCmds.OpenMask
	StdCmds.OpenBrowser
	StdCmds.OpenDoc
	StdCmds.OpenAuxDialog
Links that are stale are listed in a report text. For every stale link, the report contains one link that directly opens the culpable text and scrolls to the offending link view (using the Open command below).

PROCEDURE ListLinks
Guard: CommandGuard
Lists all links in the scope defined by the par interactor. Links are listed in a report text. For every link, the report contains one link that directly opens the relevant text and scrolls to the link view (using the Open command below).

PROCEDURE Open (path, file: ARRAY OF CHAR; pos: INTEGER)
Used internally. The procedure opens a file at location path and name file; scrolls to position pos; and selects the range [pos .. pos+1[.

PROCEDURE SubsystemGuard (VAR p: Dialog.Par)
PROCEDURE CommandGuard (VAR p: Dialog.Par)
PROCEDURE SubsystemNotifier (op, from, to: INTEGER)
Various guards and notifiers used for dialog Dev/Rsrc/LinkChk.
Dev/Docu/Markers.odc

DevMarkers

DEFINITION DevMarkers;

	PROCEDURE NextError;
	PROCEDURE ToggleCurrent;
	PROCEDURE UnmarkErrors;
	... plus some private items ...

END DevMarkers.


Error markers indicate compiler errors in-place in the compiled text.
This module contains several other items which are used internally.

Possible menu:

MENU
	"Unmar&k Errors"	""	"DevMarkers.UnmarkErrors"	"TextCmds.FocusGuard"
	"Next E&rror"	""	"DevMarkers.NextError"	"TextCmds.FocusGuard"
	"To&ggle Error Mark"	""	"DevMarkers.ToggleCurrent"	"TextCmds.FocusGuard"
END


PROCEDURE NextError
Guard: TextCmds.FocusGuard
Move caret forward after the next error marker. If there is none, the text is scrolled to the beginning.

PROCEDURE ToggleCurrent
Guard: TextCmds.FocusGuard
Toggle the state of the marker before the caret.

PROCEDURE UnmarkErrors
Guard: TextCmds.FocusGuard
Removes all error markers.