From fcf59d5d931aab5bcb1e592d4c10e2bcb58e62ec Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Mon, 21 Sep 2026 14:56:54 +0400 Subject: [PATCH] connecting ulm standard streams to platform. --- src/library/ulm/ulmStreams.Mod | 44 +++++++++++++++++++++++++----- src/library/ulm/ulmStreamsHost.Mod | 35 ++++++++++++++++++++++++ src/tools/make/oberon.mk | 1 + 3 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 src/library/ulm/ulmStreamsHost.Mod diff --git a/src/library/ulm/ulmStreams.Mod b/src/library/ulm/ulmStreams.Mod index 37f25dfd..c14e31f2 100644 --- a/src/library/ulm/ulmStreams.Mod +++ b/src/library/ulm/ulmStreams.Mod @@ -93,7 +93,8 @@ MODULE ulmStreams; 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 (* 3rd parameter of Seek *) @@ -275,11 +276,8 @@ MODULE ulmStreams; VAR null*: Stream; (* accepts any output; does not return input *) - (* these streams are set by other modules; - after initialization of Streams they equal `null'; - so, connections with the standard UNIX streams must be - done by other modules - *) + (* The initial streams are connected to the host standard handles. + More specialized modules may replace them. *) stdin*, stdout*, stderr*: Stream; errormsg*: ARRAY errorcodes OF Events.Message; error*: Events.EventType; @@ -294,6 +292,7 @@ MODULE ulmStreams; *) freelist: Buffer; (* list of free buffers *) nullif: Interface; (* interface of null-devices *) + stdinif, stdoutif, stderrif: Interface; (* === private procedures ========================================= *) @@ -2093,6 +2092,36 @@ MODULE ulmStreams; Init(s, nullif, {read, write}, nobuf); 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); (* flush all streams on exit; we do not close them to allow output by other exit event handlers @@ -2143,7 +2172,8 @@ BEGIN opened := NIL; InitNullIf(nullif); - OpenNulldev(null); stdin := null; stdout := null; stderr := null; + OpenNulldev(null); + OpenStandardStreams; Events.Handler(Process.termination, ExitHandler); Events.Handler(Process.startOfGarbageCollection, FreeHandler); diff --git a/src/library/ulm/ulmStreamsHost.Mod b/src/library/ulm/ulmStreamsHost.Mod new file mode 100644 index 00000000..eecff7bc --- /dev/null +++ b/src/library/ulm/ulmStreamsHost.Mod @@ -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. diff --git a/src/tools/make/oberon.mk b/src/tools/make/oberon.mk index 46d24905..e56bb9f9 100644 --- a/src/tools/make/oberon.mk +++ b/src/tools/make/oberon.mk @@ -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/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/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/ulmStrings.Mod cd $(BUILDDIR)/$(MODEL); "$(ROOTDIR)/$(OBECOMP)" -Fs -O$(MODEL) ../../../src/library/ulm/ulmSysTypes.Mod