connecting ulm standard streams to platform.

This commit is contained in:
Norayr Chilingarian 2026-09-21 14:56:54 +04:00
parent 552eade09d
commit fcf59d5d93
3 changed files with 73 additions and 7 deletions

View file

@ -93,7 +93,8 @@
MODULE ulmStreams; MODULE ulmStreams;
IMPORT Events := ulmEvents, Objects := ulmObjects, Priorities := ulmPriorities, Process := ulmProcess, RelatedEvents := ulmRelatedEvents, Resources := ulmResources, IMPORT Events := ulmEvents, Objects := ulmObjects, Priorities := ulmPriorities, Process := ulmProcess, RelatedEvents := ulmRelatedEvents, Resources := ulmResources,
Services := ulmServices, SYS := ulmSYSTEM, SYSTEM, Types := ulmTypes; Services := ulmServices, SYS := ulmSYSTEM, SYSTEM, Host := ulmStreamsHost,
Types := ulmTypes;
CONST CONST
(* 3rd parameter of Seek *) (* 3rd parameter of Seek *)
@ -275,11 +276,8 @@ MODULE ulmStreams;
VAR VAR
null*: Stream; (* accepts any output; does not return input *) null*: Stream; (* accepts any output; does not return input *)
(* these streams are set by other modules; (* The initial streams are connected to the host standard handles.
after initialization of Streams they equal `null'; More specialized modules may replace them. *)
so, connections with the standard UNIX streams must be
done by other modules
*)
stdin*, stdout*, stderr*: Stream; stdin*, stdout*, stderr*: Stream;
errormsg*: ARRAY errorcodes OF Events.Message; errormsg*: ARRAY errorcodes OF Events.Message;
error*: Events.EventType; error*: Events.EventType;
@ -294,6 +292,7 @@ MODULE ulmStreams;
*) *)
freelist: Buffer; (* list of free buffers *) freelist: Buffer; (* list of free buffers *)
nullif: Interface; (* interface of null-devices *) nullif: Interface; (* interface of null-devices *)
stdinif, stdoutif, stderrif: Interface;
(* === private procedures ========================================= *) (* === private procedures ========================================= *)
@ -2093,6 +2092,36 @@ MODULE ulmStreams;
Init(s, nullif, {read, write}, nobuf); Init(s, nullif, {read, write}, nobuf);
END OpenNulldev; END OpenNulldev;
PROCEDURE StdInRead(s: Stream; ptr: Address; cnt: Count): Count;
BEGIN
RETURN Host.ReadStdIn(ptr, cnt)
END StdInRead;
PROCEDURE StdOutWrite(s: Stream; ptr: Address; cnt: Count): Count;
BEGIN
RETURN Host.WriteStdOut(ptr, cnt)
END StdOutWrite;
PROCEDURE StdErrWrite(s: Stream; ptr: Address; cnt: Count): Count;
BEGIN
RETURN Host.WriteStdErr(ptr, cnt)
END StdErrWrite;
PROCEDURE OpenStandardStreams;
BEGIN
NEW(stdinif); stdinif.addrread := StdInRead;
NEW(stdin); Services.Init(stdin, type);
Init(stdin, stdinif, {read, addrio}, nobuf);
NEW(stdoutif); stdoutif.addrwrite := StdOutWrite;
NEW(stdout); Services.Init(stdout, type);
Init(stdout, stdoutif, {write, addrio}, nobuf);
NEW(stderrif); stderrif.addrwrite := StdErrWrite;
NEW(stderr); Services.Init(stderr, type);
Init(stderr, stderrif, {write, addrio}, nobuf)
END OpenStandardStreams;
PROCEDURE ExitHandler(event: Events.Event); PROCEDURE ExitHandler(event: Events.Event);
(* flush all streams on exit; (* flush all streams on exit;
we do not close them to allow output by other exit event handlers we do not close them to allow output by other exit event handlers
@ -2143,7 +2172,8 @@ BEGIN
opened := NIL; opened := NIL;
InitNullIf(nullif); InitNullIf(nullif);
OpenNulldev(null); stdin := null; stdout := null; stderr := null; OpenNulldev(null);
OpenStandardStreams;
Events.Handler(Process.termination, ExitHandler); Events.Handler(Process.termination, ExitHandler);
Events.Handler(Process.startOfGarbageCollection, FreeHandler); Events.Handler(Process.startOfGarbageCollection, FreeHandler);

View file

@ -0,0 +1,35 @@
(* Host bindings for the standard streams used by ulmStreams. *)
MODULE ulmStreamsHost;
IMPORT SYSTEM, Platform;
TYPE
Address* = SYSTEM.ADDRESS;
Count* = SYSTEM.INT32;
PROCEDURE ReadStdIn* (address: Address; count: Count): Count;
VAR actual: LONGINT;
BEGIN
IF Platform.Read(Platform.StdIn, address, count, actual) # 0 THEN
RETURN -1
END;
RETURN actual
END ReadStdIn;
PROCEDURE WriteStdOut* (address: Address; count: Count): Count;
BEGIN
IF Platform.Write(Platform.StdOut, address, count) # 0 THEN
RETURN -1
END;
RETURN count
END WriteStdOut;
PROCEDURE WriteStdErr* (address: Address; count: Count): Count;
BEGIN
IF Platform.Write(Platform.StdErr, address, count) # 0 THEN
RETURN -1
END;
RETURN count
END WriteStdErr;
END ulmStreamsHost.

View file

@ -314,6 +314,7 @@ ulm:
cd $(BUILDDIR)/$(MODEL); "$(ROOTDIR)/$(OBECOMP)" -Fs -O$(MODEL) ../../../src/library/ulm/ulmResources.Mod cd $(BUILDDIR)/$(MODEL); "$(ROOTDIR)/$(OBECOMP)" -Fs -O$(MODEL) ../../../src/library/ulm/ulmResources.Mod
cd $(BUILDDIR)/$(MODEL); "$(ROOTDIR)/$(OBECOMP)" -Fs -O$(MODEL) ../../../src/library/ulm/ulmForwarders.Mod cd $(BUILDDIR)/$(MODEL); "$(ROOTDIR)/$(OBECOMP)" -Fs -O$(MODEL) ../../../src/library/ulm/ulmForwarders.Mod
cd $(BUILDDIR)/$(MODEL); "$(ROOTDIR)/$(OBECOMP)" -Fs -O$(MODEL) ../../../src/library/ulm/ulmRelatedEvents.Mod cd $(BUILDDIR)/$(MODEL); "$(ROOTDIR)/$(OBECOMP)" -Fs -O$(MODEL) ../../../src/library/ulm/ulmRelatedEvents.Mod
cd $(BUILDDIR)/$(MODEL); "$(ROOTDIR)/$(OBECOMP)" -Fs -O$(MODEL) ../../../src/library/ulm/ulmStreamsHost.Mod
cd $(BUILDDIR)/$(MODEL); "$(ROOTDIR)/$(OBECOMP)" -Fs -O$(MODEL) ../../../src/library/ulm/ulmStreams.Mod cd $(BUILDDIR)/$(MODEL); "$(ROOTDIR)/$(OBECOMP)" -Fs -O$(MODEL) ../../../src/library/ulm/ulmStreams.Mod
cd $(BUILDDIR)/$(MODEL); "$(ROOTDIR)/$(OBECOMP)" -Fs -O$(MODEL) ../../../src/library/ulm/ulmStrings.Mod cd $(BUILDDIR)/$(MODEL); "$(ROOTDIR)/$(OBECOMP)" -Fs -O$(MODEL) ../../../src/library/ulm/ulmStrings.Mod
cd $(BUILDDIR)/$(MODEL); "$(ROOTDIR)/$(OBECOMP)" -Fs -O$(MODEL) ../../../src/library/ulm/ulmSysTypes.Mod cd $(BUILDDIR)/$(MODEL); "$(ROOTDIR)/$(OBECOMP)" -Fs -O$(MODEL) ../../../src/library/ulm/ulmSysTypes.Mod