From 2d6ac451bae3ebee1a66ab0f11cd4cb2e9206dcb Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Tue, 20 May 2014 00:56:33 +0400 Subject: [PATCH] freebsd port works. I have no freebsd, and port was made by request and with help of tangentstorm from #oberon channel (: still it's not well tested and is considered experimental. --- makefile.freebsd.clang.x86_64 | 306 +++++++ src/lib/ooc/freebsd/clang/x86_64/oocC.Mod | 71 ++ src/lib/ooc2/freebsd/clang/oocwrapperlibc.Mod | 34 + src/lib/system/freebsd/clang/Console.Mod | 89 ++ src/lib/system/freebsd/clang/Files.Mod | 658 ++++++++++++++ src/lib/system/freebsd/clang/Files0.Mod | 630 +++++++++++++ src/lib/system/freebsd/clang/Kernel.Mod | 167 ++++ src/lib/system/freebsd/clang/Kernel0.Mod | 179 ++++ src/lib/system/freebsd/clang/SYSTEM.Mod | 520 +++++++++++ src/lib/system/freebsd/clang/Texts.Mod | 859 ++++++++++++++++++ src/lib/system/freebsd/clang/Texts0.Mod | 859 ++++++++++++++++++ src/lib/system/freebsd/clang/x86_64/Args.Mod | 65 ++ src/lib/system/freebsd/clang/x86_64/SYSTEM.c0 | 205 +++++ src/lib/system/freebsd/clang/x86_64/SYSTEM.h | 236 +++++ src/lib/system/freebsd/clang/x86_64/Unix.Mod | 562 ++++++++++++ src/voc/freebsd/clang/extTools.Mod | 88 ++ src/voc/freebsd/clang/x86_64/architecture.Mod | 4 + vocstatic.freebsd.clang.x86_64 | Bin 0 -> 790110 bytes 18 files changed, 5532 insertions(+) create mode 100644 makefile.freebsd.clang.x86_64 create mode 100644 src/lib/ooc/freebsd/clang/x86_64/oocC.Mod create mode 100644 src/lib/ooc2/freebsd/clang/oocwrapperlibc.Mod create mode 100644 src/lib/system/freebsd/clang/Console.Mod create mode 100644 src/lib/system/freebsd/clang/Files.Mod create mode 100644 src/lib/system/freebsd/clang/Files0.Mod create mode 100644 src/lib/system/freebsd/clang/Kernel.Mod create mode 100644 src/lib/system/freebsd/clang/Kernel0.Mod create mode 100644 src/lib/system/freebsd/clang/SYSTEM.Mod create mode 100644 src/lib/system/freebsd/clang/Texts.Mod create mode 100644 src/lib/system/freebsd/clang/Texts0.Mod create mode 100644 src/lib/system/freebsd/clang/x86_64/Args.Mod create mode 100644 src/lib/system/freebsd/clang/x86_64/SYSTEM.c0 create mode 100644 src/lib/system/freebsd/clang/x86_64/SYSTEM.h create mode 100644 src/lib/system/freebsd/clang/x86_64/Unix.Mod create mode 100644 src/voc/freebsd/clang/extTools.Mod create mode 100644 src/voc/freebsd/clang/x86_64/architecture.Mod create mode 100755 vocstatic.freebsd.clang.x86_64 diff --git a/makefile.freebsd.clang.x86_64 b/makefile.freebsd.clang.x86_64 new file mode 100644 index 00000000..1dffe6e4 --- /dev/null +++ b/makefile.freebsd.clang.x86_64 @@ -0,0 +1,306 @@ +#SHELL := /bin/bash +BUILDID=$(shell date +%Y/%m/%d) +TOS = freebsd +TARCH = x86_64 +#TARCH = x86 x86_64 armv6j armv6j_hardfp armv7a_hardfp powerpc +CCOMP = clang +RELEASE = 1.0 + + +INCLUDEPATH = -Isrc/lib/system/$(TOS)/$(CCOMP)/$(TARCH) + +SETPATH = CFLAGS=$(INCLUDEPATH) PATH=.:/bin:/usr/bin MODULES=.:src/lib:src/lib/v4:src/lib/v4/$(TARCH):src/lib/system/$(TOS)/$(CCOMP):src/lib/system/$(TOS)/$(CCOMP)/$(TARCH):src/lib/ulm:src/lib/ulm/$(TARCH):src/lib/ooc2:src/lib/ooc2/$(TOS)/$(CCOMP):src/lib/ooc:src/lib/ooc/$(TOS)/$(CCOMP)/$(TARCH):src/lib/pow:src/lib/misc:src/lib/s3:src/voc:src/voc/$(TOS)/$(CCOMP):src/voc/$(TOS)/$(CCOMP)/$(TARCH):src/tools/ocat:src/tools/browser:src/tools/vocparam:src/tools/vmake:src/tools/coco:src/test + +VOC = voc +VERSION = $(TOS).$(CCOMP).$(TARCH) +VOCSTATIC0 = $(SETPATH) ./vocstatic.$(TOS).$(CCOMP).$(TARCH) +VOCSTATIC = $(SETPATH) ./voc +VOCPARAM = $(shell ./vocparam > voc.par) +LIBNAME = VishapOberon +LIBRARY = lib$(LIBNAME) + +ifndef PRF +PRF = "/opt" +endif +PREFIX = $(PRF)/voc-$(RELEASE) +PREFIXLN = $(PRF)/voc + +CCOPT = -fPIC $(INCLUDEPATH) -g +SHRLIBEXT = so +CC = $(CCOMP) $(CCOPT) -c +CL = $(CCOMP) $(CCOPT) +LD = $(CCOMP) -shared -o $(LIBRARY).$(SHRLIBEXT) +# s is necessary to create index inside a archive +ARCHIVE = ar rcs $(LIBRARY).a + +#%.c: %.Mod +#%.o: %.c +# $(CC) $(input) + +all: stage2 stage3 stage4 stage5 stage6 stage7 + +# when porting to new platform: +# * put corresponding .par file into current directory. it can be generated on the target platform by compiling vocparam (stage0) and running (stage1) +# * run make port0 - this will generate C source files for the target architecture +# * move the source tree to the target machine, and compile (or compile here via crosscompiler) (port1) +port0: stage2 stage3 stage4 + +# now compile C source files for voc, showdef and ocat on target machine (or by using crosscompiler) +port1: stage5 +# after you have "voc" compiled for target architecture. replace vocstatic with it and run make on target platform to get everything compiled + +# this builds binary which generates voc.par +stage0: src/tools/vocparam/vocparam.c + $(CL) -I src/lib/system/$(TOS)/$(CCOMP)/$(TARCH) -o vocparam src/tools/vocparam/vocparam.c + +# this creates voc.par for a host architecture. +# comment this out if you need to build a compiler for a different architecture. +stage1: + #rm voc.par + #$(shell "./vocparam > voc.par") + #./vocparam > voc.par + $(VOCPARAM) + +# this copies necessary voc.par to the current directory. +# skip this if you are building compiler for the host architecture. +stage2: + cp src/par/voc.par.$(CCOMP).$(TARCH) voc.par +# cp src/par/voc.par.gnu.x86_64 voc.par +# cp src/par/voc.par.gnu.x86 voc.par +# cp src/par/voc.par.gnu.armv6 voc.par +# cp src/par/voc.par.gnu.armv7 voc.par + cp src/voc/prf.Mod_default src/voc/prf.Mod + +# this prepares modules necessary to build the compiler itself +stage3: + + $(VOCSTATIC0) -siapxPS SYSTEM.Mod + $(VOCSTATIC0) -sPS Args.Mod Console.Mod Unix.Mod + sed -i.tmp "s#/opt#$(PRF)#g" src/voc/prf.Mod + $(VOCSTATIC0) -sPS prf.Mod + $(VOCSTATIC0) -sPS Strings.Mod architecture.Mod version.Mod Kernel0.Mod Modules.Mod + $(VOCSTATIC0) -sxPS Files0.Mod + $(VOCSTATIC0) -sPS Reals.Mod Texts0.Mod + $(VOCSTATIC0) -sPS vt100.Mod + +# build the compiler +stage4: + $(VOCSTATIC0) -sPS errors.Mod + $(VOCSTATIC0) -sPS extTools.Mod + $(VOCSTATIC0) -sPS OPM.cmdln.Mod + $(VOCSTATIC0) -sxPS OPS.Mod + $(VOCSTATIC0) -sPS OPT.Mod OPC.Mod OPV.Mod OPB.Mod OPP.Mod + $(VOCSTATIC0) -smPS voc.Mod + $(VOCSTATIC0) -smPS BrowserCmd.Mod + $(VOCSTATIC0) -smPS OCatCmd.Mod + +#this is to build the compiler from C sources. +#this is a way to create a bootstrap binary. +stage5: + $(CC) SYSTEM.c Args.c Console.c Modules.c Unix.c \ + Strings.c architecture.c prf.c version.c Kernel0.c Files0.c Reals.c Texts0.c vt100.c \ + extTools.c \ + OPM.c OPS.c OPT.c OPC.c OPV.c OPB.c OPP.c errors.c + + $(CL) -static voc.c -o voc \ + SYSTEM.o Args.o Console.o Modules.o Unix.o \ + Strings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.o vt100.o \ + extTools.o \ + OPM.o OPS.o OPT.o OPC.o OPV.o OPB.o OPP.o errors.o + $(CL) BrowserCmd.c -o showdef \ + SYSTEM.o Args.o Console.o Modules.o Unix.o Strings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.o vt100.o \ + OPM.o OPS.o OPT.o OPV.o OPC.o errors.o + + $(CL) OCatCmd.c -o ocat \ + SYSTEM.o Args.o Console.o Modules.o Unix.o Strings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.o + +# build all library files +stage6: + #v4 libs + $(VOCSTATIC) -sP Kernel.Mod + $(VOCSTATIC) -sP Files.Mod + $(VOCSTATIC) -sP Texts.Mod + $(VOCSTATIC) -sP Printer.Mod + $(VOCSTATIC) -sP Strings.Mod + $(VOCSTATIC) -sP Sets.Mod + $(VOCSTATIC) -sP Sets0.Mod + + #ooc libs + $(VOCSTATIC) -sP oocAscii.Mod + $(VOCSTATIC) -sP oocStrings.Mod + $(VOCSTATIC) -sP oocStrings2.Mod + $(VOCSTATIC) -sP oocOakStrings.Mod + $(VOCSTATIC) -sP oocCharClass.Mod + $(VOCSTATIC) -sP oocConvTypes.Mod + $(VOCSTATIC) -sP oocIntConv.Mod + $(VOCSTATIC) -sP oocIntStr.Mod + $(VOCSTATIC) -sP oocSysClock.Mod + $(VOCSTATIC) -sP oocTime.Mod +# $(VOCSTATIC) -s oocLongStrings.Mod +# $(CC) oocLongStrings.c +# $(VOCSTATIC) -s oocMsg.Mod +# $(CC) oocMsg.c + + + #ooc2 libs + $(VOCSTATIC) -sP ooc2Strings.Mod + $(VOCSTATIC) -sP ooc2Ascii.Mod + $(VOCSTATIC) -sP ooc2CharClass.Mod + $(VOCSTATIC) -sP ooc2ConvTypes.Mod + $(VOCSTATIC) -sP ooc2IntConv.Mod + $(VOCSTATIC) -sP ooc2IntStr.Mod + $(VOCSTATIC) -sP ooc2Real0.Mod + #ooc libs + $(VOCSTATIC) -sP oocLowReal.Mod oocLowLReal.Mod + $(VOCSTATIC) -sP oocRealMath.Mod oocOakMath.Mod + $(VOCSTATIC) -sP oocLRealMath.Mod + $(VOCSTATIC) -sP oocLongInts.Mod + $(VOCSTATIC) -sP oocComplexMath.Mod oocLComplexMath.Mod + $(VOCSTATIC) -sP oocLRealConv.Mod oocLRealStr.Mod + $(VOCSTATIC) -sP oocRealConv.Mod oocRealStr.Mod + $(VOCSTATIC) -sP oocMsg.Mod oocChannel.Mod + $(VOCSTATIC) -sP oocStrings2.Mod oocRts.Mod oocFilenames.Mod + $(VOCSTATIC) -sP oocTextRider.Mod oocBinaryRider.Mod oocJulianDay.Mod + $(VOCSTATIC) -sP oocFilenames.Mod + $(VOCSTATIC) -sP oocwrapperlibc.Mod + $(VOCSTATIC) -sP oocC.Mod +# $(VOCSTATIC) -sP oocX11.Mod +# $(VOCSTATIC) -sP oocXutil.Mod +# $(VOCSTATIC) -sP oocXYplane.Mod + + #Ulm's Oberon system libs + $(VOCSTATIC) -sP ulmSys.Mod + $(VOCSTATIC) -sP ulmSYSTEM.Mod + $(VOCSTATIC) -sP ulmASCII.Mod + $(VOCSTATIC) -sP ulmSets.Mod + $(VOCSTATIC) -sP ulmObjects.Mod + $(VOCSTATIC) -sP ulmDisciplines.Mod + $(VOCSTATIC) -sP ulmPriorities.Mod + $(VOCSTATIC) -sP ulmServices.Mod + $(VOCSTATIC) -sP ulmEvents.Mod + $(VOCSTATIC) -sP ulmResources.Mod + $(VOCSTATIC) -sP ulmForwarders.Mod + $(VOCSTATIC) -sP ulmRelatedEvents.Mod + $(VOCSTATIC) -sP ulmIO.Mod + $(VOCSTATIC) -sP ulmProcess.Mod + $(VOCSTATIC) -sP ulmTypes.Mod + $(VOCSTATIC) -sP ulmStreams.Mod + $(VOCSTATIC) -sP ulmAssertions.Mod + $(VOCSTATIC) -sP ulmIndirectDisciplines.Mod + $(VOCSTATIC) -sP ulmStreamDisciplines.Mod + $(VOCSTATIC) -sP ulmIEEE.Mod + $(VOCSTATIC) -sP ulmMC68881.Mod + $(VOCSTATIC) -sP ulmReals.Mod + $(VOCSTATIC) -sP ulmPrint.Mod + $(VOCSTATIC) -sP ulmWrite.Mod + $(VOCSTATIC) -sP ulmTexts.Mod + $(VOCSTATIC) -sP ulmStrings.Mod + $(VOCSTATIC) -sP ulmConstStrings.Mod + $(VOCSTATIC) -sP ulmPlotters.Mod + $(VOCSTATIC) -sP ulmSysTypes.Mod + $(VOCSTATIC) -sP ulmSysConversions.Mod + $(VOCSTATIC) -sP ulmErrors.Mod + $(VOCSTATIC) -sP ulmSysErrors.Mod + $(VOCSTATIC) -sP ulmSysIO.Mod + $(VOCSTATIC) -sP ulmLoader.Mod + $(VOCSTATIC) -sP ulmNetIO.Mod + $(VOCSTATIC) -sP ulmPersistentObjects.Mod + $(VOCSTATIC) -sP ulmPersistentDisciplines.Mod + $(VOCSTATIC) -sP ulmOperations.Mod + $(VOCSTATIC) -sP ulmScales.Mod + $(VOCSTATIC) -sP ulmTimes.Mod + $(VOCSTATIC) -sP ulmClocks.Mod + $(VOCSTATIC) -sP ulmTimers.Mod + $(VOCSTATIC) -sP ulmConditions.Mod + $(VOCSTATIC) -sP ulmStreamConditions.Mod + $(VOCSTATIC) -sP ulmTimeConditions.Mod + $(VOCSTATIC) -sP ulmSysConversions.Mod + $(VOCSTATIC) -sP ulmSysStat.Mod + $(VOCSTATIC) -sP ulmCiphers.Mod + $(VOCSTATIC) -sP ulmCipherOps.Mod + $(VOCSTATIC) -sP ulmBlockCiphers.Mod + $(VOCSTATIC) -sP ulmAsymmetricCiphers.Mod + $(VOCSTATIC) -sP ulmConclusions.Mod + $(VOCSTATIC) -sP ulmRandomGenerators.Mod + $(VOCSTATIC) -sP ulmTCrypt.Mod + + #pow32 libs + $(VOCSTATIC) -sP powStrings.Mod + + #misc libs + $(VOCSTATIC) -sP MultiArrays.Mod + $(VOCSTATIC) -sP MultiArrayRiders.Mod + $(VOCSTATIC) -sP MersenneTwister.Mod + $(VOCSTATIC) -sP Listen.Mod + + #s3 libs + $(VOCSTATIC) -sP ethBTrees.Mod + $(VOCSTATIC) -sP ethMD5.Mod + $(VOCSTATIC) -sP ethSets.Mod + $(VOCSTATIC) -sP ethZlib.Mod + $(VOCSTATIC) -sP ethZlibBuffers.Mod + $(VOCSTATIC) -sP ethZlibInflate.Mod + $(VOCSTATIC) -sP ethZlibDeflate.Mod + $(VOCSTATIC) -sP ethZlibReaders.Mod + $(VOCSTATIC) -sP ethZlibWriters.Mod + $(VOCSTATIC) -sP ethZip.Mod + $(VOCSTATIC) -sP ethRandomNumbers.Mod + $(VOCSTATIC) -sP ethGZReaders.Mod + $(VOCSTATIC) -sP ethGZWriters.Mod + + +# build remaining tools +# $(VOCSTATIC0) -sPS compatIn.Mod +# $(VOCSTATIC0) -smPS vmake.Mod +# $(CC) compatIn.c +# $(CL) vmake.c -o vmake SYSTEM.o Args.o compatIn.o Texts.o Console.o Files.o Reals.o Modules.o Kernel.o Unix.o Strings.o oocIntStr.o oocConvTypes.o oocIntConv.o + + + +stage7: + #remove non library objects + rm -f Kernel0.o Files0.o Texts0.o architecture.o prf.o version.o extTools.o OPM.o OPS.o OPT.o OPC.o OPV.o OPB.o OPP.o errors.o + #objects := $(wildcard *.o) + #$(LD) objects + $(ARCHIVE) *.o + #$(ARCHIVE) objects + $(LD) *.o + echo "$(PREFIX)/lib" > 05vishap.conf + +clean: +# rm_objects := rm $(wildcard *.o) +# objects + rm *.h + rm *.c + rm *.sym + rm *.o + rm *.a + rm *.$(SHRLIBEXT) + +install: + test -d $(PREFIX)/bin | mkdir -p $(PREFIX)/bin + cp voc $(PREFIX)/bin/ + cp showdef $(PREFIX)/bin/ + cp ocat $(PREFIX)/bin/ + #cp vmake $(PREFIX)/bin/ + cp -a src $(PREFIX)/ + + test -d $(PREFIX)/lib/voc | mkdir -p $(PREFIX)/lib/voc + test -d $(PREFIX)/lib/voc/ | mkdir -p $(PREFIX)/lib/voc + test -d $(PREFIX)/lib/voc/obj | mkdir -p $(PREFIX)/lib/voc/obj + test -d $(PREFIX)/lib/voc/sym | mkdir -p $(PREFIX)/lib/voc/sym + + cp $(LIBRARY).$(SHRLIBEXT) $(PREFIX)/lib + cp $(LIBRARY).a $(PREFIX)/lib + cp *.c $(PREFIX)/lib/voc/obj/ + cp *.h $(PREFIX)/lib/voc/obj/ + cp *.sym $(PREFIX)/lib/voc/sym/ + + #cp 05vishap.conf /etc/ld.so.conf.d/ + #ldconfig + ln -s $(PREFIX) $(PREFIXLN) + +# cp *.o $(PREFIX)/lib/voc/$(RELEASE)/obj/ +uninstall: + rm -rf $(PREFIX) + rm -rf $(PREFIXLN) diff --git a/src/lib/ooc/freebsd/clang/x86_64/oocC.Mod b/src/lib/ooc/freebsd/clang/x86_64/oocC.Mod new file mode 100644 index 00000000..14638e75 --- /dev/null +++ b/src/lib/ooc/freebsd/clang/x86_64/oocC.Mod @@ -0,0 +1,71 @@ +(* $Id: C.Mod,v 1.9 1999/10/03 11:46:01 ooc-devel Exp $ *) +MODULE oocC; +(* Basic data types for interfacing to C code. + Copyright (C) 1997-1998 Michael van Acken + + This module is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This module is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OOC. If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*) + +IMPORT + SYSTEM; + +(* +These types are intended to be equivalent to their C counterparts. +They may vary depending on your system, but as long as you stick to a 32 Bit +Unix they should be fairly safe. +*) + +TYPE + char* = CHAR; + signedchar* = SHORTINT; (* signed char *) + shortint* = RECORD a,b : SYSTEM.BYTE END; (* 2 bytes on x64_64 *) (* short int *) + int* = INTEGER; + set* = INTEGER;(*SET;*) (* unsigned int, used as set *) + longint* = LONGINT; (* long int *) + longset* = SET; (*SYSTEM.SET64; *) (* unsigned long, used as set *) + address* = LONGINT; (*SYSTEM.ADDRESS;*) + float* = REAL; + double* = LONGREAL; + + enum1* = int; + enum2* = int; + enum4* = int; + + (* if your C compiler uses short enumerations, you'll have to replace the + declarations above with + enum1* = SHORTINT; + enum2* = INTEGER; + enum4* = LONGINT; + *) + + FILE* = address; (* this is acually a replacement for `FILE*', i.e., for a pointer type *) + sizet* = longint; + uidt* = int; + gidt* = int; + + +TYPE (* some commonly used C array types *) + charPtr1d* = POINTER TO ARRAY OF char; + charPtr2d* = POINTER TO ARRAY OF charPtr1d; + intPtr1d* = POINTER TO ARRAY OF int; + +TYPE (* C string type, assignment compatible with character arrays and + string constants *) + string* = POINTER (*[CSTRING]*) TO ARRAY OF char; + +TYPE + Proc* = PROCEDURE; + +END oocC. diff --git a/src/lib/ooc2/freebsd/clang/oocwrapperlibc.Mod b/src/lib/ooc2/freebsd/clang/oocwrapperlibc.Mod new file mode 100644 index 00000000..0d0cf9b6 --- /dev/null +++ b/src/lib/ooc2/freebsd/clang/oocwrapperlibc.Mod @@ -0,0 +1,34 @@ +MODULE oocwrapperlibc; +IMPORT SYSTEM; +PROCEDURE -includeStdio() + "#include "; + +PROCEDURE -sys(str: ARRAY OF CHAR): INTEGER + "system(str)"; + +PROCEDURE system*(cmd : ARRAY OF CHAR); +VAR r : INTEGER; +BEGIN +r := sys(cmd); +END system; +(* +PROCEDURE strtod* (string: C.address; + VAR tailptr: C.charPtr1d): C.double; +PROCEDURE strtof* (string: C.address; + VAR tailptr: C.charPtr1d): C.float; +PROCEDURE sscanf* (s: C.address; template: ARRAY OF CHAR; ...) : C.int; +*) + +PROCEDURE -sprntf(s, t0, t1, t2: ARRAY OF CHAR): INTEGER + "sprintf(s, t0, t1, t2)"; + +PROCEDURE sprintf* (VAR s: ARRAY OF CHAR; template0: ARRAY OF CHAR; template1: ARRAY OF CHAR; template2: ARRAY OF CHAR); +VAR r : INTEGER; +BEGIN + r := sprntf (s, template0, template1, template2); +END sprintf; + +BEGIN + + +END oocwrapperlibc. diff --git a/src/lib/system/freebsd/clang/Console.Mod b/src/lib/system/freebsd/clang/Console.Mod new file mode 100644 index 00000000..93be9373 --- /dev/null +++ b/src/lib/system/freebsd/clang/Console.Mod @@ -0,0 +1,89 @@ +MODULE Console; (* J. Templ, 29-June-96 *) + + (* output to Unix standard output device based Write system call *) + + IMPORT SYSTEM; + + VAR line: ARRAY 128 OF CHAR; + pos: INTEGER; + + PROCEDURE -includeUnistd() + "#include "; + + PROCEDURE -Write(adr, n: LONGINT) + "write(1/*stdout*/, adr, n)"; + + PROCEDURE -read(VAR ch: CHAR): LONGINT + "read(0/*stdin*/, ch, 1)"; + + PROCEDURE Flush*(); + BEGIN + Write(SYSTEM.ADR(line), pos); pos := 0; + END Flush; + + PROCEDURE Char*(ch: CHAR); + BEGIN + IF pos = LEN(line) THEN Flush() END ; + line[pos] := ch; INC(pos); + IF ch = 0AX THEN Flush() END + END Char; + + PROCEDURE String*(s: ARRAY OF CHAR); + VAR i: INTEGER; + BEGIN i := 0; + WHILE s[i] # 0X DO Char(s[i]); INC(i) END + END String; + + PROCEDURE Int*(i, n: LONGINT); + VAR s: ARRAY 32 OF CHAR; i1, k: LONGINT; + BEGIN + IF i = SYSTEM.LSH(LONG(LONG(1)), SIZE(LONGINT)*8 - 1) THEN + IF SIZE(LONGINT) = 8 THEN s := "8085774586302733229"; k := 19 + ELSE s := "8463847412"; k := 10 + END + ELSE + i1 := ABS(i); + s[0] := CHR(i1 MOD 10 + ORD("0")); i1 := i1 DIV 10; k := 1; + WHILE i1 > 0 DO s[k] := CHR(i1 MOD 10 + ORD("0")); i1 := i1 DIV 10; INC(k) END + END ; + IF i < 0 THEN s[k] := "-"; INC(k) END ; + WHILE n > k DO Char(" "); DEC(n) END ; + WHILE k > 0 DO DEC(k); Char(s[k]) END + END Int; + + PROCEDURE Ln*; + BEGIN Char(0AX); (* Unix end-of-line *) + END Ln; + + PROCEDURE Bool*(b: BOOLEAN); + BEGIN IF b THEN String("TRUE") ELSE String("FALSE") END + END Bool; + + PROCEDURE Hex*(i: LONGINT); + VAR k, n: LONGINT; + BEGIN + k := -28; + WHILE k <= 0 DO + n := ASH(i, k) MOD 16; + IF n <= 9 THEN Char(CHR(ORD("0") + n)) ELSE Char(CHR(ORD("A") - 10 + n)) END ; + INC(k, 4) + END + END Hex; + + PROCEDURE Read*(VAR ch: CHAR); + VAR n: LONGINT; + BEGIN Flush(); + n := read(ch); + IF n # 1 THEN ch := 0X END + END Read; + + PROCEDURE ReadLine*(VAR line: ARRAY OF CHAR); + VAR i: LONGINT; ch: CHAR; + BEGIN Flush(); + i := 0; Read(ch); + WHILE (i < LEN(line) - 1) & (ch # 0AX) & (ch # 0X) DO line[i] := ch; INC(i); Read(ch) END ; + line[i] := 0X + END ReadLine; + +BEGIN pos := 0; +END Console. diff --git a/src/lib/system/freebsd/clang/Files.Mod b/src/lib/system/freebsd/clang/Files.Mod new file mode 100644 index 00000000..60b81e43 --- /dev/null +++ b/src/lib/system/freebsd/clang/Files.Mod @@ -0,0 +1,658 @@ +MODULE Files; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix files *) +(* modified version of Files, which opens only the file provided and does not scan any path in any environment variable, also ReadLine procedure added; -- noch *) + IMPORT SYSTEM, Unix, Kernel, Args, Console; + + (* standard data type I/O + + little endian, + Sint:1, Int:2, Lint:4 + ORD({0}) = 1, + false = 0, true =1 + IEEE real format, + null terminated strings, + compact numbers according to M.Odersky *) + + + CONST + nofbufs = 4; + bufsize = 4096; + fileTabSize = 64; + noDesc = -1; + notDone = -1; + + (* file states *) + open = 0; create = 1; close = 2; + + + TYPE + FileName = ARRAY 101 OF CHAR; + File* = POINTER TO Handle; + Buffer = POINTER TO BufDesc; + + Handle = RECORD + workName, registerName: FileName; + tempFile: BOOLEAN; + dev, ino, mtime: LONGINT; + fd-, len, pos: LONGINT; + bufs: ARRAY nofbufs OF Buffer; + swapper, state: INTEGER + END ; + + BufDesc = RECORD + f: File; + chg: BOOLEAN; + org, size: LONGINT; + data: ARRAY bufsize OF SYSTEM.BYTE + END ; + + Rider* = RECORD + res*: LONGINT; + eof*: BOOLEAN; + buf: Buffer; + org, offset: LONGINT + END ; + + Time = POINTER TO TimeDesc; + TimeDesc = RECORD + sec*, min*, hour*, mday*, mon*, year*, wday*, isdst*, zone*, gmtoff*: LONGINT; +(* sec*, min*, hour*, mday*, mon*, year*, wday*, isdst*, zone*, gmtoff*: INTEGER;*) + END ; + + VAR + fileTab: ARRAY fileTabSize OF LONGINT (*=File*); + tempno: INTEGER; + +(* for localtime *) + PROCEDURE -includetime() + '#include "time.h"'; + + PROCEDURE -localtime(VAR clock: LONGINT): Time + "(Files_Time) localtime(clock)"; + + PROCEDURE -getcwd(VAR cwd: Unix.Name) + "getcwd(cwd, cwd__len)"; + + PROCEDURE -IdxTrap "__HALT(-1)"; + + PROCEDURE^ Finalize(o: SYSTEM.PTR); + + PROCEDURE Err(s: ARRAY OF CHAR; f: File; errno: LONGINT); + BEGIN + Console.Ln; Console.String("-- "); Console.String(s); Console.String(": "); + IF f # NIL THEN + IF f.registerName # "" THEN Console.String(f.registerName) ELSE Console.String(f.workName) END + END ; + IF errno # 0 THEN Console.String(" errno = "); Console.Int(errno, 1) END ; + Console.Ln; + HALT(99) + END Err; + + PROCEDURE MakeFileName(dir, name: ARRAY OF CHAR; VAR dest: ARRAY OF CHAR); + VAR i, j: INTEGER; + BEGIN i := 0; j := 0; + WHILE dir[i] # 0X DO dest[i] := dir[i]; INC(i) END ; + IF dest[i-1] # "/" THEN dest[i] := "/"; INC(i) END ; + WHILE name[j] # 0X DO dest[i] := name[j]; INC(i); INC(j) END ; + dest[i] := 0X + END MakeFileName; + + PROCEDURE GetTempName(finalName: ARRAY OF CHAR; VAR name: ARRAY OF CHAR); + VAR n, i, j: LONGINT; + BEGIN + INC(tempno); n := tempno; i := 0; + IF finalName[0] # "/" THEN (* relative pathname *) + WHILE Kernel.CWD[i] # 0X DO name[i] := Kernel.CWD[i]; INC(i) END; + IF Kernel.CWD[i-1] # "/" THEN name[i] := "/"; INC(i) END + END; + j := 0; + WHILE finalName[j] # 0X DO name[i] := finalName[j]; INC(i); INC(j) END; + DEC(i); + WHILE name[i] # "/" DO DEC(i) END; + name[i+1] := "."; name[i+2] := "t"; name[i+3] := "m"; name[i+4] := "p"; name[i+5] := "."; INC(i, 6); + WHILE n > 0 DO name[i] := CHR(n MOD 10 + ORD("0")); n := n DIV 10; INC(i) END; + name[i] := "."; INC(i); n := SHORT(Unix.Getpid()); + WHILE n > 0 DO name[i] := CHR(n MOD 10 + ORD("0")); n := n DIV 10; INC(i) END; + name[i] := 0X + END GetTempName; + + PROCEDURE Create(f: File); + VAR stat: Unix.Status; done: BOOLEAN; + errno: LONGINT; err: ARRAY 32 OF CHAR; + BEGIN + IF f.fd = noDesc THEN + IF f.state = create THEN GetTempName(f.registerName, f.workName); f.tempFile := TRUE + ELSIF f.state = close THEN + f.workName := f.registerName; f.registerName := ""; f.tempFile := FALSE + END ; + errno := Unix.Unlink(f.workName); (*unlink first to avoid stale NFS handles and to avoid reuse of inodes*) + f.fd := Unix.Open(f.workName, Unix.rdwr + Unix.creat + Unix.trunc, {2, 4,5, 7,8}); + done := f.fd >= 0; errno := Unix.errno(); + IF (~done & ((errno = Unix.ENFILE) OR (errno = Unix.EMFILE))) OR (done & (f.fd >= fileTabSize)) THEN + IF done & (f.fd >= fileTabSize) THEN errno := Unix.Close(f.fd) END ; + Kernel.GC(TRUE); + f.fd := Unix.Open(f.workName, Unix.rdwr + Unix.creat + Unix.trunc, {2, 4,5, 7,8}); + done := f.fd >= 0 + END ; + IF done THEN + IF f.fd >= fileTabSize THEN errno := Unix.Close(f.fd); Err("too many files open", f, 0) + ELSE fileTab[f.fd] := SYSTEM.VAL(LONGINT, f); INC(Kernel.nofiles); Kernel.RegisterObject(f, Finalize); + f.state := open; f.pos := 0; errno := Unix.Fstat(f.fd, stat); + f.dev := stat.dev; f.ino := stat.ino; f.mtime := stat.mtime + END + ELSE errno := Unix.errno(); + IF errno = Unix.ENOENT THEN err := "no such directory" + ELSIF (errno = Unix.ENFILE) OR (errno = Unix.EMFILE) THEN err := "too many files open" + ELSE err := "file not created" + END ; + Err(err, f, errno) + END + END + END Create; + + PROCEDURE Flush(buf: Buffer); + VAR res: LONGINT; f: File; stat: Unix.Status; + BEGIN + IF buf.chg THEN f := buf.f; Create(f); + IF buf.org # f.pos THEN res := Unix.Lseek(f.fd, buf.org, 0) END ; + res := Unix.Write(f.fd, SYSTEM.ADR(buf.data), buf.size); + IF res < 0 THEN Err("error in writing file", f, Unix.errno()) END ; + f.pos := buf.org + buf.size; + buf.chg := FALSE; + res := Unix.Fstat(f.fd, stat); + f.mtime := stat.mtime + END + END Flush; + + PROCEDURE Close* (f: File); + VAR i, res: LONGINT; + BEGIN + IF (f.state # create) OR (f.registerName # "") THEN + Create(f); i := 0; + WHILE (i < nofbufs) & (f.bufs[i] # NIL) DO Flush(f.bufs[i]); INC(i) END ; + res := Unix.Fsync(f.fd); + IF res < 0 THEN Err("error in writing file", f, Unix.errno()) END + END + END Close; + + PROCEDURE Length* (f: File): LONGINT; + BEGIN RETURN f.len + END Length; + + PROCEDURE New* (name: ARRAY OF CHAR): File; + VAR f: File; + BEGIN + NEW(f); f.workName := ""; COPY(name, f.registerName); + f.fd := noDesc; f.state := create; f.len := 0; f.pos := 0; f.swapper := -1; (*all f.buf[i] = NIL*) + RETURN f + END New; +(* + PROCEDURE ScanPath(VAR pos: INTEGER; VAR dir: ARRAY OF CHAR); (* supports ~, ~user and blanks inside path *) + VAR i: INTEGER; ch: CHAR; home: ARRAY 256 OF CHAR; + BEGIN + i := 0; ch := Kernel.OBERON[pos]; + WHILE (ch = " ") OR (ch = ":") DO INC(pos); ch := Kernel.OBERON[pos] END ; + IF ch = "~" THEN + INC(pos); ch := Kernel.OBERON[pos]; + home := ""; Args.GetEnv("HOME", home); + WHILE home[i] # 0X DO dir[i] := home[i]; INC(i) END ; + IF (ch # "/") & (ch # 0X) & (ch # ":") & (ch # " ") THEN + WHILE (i > 0) & (dir[i-1] # "/") DO DEC(i) END + END + END ; + WHILE (ch # 0X) & (ch # ":") DO dir[i] := ch; INC(i); INC(pos); ch := Kernel.OBERON[pos] END ; + WHILE (i > 0) & (dir[i-1] = " ") DO DEC(i) END ; + dir[i] := 0X + END ScanPath; +*) + PROCEDURE HasDir(VAR name: ARRAY OF CHAR): BOOLEAN; + VAR i: INTEGER; ch: CHAR; + BEGIN i := 0; ch := name[0]; + WHILE (ch # 0X) & (ch # "/") DO INC(i); ch := name[i] END ; + RETURN ch = "/" + END HasDir; + + PROCEDURE CacheEntry(dev, ino: LONGINT; mtime: LONGINT): File; + VAR f: File; i: INTEGER; stat: Unix.Status; res: LONGINT; + BEGIN i := 0; + WHILE i < fileTabSize DO + f := SYSTEM.VAL(File, fileTab[i]); + IF (f # NIL) & (ino = f.ino) & (dev = f.dev) THEN + IF mtime # f.mtime THEN i := 0; + WHILE i < nofbufs DO + IF f.bufs[i] # NIL THEN f.bufs[i].org := -1; f.bufs[i] := NIL END ; + INC(i) + END ; + f.swapper := -1; f.mtime := mtime; + res := Unix.Fstat(f.fd, stat); f.len := stat.size + END ; + RETURN f + END ; + INC(i) + END ; + RETURN NIL + END CacheEntry; + + PROCEDURE Old* (name: ARRAY OF CHAR): File; + VAR f: File; fd, res, errno: LONGINT; pos: INTEGER; done: BOOLEAN; + dir, path: ARRAY 256 OF CHAR; + stat: Unix.Status; + BEGIN + IF name # "" THEN + IF HasDir(name) THEN dir := ""; COPY(name, path) + ELSE + pos := 0; + COPY(name, path); (* -- noch *) + (*ScanPath(pos, dir);*) (*MakeFileName(dir, name, path);*) (*ScanPath(pos, dir)*) + END ; + LOOP + fd := Unix.Open(path, Unix.rdwr, {}); done := fd >= 0; errno := Unix.errno(); + IF (~done & ((errno = Unix.ENFILE) OR (errno = Unix.EMFILE))) OR (done & (fd >= fileTabSize)) THEN + IF done & (fd >= fileTabSize) THEN res := Unix.Close(fd) END ; + Kernel.GC(TRUE); + fd := Unix.Open(path, Unix.rdwr, {}); + done := fd >= 0; errno := Unix.errno(); + IF ~done & ((errno = Unix.ENFILE) OR (errno = Unix.EMFILE)) THEN Err("too many files open", f, errno) END + END ; + IF ~done & ((errno = Unix.EACCES) OR (errno = Unix.EROFS) OR (errno = Unix.EAGAIN)) THEN + (* errno EAGAIN observed on Solaris 2.4 *) + fd := Unix.Open(path, Unix.rdonly, {}); done := fd >= 0; errno := Unix.errno() + END ; +IF (~done) & (errno # Unix.ENOENT) THEN + Console.String("warning Files.Old "); Console.String(name); + Console.String(" errno = "); Console.Int(errno, 0); Console.Ln; +END ; + IF done THEN + res := Unix.Fstat(fd, stat); + f := CacheEntry(stat.dev, stat.ino, stat.mtime); + IF f # NIL THEN res := Unix.Close(fd); RETURN f + ELSIF fd >= fileTabSize THEN res := Unix.Close(fd); Err("too many files open", f, 0) + ELSE NEW(f); fileTab[fd] := SYSTEM.VAL(LONGINT, f); INC(Kernel.nofiles); Kernel.RegisterObject(f, Finalize); + f.fd := fd; f.state := open; f.len := stat.size; f.pos := 0; f.swapper := -1; (*all f.buf[i] = NIL*) + COPY(name, f.workName); f.registerName := ""; f.tempFile := FALSE; + f.dev := stat.dev; f.ino := stat.ino; f.mtime := stat.mtime; + RETURN f + END + ELSIF dir = "" THEN RETURN NIL + ELSE (*MakeFileName(dir, name, path);*) (*ScanPath(pos, dir)*) + RETURN NIL + END + END + ELSE RETURN NIL + END + END Old; + + PROCEDURE Purge* (f: File); + VAR i: INTEGER; stat: Unix.Status; res: LONGINT; + BEGIN i := 0; + WHILE i < nofbufs DO + IF f.bufs[i] # NIL THEN f.bufs[i].org := -1; f.bufs[i] := NIL END ; + INC(i) + END ; + IF f.fd # noDesc THEN res := Unix.Ftruncate(f.fd, 0); res := Unix.Lseek(f.fd, 0, 0) END ; + f.pos := 0; f.len := 0; f.swapper := -1; + res := Unix.Fstat(f.fd, stat); f.mtime := stat.mtime + END Purge; + + PROCEDURE GetDate* (f: File; VAR t, d: LONGINT); + VAR stat: Unix.Status; clock, res: LONGINT; time: Time; + BEGIN + Create(f); res := Unix.Fstat(f.fd, stat); + time := localtime(stat.mtime); + t := time.sec + ASH(time.min, 6) + ASH(time.hour, 12); + d := time.mday + ASH(time.mon+1, 5) + ASH(time.year MOD 100, 9) + END GetDate; + + PROCEDURE Pos* (VAR r: Rider): LONGINT; + BEGIN RETURN r.org + r.offset + END Pos; + + PROCEDURE Set* (VAR r: Rider; f: File; pos: LONGINT); + VAR org, offset, i, n, res: LONGINT; buf: Buffer; + BEGIN + IF f # NIL THEN + IF pos > f.len THEN pos := f.len ELSIF pos < 0 THEN pos := 0 END ; + offset := pos MOD bufsize; org := pos - offset; i := 0; + WHILE (i < nofbufs) & (f.bufs[i] # NIL) & (org # f.bufs[i].org) DO INC(i) END ; + IF i < nofbufs THEN + IF f.bufs[i] = NIL THEN NEW(buf); buf.chg := FALSE; buf.org := -1; buf.f := f; f.bufs[i] := buf + ELSE buf := f.bufs[i] + END + ELSE + f.swapper := (f.swapper + 1) MOD nofbufs; + buf := f.bufs[f.swapper]; + Flush(buf) + END ; + IF buf.org # org THEN + IF org = f.len THEN buf.size := 0 + ELSE Create(f); + IF f.pos # org THEN res := Unix.Lseek(f.fd, org, 0) END ; + n := Unix.ReadBlk(f.fd, buf.data); + IF n < 0 THEN Err("read from file not done", f, Unix.errno()) END ; + f.pos := org + n; + buf.size := n + END ; + buf.org := org; buf.chg := FALSE + END + ELSE buf := NIL; org := 0; offset := 0 + END ; + r.buf := buf; r.org := org; r.offset := offset; r.eof := FALSE; r.res := 0 + END Set; + + PROCEDURE Read* (VAR r: Rider; VAR x: SYSTEM.BYTE); + VAR offset: LONGINT; buf: Buffer; + BEGIN + buf := r.buf; offset := r.offset; + IF r.org # buf.org THEN Set(r, buf.f, r.org + offset); buf := r.buf; offset := r.offset END ; + IF (offset < buf.size) THEN + x := buf.data[offset]; r.offset := offset + 1 + ELSIF r.org + offset < buf.f.len THEN + Set(r, r.buf.f, r.org + offset); + x := r.buf.data[0]; r.offset := 1 + ELSE + x := 0X; r.eof := TRUE + END + END Read; + + PROCEDURE ReadBytes* (VAR r: Rider; VAR x: ARRAY OF SYSTEM.BYTE; n: LONGINT); + VAR xpos, min, restInBuf, offset: LONGINT; buf: Buffer; + BEGIN + IF n > LEN(x) THEN IdxTrap END ; + xpos := 0; buf := r.buf; offset := r.offset; + WHILE n > 0 DO + IF (r.org # buf.org) OR (offset >= bufsize) THEN + Set(r, buf.f, r.org + offset); + buf := r.buf; offset := r.offset + END ; + restInBuf := buf.size - offset; + IF restInBuf = 0 THEN r.res := n; r.eof := TRUE; RETURN + ELSIF n > restInBuf THEN min := restInBuf ELSE min := n END ; + SYSTEM.MOVE(SYSTEM.ADR(buf.data) + offset, SYSTEM.ADR(x) + xpos, min); + INC(offset, min); r.offset := offset; INC(xpos, min); DEC(n, min) + END ; + r.res := 0; r.eof := FALSE + END ReadBytes; + + PROCEDURE Base* (VAR r: Rider): File; + BEGIN RETURN r.buf.f + END Base; + + PROCEDURE Write* (VAR r: Rider; x: SYSTEM.BYTE); + VAR buf: Buffer; offset: LONGINT; + BEGIN + buf := r.buf; offset := r.offset; + IF (r.org # buf.org) OR (offset >= bufsize) THEN + Set(r, buf.f, r.org + offset); + buf := r.buf; offset := r.offset + END ; + buf.data[offset] := x; + buf.chg := TRUE; + IF offset = buf.size THEN + INC(buf.size); INC(buf.f.len) + END ; + r.offset := offset + 1; r.res := 0 + END Write; + + PROCEDURE WriteByte* (VAR r : Rider; x : SYSTEM.BYTE); (* added for compatibility with PO 2013, -- noch *) + BEGIN + Write(r, x); + END WriteByte; + + PROCEDURE WriteBytes* (VAR r: Rider; VAR x: ARRAY OF SYSTEM.BYTE; n: LONGINT); + VAR xpos, min, restInBuf, offset: LONGINT; buf: Buffer; + BEGIN + IF n > LEN(x) THEN IdxTrap END ; + xpos := 0; buf := r.buf; offset := r.offset; + WHILE n > 0 DO + IF (r.org # buf.org) OR (offset >= bufsize) THEN + Set(r, buf.f, r.org + offset); + buf := r.buf; offset := r.offset + END ; + restInBuf := bufsize - offset; + IF n > restInBuf THEN min := restInBuf ELSE min := n END ; + SYSTEM.MOVE(SYSTEM.ADR(x) + xpos, SYSTEM.ADR(buf.data) + offset, min); + INC(offset, min); r.offset := offset; + IF offset > buf.size THEN INC(buf.f.len, offset - buf.size); buf.size := offset END ; + INC(xpos, min); DEC(n, min); buf.chg := TRUE + END ; + r.res := 0 + END WriteBytes; + +(* another solution would be one that is similar to ReadBytes, WriteBytes. +No code duplication, more symmetric, only two ifs for +Read and Write in buffer, buf.size replaced by bufsize in Write ops, buf.size and len +must be made consistent with offset (if offset > buf.size) in a lazy way. + +PROCEDURE Write* (VAR r: Rider; x: SYSTEM.BYTE); + VAR buf: Buffer; offset: LONGINT; +BEGIN + buf := r.buf; offset := r.offset; + IF (offset >= bufsize) OR (r.org # buf.org) THEN + Set(r, buf.f, r.org + offset); buf := r.buf; offset := r.offset; + END ; + buf.data[offset] := x; r.offset := offset + 1; buf.chg := TRUE +END Write; + + +PROCEDURE WriteBytes ... + +PROCEDURE Read* (VAR r: Rider; VAR x: SYSTEM.BYTE); + VAR offset: LONGINT; buf: Buffer; +BEGIN + buf := r.buf; offset := r.offset; + IF (offset >= buf.size) OR (r.org # buf.org) THEN + IF r.org + offset >= buf.f.len THEN x := 0X; r.eof := TRUE; RETURN + ELSE Set(r, buf.f, r.org + offset); buf := r.buf; offset := r.offset + END + END ; + x := buf.data[offset]; r.offset := offset + 1 +END Read; + +but this would also affect Set, Length, and Flush. +Especially Length would become fairly complex. +*) + + PROCEDURE Delete* (name: ARRAY OF CHAR; VAR res: INTEGER); + BEGIN + res := SHORT(Unix.Unlink(name)); + res := SHORT(Unix.errno()) + END Delete; + + PROCEDURE Rename* (old, new: ARRAY OF CHAR; VAR res: INTEGER); + VAR fdold, fdnew, n, errno, r: LONGINT; + ostat, nstat: Unix.Status; + buf: ARRAY 4096 OF CHAR; + BEGIN + r := Unix.Stat(old, ostat); + IF r >= 0 THEN + r := Unix.Stat(new, nstat); + IF (r >= 0) & ((ostat.dev # nstat.dev) OR (ostat.ino # nstat.ino)) THEN + Delete(new, res); (* work around stale nfs handles *) + END ; + r := Unix.Rename(old, new); + IF r < 0 THEN res := SHORT(Unix.errno()); + IF res = Unix.EXDEV THEN (* cross device link, move the file *) + fdold := Unix.Open(old, Unix.rdonly, {}); + IF fdold < 0 THEN res := 2; RETURN END ; + fdnew := Unix.Open(new, Unix.rdwr + Unix.creat + Unix.trunc, {2, 4,5, 7,8}); + IF fdnew < 0 THEN r := Unix.Close(fdold); res := 3; RETURN END ; + n := Unix.Read(fdold, SYSTEM.ADR(buf), bufsize); + WHILE n > 0 DO + r := Unix.Write(fdnew, SYSTEM.ADR(buf), n); + IF r < 0 THEN errno := Unix.errno(); r := Unix.Close(fdold); r := Unix.Close(fdnew); + Err("cannot move file", NIL, errno) + END ; + n := Unix.Read(fdold, SYSTEM.ADR(buf), bufsize) + END ; + errno := Unix.errno(); + r := Unix.Close(fdold); r := Unix.Close(fdnew); + IF n = 0 THEN r := Unix.Unlink(old); res := 0 + ELSE Err("cannot move file", NIL, errno) + END ; + ELSE RETURN (* res is Unix.Rename return code *) + END + END ; + res := 0 + ELSE res := 2 (* old file not found *) + END + END Rename; + + PROCEDURE Register* (f: File); + VAR idx, errno: INTEGER; f1: File; file: ARRAY 104 OF CHAR; + BEGIN + IF (f.state = create) & (f.registerName # "") THEN f.state := close (* shortcut renaming *) END ; + Close(f); + IF f.registerName # "" THEN + Rename(f.workName, f.registerName, errno); + IF errno # 0 THEN COPY(f.registerName, file); HALT(99) END ; + f.workName := f.registerName; f.registerName := ""; f.tempFile := FALSE + END + END Register; + + PROCEDURE ChangeDirectory*(path: ARRAY OF CHAR; VAR res: INTEGER); + BEGIN + res := SHORT(Unix.Chdir(path)); + getcwd(Kernel.CWD) + END ChangeDirectory; + + PROCEDURE FlipBytes(VAR src, dest: ARRAY OF SYSTEM.BYTE); + VAR i, j: LONGINT; + BEGIN + IF ~Kernel.littleEndian THEN i := LEN(src); j := 0; + WHILE i > 0 DO DEC(i); dest[j] := src[i]; INC(j) END + ELSE SYSTEM.MOVE(SYSTEM.ADR(src), SYSTEM.ADR(dest), LEN(src)) + END + END FlipBytes; + + PROCEDURE ReadBool* (VAR R: Rider; VAR x: BOOLEAN); + BEGIN Read(R, SYSTEM.VAL(CHAR, x)) + END ReadBool; + + PROCEDURE ReadInt* (VAR R: Rider; VAR x: INTEGER); + VAR b: ARRAY 2 OF CHAR; + BEGIN ReadBytes(R, b, 2); + x := ORD(b[0]) + ORD(b[1])*256 + END ReadInt; + + PROCEDURE ReadLInt* (VAR R: Rider; VAR x: LONGINT); + VAR b: ARRAY 4 OF CHAR; + BEGIN ReadBytes(R, b, 4); + x := ORD(b[0]) + ORD(b[1])*100H + ORD(b[2])*10000H + ORD(b[3])*1000000H + END ReadLInt; + + PROCEDURE ReadSet* (VAR R: Rider; VAR x: SET); + VAR b: ARRAY 4 OF CHAR; + BEGIN ReadBytes(R, b, 4); + x := SYSTEM.VAL(SET, ORD(b[0]) + ORD(b[1])*100H + ORD(b[2])*10000H + ORD(b[3])*1000000H) + END ReadSet; + + PROCEDURE ReadReal* (VAR R: Rider; VAR x: REAL); + VAR b: ARRAY 4 OF CHAR; + BEGIN ReadBytes(R, b, 4); FlipBytes(b, x) + END ReadReal; + + PROCEDURE ReadLReal* (VAR R: Rider; VAR x: LONGREAL); + VAR b: ARRAY 8 OF CHAR; + BEGIN ReadBytes(R, b, 8); FlipBytes(b, x) + END ReadLReal; + + PROCEDURE ReadString* (VAR R: Rider; VAR x: ARRAY OF CHAR); + VAR i: INTEGER; ch: CHAR; + BEGIN i := 0; + REPEAT Read(R, ch); x[i] := ch; INC(i) UNTIL ch = 0X + END ReadString; + + (* need to read line; -- noch *) + PROCEDURE ReadLine* (VAR R: Rider; VAR x: ARRAY OF CHAR); + VAR i: INTEGER; ch: CHAR; b : BOOLEAN; + BEGIN i := 0; + b := FALSE; + REPEAT + Read(R, ch); + IF ((ch = 0X) OR (ch = 0AX) OR (ch = 0DX)) THEN + b := TRUE + ELSE + x[i] := ch; + INC(i); + END; + UNTIL b + END ReadLine; + + PROCEDURE ReadNum* (VAR R: Rider; VAR x: LONGINT); + VAR s: SHORTINT; ch: CHAR; n: LONGINT; + BEGIN s := 0; n := 0; Read(R, ch); + WHILE ORD(ch) >= 128 DO INC(n, ASH(ORD(ch) - 128, s) ); INC(s, 7); Read(R, ch) END; + INC(n, ASH(ORD(ch) MOD 64 - ORD(ch) DIV 64 * 64, s) ); + x := n + END ReadNum; + + PROCEDURE WriteBool* (VAR R: Rider; x: BOOLEAN); + BEGIN Write(R, SYSTEM.VAL(CHAR, x)) + END WriteBool; + + PROCEDURE WriteInt* (VAR R: Rider; x: INTEGER); + VAR b: ARRAY 2 OF CHAR; + BEGIN b[0] := CHR(x); b[1] := CHR(x DIV 256); + WriteBytes(R, b, 2); + END WriteInt; + + PROCEDURE WriteLInt* (VAR R: Rider; x: LONGINT); + VAR b: ARRAY 4 OF CHAR; + BEGIN + b[0] := CHR(x); b[1] := CHR(x DIV 100H); b[2] := CHR(x DIV 10000H); b[3] := CHR(x DIV 1000000H); + WriteBytes(R, b, 4); + END WriteLInt; + + PROCEDURE WriteSet* (VAR R: Rider; x: SET); + VAR b: ARRAY 4 OF CHAR; i: LONGINT; + BEGIN i := SYSTEM.VAL(LONGINT, x); + b[0] := CHR(i); b[1] := CHR(i DIV 100H); b[2] := CHR(i DIV 10000H); b[3] := CHR(i DIV 1000000H); + WriteBytes(R, b, 4); + END WriteSet; + + PROCEDURE WriteReal* (VAR R: Rider; x: REAL); + VAR b: ARRAY 4 OF CHAR; + BEGIN FlipBytes(x, b); WriteBytes(R, b, 4) + END WriteReal; + + PROCEDURE WriteLReal* (VAR R: Rider; x: LONGREAL); + VAR b: ARRAY 8 OF CHAR; + BEGIN FlipBytes(x, b); WriteBytes(R, b, 8) + END WriteLReal; + + PROCEDURE WriteString* (VAR R: Rider; x: ARRAY [1] OF CHAR); + VAR i: INTEGER; + BEGIN i := 0; + WHILE x[i] # 0X DO INC(i) END ; + WriteBytes(R, x, i+1) + END WriteString; + + PROCEDURE WriteNum* (VAR R: Rider; x: LONGINT); + BEGIN + WHILE (x < - 64) OR (x > 63) DO Write(R, CHR(x MOD 128 + 128)); x := x DIV 128 END; + Write(R, CHR(x MOD 128)) + END WriteNum; + + PROCEDURE GetName*(f: File; VAR name: ARRAY OF CHAR); + BEGIN + COPY (f.workName, name); + END GetName; + + PROCEDURE Finalize(o: SYSTEM.PTR); + VAR f: File; res: LONGINT; + BEGIN + f := SYSTEM.VAL(File, o); + IF f.fd >= 0 THEN + fileTab[f.fd] := 0; res := Unix.Close(f.fd); f.fd := -1; DEC(Kernel.nofiles); + IF f.tempFile THEN res := Unix.Unlink(f.workName) END + END + END Finalize; + + PROCEDURE Init; + VAR i: LONGINT; + BEGIN + i := 0; WHILE i < fileTabSize DO fileTab[i] := 0; INC(i) END ; + tempno := -1; Kernel.nofiles := 0 + END Init; + +BEGIN Init +END Files. diff --git a/src/lib/system/freebsd/clang/Files0.Mod b/src/lib/system/freebsd/clang/Files0.Mod new file mode 100644 index 00000000..f889db57 --- /dev/null +++ b/src/lib/system/freebsd/clang/Files0.Mod @@ -0,0 +1,630 @@ +MODULE Files0; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix files *) + +(* this module is not for use by developers and inteded to bootstrap voc *) +(* for general use import Files module *) + + IMPORT SYSTEM, Unix, Kernel := Kernel0, Args, Console; + + (* standard data type I/O + + little endian, + Sint:1, Int:2, Lint:4 + ORD({0}) = 1, + false = 0, true =1 + IEEE real format, + null terminated strings, + compact numbers according to M.Odersky *) + + + CONST + nofbufs = 4; + bufsize = 4096; + fileTabSize = 64; + noDesc = -1; + notDone = -1; + + (* file states *) + open = 0; create = 1; close = 2; + + + TYPE + FileName = ARRAY 101 OF CHAR; + File* = POINTER TO Handle; + Buffer = POINTER TO BufDesc; + + Handle = RECORD + workName, registerName: FileName; + tempFile: BOOLEAN; + dev, ino, mtime: LONGINT; + fd-, len, pos: LONGINT; + bufs: ARRAY nofbufs OF Buffer; + swapper, state: INTEGER + END ; + + BufDesc = RECORD + f: File; + chg: BOOLEAN; + org, size: LONGINT; + data: ARRAY bufsize OF SYSTEM.BYTE + END ; + + Rider* = RECORD + res*: LONGINT; + eof*: BOOLEAN; + buf: Buffer; + org, offset: LONGINT + END ; + + Time = POINTER TO TimeDesc; + TimeDesc = RECORD + sec*, min*, hour*, mday*, mon*, year*, wday*, isdst*, zone*, gmtoff*: LONGINT; +(* sec*, min*, hour*, mday*, mon*, year*, wday*, isdst*, zone*, gmtoff*: INTEGER;*) + END ; + + VAR + fileTab: ARRAY fileTabSize OF LONGINT (*=File*); + tempno: INTEGER; + +(* for localtime *) + PROCEDURE -includetime() + '#include "time.h"'; + + PROCEDURE -localtime(VAR clock: LONGINT): Time + "(Files0_Time) localtime(clock)"; + + PROCEDURE -getcwd(VAR cwd: Unix.Name) + "getcwd(cwd, cwd__len)"; + + PROCEDURE -IdxTrap "__HALT(-1)"; + + PROCEDURE^ Finalize(o: SYSTEM.PTR); + + PROCEDURE Err(s: ARRAY OF CHAR; f: File; errno: LONGINT); + BEGIN + Console.Ln; Console.String("-- "); Console.String(s); Console.String(": "); + IF f # NIL THEN + IF f.registerName # "" THEN Console.String(f.registerName) ELSE Console.String(f.workName) END + END ; + IF errno # 0 THEN Console.String(" errno = "); Console.Int(errno, 1) END ; + Console.Ln; + HALT(99) + END Err; + + PROCEDURE MakeFileName(dir, name: ARRAY OF CHAR; VAR dest: ARRAY OF CHAR); + VAR i, j: INTEGER; + BEGIN i := 0; j := 0; + WHILE dir[i] # 0X DO dest[i] := dir[i]; INC(i) END ; + IF dest[i-1] # "/" THEN dest[i] := "/"; INC(i) END ; + WHILE name[j] # 0X DO dest[i] := name[j]; INC(i); INC(j) END ; + dest[i] := 0X + END MakeFileName; + + PROCEDURE GetTempName(finalName: ARRAY OF CHAR; VAR name: ARRAY OF CHAR); + VAR n, i, j: LONGINT; + BEGIN + INC(tempno); n := tempno; i := 0; + IF finalName[0] # "/" THEN (* relative pathname *) + WHILE Kernel.CWD[i] # 0X DO name[i] := Kernel.CWD[i]; INC(i) END; + IF Kernel.CWD[i-1] # "/" THEN name[i] := "/"; INC(i) END + END; + j := 0; + WHILE finalName[j] # 0X DO name[i] := finalName[j]; INC(i); INC(j) END; + DEC(i); + WHILE name[i] # "/" DO DEC(i) END; + name[i+1] := "."; name[i+2] := "t"; name[i+3] := "m"; name[i+4] := "p"; name[i+5] := "."; INC(i, 6); + WHILE n > 0 DO name[i] := CHR(n MOD 10 + ORD("0")); n := n DIV 10; INC(i) END; + name[i] := "."; INC(i); n := SHORT(Unix.Getpid()); + WHILE n > 0 DO name[i] := CHR(n MOD 10 + ORD("0")); n := n DIV 10; INC(i) END; + name[i] := 0X + END GetTempName; + + PROCEDURE Create(f: File); + VAR stat: Unix.Status; done: BOOLEAN; + errno: LONGINT; err: ARRAY 32 OF CHAR; + BEGIN + IF f.fd = noDesc THEN + IF f.state = create THEN GetTempName(f.registerName, f.workName); f.tempFile := TRUE + ELSIF f.state = close THEN + f.workName := f.registerName; f.registerName := ""; f.tempFile := FALSE + END ; + errno := Unix.Unlink(f.workName); (*unlink first to avoid stale NFS handles and to avoid reuse of inodes*) + f.fd := Unix.Open(f.workName, Unix.rdwr + Unix.creat + Unix.trunc, {2, 4,5, 7,8}); + done := f.fd >= 0; errno := Unix.errno(); + IF (~done & ((errno = Unix.ENFILE) OR (errno = Unix.EMFILE))) OR (done & (f.fd >= fileTabSize)) THEN + IF done & (f.fd >= fileTabSize) THEN errno := Unix.Close(f.fd) END ; + Kernel.GC(TRUE); + f.fd := Unix.Open(f.workName, Unix.rdwr + Unix.creat + Unix.trunc, {2, 4,5, 7,8}); + done := f.fd >= 0 + END ; + IF done THEN + IF f.fd >= fileTabSize THEN errno := Unix.Close(f.fd); Err("too many files open", f, 0) + ELSE fileTab[f.fd] := SYSTEM.VAL(LONGINT, f); INC(Kernel.nofiles); Kernel.RegisterObject(f, Finalize); + f.state := open; f.pos := 0; errno := Unix.Fstat(f.fd, stat); + f.dev := stat.dev; f.ino := stat.ino; f.mtime := stat.mtime + END + ELSE errno := Unix.errno(); + IF errno = Unix.ENOENT THEN err := "no such directory" + ELSIF (errno = Unix.ENFILE) OR (errno = Unix.EMFILE) THEN err := "too many files open" + ELSE err := "file not created" + END ; + Err(err, f, errno) + END + END + END Create; + + PROCEDURE Flush(buf: Buffer); + VAR res: LONGINT; f: File; stat: Unix.Status; + BEGIN + IF buf.chg THEN f := buf.f; Create(f); + IF buf.org # f.pos THEN res := Unix.Lseek(f.fd, buf.org, 0) END ; + res := Unix.Write(f.fd, SYSTEM.ADR(buf.data), buf.size); + IF res < 0 THEN Err("error in writing file", f, Unix.errno()) END ; + f.pos := buf.org + buf.size; + buf.chg := FALSE; + res := Unix.Fstat(f.fd, stat); + f.mtime := stat.mtime + END + END Flush; + + PROCEDURE Close* (f: File); + VAR i, res: LONGINT; + BEGIN + IF (f.state # create) OR (f.registerName # "") THEN + Create(f); i := 0; + WHILE (i < nofbufs) & (f.bufs[i] # NIL) DO Flush(f.bufs[i]); INC(i) END ; + res := Unix.Fsync(f.fd); + IF res < 0 THEN Err("error in writing file", f, Unix.errno()) END + END + END Close; + + PROCEDURE Length* (f: File): LONGINT; + BEGIN RETURN f.len + END Length; + + PROCEDURE New* (name: ARRAY OF CHAR): File; + VAR f: File; + BEGIN + NEW(f); f.workName := ""; COPY(name, f.registerName); + f.fd := noDesc; f.state := create; f.len := 0; f.pos := 0; f.swapper := -1; (*all f.buf[i] = NIL*) + RETURN f + END New; + + PROCEDURE ScanPath(VAR pos: INTEGER; VAR dir: ARRAY OF CHAR); (* supports ~, ~user and blanks inside path *) + VAR i: INTEGER; ch: CHAR; home: ARRAY 256 OF CHAR; + BEGIN + i := 0; ch := Kernel.OBERON[pos]; + WHILE (ch = " ") OR (ch = ":") DO INC(pos); ch := Kernel.OBERON[pos] END ; + IF ch = "~" THEN + INC(pos); ch := Kernel.OBERON[pos]; + home := ""; Args.GetEnv("HOME", home); + WHILE home[i] # 0X DO dir[i] := home[i]; INC(i) END ; + IF (ch # "/") & (ch # 0X) & (ch # ":") & (ch # " ") THEN + WHILE (i > 0) & (dir[i-1] # "/") DO DEC(i) END + END + END ; + WHILE (ch # 0X) & (ch # ":") DO dir[i] := ch; INC(i); INC(pos); ch := Kernel.OBERON[pos] END ; + WHILE (i > 0) & (dir[i-1] = " ") DO DEC(i) END ; + dir[i] := 0X + END ScanPath; + + PROCEDURE HasDir(VAR name: ARRAY OF CHAR): BOOLEAN; + VAR i: INTEGER; ch: CHAR; + BEGIN i := 0; ch := name[0]; + WHILE (ch # 0X) & (ch # "/") DO INC(i); ch := name[i] END ; + RETURN ch = "/" + END HasDir; + + PROCEDURE CacheEntry(dev, ino: LONGINT; mtime: LONGINT): File; + VAR f: File; i: INTEGER; stat: Unix.Status; res: LONGINT; + BEGIN i := 0; + WHILE i < fileTabSize DO + f := SYSTEM.VAL(File, fileTab[i]); + IF (f # NIL) & (ino = f.ino) & (dev = f.dev) THEN + IF mtime # f.mtime THEN i := 0; + WHILE i < nofbufs DO + IF f.bufs[i] # NIL THEN f.bufs[i].org := -1; f.bufs[i] := NIL END ; + INC(i) + END ; + f.swapper := -1; f.mtime := mtime; + res := Unix.Fstat(f.fd, stat); f.len := stat.size + END ; + RETURN f + END ; + INC(i) + END ; + RETURN NIL + END CacheEntry; + + PROCEDURE Old* (name: ARRAY OF CHAR): File; + VAR f: File; fd, res, errno: LONGINT; pos: INTEGER; done: BOOLEAN; + dir, path: ARRAY 256 OF CHAR; + stat: Unix.Status; + BEGIN + IF name # "" THEN + IF HasDir(name) THEN dir := ""; COPY(name, path) + ELSE pos := 0; ScanPath(pos, dir); MakeFileName(dir, name, path); ScanPath(pos, dir) + END ; + LOOP + fd := Unix.Open(path, Unix.rdwr, {}); done := fd >= 0; errno := Unix.errno(); + IF (~done & ((errno = Unix.ENFILE) OR (errno = Unix.EMFILE))) OR (done & (fd >= fileTabSize)) THEN + IF done & (fd >= fileTabSize) THEN res := Unix.Close(fd) END ; + Kernel.GC(TRUE); + fd := Unix.Open(path, Unix.rdwr, {}); + done := fd >= 0; errno := Unix.errno(); + IF ~done & ((errno = Unix.ENFILE) OR (errno = Unix.EMFILE)) THEN Err("too many files open", f, errno) END + END ; + IF ~done & ((errno = Unix.EACCES) OR (errno = Unix.EROFS) OR (errno = Unix.EAGAIN)) THEN + (* errno EAGAIN observed on Solaris 2.4 *) + fd := Unix.Open(path, Unix.rdonly, {}); done := fd >= 0; errno := Unix.errno() + END ; +IF (~done) & (errno # Unix.ENOENT) THEN + Console.String("warning Files0.Old "); Console.String(name); + Console.String(" errno = "); Console.Int(errno, 0); Console.Ln; +END ; + IF done THEN + res := Unix.Fstat(fd, stat); + f := CacheEntry(stat.dev, stat.ino, stat.mtime); + IF f # NIL THEN res := Unix.Close(fd); RETURN f + ELSIF fd >= fileTabSize THEN res := Unix.Close(fd); Err("too many files open", f, 0) + ELSE NEW(f); fileTab[fd] := SYSTEM.VAL(LONGINT, f); INC(Kernel.nofiles); Kernel.RegisterObject(f, Finalize); + f.fd := fd; f.state := open; f.len := stat.size; f.pos := 0; f.swapper := -1; (*all f.buf[i] = NIL*) + COPY(name, f.workName); f.registerName := ""; f.tempFile := FALSE; + f.dev := stat.dev; f.ino := stat.ino; f.mtime := stat.mtime; + RETURN f + END + ELSIF dir = "" THEN RETURN NIL + ELSE MakeFileName(dir, name, path); ScanPath(pos, dir) + END + END + ELSE RETURN NIL + END + END Old; + + PROCEDURE Purge* (f: File); + VAR i: INTEGER; stat: Unix.Status; res: LONGINT; + BEGIN i := 0; + WHILE i < nofbufs DO + IF f.bufs[i] # NIL THEN f.bufs[i].org := -1; f.bufs[i] := NIL END ; + INC(i) + END ; + IF f.fd # noDesc THEN res := Unix.Ftruncate(f.fd, 0); res := Unix.Lseek(f.fd, 0, 0) END ; + f.pos := 0; f.len := 0; f.swapper := -1; + res := Unix.Fstat(f.fd, stat); f.mtime := stat.mtime + END Purge; + + PROCEDURE GetDate* (f: File; VAR t, d: LONGINT); + VAR stat: Unix.Status; clock, res: LONGINT; time: Time; + BEGIN + Create(f); res := Unix.Fstat(f.fd, stat); + time := localtime(stat.mtime); + t := time.sec + ASH(time.min, 6) + ASH(time.hour, 12); + d := time.mday + ASH(time.mon+1, 5) + ASH(time.year MOD 100, 9) + END GetDate; + + PROCEDURE Pos* (VAR r: Rider): LONGINT; + BEGIN RETURN r.org + r.offset + END Pos; + + PROCEDURE Set* (VAR r: Rider; f: File; pos: LONGINT); + VAR org, offset, i, n, res: LONGINT; buf: Buffer; + BEGIN + IF f # NIL THEN + IF pos > f.len THEN pos := f.len ELSIF pos < 0 THEN pos := 0 END ; + offset := pos MOD bufsize; org := pos - offset; i := 0; + WHILE (i < nofbufs) & (f.bufs[i] # NIL) & (org # f.bufs[i].org) DO INC(i) END ; + IF i < nofbufs THEN + IF f.bufs[i] = NIL THEN NEW(buf); buf.chg := FALSE; buf.org := -1; buf.f := f; f.bufs[i] := buf + ELSE buf := f.bufs[i] + END + ELSE + f.swapper := (f.swapper + 1) MOD nofbufs; + buf := f.bufs[f.swapper]; + Flush(buf) + END ; + IF buf.org # org THEN + IF org = f.len THEN buf.size := 0 + ELSE Create(f); + IF f.pos # org THEN res := Unix.Lseek(f.fd, org, 0) END ; + n := Unix.ReadBlk(f.fd, buf.data); + IF n < 0 THEN Err("read from file not done", f, Unix.errno()) END ; + f.pos := org + n; + buf.size := n + END ; + buf.org := org; buf.chg := FALSE + END + ELSE buf := NIL; org := 0; offset := 0 + END ; + r.buf := buf; r.org := org; r.offset := offset; r.eof := FALSE; r.res := 0 + END Set; + + PROCEDURE Read* (VAR r: Rider; VAR x: SYSTEM.BYTE); + VAR offset: LONGINT; buf: Buffer; + BEGIN + buf := r.buf; offset := r.offset; + IF r.org # buf.org THEN Set(r, buf.f, r.org + offset); buf := r.buf; offset := r.offset END ; + IF (offset < buf.size) THEN + x := buf.data[offset]; r.offset := offset + 1 + ELSIF r.org + offset < buf.f.len THEN + Set(r, r.buf.f, r.org + offset); + x := r.buf.data[0]; r.offset := 1 + ELSE + x := 0X; r.eof := TRUE + END + END Read; + + PROCEDURE ReadBytes* (VAR r: Rider; VAR x: ARRAY OF SYSTEM.BYTE; n: LONGINT); + VAR xpos, min, restInBuf, offset: LONGINT; buf: Buffer; + BEGIN + IF n > LEN(x) THEN IdxTrap END ; + xpos := 0; buf := r.buf; offset := r.offset; + WHILE n > 0 DO + IF (r.org # buf.org) OR (offset >= bufsize) THEN + Set(r, buf.f, r.org + offset); + buf := r.buf; offset := r.offset + END ; + restInBuf := buf.size - offset; + IF restInBuf = 0 THEN r.res := n; r.eof := TRUE; RETURN + ELSIF n > restInBuf THEN min := restInBuf ELSE min := n END ; + SYSTEM.MOVE(SYSTEM.ADR(buf.data) + offset, SYSTEM.ADR(x) + xpos, min); + INC(offset, min); r.offset := offset; INC(xpos, min); DEC(n, min) + END ; + r.res := 0; r.eof := FALSE + END ReadBytes; + + PROCEDURE Base* (VAR r: Rider): File; + BEGIN RETURN r.buf.f + END Base; + + PROCEDURE Write* (VAR r: Rider; x: SYSTEM.BYTE); + VAR buf: Buffer; offset: LONGINT; + BEGIN + buf := r.buf; offset := r.offset; + IF (r.org # buf.org) OR (offset >= bufsize) THEN + Set(r, buf.f, r.org + offset); + buf := r.buf; offset := r.offset + END ; + buf.data[offset] := x; + buf.chg := TRUE; + IF offset = buf.size THEN + INC(buf.size); INC(buf.f.len) + END ; + r.offset := offset + 1; r.res := 0 + END Write; + + PROCEDURE WriteBytes* (VAR r: Rider; VAR x: ARRAY OF SYSTEM.BYTE; n: LONGINT); + VAR xpos, min, restInBuf, offset: LONGINT; buf: Buffer; + BEGIN + IF n > LEN(x) THEN IdxTrap END ; + xpos := 0; buf := r.buf; offset := r.offset; + WHILE n > 0 DO + IF (r.org # buf.org) OR (offset >= bufsize) THEN + Set(r, buf.f, r.org + offset); + buf := r.buf; offset := r.offset + END ; + restInBuf := bufsize - offset; + IF n > restInBuf THEN min := restInBuf ELSE min := n END ; + SYSTEM.MOVE(SYSTEM.ADR(x) + xpos, SYSTEM.ADR(buf.data) + offset, min); + INC(offset, min); r.offset := offset; + IF offset > buf.size THEN INC(buf.f.len, offset - buf.size); buf.size := offset END ; + INC(xpos, min); DEC(n, min); buf.chg := TRUE + END ; + r.res := 0 + END WriteBytes; + +(* another solution would be one that is similar to ReadBytes, WriteBytes. +No code duplication, more symmetric, only two ifs for +Read and Write in buffer, buf.size replaced by bufsize in Write ops, buf.size and len +must be made consistent with offset (if offset > buf.size) in a lazy way. + +PROCEDURE Write* (VAR r: Rider; x: SYSTEM.BYTE); + VAR buf: Buffer; offset: LONGINT; +BEGIN + buf := r.buf; offset := r.offset; + IF (offset >= bufsize) OR (r.org # buf.org) THEN + Set(r, buf.f, r.org + offset); buf := r.buf; offset := r.offset; + END ; + buf.data[offset] := x; r.offset := offset + 1; buf.chg := TRUE +END Write; + +PROCEDURE WriteBytes ... + +PROCEDURE Read* (VAR r: Rider; VAR x: SYSTEM.BYTE); + VAR offset: LONGINT; buf: Buffer; +BEGIN + buf := r.buf; offset := r.offset; + IF (offset >= buf.size) OR (r.org # buf.org) THEN + IF r.org + offset >= buf.f.len THEN x := 0X; r.eof := TRUE; RETURN + ELSE Set(r, buf.f, r.org + offset); buf := r.buf; offset := r.offset + END + END ; + x := buf.data[offset]; r.offset := offset + 1 +END Read; + +but this would also affect Set, Length, and Flush. +Especially Length would become fairly complex. +*) + + PROCEDURE Delete* (name: ARRAY OF CHAR; VAR res: INTEGER); + BEGIN + res := SHORT(Unix.Unlink(name)); + res := SHORT(Unix.errno()) + END Delete; + + PROCEDURE Rename* (old, new: ARRAY OF CHAR; VAR res: INTEGER); + VAR fdold, fdnew, n, errno, r: LONGINT; + ostat, nstat: Unix.Status; + buf: ARRAY 4096 OF CHAR; + BEGIN + r := Unix.Stat(old, ostat); + IF r >= 0 THEN + r := Unix.Stat(new, nstat); + IF (r >= 0) & ((ostat.dev # nstat.dev) OR (ostat.ino # nstat.ino)) THEN + Delete(new, res); (* work around stale nfs handles *) + END ; + r := Unix.Rename(old, new); + IF r < 0 THEN res := SHORT(Unix.errno()); + IF res = Unix.EXDEV THEN (* cross device link, move the file *) + fdold := Unix.Open(old, Unix.rdonly, {}); + IF fdold < 0 THEN res := 2; RETURN END ; + fdnew := Unix.Open(new, Unix.rdwr + Unix.creat + Unix.trunc, {2, 4,5, 7,8}); + IF fdnew < 0 THEN r := Unix.Close(fdold); res := 3; RETURN END ; + n := Unix.Read(fdold, SYSTEM.ADR(buf), bufsize); + WHILE n > 0 DO + r := Unix.Write(fdnew, SYSTEM.ADR(buf), n); + IF r < 0 THEN errno := Unix.errno(); r := Unix.Close(fdold); r := Unix.Close(fdnew); + Err("cannot move file", NIL, errno) + END ; + n := Unix.Read(fdold, SYSTEM.ADR(buf), bufsize) + END ; + errno := Unix.errno(); + r := Unix.Close(fdold); r := Unix.Close(fdnew); + IF n = 0 THEN r := Unix.Unlink(old); res := 0 + ELSE Err("cannot move file", NIL, errno) + END ; + ELSE RETURN (* res is Unix.Rename return code *) + END + END ; + res := 0 + ELSE res := 2 (* old file not found *) + END + END Rename; + + PROCEDURE Register* (f: File); + VAR idx, errno: INTEGER; f1: File; file: ARRAY 104 OF CHAR; + BEGIN + IF (f.state = create) & (f.registerName # "") THEN f.state := close (* shortcut renaming *) END ; + Close(f); + IF f.registerName # "" THEN + Rename(f.workName, f.registerName, errno); + IF errno # 0 THEN COPY(f.registerName, file); HALT(99) END ; + f.workName := f.registerName; f.registerName := ""; f.tempFile := FALSE + END + END Register; + + PROCEDURE ChangeDirectory*(path: ARRAY OF CHAR; VAR res: INTEGER); + BEGIN + res := SHORT(Unix.Chdir(path)); + getcwd(Kernel.CWD) + END ChangeDirectory; + + PROCEDURE FlipBytes(VAR src, dest: ARRAY OF SYSTEM.BYTE); + VAR i, j: LONGINT; + BEGIN + IF ~Kernel.littleEndian THEN i := LEN(src); j := 0; + WHILE i > 0 DO DEC(i); dest[j] := src[i]; INC(j) END + ELSE SYSTEM.MOVE(SYSTEM.ADR(src), SYSTEM.ADR(dest), LEN(src)) + END + END FlipBytes; + + PROCEDURE ReadBool* (VAR R: Rider; VAR x: BOOLEAN); + BEGIN Read(R, SYSTEM.VAL(CHAR, x)) + END ReadBool; + + PROCEDURE ReadInt* (VAR R: Rider; VAR x: INTEGER); + VAR b: ARRAY 2 OF CHAR; + BEGIN ReadBytes(R, b, 2); + x := ORD(b[0]) + ORD(b[1])*256 + END ReadInt; + + PROCEDURE ReadLInt* (VAR R: Rider; VAR x: LONGINT); + VAR b: ARRAY 4 OF CHAR; + BEGIN ReadBytes(R, b, 4); + x := ORD(b[0]) + ORD(b[1])*100H + ORD(b[2])*10000H + ORD(b[3])*1000000H + END ReadLInt; + + PROCEDURE ReadSet* (VAR R: Rider; VAR x: SET); + VAR b: ARRAY 4 OF CHAR; + BEGIN ReadBytes(R, b, 4); + x := SYSTEM.VAL(SET, ORD(b[0]) + ORD(b[1])*100H + ORD(b[2])*10000H + ORD(b[3])*1000000H) + END ReadSet; + + PROCEDURE ReadReal* (VAR R: Rider; VAR x: REAL); + VAR b: ARRAY 4 OF CHAR; + BEGIN ReadBytes(R, b, 4); FlipBytes(b, x) + END ReadReal; + + PROCEDURE ReadLReal* (VAR R: Rider; VAR x: LONGREAL); + VAR b: ARRAY 8 OF CHAR; + BEGIN ReadBytes(R, b, 8); FlipBytes(b, x) + END ReadLReal; + + PROCEDURE ReadString* (VAR R: Rider; VAR x: ARRAY OF CHAR); + VAR i: INTEGER; ch: CHAR; + BEGIN i := 0; + REPEAT Read(R, ch); x[i] := ch; INC(i) UNTIL ch = 0X + END ReadString; + + PROCEDURE ReadNum* (VAR R: Rider; VAR x: LONGINT); + VAR s: SHORTINT; ch: CHAR; n: LONGINT; + BEGIN s := 0; n := 0; Read(R, ch); + WHILE ORD(ch) >= 128 DO INC(n, ASH(ORD(ch) - 128, s) ); INC(s, 7); Read(R, ch) END; + INC(n, ASH(ORD(ch) MOD 64 - ORD(ch) DIV 64 * 64, s) ); + x := n + END ReadNum; + + PROCEDURE WriteBool* (VAR R: Rider; x: BOOLEAN); + BEGIN Write(R, SYSTEM.VAL(CHAR, x)) + END WriteBool; + + PROCEDURE WriteInt* (VAR R: Rider; x: INTEGER); + VAR b: ARRAY 2 OF CHAR; + BEGIN b[0] := CHR(x); b[1] := CHR(x DIV 256); + WriteBytes(R, b, 2); + END WriteInt; + + PROCEDURE WriteLInt* (VAR R: Rider; x: LONGINT); + VAR b: ARRAY 4 OF CHAR; + BEGIN + b[0] := CHR(x); b[1] := CHR(x DIV 100H); b[2] := CHR(x DIV 10000H); b[3] := CHR(x DIV 1000000H); + WriteBytes(R, b, 4); + END WriteLInt; + + PROCEDURE WriteSet* (VAR R: Rider; x: SET); + VAR b: ARRAY 4 OF CHAR; i: LONGINT; + BEGIN i := SYSTEM.VAL(LONGINT, x); + b[0] := CHR(i); b[1] := CHR(i DIV 100H); b[2] := CHR(i DIV 10000H); b[3] := CHR(i DIV 1000000H); + WriteBytes(R, b, 4); + END WriteSet; + + PROCEDURE WriteReal* (VAR R: Rider; x: REAL); + VAR b: ARRAY 4 OF CHAR; + BEGIN FlipBytes(x, b); WriteBytes(R, b, 4) + END WriteReal; + + PROCEDURE WriteLReal* (VAR R: Rider; x: LONGREAL); + VAR b: ARRAY 8 OF CHAR; + BEGIN FlipBytes(x, b); WriteBytes(R, b, 8) + END WriteLReal; + + PROCEDURE WriteString* (VAR R: Rider; x: ARRAY [1] OF CHAR); + VAR i: INTEGER; + BEGIN i := 0; + WHILE x[i] # 0X DO INC(i) END ; + WriteBytes(R, x, i+1) + END WriteString; + + PROCEDURE WriteNum* (VAR R: Rider; x: LONGINT); + BEGIN + WHILE (x < - 64) OR (x > 63) DO Write(R, CHR(x MOD 128 + 128)); x := x DIV 128 END; + Write(R, CHR(x MOD 128)) + END WriteNum; + + PROCEDURE Finalize(o: SYSTEM.PTR); + VAR f: File; res: LONGINT; + BEGIN + f := SYSTEM.VAL(File, o); + IF f.fd >= 0 THEN + fileTab[f.fd] := 0; res := Unix.Close(f.fd); f.fd := -1; DEC(Kernel.nofiles); + IF f.tempFile THEN res := Unix.Unlink(f.workName) END + END + END Finalize; + + PROCEDURE Init; + VAR i: LONGINT; + BEGIN + i := 0; WHILE i < fileTabSize DO fileTab[i] := 0; INC(i) END ; + tempno := -1; Kernel.nofiles := 0 + END Init; + +BEGIN Init +END Files0. diff --git a/src/lib/system/freebsd/clang/Kernel.Mod b/src/lib/system/freebsd/clang/Kernel.Mod new file mode 100644 index 00000000..e84e5eae --- /dev/null +++ b/src/lib/system/freebsd/clang/Kernel.Mod @@ -0,0 +1,167 @@ +MODULE Kernel; +(* + J. Templ, 16.4.95 + communication with C-runtime and storage management +*) + + IMPORT SYSTEM, Unix, Args; + + TYPE + RealTime = POINTER TO TimeDesc; + TimeDesc = RECORD + sec, min, hour, mday, mon, year, wday, isdst, zone, gmtoff: LONGINT + END ; + + KeyCmd* = PROCEDURE; + + ObjFinalizer* = PROCEDURE(obj: SYSTEM.PTR); + + + VAR + (* trap handling *) + trapEnv*: Unix.JmpBuf; (* saved stack environment for trap handling *) + + (* oberon heap management *) + nofiles*: LONGINT; + + (* input event handling *) + readSet*, readySet*: Unix.FdSet; + + FKey*: ARRAY 16 OF KeyCmd; + + littleEndian*: BOOLEAN; + + TimeUnit*: LONGINT; (* 1 sec *) + + LIB*, CWD*: ARRAY 256 OF CHAR; + OBERON*: ARRAY 1024 OF CHAR; + + + timeStart: LONGINT; (* milliseconds *) + + PROCEDURE -includesetjmp() + '#include "setjmp.h"'; +(* for localtime *) + PROCEDURE -includetime() + '#include "time.h"'; + + PROCEDURE -Lock*() + "SYSTEM_lock++"; + + PROCEDURE -Unlock*() + "SYSTEM_lock--; if (SYSTEM_interrupted && SYSTEM_lock == 0) __HALT(-9)"; + + PROCEDURE -Exit*(n: LONGINT) + "exit(n)"; + + PROCEDURE -sigsetjmp*(VAR env: Unix.JmpBuf; savemask: LONGINT): LONGINT + "__sigsetjmp(env, savemask)"; + + PROCEDURE -siglongjmp*(VAR env:Unix. JmpBuf; val: LONGINT) + "siglongjmp(env, val)"; + + PROCEDURE -heapsize*(): LONGINT + "SYSTEM_heapsize"; + + PROCEDURE -allocated*(): LONGINT + "SYSTEM_allocated"; + + PROCEDURE -localtime(VAR clock: LONGINT): RealTime + "(Kernel_RealTime)localtime(clock)"; + + PROCEDURE -malloc*(size: LONGINT): LONGINT + "(LONGINT)malloc(size)"; + + PROCEDURE -free*(adr: LONGINT) + "(void)free(adr)"; + + PROCEDURE -getcwd(VAR cwd: Unix.Name) + "getcwd(cwd, cwd__len)"; + + + PROCEDURE GetClock* (VAR t, d: LONGINT); + VAR tv: Unix.Timeval; tz: Unix.Timezone; time: RealTime; + l : LONGINT; + BEGIN + l := Unix.Gettimeofday(tv, tz); + time := localtime(tv.sec); + t := time.sec + ASH(time.min, 6) + ASH(time.hour, 12); + d := time.mday + ASH(time.mon+1, 5) + ASH(time.year MOD 100, 9); + END GetClock; + + PROCEDURE SetClock* (t, d: LONGINT); + VAR err: ARRAY 25 OF CHAR; + BEGIN err := "not yet implemented"; HALT(99) + END SetClock; + + PROCEDURE Time*(): LONGINT; + VAR timeval: Unix.Timeval; timezone: Unix.Timezone; + l : LONGINT; + BEGIN + l := Unix.Gettimeofday(timeval, timezone); + RETURN (timeval.usec DIV 1000 + timeval.sec * 1000 - timeStart) MOD 7FFFFFFFH + END Time; + +(* + PROCEDURE UserTime*(): LONGINT; + VAR rusage: Unix.Rusage; + BEGIN + Unix.Getrusage(0, S.ADR(rusage)); + RETURN rusage.utime.sec*1000 + rusage.utime.usec DIV 1000 + (* + rusage.stime.sec*1000 + rusage.stime.usec DIV 1000*) + END UserTime; +*) + + PROCEDURE Select*(delay: LONGINT); + VAR rs, ws, xs: Unix.FdSet; n: LONGINT; tv: Unix.Timeval; + BEGIN + rs := readSet; + FOR n := 0 TO 7 DO ws[n] := {}; xs[n] := {}; readySet[n] := {} END; + IF delay < 0 THEN delay := 0 END ; + tv.sec := delay DIV 1000; tv.usec := delay MOD 1000 * 1000; + n := Unix.Select(256, rs, ws, xs, tv); + IF n >= 0 THEN readySet := rs END + END Select; + + PROCEDURE -GC*(markStack: BOOLEAN) + "SYSTEM_GC(markStack)"; + + PROCEDURE -RegisterObject*(obj: SYSTEM.PTR; finalize: ObjFinalizer) + "SYSTEM_REGFIN(obj, finalize)"; + + PROCEDURE -SetHalt*(p: PROCEDURE(n: LONGINT)) + "SYSTEM_Halt = p"; + + PROCEDURE InstallTermHandler*(p: PROCEDURE); + (* not yet supported; no Modules.Free *) + END InstallTermHandler; + + PROCEDURE LargestAvailable*(): LONGINT; + BEGIN + (* dummy proc for System 3 compatibility + no meaningful value except may be the remaining swap space can be returned + in the context of an extensible heap *) + RETURN MAX(LONGINT) + END LargestAvailable; + + PROCEDURE Halt(n: LONGINT); + VAR res: LONGINT; + BEGIN res := Unix.Kill(Unix.Getpid(), 4); + END Halt; + + PROCEDURE EndianTest; + VAR i: LONGINT; dmy: INTEGER; + BEGIN + dmy := 1; i := SYSTEM.ADR(dmy); + SYSTEM.GET(i, littleEndian); (* indirection via i avoids warning on SUN cc -O *) + END EndianTest; + +BEGIN + EndianTest(); + SetHalt(Halt); + CWD := ""; OBERON := "."; LIB := ""; + getcwd(CWD); + Args.GetEnv("OBERON", OBERON); + Args.GetEnv("OBERON_LIB", LIB); + TimeUnit := 1000; timeStart := 0; timeStart := Time() +END Kernel. diff --git a/src/lib/system/freebsd/clang/Kernel0.Mod b/src/lib/system/freebsd/clang/Kernel0.Mod new file mode 100644 index 00000000..c128b73d --- /dev/null +++ b/src/lib/system/freebsd/clang/Kernel0.Mod @@ -0,0 +1,179 @@ +MODULE Kernel0; +(* + J. Templ, 16.4.95 + communication with C-runtime and storage management +*) +(* version for bootstrapping voc *) + + IMPORT SYSTEM, Unix, Args, Strings, version; + + TYPE + RealTime = POINTER TO TimeDesc; + TimeDesc = RECORD + sec, min, hour, mday, mon, year, wday, isdst, zone, gmtoff: LONGINT +(* sec, min, hour, mday, mon, year, wday, isdst, zone, gmtoff: INTEGER*) + END ; + + KeyCmd* = PROCEDURE; + + ObjFinalizer* = PROCEDURE(obj: SYSTEM.PTR); + + + VAR + (* trap handling *) + trapEnv*: Unix.JmpBuf; (* saved stack environment for trap handling *) + + (* oberon heap management *) + nofiles*: LONGINT; + + (* input event handling *) + readSet*, readySet*: Unix.FdSet; + + FKey*: ARRAY 16 OF KeyCmd; + + littleEndian*: BOOLEAN; + + TimeUnit*: LONGINT; (* 1 sec *) + + LIB*, CWD*: ARRAY 256 OF CHAR; + OBERON*: ARRAY 1024 OF CHAR; + MODULES-: ARRAY 1024 OF CHAR; + + prefix*, fullprefix* : ARRAY 256 OF CHAR; + timeStart: LONGINT; (* milliseconds *) + + + PROCEDURE -includesetjmp() + '#include "setjmp.h"'; +(* for localtime *) + PROCEDURE -includetime() + '#include "time.h"'; + + PROCEDURE -Lock*() + "SYSTEM_lock++"; + + PROCEDURE -Unlock*() + "SYSTEM_lock--; if (SYSTEM_interrupted && SYSTEM_lock == 0) __HALT(-9)"; + + PROCEDURE -Exit*(n: LONGINT) + "exit(n)"; + + PROCEDURE -sigsetjmp*(VAR env: Unix.JmpBuf; savemask: LONGINT): LONGINT + "__sigsetjmp(env, savemask)"; + + PROCEDURE -siglongjmp*(VAR env:Unix.JmpBuf; val: LONGINT) + "siglongjmp(env, val)"; + + PROCEDURE -heapsize*(): LONGINT + "SYSTEM_heapsize"; + + PROCEDURE -allocated*(): LONGINT + "SYSTEM_allocated"; + + PROCEDURE -localtime(VAR clock: LONGINT): RealTime + "(Kernel0_RealTime)localtime(clock)"; + + PROCEDURE -malloc*(size: LONGINT): LONGINT + "(LONGINT)malloc(size)"; + + PROCEDURE -free*(adr: LONGINT) + "(void)free(adr)"; + + PROCEDURE -getcwd(VAR cwd: Unix.Name) + "getcwd(cwd, cwd__len)"; + + + PROCEDURE GetClock* (VAR t, d: LONGINT); + VAR tv: Unix.Timeval; tz: Unix.Timezone; time: RealTime; + l : LONGINT; + BEGIN + l := Unix.Gettimeofday(tv, tz); + time := localtime(tv.sec); + t := time.sec + ASH(time.min, 6) + ASH(time.hour, 12); + d := time.mday + ASH(time.mon+1, 5) + ASH(time.year MOD 100, 9); + END GetClock; + + PROCEDURE SetClock* (t, d: LONGINT); + VAR err: ARRAY 25 OF CHAR; + BEGIN err := "not yet implemented"; HALT(99) + END SetClock; + + PROCEDURE Time*(): LONGINT; + VAR timeval: Unix.Timeval; timezone: Unix.Timezone; + l : LONGINT; + BEGIN + l := Unix.Gettimeofday(timeval, timezone); + RETURN (timeval.usec DIV 1000 + timeval.sec * 1000 - timeStart) MOD 7FFFFFFFH + END Time; + +(* + PROCEDURE UserTime*(): LONGINT; + VAR rusage: Unix.Rusage; + BEGIN + Unix.Getrusage(0, S.ADR(rusage)); + RETURN rusage.utime.sec*1000 + rusage.utime.usec DIV 1000 + (* + rusage.stime.sec*1000 + rusage.stime.usec DIV 1000*) + END UserTime; +*) + + PROCEDURE Select*(delay: LONGINT); + VAR rs, ws, xs: Unix.FdSet; n: LONGINT; tv: Unix.Timeval; + BEGIN + rs := readSet; + FOR n := 0 TO 7 DO ws[n] := {}; xs[n] := {}; readySet[n] := {} END; + IF delay < 0 THEN delay := 0 END ; + tv.sec := delay DIV 1000; tv.usec := delay MOD 1000 * 1000; + n := Unix.Select(256, rs, ws, xs, tv); + IF n >= 0 THEN readySet := rs END + END Select; + + PROCEDURE -GC*(markStack: BOOLEAN) + "SYSTEM_GC(markStack)"; + + PROCEDURE -RegisterObject*(obj: SYSTEM.PTR; finalize: ObjFinalizer) + "SYSTEM_REGFIN(obj, finalize)"; + + PROCEDURE -SetHalt*(p: PROCEDURE(n: LONGINT)) + "SYSTEM_Halt = p"; + + PROCEDURE InstallTermHandler*(p: PROCEDURE); + (* not yet supported; no Modules.Free *) + END InstallTermHandler; + + PROCEDURE LargestAvailable*(): LONGINT; + BEGIN + (* dummy proc for System 3 compatibility + no meaningful value except may be the remaining swap space can be returned + in the context of an extensible heap *) + RETURN MAX(LONGINT) + END LargestAvailable; + + PROCEDURE Halt(n: LONGINT); + VAR res: LONGINT; + BEGIN res := Unix.Kill(Unix.Getpid(), 4); + END Halt; + + PROCEDURE EndianTest; + VAR i: LONGINT; dmy: INTEGER; + BEGIN + dmy := 1; i := SYSTEM.ADR(dmy); + SYSTEM.GET(i, littleEndian); (* indirection via i avoids warning on SUN cc -O *) + END EndianTest; + +BEGIN + EndianTest(); + SetHalt(Halt); + CWD := ""; OBERON := "."; LIB := ""; + MODULES := ""; (* additional modules path which can be specified on commandline and will be added to the OBERON variable; noch *) + getcwd(CWD); + Args.GetEnv ("MODULES", MODULES); + Args.GetEnv("OBERON", OBERON); + (* always have current directory in module search path, noch *) + Strings.Append(":.:", OBERON); + Strings.Append(MODULES, OBERON); + Strings.Append(":", OBERON); + Strings.Append(version.prefix, OBERON); + Strings.Append("/lib/voc/sym:", OBERON); + Args.GetEnv("OBERON_LIB", LIB); + TimeUnit := 1000; timeStart := 0; timeStart := Time() +END Kernel0. diff --git a/src/lib/system/freebsd/clang/SYSTEM.Mod b/src/lib/system/freebsd/clang/SYSTEM.Mod new file mode 100644 index 00000000..6fc08dcf --- /dev/null +++ b/src/lib/system/freebsd/clang/SYSTEM.Mod @@ -0,0 +1,520 @@ +(* +* voc (jet backend) runtime system, Version 1.1 +* +* Copyright (c) Software Templ, 1994, 1995, 1996 +* +* Module SYSTEM is subject to change any time without prior notification. +* Software Templ disclaims all warranties with regard to module SYSTEM, +* in particular shall Software Templ not be liable for any damage resulting +* from inappropriate use or modification of module SYSTEM. +*) + +MODULE SYSTEM; (* J. Templ, 31.5.95 *) + + IMPORT SYSTEM; (*must not import other modules*) + + CONST + ModNameLen = 20; + CmdNameLen = 24; + SZL = SIZE(LONGINT); + Unit = 4*SZL; (* smallest possible heap block *) + nofLists = 9; (* number of free_lists *) + heapSize0 = 8000*Unit; (* startup heap size *) + + (* all blocks look the same: + free blocks describe themselves: size = Unit + tag = &tag++ + ->blksize + sentinel = -SZL + next + *) + + (* heap chunks *) + nextChnkOff = 0; (* next heap chunk, sorted ascendingly! *) + endOff = SZL; (* end of heap chunk *) + blkOff = 3*SZL; (* first block in a chunk *) + + (* heap blocks *) + tagOff = 0; (* block starts with tag *) + sizeOff = SZL; (* block size in free block relative to block start *) + sntlOff = 2*SZL; (* pointer offset table sentinel in free block relative to block start *) + nextOff = 3*SZL; (* next pointer in free block relative to block start *) + NoPtrSntl = LONG(LONG(-SZL)); + + + TYPE + ModuleName = ARRAY ModNameLen OF CHAR; + CmdName = ARRAY CmdNameLen OF CHAR; + + Module = POINTER TO ModuleDesc; + Cmd = POINTER TO CmdDesc; + EnumProc = PROCEDURE(P: PROCEDURE(p: SYSTEM.PTR)); + ModuleDesc = RECORD + next: Module; + name: ModuleName; + refcnt: LONGINT; + cmds: Cmd; + types: LONGINT; + enumPtrs: EnumProc; + reserved1, reserved2: LONGINT + END ; + + Command = PROCEDURE; + + CmdDesc = RECORD + next: Cmd; + name: CmdName; + cmd: Command + END ; + + Finalizer = PROCEDURE(obj: SYSTEM.PTR); + + FinNode = POINTER TO FinDesc; + FinDesc = RECORD + next: FinNode; + obj: LONGINT; (* weak pointer *) + marked: BOOLEAN; + finalize: Finalizer; + END ; + + VAR + (* the list of loaded (=initialization started) modules *) + modules*: SYSTEM.PTR; + + freeList: ARRAY nofLists + 1 OF LONGINT; (* dummy, 16, 32, 48, 64, 80, 96, 112, 128, sentinel *) + bigBlocks, allocated*: LONGINT; + firstTry: BOOLEAN; + + (* extensible heap *) + heap, (* the sorted list of heap chunks *) + heapend, (* max possible pointer value (used for stack collection) *) + heapsize*: LONGINT; (* the sum of all heap chunk sizes *) + + (* finalization candidates *) + fin: FinNode; + + (* garbage collector locking *) + gclock*: SHORTINT; + + + PROCEDURE -malloc(size: LONGINT): LONGINT "(LONGINT)malloc(size)"; + PROCEDURE -Lock() "Lock"; + PROCEDURE -Unlock() "Unlock"; + PROCEDURE -Mainfrm(): LONGINT "SYSTEM_mainfrm"; +(* + PROCEDURE TAS*(VAR flag:BOOLEAN): BOOLEAN; (* added for compatibility with ulmSYSTEM module; noch *) + VAR oldflag : BOOLEAN; + BEGIN + oldflag := flag; + flag := TRUE; + RETURN oldflag; + END TAS; +*) + PROCEDURE REGMOD*(VAR name: ModuleName; enumPtrs: EnumProc): SYSTEM.PTR; + VAR m: Module; + BEGIN + IF name = "SYSTEM" THEN (* cannot use NEW *) + SYSTEM.NEW(m, SIZE(ModuleDesc)); m.cmds := NIL + ELSE NEW(m) + END ; + COPY(name, m.name); m.refcnt := 0; m.enumPtrs := enumPtrs; m.next := SYSTEM.VAL(Module, modules); + modules := m; + RETURN m + END REGMOD; + + PROCEDURE REGCMD*(m: Module; VAR name: CmdName; cmd: Command); + VAR c: Cmd; + BEGIN NEW(c); + COPY(name, c.name); c.cmd := cmd; c.next := m.cmds; m.cmds := c + END REGCMD; + + PROCEDURE REGTYP*(m: Module; typ: LONGINT); + BEGIN SYSTEM.PUT(typ, m.types); m.types := typ + END REGTYP; + + PROCEDURE INCREF*(m: Module); + BEGIN INC(m.refcnt) + END INCREF; + + PROCEDURE NewChunk(blksz: LONGINT): LONGINT; + VAR chnk: LONGINT; + BEGIN + chnk := malloc(blksz + blkOff); + IF chnk # 0 THEN + SYSTEM.PUT(chnk + endOff, chnk + (blkOff + blksz)); + SYSTEM.PUT(chnk + blkOff, chnk + (blkOff + sizeOff)); + SYSTEM.PUT(chnk + (blkOff + sizeOff), blksz); + SYSTEM.PUT(chnk + (blkOff + sntlOff), NoPtrSntl); + SYSTEM.PUT(chnk + (blkOff + nextOff), bigBlocks); + bigBlocks := chnk + blkOff; + INC(heapsize, blksz) + END ; + RETURN chnk + END NewChunk; + + PROCEDURE ExtendHeap(blksz: LONGINT); + VAR size, chnk, j, next: LONGINT; + BEGIN + IF blksz > 10000*Unit THEN size := blksz + ELSE size := 10000*Unit (* additional heuristics *) + END ; + chnk := NewChunk(size); + IF chnk # 0 THEN + (*sorted insertion*) + IF chnk < heap THEN + SYSTEM.PUT(chnk, heap); heap := chnk + ELSE + j := heap; SYSTEM.GET(j, next); + WHILE (next # 0) & (chnk > next) DO j := next; SYSTEM.GET(j, next) END ; + SYSTEM.PUT(chnk, next); SYSTEM.PUT(j, chnk) + END ; + IF next = 0 THEN SYSTEM.GET(chnk + endOff, heapend) END + END + END ExtendHeap; + + PROCEDURE ^GC*(markStack: BOOLEAN); + + PROCEDURE NEWREC*(tag: LONGINT): SYSTEM.PTR; + VAR i, i0, di, blksz, restsize, t, adr, end, next, prev: LONGINT; new: SYSTEM.PTR; + BEGIN + Lock(); + SYSTEM.GET(tag, blksz); + ASSERT(blksz MOD Unit = 0); + i0 := blksz DIV Unit; i := i0; + IF i < nofLists THEN adr := freeList[i]; + WHILE adr = 0 DO INC(i); adr := freeList[i] END + END ; + IF i < nofLists THEN (* unlink *) + SYSTEM.GET(adr + nextOff, next); + freeList[i] := next; + IF i # i0 THEN (* split *) + di := i - i0; restsize := di * Unit; end := adr + restsize; + SYSTEM.PUT(end + sizeOff, blksz); + SYSTEM.PUT(end + sntlOff, NoPtrSntl); + SYSTEM.PUT(end, end + sizeOff); + SYSTEM.PUT(adr + sizeOff, restsize); + SYSTEM.PUT(adr + nextOff, freeList[di]); + freeList[di] := adr; + INC(adr, restsize) + END + ELSE + adr := bigBlocks; prev := 0; + LOOP + IF adr = 0 THEN + IF firstTry THEN + GC(TRUE); INC(blksz, Unit); + IF (heapsize - allocated - blksz) * 4 < heapsize THEN + (* heap is still almost full; expand to avoid thrashing *) + ExtendHeap((allocated + blksz) DIV (3*Unit) * (4*Unit) - heapsize) + END ; + firstTry := FALSE; new := NEWREC(tag); firstTry := TRUE; + IF new = NIL THEN + (* depending on the fragmentation, the heap may not have been extended by + the anti-thrashing heuristics above *) + ExtendHeap((allocated + blksz) DIV (3*Unit) * (4*Unit) - heapsize); + new := NEWREC(tag); (* will find a free block if heap has been expanded properly *) + END ; + Unlock(); RETURN new + ELSE + Unlock(); RETURN NIL + END + END ; + SYSTEM.GET(adr+sizeOff, t); + IF t >= blksz THEN EXIT END ; + prev := adr; SYSTEM.GET(adr + nextOff, adr) + END ; + restsize := t - blksz; end := adr + restsize; + SYSTEM.PUT(end + sizeOff, blksz); + SYSTEM.PUT(end + sntlOff, NoPtrSntl); + SYSTEM.PUT(end, end + sizeOff); + IF restsize > nofLists * Unit THEN (*resize*) + SYSTEM.PUT(adr + sizeOff, restsize) + ELSE (*unlink*) + SYSTEM.GET(adr + nextOff, next); + IF prev = 0 THEN bigBlocks := next + ELSE SYSTEM.PUT(prev + nextOff, next); + END ; + IF restsize > 0 THEN (*move*) + di := restsize DIV Unit; + SYSTEM.PUT(adr + sizeOff, restsize); + SYSTEM.PUT(adr + nextOff, freeList[di]); + freeList[di] := adr + END + END ; + INC(adr, restsize) + END ; + i := adr + 4*SZL; end := adr + blksz; + WHILE i < end DO (*deliberately unrolled*) + SYSTEM.PUT(i, LONG(LONG(0))); + SYSTEM.PUT(i + SZL, LONG(LONG(0))); + SYSTEM.PUT(i + 2*SZL, LONG(LONG(0))); + SYSTEM.PUT(i + 3*SZL, LONG(LONG(0))); + INC(i, 4*SZL) + END ; + SYSTEM.PUT(adr + nextOff, LONG(LONG(0))); + SYSTEM.PUT(adr, tag); + SYSTEM.PUT(adr + sizeOff, LONG(LONG(0))); + SYSTEM.PUT(adr + sntlOff, LONG(LONG(0))); + INC(allocated, blksz); + Unlock(); + RETURN SYSTEM.VAL(SYSTEM.PTR, adr + SZL) + END NEWREC; + + PROCEDURE NEWBLK*(size: LONGINT): SYSTEM.PTR; + VAR blksz, tag: LONGINT; new: SYSTEM.PTR; + BEGIN + Lock(); + blksz := (size + (4*SZL + Unit - 1)) DIV Unit * Unit; (*size + tag + meta + blksz + sntnl + UnitAlignment*) + new := NEWREC(SYSTEM.ADR(blksz)); + tag := SYSTEM.VAL(LONGINT, new) + blksz - 3*SZL; + SYSTEM.PUT(tag - SZL, LONG(LONG(0))); (*reserved for meta info*) + SYSTEM.PUT(tag, blksz); + SYSTEM.PUT(tag + SZL, NoPtrSntl); + SYSTEM.PUT(SYSTEM.VAL(LONGINT, new) - SZL, tag); + Unlock(); + RETURN new + END NEWBLK; + + PROCEDURE Mark(q: LONGINT); + VAR p, tag, fld, n, offset, tagbits: LONGINT; + BEGIN + IF q # 0 THEN SYSTEM.GET(q - SZL, tagbits); + IF ~ODD(tagbits) THEN + SYSTEM.PUT(q - SZL, tagbits + 1); + p := 0; tag := tagbits + SZL; + LOOP + SYSTEM.GET(tag, offset); + IF offset < 0 THEN + SYSTEM.PUT(q - SZL, tag + offset + 1); + IF p = 0 THEN EXIT END ; + n := q; q := p; + SYSTEM.GET(q - SZL, tag); DEC(tag, 1); + SYSTEM.GET(tag, offset); fld := q + offset; + SYSTEM.GET(fld, p); SYSTEM.PUT(fld, n) + ELSE + fld := q + offset; + SYSTEM.GET(fld, n); + IF n # 0 THEN + SYSTEM.GET(n - SZL, tagbits); + IF ~ODD(tagbits) THEN + SYSTEM.PUT(n - SZL, tagbits + 1); + SYSTEM.PUT(q - SZL, tag + 1); + SYSTEM.PUT(fld, p); p := q; q := n; + tag := tagbits + END + END + END ; + INC(tag, SZL) + END + END + END + END Mark; + + PROCEDURE MarkP(p: SYSTEM.PTR); (* for compatibility with EnumPtrs in ANSI mode *) + BEGIN + Mark(SYSTEM.VAL(LONGINT, p)) + END MarkP; + + PROCEDURE Scan; + VAR chnk, adr, end, start, tag, i, size, freesize: LONGINT; + BEGIN bigBlocks := 0; i := 1; + WHILE i < nofLists DO freeList[i] := 0; INC(i) END ; + freesize := 0; allocated := 0; chnk := heap; + WHILE chnk # 0 DO + adr := chnk + blkOff; SYSTEM.GET(chnk + endOff, end); + WHILE adr < end DO + SYSTEM.GET(adr, tag); + IF ODD(tag) THEN (*marked*) + IF freesize > 0 THEN + start := adr - freesize; + SYSTEM.PUT(start, start+SZL); + SYSTEM.PUT(start+sizeOff, freesize); + SYSTEM.PUT(start+sntlOff, NoPtrSntl); + i := freesize DIV Unit; freesize := 0; + IF i < nofLists THEN SYSTEM.PUT(start + nextOff, freeList[i]); freeList[i] := start + ELSE SYSTEM.PUT(start + nextOff, bigBlocks); bigBlocks := start + END + END ; + DEC(tag, 1); + SYSTEM.PUT(adr, tag); + SYSTEM.GET(tag, size); + INC(allocated, size); + INC(adr, size) + ELSE (*unmarked*) + SYSTEM.GET(tag, size); + INC(freesize, size); + INC(adr, size) + END + END ; + IF freesize > 0 THEN (*collect last block*) + start := adr - freesize; + SYSTEM.PUT(start, start+SZL); + SYSTEM.PUT(start+sizeOff, freesize); + SYSTEM.PUT(start+sntlOff, NoPtrSntl); + i := freesize DIV Unit; freesize := 0; + IF i < nofLists THEN SYSTEM.PUT(start + nextOff, freeList[i]); freeList[i] := start + ELSE SYSTEM.PUT(start + nextOff, bigBlocks); bigBlocks := start + END + END ; + SYSTEM.GET(chnk, chnk) + END + END Scan; + + PROCEDURE Sift (l, r: LONGINT; VAR a: ARRAY OF LONGINT); + VAR i, j, x: LONGINT; + BEGIN j := l; x := a[j]; + LOOP i := j; j := 2*j + 1; + IF (j < r) & (a[j] < a[j+1]) THEN INC(j) END; + IF (j > r) OR (a[j] <= x) THEN EXIT END; + a[i] := a[j] + END; + a[i] := x + END Sift; + + PROCEDURE HeapSort (n: LONGINT; VAR a: ARRAY OF LONGINT); + VAR l, r, x: LONGINT; + BEGIN l := n DIV 2; r := n - 1; + WHILE l > 0 DO DEC(l); Sift(l, r, a) END; + WHILE r > 0 DO x := a[0]; a[0] := a[r]; a[r] := x; DEC(r); Sift(l, r, a) END + END HeapSort; + + PROCEDURE MarkCandidates(n: LONGINT; VAR cand: ARRAY OF LONGINT); + VAR chnk, adr, tag, next, lim, lim1, i, ptr, size: LONGINT; + BEGIN + chnk := heap; i := 0; lim := cand[n-1]; + WHILE (chnk # 0 ) & (chnk < lim) DO + adr := chnk + blkOff; + SYSTEM.GET(chnk + endOff, lim1); + IF lim < lim1 THEN lim1 := lim END ; + WHILE adr < lim1 DO + SYSTEM.GET(adr, tag); + IF ODD(tag) THEN (*already marked*) + SYSTEM.GET(tag-1, size); INC(adr, size) + ELSE + SYSTEM.GET(tag, size); + ptr := adr + SZL; + WHILE cand[i] < ptr DO INC(i) END ; + IF i = n THEN RETURN END ; + next := adr + size; + IF cand[i] < next THEN Mark(ptr) END ; + adr := next + END + END ; + SYSTEM.GET(chnk, chnk) + END + END MarkCandidates; + + PROCEDURE CheckFin; + VAR n: FinNode; tag: LONGINT; + BEGIN n := fin; + WHILE n # NIL DO + SYSTEM.GET(n.obj - SZL, tag); + IF ~ODD(tag) THEN n.marked := FALSE; Mark(n.obj) + ELSE n.marked := TRUE + END ; + n := n.next + END + END CheckFin; + + PROCEDURE Finalize; + VAR n, prev: FinNode; + BEGIN n := fin; prev := NIL; + WHILE n # NIL DO + IF ~n.marked THEN + IF n = fin THEN fin := fin.next ELSE prev.next := n.next END ; + n.finalize(SYSTEM.VAL(SYSTEM.PTR, n.obj)); + (* new nodes may have been pushed in n.finalize, therefore: *) + IF prev = NIL THEN n := fin ELSE n := n.next END + ELSE prev := n; n := n.next + END + END + END Finalize; + + PROCEDURE FINALL*; + VAR n: FinNode; + BEGIN + WHILE fin # NIL DO + n := fin; fin := fin.next; + n.finalize(SYSTEM.VAL(SYSTEM.PTR, n.obj)) + END + END FINALL; + + PROCEDURE MarkStack(n: LONGINT; VAR cand: ARRAY OF LONGINT); + VAR + frame: SYSTEM.PTR; + inc, nofcand: LONGINT; + sp, p, stack0, ptr: LONGINT; + align: RECORD ch: CHAR; p: SYSTEM.PTR END ; + BEGIN + IF n > 0 THEN MarkStack(n-1, cand); (* flush register windows by means of recursive calls *) + IF n > 100 THEN RETURN END (* prevent tail recursion optimization *) + END ; + IF n = 0 THEN + nofcand := 0; sp := SYSTEM.ADR(frame); + stack0 := Mainfrm(); + (* check for minimum alignment of pointers *) + inc := SYSTEM.ADR(align.p) - SYSTEM.ADR(align); + IF sp > stack0 THEN inc := -inc END ; + WHILE sp # stack0 DO + SYSTEM.GET(sp, p); + IF (p > heap) & (p < heapend) THEN + IF nofcand = LEN(cand) THEN HeapSort(nofcand, cand); MarkCandidates(nofcand, cand); nofcand := 0 END ; + cand[nofcand] := p; INC(nofcand) + END ; + INC(sp, inc) + END ; + IF nofcand > 0 THEN HeapSort(nofcand, cand); MarkCandidates(nofcand, cand) END + END + END MarkStack; + + PROCEDURE GC*(markStack: BOOLEAN); + VAR + m: Module; + i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, i23: LONGINT; + cand: ARRAY 10000 OF LONGINT; + BEGIN + IF (gclock = 0) OR (gclock = 1) & ~markStack THEN + Lock(); + m := SYSTEM.VAL(Module, modules); + WHILE m # NIL DO + IF m.enumPtrs # NIL THEN m.enumPtrs(MarkP) END ; + m := m^.next + END ; + IF markStack THEN + (* generate register pressure to force callee saved registers to memory; + may be simplified by inlining OS calls or processor specific instructions + *) + i0 := -100; i1 := -101; i2 := -102; i3 := -103; i4 := -104; i5 := -105; i6 := -106; i7 := -107; + i8 := 1; i9 := 2; i10 := 3; i11 := 4; i12 := 5; i13 := 6; i14 := 7; i15 := 8; + i16 := 9; i17 := 10; i18 := 11; i19 := 12; i20 := 13; i21 := 14; i22 := 15; i23 := 16; + LOOP INC(i0, 1); INC(i1, 2); INC(i2, 3); INC(i3, 4); INC(i4, 5); INC(i5, 6); INC(i6, 7); INC(i7, 8); + INC(i8, 9); INC(i9, 10); INC(i10, 11); INC(i11, 12); INC(i12, 13); INC(i13, 14); INC(i14, 15); INC(i15, 16); + INC(i16, 17); INC(i17, 18); INC(i18, 19); INC(i19, 20); INC(i20, 21); INC(i21, 22); INC(i22, 23); INC(i23, 24); + IF (i0 = -99) & (i15 = 24) THEN MarkStack(32, cand); EXIT END + END ; + IF i0 + i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + i10 + i11 + i12 + i13 + i14 + i15 + + i16 + i17 + i18 + i19 + i20 + i21 + i22 + i23 > 10000 THEN RETURN (* use all variables *) + END ; + END; + CheckFin; + Scan; + Finalize; + Unlock() + END + END GC; + + PROCEDURE REGFIN*(obj: SYSTEM.PTR; finalize: Finalizer); + VAR f: FinNode; + BEGIN NEW(f); + f.obj := SYSTEM.VAL(LONGINT, obj); f.finalize := finalize; f.marked := TRUE; f.next := fin; fin := f + END REGFIN; + + PROCEDURE InitHeap; (* initialized before body to enable NEW, SYSTEM.NEW *) + BEGIN + heap := NewChunk(heapSize0); + SYSTEM.GET(heap + endOff, heapend); + SYSTEM.PUT(heap, LONG(LONG(0))); + allocated := 0; firstTry := TRUE; freeList[nofLists] := 1; gclock := 0 + END InitHeap; + +END SYSTEM. diff --git a/src/lib/system/freebsd/clang/Texts.Mod b/src/lib/system/freebsd/clang/Texts.Mod new file mode 100644 index 00000000..320f426b --- /dev/null +++ b/src/lib/system/freebsd/clang/Texts.Mod @@ -0,0 +1,859 @@ +MODULE Texts; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91**) (* << RC, MB, JT *) + IMPORT + Files, Modules, Reals; + + (*--- insert field e: Elem into Texts.Scanner and change Texts.Scan to set it in case of class=6 *) + + + CONST + Displaywhite = 15; + ElemChar* = 1CX; + TAB = 9X; CR = 0DX; maxD = 9; + (**FileMsg.id**) + load* = 0; store* = 1; + (**Notifier op**) + replace* = 0; insert* = 1; delete* = 2; + (**Scanner.class**) + Inval* = 0; Name* = 1; String* = 2; Int* = 3; Real* = 4; LongReal* = 5; Char* = 6; + + textTag = 0F0X; DocBlockId = 0F7X; version = 01X; + + TYPE + FontsFont = POINTER TO FontDesc; + FontDesc = RECORD + name: ARRAY 32 OF CHAR; + END ; + + Run = POINTER TO RunDesc; + RunDesc = RECORD + prev, next: Run; + len: LONGINT; + fnt: FontsFont; + col, voff: SHORTINT; + ascii: BOOLEAN (* << *) + END; + + Piece = POINTER TO PieceDesc; + PieceDesc = RECORD (RunDesc) + file: Files.File; + org: LONGINT + END; + + Elem* = POINTER TO ElemDesc; + Buffer* = POINTER TO BufDesc; + Text* = POINTER TO TextDesc; + + ElemMsg* = RECORD END; + Handler* = PROCEDURE (e: Elem; VAR msg: ElemMsg); + + ElemDesc* = RECORD (RunDesc) + W*, H*: LONGINT; + handle*: Handler; + base: Text + END; + + FileMsg* = RECORD (ElemMsg) + id*: INTEGER; + pos*: LONGINT; + r*: Files.Rider + END; + + CopyMsg* = RECORD (ElemMsg) + e*: Elem + END; + + IdentifyMsg* = RECORD (ElemMsg) + mod*, proc*: ARRAY 32 OF CHAR + END; + + + BufDesc* = RECORD + len*: LONGINT; + head: Run + END; + + TextDesc* = RECORD + len*: LONGINT; + head, cache: Run; + corg: LONGINT + END; + + Reader* = RECORD + eot*: BOOLEAN; + fnt*: FontsFont; + col*, voff*: SHORTINT; + elem*: Elem; + rider: Files.Rider; + run: Run; + org, off: LONGINT + END; + + Scanner* = RECORD (Reader) + nextCh*: CHAR; + line*, class*: INTEGER; + i*: LONGINT; + x*: REAL; + y*: LONGREAL; + c*: CHAR; + len*: SHORTINT; + s*: ARRAY 64 OF CHAR (* << *) + END; + + Writer* = RECORD + buf*: Buffer; + fnt*: FontsFont; + col*, voff*: SHORTINT; + rider: Files.Rider; + file: Files.File + END; + + Alien = POINTER TO RECORD (ElemDesc) + file: Files.File; + org, span: LONGINT; + mod, proc: ARRAY 32 OF CHAR + END; + + VAR + new*: Elem; + del: Buffer; + FontsDefault: FontsFont; + + + PROCEDURE FontsThis(VAR name: ARRAY OF CHAR): FontsFont; + VAR F: FontsFont; + BEGIN + NEW(F); COPY(name, F.name); RETURN F + END FontsThis; + + (* run primitives *) + + PROCEDURE Find (T: Text; VAR pos: LONGINT; VAR u: Run; VAR org, off: LONGINT); + VAR v: Run; m: LONGINT; + BEGIN + IF pos >= T.len THEN pos := T.len; u := T.head; org := T.len; off := 0; T.cache := T.head; T.corg := 0 + ELSE v := T.cache.next; m := pos - T.corg; + IF pos >= T.corg THEN + WHILE m >= v.len DO DEC(m, v.len); v := v.next END + ELSE + WHILE m < 0 DO v := v.prev; INC(m, v.len) END; + END; + u := v; org := pos - m; off := m; T.cache := v.prev; T.corg := org + END + END Find; + + PROCEDURE Split (off: LONGINT; VAR u, un: Run); + VAR p, U: Piece; + BEGIN + IF off = 0 THEN un := u; u := un.prev + ELSIF off >= u.len THEN un := u.next + ELSE NEW(p); un := p; U := u(Piece); + p^ := U^; INC(p.org, off); DEC(p.len, off); DEC(U.len, p.len); + p.ascii := u.ascii; p.prev := U; p.next := U.next; p.next.prev := p; U.next := p (* << *) + END + END Split; + + PROCEDURE Merge (T: Text; u: Run; VAR v: Run); + VAR p, q: Piece; + BEGIN + IF (u IS Piece) & (v IS Piece) & (u.fnt.name = v.fnt.name) & (u.col = v.col) & (u.voff = v.voff) + & (u(Piece).ascii = v(Piece).ascii) THEN (* << *) + p := u(Piece); q := v(Piece); + IF (p.file = q.file) & (p.org + p.len = q.org) THEN + IF T.cache = u THEN INC(T.corg, q.len) + ELSIF T.cache = v THEN T.cache := T.head; T.corg := 0 + END; + INC(p.len, q.len); v := v.next + END + END + END Merge; + + PROCEDURE Splice (un, v, w: Run; base: Text); (* (u, un) -> (u, v, w, un) *) + VAR u: Run; + BEGIN + IF v # w.next THEN u := un.prev; + u.next := v; v.prev := u; un.prev := w; w.next := un; + REPEAT + IF v IS Elem THEN v(Elem).base := base END; + v := v.next + UNTIL v = un + END + END Splice; + + PROCEDURE ClonePiece (p: Piece): Piece; + VAR q: Piece; + BEGIN NEW(q); q^ := p^; RETURN q + END ClonePiece; + + PROCEDURE CloneElem (e: Elem): Elem; + VAR msg: CopyMsg; + BEGIN msg.e := NIL; e.handle(e, msg); RETURN msg.e + END CloneElem; + + + (** Elements **) + + PROCEDURE CopyElem* (SE, DE: Elem); + BEGIN DE.len := SE.len; DE.fnt := SE.fnt; DE.col := SE.col; DE.voff := SE.voff; + DE.W := SE.W; DE.H := SE.H; DE.handle := SE.handle + END CopyElem; + + PROCEDURE ElemBase* (E: Elem): Text; + BEGIN RETURN E.base + END ElemBase; + + PROCEDURE ElemPos* (E: Elem): LONGINT; + VAR u: Run; pos: LONGINT; + BEGIN u := E.base.head.next; pos := 0; + WHILE u # E DO pos := pos + u.len; u := u.next END; + RETURN pos + END ElemPos; + + + PROCEDURE HandleAlien (E: Elem; VAR msg: ElemMsg); + VAR e: Alien; r: Files.Rider; i: LONGINT; ch: CHAR; + BEGIN + WITH E: Alien DO + IF msg IS CopyMsg THEN + WITH msg: CopyMsg DO NEW(e); CopyElem(E, e); + e.file := E.file; e.org := E.org; e.span := E.span; e.mod := E.mod; e.proc := E.proc; + msg.e := e + END + ELSIF msg IS IdentifyMsg THEN + WITH msg: IdentifyMsg DO + COPY(E.mod, msg.mod); COPY(E.proc, msg.proc); msg.mod[31] := 1X (*alien*) + END + ELSIF msg IS FileMsg THEN + WITH msg: FileMsg DO + IF msg.id = store THEN Files.Set(r, E.file, E.org); i := E.span; + WHILE i > 0 DO Files.Read(r, ch); Files.Write(msg.r, ch); DEC(i) END + END + END + END + END + END HandleAlien; + + + (** Buffers **) + + PROCEDURE OpenBuf* (B: Buffer); + VAR u: Run; + BEGIN NEW(u); u.next := u; u.prev := u; B.head := u; B.len := 0 + END OpenBuf; + + PROCEDURE Copy* (SB, DB: Buffer); + VAR u, v, vn: Run; + BEGIN u := SB.head.next; v := DB.head.prev; + WHILE u # SB.head DO + IF u IS Piece THEN vn := ClonePiece(u(Piece)) ELSE vn := CloneElem(u(Elem)) END; + v.next := vn; vn.prev := v; v := vn; u := u.next + END; + v.next := DB.head; DB.head.prev := v; + INC(DB.len, SB.len) + END Copy; + + PROCEDURE Recall* (VAR B: Buffer); + BEGIN B := del; del := NIL + END Recall; + + + (** Texts **) + + PROCEDURE Save* (T: Text; beg, end: LONGINT; B: Buffer); + VAR u, v, w, wn: Run; uo, ud, vo, vd: LONGINT; + BEGIN Find(T, beg, u, uo, ud); Find(T, end, v, vo, vd); + w := B.head.prev; + WHILE u # v DO + IF u IS Piece THEN wn := ClonePiece(u(Piece)); DEC(wn.len, ud); INC(wn(Piece).org, ud) + ELSE wn := CloneElem(u(Elem)) + END; + w.next := wn; wn.prev := w; w := wn; u := u.next; ud := 0 + END; + IF vd > 0 THEN (*v IS Piece*) wn := ClonePiece(v(Piece)); wn.len := vd - ud; INC(wn(Piece).org, ud); + w.next := wn; wn.prev := w; w := wn + END; + w.next := B.head; B.head.prev := w; + INC(B.len, end - beg) + END Save; + + PROCEDURE Insert* (T: Text; pos: LONGINT; B: Buffer); + VAR u, un, v: Run; p, q: Piece; uo, ud, len: LONGINT; + BEGIN Find(T, pos, u, uo, ud); Split(ud, u, un); + len := B.len; v := B.head.next; + Merge(T, u, v); Splice(un, v, B.head.prev, T); + INC(T.len, len); B.head.next := B.head; B.head.prev := B.head; B.len := 0; + END Insert; + + PROCEDURE Append* (T: Text; B: Buffer); + VAR v: Run; pos, len: LONGINT; + BEGIN pos := T.len; len := B.len; v := B.head.next; + Merge(T, T.head.prev, v); Splice(T.head, v, B.head.prev, T); + INC(T.len, len); B.head.next := B.head; B.head.prev := B.head; B.len := 0; + END Append; + + PROCEDURE Delete* (T: Text; beg, end: LONGINT); + VAR c, u, un, v, vn: Run; co, uo, ud, vo, vd: LONGINT; + BEGIN + Find(T, beg, u, uo, ud); Split(ud, u, un); c := T.cache; co := T.corg; + Find(T, end, v, vo, vd); Split(vd, v, vn); T.cache := c; T.corg := co; + NEW(del); OpenBuf(del); del.len := end - beg; + Splice(del.head, un, v, NIL); + Merge(T, u, vn); u.next := vn; vn.prev := u; + DEC(T.len, end - beg); + END Delete; + + PROCEDURE ChangeLooks* (T: Text; beg, end: LONGINT; sel: SET; fnt: FontsFont; col, voff: SHORTINT); + VAR c, u, un, v, vn: Run; co, uo, ud, vo, vd: LONGINT; + BEGIN Find(T, beg, u, uo, ud); Split(ud, u, un); c := T.cache; co := T.corg; + Find(T, end, v, vo, vd); Split(vd, v, vn); T.cache := c; T.corg := co; + WHILE un # vn DO + IF (0 IN sel) & (fnt # NIL) THEN un.fnt := fnt END; + IF 1 IN sel THEN un.col := col END; + IF 2 IN sel THEN un.voff := voff END; + Merge(T, u, un); + IF u.next = un THEN u := un; un := un.next ELSE u.next := un; un.prev := u END + END; + Merge(T, u, un); u.next := un; un.prev := u; + END ChangeLooks; + + + (** Readers **) + + PROCEDURE OpenReader* (VAR R: Reader; T: Text; pos: LONGINT); + VAR u: Run; + BEGIN + IF pos >= T.len THEN pos := T.len END; + Find(T, pos, u, R.org, R.off); R.run := u; R.eot := FALSE; + IF u IS Piece THEN + Files.Set(R.rider, u(Piece).file, u(Piece).org + R.off) + END + END OpenReader; + + PROCEDURE Read* (VAR R: Reader; VAR ch: CHAR); + VAR u: Run; + BEGIN u := R.run; R.fnt := u.fnt; R.col := u.col; R.voff := u.voff; INC(R.off); + IF u IS Piece THEN Files.Read(R.rider, ch); R.elem := NIL; + IF (ch = 0AX) & u(Piece).ascii THEN ch := CR END (* << LF to CR *) + ELSIF u IS Elem THEN ch := ElemChar; R.elem := u(Elem) + ELSE ch := 0X; R.elem := NIL; R.eot := TRUE + END; + IF R.off = u.len THEN INC(R.org, u.len); u := u.next; + IF u IS Piece THEN + WITH u: Piece DO Files.Set(R.rider, u.file, u.org) END + END; + R.run := u; R.off := 0 + END + END Read; + + PROCEDURE ReadElem* (VAR R: Reader); + VAR u, un: Run; + BEGIN u := R.run; + WHILE u IS Piece DO INC(R.org, u.len); u := u.next END; + IF u IS Elem THEN un := u.next; R.run := un; INC(R.org); R.off := 0; + R.fnt := u.fnt; R.col := u.col; R.voff := u.voff; R.elem := u(Elem); + IF un IS Piece THEN + WITH un: Piece DO Files.Set(R.rider, un.file, un.org) END + END + ELSE R.eot := TRUE; R.elem := NIL + END + END ReadElem; + + PROCEDURE ReadPrevElem* (VAR R: Reader); + VAR u: Run; + BEGIN u := R.run.prev; + WHILE u IS Piece DO DEC(R.org, u.len); u := u.prev END; + IF u IS Elem THEN R.run := u; DEC(R.org); R.off := 0; + R.fnt := u.fnt; R.col := u.col; R.voff := u.voff; R.elem := u(Elem) + ELSE R.eot := TRUE; R.elem := NIL + END + END ReadPrevElem; + + PROCEDURE Pos* (VAR R: Reader): LONGINT; + BEGIN RETURN R.org + R.off + END Pos; + + + (** Scanners --------------- NW --------------- **) + + PROCEDURE OpenScanner* (VAR S: Scanner; T: Text; pos: LONGINT); + BEGIN OpenReader(S, T, pos); S.line := 0; S.nextCh := " " + END OpenScanner; + + (*IEEE floating point formats: + x = 2^(e-127) * 1.m bit 0: sign, bits 1- 8: e, bits 9-31: m + x = 2^(e-1023) * 1.m bit 0: sign, bits 1-11: e, bits 12-63: m *) + + PROCEDURE Scan* (VAR S: Scanner); + CONST maxD = 32; + VAR ch, term: CHAR; + neg, negE, hex: BOOLEAN; + i, j, h: SHORTINT; + e: INTEGER; k: LONGINT; + x, f: REAL; y, g: LONGREAL; + d: ARRAY maxD OF CHAR; + + PROCEDURE ReadScaleFactor; + BEGIN Read(S, ch); + IF ch = "-" THEN negE := TRUE; Read(S, ch) + ELSE negE := FALSE; + IF ch = "+" THEN Read(S, ch) END + END; + WHILE ("0" <= ch) & (ch <= "9") DO + e := e*10 + ORD(ch) - 30H; Read(S, ch) + END + END ReadScaleFactor; + + BEGIN ch := S.nextCh; i := 0; + LOOP + IF ch = CR THEN INC(S.line) + ELSIF (ch # " ") & (ch # TAB) THEN EXIT + END ; + Read(S, ch) + END; + IF ("A" <= CAP(ch)) & (CAP(ch) <= "Z") OR (ch = "/") OR (ch = ".") THEN (*name*) (* << *) + REPEAT S.s[i] := ch; INC(i); Read(S, ch) + UNTIL (CAP(ch) > "Z") & (ch # "_") (* << *) + OR ("A" > CAP(ch)) & (ch > "9") + OR ("0" > ch) & (ch # ".") & (ch # "/") (* << *) + OR (i = 63); (* << *) + S.s[i] := 0X; S.len := i; S.class := 1 + ELSIF ch = 22X THEN (*literal string*) + Read(S, ch); + WHILE (ch # 22X) & (ch >= " ") & (i # 63) DO (* << *) + S.s[i] := ch; INC(i); Read(S, ch) + END; + S.s[i] := 0X; S.len := i+1; Read(S, ch); S.class := 2 + ELSE + IF ch = "-" THEN neg := TRUE; Read(S, ch) ELSE neg := FALSE END ; + IF ("0" <= ch) & (ch <= "9") THEN (*number*) + hex := FALSE; j := 0; + LOOP d[i] := ch; INC(i); Read(S, ch); + IF ch < "0" THEN EXIT END; + IF "9" < ch THEN + IF ("A" <= ch) & (ch <= "F") THEN hex := TRUE; ch := CHR(ORD(ch)-7) + ELSIF ("a" <= ch) & (ch <= "f") THEN hex := TRUE; ch := CHR(ORD(ch)-27H) + ELSE EXIT + END + END + END; + IF ch = "H" THEN (*hex number*) + Read(S, ch); S.class := 3; + IF i-j > 8 THEN j := i-8 END ; + k := ORD(d[j]) - 30H; INC(j); + IF (i-j = 7) & (k >= 8) THEN DEC(k, 16) END ; + WHILE j < i DO k := k*10H + (ORD(d[j]) - 30H); INC(j) END ; + IF neg THEN S.i := -k ELSE S.i := k END + ELSIF ch = "." THEN (*read real*) + Read(S, ch); h := i; + WHILE ("0" <= ch) & (ch <= "9") DO d[i] := ch; INC(i); Read(S, ch) END ; + IF ch = "D" THEN + e := 0; y := 0; g := 1; + REPEAT y := y*10 + (ORD(d[j]) - 30H); INC(j) UNTIL j = h; + WHILE j < i DO g := g/10; y := (ORD(d[j]) - 30H)*g + y; INC(j) END ; + ReadScaleFactor; + IF negE THEN + IF e <= 308 THEN y := y / Reals.TenL(e) ELSE y := 0 END + ELSIF e > 0 THEN + IF e <= 308 THEN y := Reals.TenL(e) * y ELSE HALT(40) END + END ; + IF neg THEN y := -y END ; + S.class := 5; S.y := y + ELSE e := 0; x := 0; f := 1; + REPEAT x := x*10 + (ORD(d[j]) - 30H); INC(j) UNTIL j = h; + WHILE j < i DO f := f/10; x := (ORD(d[j])-30H)*f + x; INC(j) END; + IF ch = "E" THEN ReadScaleFactor END ; + IF negE THEN + IF e <= 38 THEN x := x / Reals.Ten(e) ELSE x := 0 END + ELSIF e > 0 THEN + IF e <= 38 THEN x := Reals.Ten(e) * x ELSE HALT(40) END + END ; + IF neg THEN x := -x END ; + S.class := 4; S.x := x + END ; + IF hex THEN S.class := 0 END + ELSE (*decimal integer*) + S.class := 3; k := 0; + REPEAT k := k*10 + (ORD(d[j]) - 30H); INC(j) UNTIL j = i; + IF neg THEN S.i := -k ELSE S.i := k END; + IF hex THEN S.class := 0 ELSE S.class := 3 END + END + ELSE S.class := 6; + IF neg THEN S.c := "-" ELSE S.c := ch; Read(S, ch) END + END + END; + S.nextCh := ch + END Scan; + + + (** Writers **) + + PROCEDURE OpenWriter* (VAR W: Writer); + BEGIN NEW(W.buf); OpenBuf(W.buf); + W.fnt := FontsDefault; W.col := Displaywhite; W.voff := 0; + W.file := Files.New(""); Files.Set(W.rider, W.file, 0) + END OpenWriter; + + PROCEDURE SetFont* (VAR W: Writer; fnt: FontsFont); + BEGIN W.fnt := fnt + END SetFont; + + PROCEDURE SetColor* (VAR W: Writer; col: SHORTINT); + BEGIN W.col := col + END SetColor; + + PROCEDURE SetOffset* (VAR W: Writer; voff: SHORTINT); + BEGIN W.voff := voff + END SetOffset; + + + PROCEDURE Write* (VAR W: Writer; ch: CHAR); + VAR u, un: Run; p: Piece; + BEGIN Files.Write(W.rider, ch); INC(W.buf.len); un := W.buf.head; u := un.prev; + IF (u IS Piece) & (u(Piece).file = W.file) & (u.fnt.name = W.fnt.name) & (u.col = W.col) & (u.voff = W.voff) + & ~u(Piece).ascii THEN (* << *) + INC(u.len) + ELSE NEW(p); u.next := p; p.prev := u; p.next := un; un.prev := p; + p.len := 1; p.fnt := W.fnt; p.col := W.col; p.voff := W.voff; + p.file := W.file; p.org := Files.Length(W.file) - 1; p.ascii := FALSE (* << *) + END + END Write; + + PROCEDURE WriteElem* (VAR W: Writer; e: Elem); + VAR u, un: Run; + BEGIN + IF e.base # NIL THEN HALT(99) END; + INC(W.buf.len); e.len := 1; e.fnt := W.fnt; e.col := W.col; e.voff := W.voff; + un := W.buf.head; u := un.prev; u.next := e; e.prev := u; e.next := un; un.prev := e + END WriteElem; + + PROCEDURE WriteLn* (VAR W: Writer); + BEGIN Write(W, CR) + END WriteLn; + + PROCEDURE WriteString* (VAR W: Writer; s: ARRAY OF CHAR); + VAR i: INTEGER; + BEGIN i := 0; + WHILE s[i] >= " " DO Write(W, s[i]); INC(i) END + END WriteString; + + PROCEDURE WriteInt* (VAR W: Writer; x, n: LONGINT); + VAR i: INTEGER; x0: LONGINT; + a: ARRAY 11 OF CHAR; + BEGIN i := 0; + IF x < 0 THEN + IF x = MIN(LONGINT) THEN WriteString(W, " -2147483648"); RETURN + ELSE DEC(n); x0 := -x + END + ELSE x0 := x + END; + REPEAT + a[i] := CHR(x0 MOD 10 + 30H); x0 := x0 DIV 10; INC(i) + UNTIL x0 = 0; + WHILE n > i DO Write(W, " "); DEC(n) END; + IF x < 0 THEN Write(W, "-") END; + REPEAT DEC(i); Write(W, a[i]) UNTIL i = 0 + END WriteInt; + + PROCEDURE WriteHex* (VAR W: Writer; x: LONGINT); + VAR i: INTEGER; y: LONGINT; + a: ARRAY 10 OF CHAR; + BEGIN i := 0; Write(W, " "); + REPEAT y := x MOD 10H; + IF y < 10 THEN a[i] := CHR(y + 30H) ELSE a[i] := CHR(y + 37H) END; + x := x DIV 10H; INC(i) + UNTIL i = 8; + REPEAT DEC(i); Write(W, a[i]) UNTIL i = 0 + END WriteHex; + + PROCEDURE WriteReal* (VAR W: Writer; x: REAL; n: INTEGER); + VAR e: INTEGER; x0: REAL; + d: ARRAY maxD OF CHAR; + BEGIN e := Reals.Expo(x); + IF e = 0 THEN + WriteString(W, " 0"); + REPEAT Write(W, " "); DEC(n) UNTIL n <= 3 + ELSIF e = 255 THEN + WriteString(W, " NaN"); + WHILE n > 4 DO Write(W, " "); DEC(n) END + ELSE + IF n <= 9 THEN n := 3 ELSE DEC(n, 6) END; + REPEAT Write(W, " "); DEC(n) UNTIL n <= 8; + (*there are 2 < n <= 8 digits to be written*) + IF x < 0.0 THEN Write(W, "-"); x := -x ELSE Write(W, " ") END; + e := (e - 127) * 77 DIV 256; + IF e >= 0 THEN x := x / Reals.Ten(e) ELSE x := Reals.Ten(-e) * x END; + IF x >= 10.0 THEN x := 0.1*x; INC(e) END; + x0 := Reals.Ten(n-1); x := x0*x + 0.5; + IF x >= 10.0*x0 THEN x := x*0.1; INC(e) END; + Reals.Convert(x, n, d); + DEC(n); Write(W, d[n]); Write(W, "."); + REPEAT DEC(n); Write(W, d[n]) UNTIL n = 0; + Write(W, "E"); + IF e < 0 THEN Write(W, "-"); e := -e ELSE Write(W, "+") END; + Write(W, CHR(e DIV 10 + 30H)); Write(W, CHR(e MOD 10 + 30H)) + END + END WriteReal; + + PROCEDURE WriteRealFix* (VAR W: Writer; x: REAL; n, k: INTEGER); + VAR e, i: INTEGER; sign: CHAR; x0: REAL; + d: ARRAY maxD OF CHAR; + + PROCEDURE seq(ch: CHAR; n: INTEGER); + BEGIN WHILE n > 0 DO Write(W, ch); DEC(n) END + END seq; + + PROCEDURE dig(n: INTEGER); + BEGIN + WHILE n > 0 DO + DEC(i); Write(W, d[i]); DEC(n) + END + END dig; + + BEGIN e := Reals.Expo(x); + IF k < 0 THEN k := 0 END; + IF e = 0 THEN seq(" ", n-k-2); Write(W, "0"); seq(" ", k+1) + ELSIF e = 255 THEN WriteString(W, " NaN"); seq(" ", n-4) + ELSE e := (e - 127) * 77 DIV 256; + IF x < 0 THEN sign := "-"; x := -x ELSE sign := " " END; + IF e >= 0 THEN (*x >= 1.0, 77/256 = log 2*) x := x/Reals.Ten(e) + ELSE (*x < 1.0*) x := Reals.Ten(-e) * x + END; + IF x >= 10.0 THEN x := 0.1*x; INC(e) END; + (* 1 <= x < 10 *) + IF k+e >= maxD-1 THEN k := maxD-1-e + ELSIF k+e < 0 THEN k := -e; x := 0.0 + END; + x0 := Reals.Ten(k+e); x := x0*x + 0.5; + IF x >= 10.0*x0 THEN INC(e) END; + (*e = no. of digits before decimal point*) + INC(e); i := k+e; Reals.Convert(x, i, d); + IF e > 0 THEN + seq(" ", n-e-k-2); Write(W, sign); dig(e); + Write(W, "."); dig(k) + ELSE seq(" ", n-k-3); + Write(W, sign); Write(W, "0"); Write(W, "."); + seq("0", -e); dig(k+e) + END + END + END WriteRealFix; + + PROCEDURE WriteRealHex* (VAR W: Writer; x: REAL); + VAR i: INTEGER; + d: ARRAY 8 OF CHAR; + BEGIN Reals.ConvertH(x, d); i := 0; + REPEAT Write(W, d[i]); INC(i) UNTIL i = 8 + END WriteRealHex; + + PROCEDURE WriteLongReal* (VAR W: Writer; x: LONGREAL; n: INTEGER); + CONST maxD = 16; + VAR e: INTEGER; x0: LONGREAL; + d: ARRAY maxD OF CHAR; + BEGIN e := Reals.ExpoL(x); + IF e = 0 THEN + WriteString(W, " 0"); + REPEAT Write(W, " "); DEC(n) UNTIL n <= 3 + ELSIF e = 2047 THEN + WriteString(W, " NaN"); + WHILE n > 4 DO Write(W, " "); DEC(n) END + ELSE + IF n <= 10 THEN n := 3 ELSE DEC(n, 7) END; + REPEAT Write(W, " "); DEC(n) UNTIL n <= maxD; + (*there are 2 <= n <= maxD digits to be written*) + IF x < 0 THEN Write(W, "-"); x := -x ELSE Write(W, " ") END; + e := SHORT(LONG(e - 1023) * 77 DIV 256); + IF e >= 0 THEN x := x / Reals.TenL(e) ELSE x := Reals.TenL(-e) * x END ; + IF x >= 10.0D0 THEN x := 0.1D0 * x; INC(e) END ; + x0 := Reals.TenL(n-1); x := x0*x + 0.5D0; + IF x >= 10.0D0*x0 THEN x := 0.1D0 * x; INC(e) END ; + Reals.ConvertL(x, n, d); + DEC(n); Write(W, d[n]); Write(W, "."); + REPEAT DEC(n); Write(W, d[n]) UNTIL n = 0; + Write(W, "D"); + IF e < 0 THEN Write(W, "-"); e := -e ELSE Write(W, "+") END; + Write(W, CHR(e DIV 100 + 30H)); e := e MOD 100; + Write(W, CHR(e DIV 10 + 30H)); + Write(W, CHR(e MOD 10 + 30H)) + END + END WriteLongReal; + + PROCEDURE WriteLongRealHex* (VAR W: Writer; x: LONGREAL); + VAR i: INTEGER; + d: ARRAY 16 OF CHAR; + BEGIN Reals.ConvertHL(x, d); i := 0; + REPEAT Write(W, d[i]); INC(i) UNTIL i = 16 + END WriteLongRealHex; + + PROCEDURE WriteDate* (VAR W: Writer; t, d: LONGINT); + + PROCEDURE WritePair(ch: CHAR; x: LONGINT); + BEGIN Write(W, ch); + Write(W, CHR(x DIV 10 + 30H)); Write(W, CHR(x MOD 10 + 30H)) + END WritePair; + + BEGIN + WritePair(" ", d MOD 32); WritePair(".", d DIV 32 MOD 16); WritePair(".", d DIV 512 MOD 128); + WritePair(" ", t DIV 4096 MOD 32); WritePair(":", t DIV 64 MOD 64); WritePair(":", t MOD 64) + END WriteDate; + + + (** Text Filing **) + + PROCEDURE Load0 (VAR r: Files.Rider; T: Text); + VAR u, un: Run; p: Piece; e: Elem; + org, pos, hlen, plen: LONGINT; ecnt, fno, fcnt, col, voff: SHORTINT; + f: Files.File; + msg: FileMsg; + mods, procs: ARRAY 64, 32 OF CHAR; + name: ARRAY 32 OF CHAR; + fnts: ARRAY 32 OF FontsFont; + + PROCEDURE LoadElem (VAR r: Files.Rider; pos, span: LONGINT; VAR e: Elem); + VAR M: Modules.Module; Cmd: Modules.Command; a: Alien; + org, ew, eh: LONGINT; eno: SHORTINT; + BEGIN new := NIL; + Files.ReadLInt(r, ew); Files.ReadLInt(r, eh); Files.Read(r, eno); + IF eno > ecnt THEN ecnt := eno; Files.ReadString(r, mods[eno]); Files.ReadString(r, procs[eno]) END; + org := Files.Pos(r); M := Modules.ThisMod(mods[eno]); + IF M # NIL THEN Cmd := Modules.ThisCommand(M, procs[eno]); + IF Cmd # NIL THEN Cmd END + END; + e := new; + IF e # NIL THEN e.W := ew; e.H := eh; e.base := T; + msg.pos := pos; e.handle(e, msg); + IF Files.Pos(r) # org + span THEN e := NIL END + END; + IF e = NIL THEN Files.Set(r, f, org + span); + NEW(a); a.W := ew; a.H := eh; a.handle := HandleAlien; a.base := T; + a.file := f; a.org := org; a.span := span; + COPY(mods[eno], a.mod); COPY(procs[eno], a.proc); + e := a + END + END LoadElem; + + BEGIN pos := Files.Pos(r); f := Files.Base(r); + NEW(u); u.len := MAX(LONGINT); (*u.fnt := FontsDefault;*)u.fnt := NIL; u.col := Displaywhite; + T.head := u; ecnt := 0; fcnt := 0; + msg.id := load; msg.r := r; + Files.ReadLInt(msg.r, hlen); (*!!!org := pos + hlen;*) org := pos -2 + hlen; pos := org; Files.Read(msg.r, fno); + WHILE fno # 0 DO + IF fno > fcnt THEN fcnt := fno; Files.ReadString(msg.r, name); fnts[fno] := FontsThis(name) END; + Files.Read(msg.r, col); Files.Read(msg.r, voff); Files.ReadLInt(msg.r, plen); + IF plen > 0 THEN NEW(p); p.file := f; p.org := pos; p.ascii := FALSE; un := p; un.len := plen + ELSE LoadElem(msg.r, pos - org, -plen, e); un := e; un.len := 1 + END; + un.fnt := fnts[fno]; un.col := col; un.voff := voff; + INC(pos, un.len); u.next := un; un.prev := u; u := un; Files.Read(msg.r, fno) + END; + u.next := T.head; T.head.prev := u; T.cache := T.head; T.corg := 0; + Files.ReadLInt(msg.r, T.len); Files.Set(r, f, Files.Pos(msg.r) + T.len) + END Load0; + + PROCEDURE Load* (VAR r: Files.Rider; T: Text); + CONST oldTag = -4095; + VAR tag: INTEGER; + BEGIN + (* for compatibility inner text tags are checked and skipped; remove this in a later version *) + Files.ReadInt(r, tag); IF tag # oldTag THEN Files.Set(r, Files.Base(r), Files.Pos(r)-2) END; + Load0(r, T) + END Load; + + PROCEDURE Open* (T: Text; name: ARRAY OF CHAR); + VAR f: Files.File; r: Files.Rider; u: Run; p: Piece; tag, version: CHAR; hlen: LONGINT; + BEGIN f := Files.Old(name); + IF f = NIL THEN f := Files.New("") END; + Files.Set(r, f, 0); Files.Read(r, tag); Files.Read(r, version); + IF (tag = textTag) OR (tag = 01X) & (version = textTag) THEN Load0(r, T) + ELSE (*ascii*) + NEW(u); u.len := MAX(LONGINT); u.fnt := NIL; u.col := Displaywhite; + NEW(p); + IF (tag = DocBlockId) & (version = 07X) THEN (* extract ascii text from System 3 text document *) + Files.Set(r, f, 28); Files.ReadLInt(r, hlen); + Files.Set(r, f, 22 + hlen); Files.ReadLInt(r, T.len); p.org := 26 + hlen + ELSE + T.len := Files.Length(f); p.org := 0 + END ; + IF T.len > 0 THEN p.len := T.len; p.fnt := FontsDefault; + p.col := Displaywhite; p.voff := 0; p.file := f; p.ascii := TRUE; + u.next := p; u.prev := p; p.next := u; p.prev := u + ELSE u.next := u; u.prev := u + END; + T.head := u; T.cache := T.head; T.corg := 0 + END + END Open; + + PROCEDURE Store* (VAR r: Files.Rider; T: Text); + VAR r1: Files.Rider; u, un: Run; e: Elem; org, pos, delta, hlen, rlen: LONGINT; ecnt, fno, fcnt: SHORTINT; ch: CHAR; (* << *) + msg: FileMsg; iden: IdentifyMsg; + mods, procs: ARRAY 64, 32 OF CHAR; + fnts: ARRAY 32 OF FontsFont; + block: ARRAY 1024 OF CHAR; + + PROCEDURE StoreElem (VAR r: Files.Rider; pos: LONGINT; e: Elem); + VAR r1: Files.Rider; org, span: LONGINT; eno: SHORTINT; + BEGIN COPY(iden.mod, mods[ecnt]); COPY(iden.proc, procs[ecnt]); eno := 1; + WHILE (mods[eno] # iden.mod) OR (procs[eno] # iden.proc) DO INC(eno) END; + Files.Set(r1, Files.Base(r), Files.Pos(r)); + Files.WriteLInt(r, 0); Files.WriteLInt(r, 0); Files.WriteLInt(r, 0); (*fixup slot*) + Files.Write(r, eno); + IF eno = ecnt THEN INC(ecnt); Files.WriteString(r, iden.mod); Files.WriteString(r, iden.proc) END; + msg.pos := pos; org := Files.Pos(r); e.handle(e, msg); span := Files.Pos(r) - org; + Files.WriteLInt(r1, -span); Files.WriteLInt(r1, e.W); Files.WriteLInt(r1, e.H) (*fixup*) + END StoreElem; + + BEGIN + org := Files.Pos(r); msg.id := store; msg.r := r; Files.WriteLInt(msg.r, 0); (*fixup slot*) + u := T.head.next; pos := 0; delta := 0; fcnt := 1; ecnt := 1; + WHILE u # T.head DO + IF u IS Elem THEN iden.mod[0] := 0X; u(Elem).handle(u(Elem), iden) ELSE iden.mod[0] := 1X END; + IF iden.mod[0] # 0X THEN + fnts[fcnt] := u.fnt; fno := 1; + WHILE fnts[fno].name # u.fnt.name DO INC(fno) END; + Files.Write(msg.r, fno); + IF fno = fcnt THEN INC(fcnt); Files.WriteString(msg.r, u.fnt.name) END; + Files.Write(msg.r, u.col); Files.Write(msg.r, u.voff) + END; + IF u IS Piece THEN rlen := u.len; un := u.next; + WHILE (un IS Piece) & (un.fnt = u.fnt) & (un.col = u.col) & (un.voff = u.voff) DO + INC(rlen, un.len); un := un.next + END; + Files.WriteLInt(msg.r, rlen); INC(pos, rlen); u := un + ELSIF iden.mod[0] # 0X THEN StoreElem(msg.r, pos, u(Elem)); INC(pos); u := u.next + ELSE INC(delta); u := u.next + END + END; + Files.Write(msg.r, 0); Files.WriteLInt(msg.r, T.len - delta); + (*!!!hlen := Files.Pos(msg.r) - org;*) hlen := Files.Pos(msg.r) - org + 2; + Files.Set(r1, Files.Base(msg.r), org); Files.WriteLInt(r1, hlen); (*fixup*) + u := T.head.next; + WHILE u # T.head DO + IF u IS Piece THEN + WITH u: Piece DO + IF u.ascii THEN Files.Set(r1, u.file, u.org); delta := u.len; (* << LF to CR *) + WHILE delta > 0 DO Files.Read(r1, ch); DEC(delta); + IF ch = 0AX THEN Files.Write(msg.r, CR) ELSE Files.Write(msg.r, ch) END + END + ELSE Files.Set(r1, u.file, u.org); delta := u.len; + WHILE delta > LEN(block) DO Files.ReadBytes(r1, block, LEN(block)); + Files.WriteBytes(msg.r, block, LEN(block)); DEC(delta, LEN(block)) + END; + Files.ReadBytes(r1, block, delta); Files.WriteBytes(msg.r, block, delta) + END + END + ELSE iden.mod[0] := 0X; u(Elem).handle(u(Elem), iden); + IF iden.mod[0] # 0X THEN Files.Write(msg.r, ElemChar) END + END; + u := u.next + END; + r := msg.r; + END Store; + + PROCEDURE Close* (T: Text; name: ARRAY OF CHAR); + VAR f: Files.File; r: Files.Rider; i, res: INTEGER; bak: ARRAY 64 OF CHAR; + BEGIN + f := Files.New(name); Files.Set(r, f, 0); Files.Write(r, textTag); Files.Write(r, version); Store(r, T); + i := 0; WHILE name[i] # 0X DO INC(i) END; + COPY(name, bak); bak[i] := "."; bak[i+1] := "B"; bak[i+2] := "a"; bak[i+3] := "k"; bak[i+4] := 0X; + Files.Rename(name, bak, res); Files.Register(f) + END Close; + +BEGIN del := NIL; NEW(FontsDefault); FontsDefault.name := "Syntax10.Scn.Fnt" +END Texts. diff --git a/src/lib/system/freebsd/clang/Texts0.Mod b/src/lib/system/freebsd/clang/Texts0.Mod new file mode 100644 index 00000000..7b95e031 --- /dev/null +++ b/src/lib/system/freebsd/clang/Texts0.Mod @@ -0,0 +1,859 @@ +MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91**) (* << RC, MB, JT *) + IMPORT + Files := Files0, Modules, Reals; + + (*--- insert field e: Elem into Texts.Scanner and change Texts.Scan to set it in case of class=6 *) + (* this module is for bootstrapping voc, use Texts instead *) + + CONST + Displaywhite = 15; + ElemChar* = 1CX; + TAB = 9X; CR = 0DX; maxD = 9; + (**FileMsg.id**) + load* = 0; store* = 1; + (**Notifier op**) + replace* = 0; insert* = 1; delete* = 2; + (**Scanner.class**) + Inval* = 0; Name* = 1; String* = 2; Int* = 3; Real* = 4; LongReal* = 5; Char* = 6; + + textTag = 0F0X; DocBlockId = 0F7X; version = 01X; + + TYPE + FontsFont = POINTER TO FontDesc; + FontDesc = RECORD + name: ARRAY 32 OF CHAR; + END ; + + Run = POINTER TO RunDesc; + RunDesc = RECORD + prev, next: Run; + len: LONGINT; + fnt: FontsFont; + col, voff: SHORTINT; + ascii: BOOLEAN (* << *) + END; + + Piece = POINTER TO PieceDesc; + PieceDesc = RECORD (RunDesc) + file: Files.File; + org: LONGINT + END; + + Elem* = POINTER TO ElemDesc; + Buffer* = POINTER TO BufDesc; + Text* = POINTER TO TextDesc; + + ElemMsg* = RECORD END; + Handler* = PROCEDURE (e: Elem; VAR msg: ElemMsg); + + ElemDesc* = RECORD (RunDesc) + W*, H*: LONGINT; + handle*: Handler; + base: Text + END; + + FileMsg* = RECORD (ElemMsg) + id*: INTEGER; + pos*: LONGINT; + r*: Files.Rider + END; + + CopyMsg* = RECORD (ElemMsg) + e*: Elem + END; + + IdentifyMsg* = RECORD (ElemMsg) + mod*, proc*: ARRAY 32 OF CHAR + END; + + + BufDesc* = RECORD + len*: LONGINT; + head: Run + END; + + TextDesc* = RECORD + len*: LONGINT; + head, cache: Run; + corg: LONGINT + END; + + Reader* = RECORD + eot*: BOOLEAN; + fnt*: FontsFont; + col*, voff*: SHORTINT; + elem*: Elem; + rider: Files.Rider; + run: Run; + org, off: LONGINT + END; + + Scanner* = RECORD (Reader) + nextCh*: CHAR; + line*, class*: INTEGER; + i*: LONGINT; + x*: REAL; + y*: LONGREAL; + c*: CHAR; + len*: SHORTINT; + s*: ARRAY 64 OF CHAR (* << *) + END; + + Writer* = RECORD + buf*: Buffer; + fnt*: FontsFont; + col*, voff*: SHORTINT; + rider: Files.Rider; + file: Files.File + END; + + Alien = POINTER TO RECORD (ElemDesc) + file: Files.File; + org, span: LONGINT; + mod, proc: ARRAY 32 OF CHAR + END; + + VAR + new*: Elem; + del: Buffer; + FontsDefault: FontsFont; + + + PROCEDURE FontsThis(VAR name: ARRAY OF CHAR): FontsFont; + VAR F: FontsFont; + BEGIN + NEW(F); COPY(name, F.name); RETURN F + END FontsThis; + + (* run primitives *) + + PROCEDURE Find (T: Text; VAR pos: LONGINT; VAR u: Run; VAR org, off: LONGINT); + VAR v: Run; m: LONGINT; + BEGIN + IF pos >= T.len THEN pos := T.len; u := T.head; org := T.len; off := 0; T.cache := T.head; T.corg := 0 + ELSE v := T.cache.next; m := pos - T.corg; + IF pos >= T.corg THEN + WHILE m >= v.len DO DEC(m, v.len); v := v.next END + ELSE + WHILE m < 0 DO v := v.prev; INC(m, v.len) END; + END; + u := v; org := pos - m; off := m; T.cache := v.prev; T.corg := org + END + END Find; + + PROCEDURE Split (off: LONGINT; VAR u, un: Run); + VAR p, U: Piece; + BEGIN + IF off = 0 THEN un := u; u := un.prev + ELSIF off >= u.len THEN un := u.next + ELSE NEW(p); un := p; U := u(Piece); + p^ := U^; INC(p.org, off); DEC(p.len, off); DEC(U.len, p.len); + p.ascii := u.ascii; p.prev := U; p.next := U.next; p.next.prev := p; U.next := p (* << *) + END + END Split; + + PROCEDURE Merge (T: Text; u: Run; VAR v: Run); + VAR p, q: Piece; + BEGIN + IF (u IS Piece) & (v IS Piece) & (u.fnt.name = v.fnt.name) & (u.col = v.col) & (u.voff = v.voff) + & (u(Piece).ascii = v(Piece).ascii) THEN (* << *) + p := u(Piece); q := v(Piece); + IF (p.file = q.file) & (p.org + p.len = q.org) THEN + IF T.cache = u THEN INC(T.corg, q.len) + ELSIF T.cache = v THEN T.cache := T.head; T.corg := 0 + END; + INC(p.len, q.len); v := v.next + END + END + END Merge; + + PROCEDURE Splice (un, v, w: Run; base: Text); (* (u, un) -> (u, v, w, un) *) + VAR u: Run; + BEGIN + IF v # w.next THEN u := un.prev; + u.next := v; v.prev := u; un.prev := w; w.next := un; + REPEAT + IF v IS Elem THEN v(Elem).base := base END; + v := v.next + UNTIL v = un + END + END Splice; + + PROCEDURE ClonePiece (p: Piece): Piece; + VAR q: Piece; + BEGIN NEW(q); q^ := p^; RETURN q + END ClonePiece; + + PROCEDURE CloneElem (e: Elem): Elem; + VAR msg: CopyMsg; + BEGIN msg.e := NIL; e.handle(e, msg); RETURN msg.e + END CloneElem; + + + (** Elements **) + + PROCEDURE CopyElem* (SE, DE: Elem); + BEGIN DE.len := SE.len; DE.fnt := SE.fnt; DE.col := SE.col; DE.voff := SE.voff; + DE.W := SE.W; DE.H := SE.H; DE.handle := SE.handle + END CopyElem; + + PROCEDURE ElemBase* (E: Elem): Text; + BEGIN RETURN E.base + END ElemBase; + + PROCEDURE ElemPos* (E: Elem): LONGINT; + VAR u: Run; pos: LONGINT; + BEGIN u := E.base.head.next; pos := 0; + WHILE u # E DO pos := pos + u.len; u := u.next END; + RETURN pos + END ElemPos; + + + PROCEDURE HandleAlien (E: Elem; VAR msg: ElemMsg); + VAR e: Alien; r: Files.Rider; i: LONGINT; ch: CHAR; + BEGIN + WITH E: Alien DO + IF msg IS CopyMsg THEN + WITH msg: CopyMsg DO NEW(e); CopyElem(E, e); + e.file := E.file; e.org := E.org; e.span := E.span; e.mod := E.mod; e.proc := E.proc; + msg.e := e + END + ELSIF msg IS IdentifyMsg THEN + WITH msg: IdentifyMsg DO + COPY(E.mod, msg.mod); COPY(E.proc, msg.proc); msg.mod[31] := 1X (*alien*) + END + ELSIF msg IS FileMsg THEN + WITH msg: FileMsg DO + IF msg.id = store THEN Files.Set(r, E.file, E.org); i := E.span; + WHILE i > 0 DO Files.Read(r, ch); Files.Write(msg.r, ch); DEC(i) END + END + END + END + END + END HandleAlien; + + + (** Buffers **) + + PROCEDURE OpenBuf* (B: Buffer); + VAR u: Run; + BEGIN NEW(u); u.next := u; u.prev := u; B.head := u; B.len := 0 + END OpenBuf; + + PROCEDURE Copy* (SB, DB: Buffer); + VAR u, v, vn: Run; + BEGIN u := SB.head.next; v := DB.head.prev; + WHILE u # SB.head DO + IF u IS Piece THEN vn := ClonePiece(u(Piece)) ELSE vn := CloneElem(u(Elem)) END; + v.next := vn; vn.prev := v; v := vn; u := u.next + END; + v.next := DB.head; DB.head.prev := v; + INC(DB.len, SB.len) + END Copy; + + PROCEDURE Recall* (VAR B: Buffer); + BEGIN B := del; del := NIL + END Recall; + + + (** Texts **) + + PROCEDURE Save* (T: Text; beg, end: LONGINT; B: Buffer); + VAR u, v, w, wn: Run; uo, ud, vo, vd: LONGINT; + BEGIN Find(T, beg, u, uo, ud); Find(T, end, v, vo, vd); + w := B.head.prev; + WHILE u # v DO + IF u IS Piece THEN wn := ClonePiece(u(Piece)); DEC(wn.len, ud); INC(wn(Piece).org, ud) + ELSE wn := CloneElem(u(Elem)) + END; + w.next := wn; wn.prev := w; w := wn; u := u.next; ud := 0 + END; + IF vd > 0 THEN (*v IS Piece*) wn := ClonePiece(v(Piece)); wn.len := vd - ud; INC(wn(Piece).org, ud); + w.next := wn; wn.prev := w; w := wn + END; + w.next := B.head; B.head.prev := w; + INC(B.len, end - beg) + END Save; + + PROCEDURE Insert* (T: Text; pos: LONGINT; B: Buffer); + VAR u, un, v: Run; p, q: Piece; uo, ud, len: LONGINT; + BEGIN Find(T, pos, u, uo, ud); Split(ud, u, un); + len := B.len; v := B.head.next; + Merge(T, u, v); Splice(un, v, B.head.prev, T); + INC(T.len, len); B.head.next := B.head; B.head.prev := B.head; B.len := 0; + END Insert; + + PROCEDURE Append* (T: Text; B: Buffer); + VAR v: Run; pos, len: LONGINT; + BEGIN pos := T.len; len := B.len; v := B.head.next; + Merge(T, T.head.prev, v); Splice(T.head, v, B.head.prev, T); + INC(T.len, len); B.head.next := B.head; B.head.prev := B.head; B.len := 0; + END Append; + + PROCEDURE Delete* (T: Text; beg, end: LONGINT); + VAR c, u, un, v, vn: Run; co, uo, ud, vo, vd: LONGINT; + BEGIN + Find(T, beg, u, uo, ud); Split(ud, u, un); c := T.cache; co := T.corg; + Find(T, end, v, vo, vd); Split(vd, v, vn); T.cache := c; T.corg := co; + NEW(del); OpenBuf(del); del.len := end - beg; + Splice(del.head, un, v, NIL); + Merge(T, u, vn); u.next := vn; vn.prev := u; + DEC(T.len, end - beg); + END Delete; + + PROCEDURE ChangeLooks* (T: Text; beg, end: LONGINT; sel: SET; fnt: FontsFont; col, voff: SHORTINT); + VAR c, u, un, v, vn: Run; co, uo, ud, vo, vd: LONGINT; + BEGIN Find(T, beg, u, uo, ud); Split(ud, u, un); c := T.cache; co := T.corg; + Find(T, end, v, vo, vd); Split(vd, v, vn); T.cache := c; T.corg := co; + WHILE un # vn DO + IF (0 IN sel) & (fnt # NIL) THEN un.fnt := fnt END; + IF 1 IN sel THEN un.col := col END; + IF 2 IN sel THEN un.voff := voff END; + Merge(T, u, un); + IF u.next = un THEN u := un; un := un.next ELSE u.next := un; un.prev := u END + END; + Merge(T, u, un); u.next := un; un.prev := u; + END ChangeLooks; + + + (** Readers **) + + PROCEDURE OpenReader* (VAR R: Reader; T: Text; pos: LONGINT); + VAR u: Run; + BEGIN + IF pos >= T.len THEN pos := T.len END; + Find(T, pos, u, R.org, R.off); R.run := u; R.eot := FALSE; + IF u IS Piece THEN + Files.Set(R.rider, u(Piece).file, u(Piece).org + R.off) + END + END OpenReader; + + PROCEDURE Read* (VAR R: Reader; VAR ch: CHAR); + VAR u: Run; + BEGIN u := R.run; R.fnt := u.fnt; R.col := u.col; R.voff := u.voff; INC(R.off); + IF u IS Piece THEN Files.Read(R.rider, ch); R.elem := NIL; + IF (ch = 0AX) & u(Piece).ascii THEN ch := CR END (* << LF to CR *) + ELSIF u IS Elem THEN ch := ElemChar; R.elem := u(Elem) + ELSE ch := 0X; R.elem := NIL; R.eot := TRUE + END; + IF R.off = u.len THEN INC(R.org, u.len); u := u.next; + IF u IS Piece THEN + WITH u: Piece DO Files.Set(R.rider, u.file, u.org) END + END; + R.run := u; R.off := 0 + END + END Read; + + PROCEDURE ReadElem* (VAR R: Reader); + VAR u, un: Run; + BEGIN u := R.run; + WHILE u IS Piece DO INC(R.org, u.len); u := u.next END; + IF u IS Elem THEN un := u.next; R.run := un; INC(R.org); R.off := 0; + R.fnt := u.fnt; R.col := u.col; R.voff := u.voff; R.elem := u(Elem); + IF un IS Piece THEN + WITH un: Piece DO Files.Set(R.rider, un.file, un.org) END + END + ELSE R.eot := TRUE; R.elem := NIL + END + END ReadElem; + + PROCEDURE ReadPrevElem* (VAR R: Reader); + VAR u: Run; + BEGIN u := R.run.prev; + WHILE u IS Piece DO DEC(R.org, u.len); u := u.prev END; + IF u IS Elem THEN R.run := u; DEC(R.org); R.off := 0; + R.fnt := u.fnt; R.col := u.col; R.voff := u.voff; R.elem := u(Elem) + ELSE R.eot := TRUE; R.elem := NIL + END + END ReadPrevElem; + + PROCEDURE Pos* (VAR R: Reader): LONGINT; + BEGIN RETURN R.org + R.off + END Pos; + + + (** Scanners --------------- NW --------------- **) + + PROCEDURE OpenScanner* (VAR S: Scanner; T: Text; pos: LONGINT); + BEGIN OpenReader(S, T, pos); S.line := 0; S.nextCh := " " + END OpenScanner; + + (*IEEE floating point formats: + x = 2^(e-127) * 1.m bit 0: sign, bits 1- 8: e, bits 9-31: m + x = 2^(e-1023) * 1.m bit 0: sign, bits 1-11: e, bits 12-63: m *) + + PROCEDURE Scan* (VAR S: Scanner); + CONST maxD = 32; + VAR ch, term: CHAR; + neg, negE, hex: BOOLEAN; + i, j, h: SHORTINT; + e: INTEGER; k: LONGINT; + x, f: REAL; y, g: LONGREAL; + d: ARRAY maxD OF CHAR; + + PROCEDURE ReadScaleFactor; + BEGIN Read(S, ch); + IF ch = "-" THEN negE := TRUE; Read(S, ch) + ELSE negE := FALSE; + IF ch = "+" THEN Read(S, ch) END + END; + WHILE ("0" <= ch) & (ch <= "9") DO + e := e*10 + ORD(ch) - 30H; Read(S, ch) + END + END ReadScaleFactor; + + BEGIN ch := S.nextCh; i := 0; + LOOP + IF ch = CR THEN INC(S.line) + ELSIF (ch # " ") & (ch # TAB) THEN EXIT + END ; + Read(S, ch) + END; + IF ("A" <= CAP(ch)) & (CAP(ch) <= "Z") OR (ch = "/") OR (ch = ".") THEN (*name*) (* << *) + REPEAT S.s[i] := ch; INC(i); Read(S, ch) + UNTIL (CAP(ch) > "Z") & (ch # "_") (* << *) + OR ("A" > CAP(ch)) & (ch > "9") + OR ("0" > ch) & (ch # ".") & (ch # "/") (* << *) + OR (i = 63); (* << *) + S.s[i] := 0X; S.len := i; S.class := 1 + ELSIF ch = 22X THEN (*literal string*) + Read(S, ch); + WHILE (ch # 22X) & (ch >= " ") & (i # 63) DO (* << *) + S.s[i] := ch; INC(i); Read(S, ch) + END; + S.s[i] := 0X; S.len := i+1; Read(S, ch); S.class := 2 + ELSE + IF ch = "-" THEN neg := TRUE; Read(S, ch) ELSE neg := FALSE END ; + IF ("0" <= ch) & (ch <= "9") THEN (*number*) + hex := FALSE; j := 0; + LOOP d[i] := ch; INC(i); Read(S, ch); + IF ch < "0" THEN EXIT END; + IF "9" < ch THEN + IF ("A" <= ch) & (ch <= "F") THEN hex := TRUE; ch := CHR(ORD(ch)-7) + ELSIF ("a" <= ch) & (ch <= "f") THEN hex := TRUE; ch := CHR(ORD(ch)-27H) + ELSE EXIT + END + END + END; + IF ch = "H" THEN (*hex number*) + Read(S, ch); S.class := 3; + IF i-j > 8 THEN j := i-8 END ; + k := ORD(d[j]) - 30H; INC(j); + IF (i-j = 7) & (k >= 8) THEN DEC(k, 16) END ; + WHILE j < i DO k := k*10H + (ORD(d[j]) - 30H); INC(j) END ; + IF neg THEN S.i := -k ELSE S.i := k END + ELSIF ch = "." THEN (*read real*) + Read(S, ch); h := i; + WHILE ("0" <= ch) & (ch <= "9") DO d[i] := ch; INC(i); Read(S, ch) END ; + IF ch = "D" THEN + e := 0; y := 0; g := 1; + REPEAT y := y*10 + (ORD(d[j]) - 30H); INC(j) UNTIL j = h; + WHILE j < i DO g := g/10; y := (ORD(d[j]) - 30H)*g + y; INC(j) END ; + ReadScaleFactor; + IF negE THEN + IF e <= 308 THEN y := y / Reals.TenL(e) ELSE y := 0 END + ELSIF e > 0 THEN + IF e <= 308 THEN y := Reals.TenL(e) * y ELSE HALT(40) END + END ; + IF neg THEN y := -y END ; + S.class := 5; S.y := y + ELSE e := 0; x := 0; f := 1; + REPEAT x := x*10 + (ORD(d[j]) - 30H); INC(j) UNTIL j = h; + WHILE j < i DO f := f/10; x := (ORD(d[j])-30H)*f + x; INC(j) END; + IF ch = "E" THEN ReadScaleFactor END ; + IF negE THEN + IF e <= 38 THEN x := x / Reals.Ten(e) ELSE x := 0 END + ELSIF e > 0 THEN + IF e <= 38 THEN x := Reals.Ten(e) * x ELSE HALT(40) END + END ; + IF neg THEN x := -x END ; + S.class := 4; S.x := x + END ; + IF hex THEN S.class := 0 END + ELSE (*decimal integer*) + S.class := 3; k := 0; + REPEAT k := k*10 + (ORD(d[j]) - 30H); INC(j) UNTIL j = i; + IF neg THEN S.i := -k ELSE S.i := k END; + IF hex THEN S.class := 0 ELSE S.class := 3 END + END + ELSE S.class := 6; + IF neg THEN S.c := "-" ELSE S.c := ch; Read(S, ch) END + END + END; + S.nextCh := ch + END Scan; + + + (** Writers **) + + PROCEDURE OpenWriter* (VAR W: Writer); + BEGIN NEW(W.buf); OpenBuf(W.buf); + W.fnt := FontsDefault; W.col := Displaywhite; W.voff := 0; + W.file := Files.New(""); Files.Set(W.rider, W.file, 0) + END OpenWriter; + + PROCEDURE SetFont* (VAR W: Writer; fnt: FontsFont); + BEGIN W.fnt := fnt + END SetFont; + + PROCEDURE SetColor* (VAR W: Writer; col: SHORTINT); + BEGIN W.col := col + END SetColor; + + PROCEDURE SetOffset* (VAR W: Writer; voff: SHORTINT); + BEGIN W.voff := voff + END SetOffset; + + + PROCEDURE Write* (VAR W: Writer; ch: CHAR); + VAR u, un: Run; p: Piece; + BEGIN Files.Write(W.rider, ch); INC(W.buf.len); un := W.buf.head; u := un.prev; + IF (u IS Piece) & (u(Piece).file = W.file) & (u.fnt.name = W.fnt.name) & (u.col = W.col) & (u.voff = W.voff) + & ~u(Piece).ascii THEN (* << *) + INC(u.len) + ELSE NEW(p); u.next := p; p.prev := u; p.next := un; un.prev := p; + p.len := 1; p.fnt := W.fnt; p.col := W.col; p.voff := W.voff; + p.file := W.file; p.org := Files.Length(W.file) - 1; p.ascii := FALSE (* << *) + END + END Write; + + PROCEDURE WriteElem* (VAR W: Writer; e: Elem); + VAR u, un: Run; + BEGIN + IF e.base # NIL THEN HALT(99) END; + INC(W.buf.len); e.len := 1; e.fnt := W.fnt; e.col := W.col; e.voff := W.voff; + un := W.buf.head; u := un.prev; u.next := e; e.prev := u; e.next := un; un.prev := e + END WriteElem; + + PROCEDURE WriteLn* (VAR W: Writer); + BEGIN Write(W, CR) + END WriteLn; + + PROCEDURE WriteString* (VAR W: Writer; s: ARRAY OF CHAR); + VAR i: INTEGER; + BEGIN i := 0; + WHILE s[i] >= " " DO Write(W, s[i]); INC(i) END + END WriteString; + + PROCEDURE WriteInt* (VAR W: Writer; x, n: LONGINT); + VAR i: INTEGER; x0: LONGINT; + a: ARRAY 11 OF CHAR; + BEGIN i := 0; + IF x < 0 THEN + IF x = MIN(LONGINT) THEN WriteString(W, " -2147483648"); RETURN + ELSE DEC(n); x0 := -x + END + ELSE x0 := x + END; + REPEAT + a[i] := CHR(x0 MOD 10 + 30H); x0 := x0 DIV 10; INC(i) + UNTIL x0 = 0; + WHILE n > i DO Write(W, " "); DEC(n) END; + IF x < 0 THEN Write(W, "-") END; + REPEAT DEC(i); Write(W, a[i]) UNTIL i = 0 + END WriteInt; + + PROCEDURE WriteHex* (VAR W: Writer; x: LONGINT); + VAR i: INTEGER; y: LONGINT; + a: ARRAY 10 OF CHAR; + BEGIN i := 0; Write(W, " "); + REPEAT y := x MOD 10H; + IF y < 10 THEN a[i] := CHR(y + 30H) ELSE a[i] := CHR(y + 37H) END; + x := x DIV 10H; INC(i) + UNTIL i = 8; + REPEAT DEC(i); Write(W, a[i]) UNTIL i = 0 + END WriteHex; + + PROCEDURE WriteReal* (VAR W: Writer; x: REAL; n: INTEGER); + VAR e: INTEGER; x0: REAL; + d: ARRAY maxD OF CHAR; + BEGIN e := Reals.Expo(x); + IF e = 0 THEN + WriteString(W, " 0"); + REPEAT Write(W, " "); DEC(n) UNTIL n <= 3 + ELSIF e = 255 THEN + WriteString(W, " NaN"); + WHILE n > 4 DO Write(W, " "); DEC(n) END + ELSE + IF n <= 9 THEN n := 3 ELSE DEC(n, 6) END; + REPEAT Write(W, " "); DEC(n) UNTIL n <= 8; + (*there are 2 < n <= 8 digits to be written*) + IF x < 0.0 THEN Write(W, "-"); x := -x ELSE Write(W, " ") END; + e := (e - 127) * 77 DIV 256; + IF e >= 0 THEN x := x / Reals.Ten(e) ELSE x := Reals.Ten(-e) * x END; + IF x >= 10.0 THEN x := 0.1*x; INC(e) END; + x0 := Reals.Ten(n-1); x := x0*x + 0.5; + IF x >= 10.0*x0 THEN x := x*0.1; INC(e) END; + Reals.Convert(x, n, d); + DEC(n); Write(W, d[n]); Write(W, "."); + REPEAT DEC(n); Write(W, d[n]) UNTIL n = 0; + Write(W, "E"); + IF e < 0 THEN Write(W, "-"); e := -e ELSE Write(W, "+") END; + Write(W, CHR(e DIV 10 + 30H)); Write(W, CHR(e MOD 10 + 30H)) + END + END WriteReal; + + PROCEDURE WriteRealFix* (VAR W: Writer; x: REAL; n, k: INTEGER); + VAR e, i: INTEGER; sign: CHAR; x0: REAL; + d: ARRAY maxD OF CHAR; + + PROCEDURE seq(ch: CHAR; n: INTEGER); + BEGIN WHILE n > 0 DO Write(W, ch); DEC(n) END + END seq; + + PROCEDURE dig(n: INTEGER); + BEGIN + WHILE n > 0 DO + DEC(i); Write(W, d[i]); DEC(n) + END + END dig; + + BEGIN e := Reals.Expo(x); + IF k < 0 THEN k := 0 END; + IF e = 0 THEN seq(" ", n-k-2); Write(W, "0"); seq(" ", k+1) + ELSIF e = 255 THEN WriteString(W, " NaN"); seq(" ", n-4) + ELSE e := (e - 127) * 77 DIV 256; + IF x < 0 THEN sign := "-"; x := -x ELSE sign := " " END; + IF e >= 0 THEN (*x >= 1.0, 77/256 = log 2*) x := x/Reals.Ten(e) + ELSE (*x < 1.0*) x := Reals.Ten(-e) * x + END; + IF x >= 10.0 THEN x := 0.1*x; INC(e) END; + (* 1 <= x < 10 *) + IF k+e >= maxD-1 THEN k := maxD-1-e + ELSIF k+e < 0 THEN k := -e; x := 0.0 + END; + x0 := Reals.Ten(k+e); x := x0*x + 0.5; + IF x >= 10.0*x0 THEN INC(e) END; + (*e = no. of digits before decimal point*) + INC(e); i := k+e; Reals.Convert(x, i, d); + IF e > 0 THEN + seq(" ", n-e-k-2); Write(W, sign); dig(e); + Write(W, "."); dig(k) + ELSE seq(" ", n-k-3); + Write(W, sign); Write(W, "0"); Write(W, "."); + seq("0", -e); dig(k+e) + END + END + END WriteRealFix; + + PROCEDURE WriteRealHex* (VAR W: Writer; x: REAL); + VAR i: INTEGER; + d: ARRAY 8 OF CHAR; + BEGIN Reals.ConvertH(x, d); i := 0; + REPEAT Write(W, d[i]); INC(i) UNTIL i = 8 + END WriteRealHex; + + PROCEDURE WriteLongReal* (VAR W: Writer; x: LONGREAL; n: INTEGER); + CONST maxD = 16; + VAR e: INTEGER; x0: LONGREAL; + d: ARRAY maxD OF CHAR; + BEGIN e := Reals.ExpoL(x); + IF e = 0 THEN + WriteString(W, " 0"); + REPEAT Write(W, " "); DEC(n) UNTIL n <= 3 + ELSIF e = 2047 THEN + WriteString(W, " NaN"); + WHILE n > 4 DO Write(W, " "); DEC(n) END + ELSE + IF n <= 10 THEN n := 3 ELSE DEC(n, 7) END; + REPEAT Write(W, " "); DEC(n) UNTIL n <= maxD; + (*there are 2 <= n <= maxD digits to be written*) + IF x < 0 THEN Write(W, "-"); x := -x ELSE Write(W, " ") END; + e := SHORT(LONG(e - 1023) * 77 DIV 256); + IF e >= 0 THEN x := x / Reals.TenL(e) ELSE x := Reals.TenL(-e) * x END ; + IF x >= 10.0D0 THEN x := 0.1D0 * x; INC(e) END ; + x0 := Reals.TenL(n-1); x := x0*x + 0.5D0; + IF x >= 10.0D0*x0 THEN x := 0.1D0 * x; INC(e) END ; + Reals.ConvertL(x, n, d); + DEC(n); Write(W, d[n]); Write(W, "."); + REPEAT DEC(n); Write(W, d[n]) UNTIL n = 0; + Write(W, "D"); + IF e < 0 THEN Write(W, "-"); e := -e ELSE Write(W, "+") END; + Write(W, CHR(e DIV 100 + 30H)); e := e MOD 100; + Write(W, CHR(e DIV 10 + 30H)); + Write(W, CHR(e MOD 10 + 30H)) + END + END WriteLongReal; + + PROCEDURE WriteLongRealHex* (VAR W: Writer; x: LONGREAL); + VAR i: INTEGER; + d: ARRAY 16 OF CHAR; + BEGIN Reals.ConvertHL(x, d); i := 0; + REPEAT Write(W, d[i]); INC(i) UNTIL i = 16 + END WriteLongRealHex; + + PROCEDURE WriteDate* (VAR W: Writer; t, d: LONGINT); + + PROCEDURE WritePair(ch: CHAR; x: LONGINT); + BEGIN Write(W, ch); + Write(W, CHR(x DIV 10 + 30H)); Write(W, CHR(x MOD 10 + 30H)) + END WritePair; + + BEGIN + WritePair(" ", d MOD 32); WritePair(".", d DIV 32 MOD 16); WritePair(".", d DIV 512 MOD 128); + WritePair(" ", t DIV 4096 MOD 32); WritePair(":", t DIV 64 MOD 64); WritePair(":", t MOD 64) + END WriteDate; + + + (** Text Filing **) + + PROCEDURE Load0 (VAR r: Files.Rider; T: Text); + VAR u, un: Run; p: Piece; e: Elem; + org, pos, hlen, plen: LONGINT; ecnt, fno, fcnt, col, voff: SHORTINT; + f: Files.File; + msg: FileMsg; + mods, procs: ARRAY 64, 32 OF CHAR; + name: ARRAY 32 OF CHAR; + fnts: ARRAY 32 OF FontsFont; + + PROCEDURE LoadElem (VAR r: Files.Rider; pos, span: LONGINT; VAR e: Elem); + VAR M: Modules.Module; Cmd: Modules.Command; a: Alien; + org, ew, eh: LONGINT; eno: SHORTINT; + BEGIN new := NIL; + Files.ReadLInt(r, ew); Files.ReadLInt(r, eh); Files.Read(r, eno); + IF eno > ecnt THEN ecnt := eno; Files.ReadString(r, mods[eno]); Files.ReadString(r, procs[eno]) END; + org := Files.Pos(r); M := Modules.ThisMod(mods[eno]); + IF M # NIL THEN Cmd := Modules.ThisCommand(M, procs[eno]); + IF Cmd # NIL THEN Cmd END + END; + e := new; + IF e # NIL THEN e.W := ew; e.H := eh; e.base := T; + msg.pos := pos; e.handle(e, msg); + IF Files.Pos(r) # org + span THEN e := NIL END + END; + IF e = NIL THEN Files.Set(r, f, org + span); + NEW(a); a.W := ew; a.H := eh; a.handle := HandleAlien; a.base := T; + a.file := f; a.org := org; a.span := span; + COPY(mods[eno], a.mod); COPY(procs[eno], a.proc); + e := a + END + END LoadElem; + + BEGIN pos := Files.Pos(r); f := Files.Base(r); + NEW(u); u.len := MAX(LONGINT); (*u.fnt := FontsDefault;*)u.fnt := NIL; u.col := Displaywhite; + T.head := u; ecnt := 0; fcnt := 0; + msg.id := load; msg.r := r; + Files.ReadLInt(msg.r, hlen); (*!!!org := pos + hlen;*) org := pos -2 + hlen; pos := org; Files.Read(msg.r, fno); + WHILE fno # 0 DO + IF fno > fcnt THEN fcnt := fno; Files.ReadString(msg.r, name); fnts[fno] := FontsThis(name) END; + Files.Read(msg.r, col); Files.Read(msg.r, voff); Files.ReadLInt(msg.r, plen); + IF plen > 0 THEN NEW(p); p.file := f; p.org := pos; p.ascii := FALSE; un := p; un.len := plen + ELSE LoadElem(msg.r, pos - org, -plen, e); un := e; un.len := 1 + END; + un.fnt := fnts[fno]; un.col := col; un.voff := voff; + INC(pos, un.len); u.next := un; un.prev := u; u := un; Files.Read(msg.r, fno) + END; + u.next := T.head; T.head.prev := u; T.cache := T.head; T.corg := 0; + Files.ReadLInt(msg.r, T.len); Files.Set(r, f, Files.Pos(msg.r) + T.len) + END Load0; + + PROCEDURE Load* (VAR r: Files.Rider; T: Text); + CONST oldTag = -4095; + VAR tag: INTEGER; + BEGIN + (* for compatibility inner text tags are checked and skipped; remove this in a later version *) + Files.ReadInt(r, tag); IF tag # oldTag THEN Files.Set(r, Files.Base(r), Files.Pos(r)-2) END; + Load0(r, T) + END Load; + + PROCEDURE Open* (T: Text; name: ARRAY OF CHAR); + VAR f: Files.File; r: Files.Rider; u: Run; p: Piece; tag, version: CHAR; hlen: LONGINT; + BEGIN f := Files.Old(name); + IF f = NIL THEN f := Files.New("") END; + Files.Set(r, f, 0); Files.Read(r, tag); Files.Read(r, version); + IF (tag = textTag) OR (tag = 01X) & (version = textTag) THEN Load0(r, T) + ELSE (*ascii*) + NEW(u); u.len := MAX(LONGINT); u.fnt := NIL; u.col := Displaywhite; + NEW(p); + IF (tag = DocBlockId) & (version = 07X) THEN (* extract ascii text from System 3 text document *) + Files.Set(r, f, 28); Files.ReadLInt(r, hlen); + Files.Set(r, f, 22 + hlen); Files.ReadLInt(r, T.len); p.org := 26 + hlen + ELSE + T.len := Files.Length(f); p.org := 0 + END ; + IF T.len > 0 THEN p.len := T.len; p.fnt := FontsDefault; + p.col := Displaywhite; p.voff := 0; p.file := f; p.ascii := TRUE; + u.next := p; u.prev := p; p.next := u; p.prev := u + ELSE u.next := u; u.prev := u + END; + T.head := u; T.cache := T.head; T.corg := 0 + END + END Open; + + PROCEDURE Store* (VAR r: Files.Rider; T: Text); + VAR r1: Files.Rider; u, un: Run; e: Elem; org, pos, delta, hlen, rlen: LONGINT; ecnt, fno, fcnt: SHORTINT; ch: CHAR; (* << *) + msg: FileMsg; iden: IdentifyMsg; + mods, procs: ARRAY 64, 32 OF CHAR; + fnts: ARRAY 32 OF FontsFont; + block: ARRAY 1024 OF CHAR; + + PROCEDURE StoreElem (VAR r: Files.Rider; pos: LONGINT; e: Elem); + VAR r1: Files.Rider; org, span: LONGINT; eno: SHORTINT; + BEGIN COPY(iden.mod, mods[ecnt]); COPY(iden.proc, procs[ecnt]); eno := 1; + WHILE (mods[eno] # iden.mod) OR (procs[eno] # iden.proc) DO INC(eno) END; + Files.Set(r1, Files.Base(r), Files.Pos(r)); + Files.WriteLInt(r, 0); Files.WriteLInt(r, 0); Files.WriteLInt(r, 0); (*fixup slot*) + Files.Write(r, eno); + IF eno = ecnt THEN INC(ecnt); Files.WriteString(r, iden.mod); Files.WriteString(r, iden.proc) END; + msg.pos := pos; org := Files.Pos(r); e.handle(e, msg); span := Files.Pos(r) - org; + Files.WriteLInt(r1, -span); Files.WriteLInt(r1, e.W); Files.WriteLInt(r1, e.H) (*fixup*) + END StoreElem; + + BEGIN + org := Files.Pos(r); msg.id := store; msg.r := r; Files.WriteLInt(msg.r, 0); (*fixup slot*) + u := T.head.next; pos := 0; delta := 0; fcnt := 1; ecnt := 1; + WHILE u # T.head DO + IF u IS Elem THEN iden.mod[0] := 0X; u(Elem).handle(u(Elem), iden) ELSE iden.mod[0] := 1X END; + IF iden.mod[0] # 0X THEN + fnts[fcnt] := u.fnt; fno := 1; + WHILE fnts[fno].name # u.fnt.name DO INC(fno) END; + Files.Write(msg.r, fno); + IF fno = fcnt THEN INC(fcnt); Files.WriteString(msg.r, u.fnt.name) END; + Files.Write(msg.r, u.col); Files.Write(msg.r, u.voff) + END; + IF u IS Piece THEN rlen := u.len; un := u.next; + WHILE (un IS Piece) & (un.fnt = u.fnt) & (un.col = u.col) & (un.voff = u.voff) DO + INC(rlen, un.len); un := un.next + END; + Files.WriteLInt(msg.r, rlen); INC(pos, rlen); u := un + ELSIF iden.mod[0] # 0X THEN StoreElem(msg.r, pos, u(Elem)); INC(pos); u := u.next + ELSE INC(delta); u := u.next + END + END; + Files.Write(msg.r, 0); Files.WriteLInt(msg.r, T.len - delta); + (*!!!hlen := Files.Pos(msg.r) - org;*) hlen := Files.Pos(msg.r) - org + 2; + Files.Set(r1, Files.Base(msg.r), org); Files.WriteLInt(r1, hlen); (*fixup*) + u := T.head.next; + WHILE u # T.head DO + IF u IS Piece THEN + WITH u: Piece DO + IF u.ascii THEN Files.Set(r1, u.file, u.org); delta := u.len; (* << LF to CR *) + WHILE delta > 0 DO Files.Read(r1, ch); DEC(delta); + IF ch = 0AX THEN Files.Write(msg.r, CR) ELSE Files.Write(msg.r, ch) END + END + ELSE Files.Set(r1, u.file, u.org); delta := u.len; + WHILE delta > LEN(block) DO Files.ReadBytes(r1, block, LEN(block)); + Files.WriteBytes(msg.r, block, LEN(block)); DEC(delta, LEN(block)) + END; + Files.ReadBytes(r1, block, delta); Files.WriteBytes(msg.r, block, delta) + END + END + ELSE iden.mod[0] := 0X; u(Elem).handle(u(Elem), iden); + IF iden.mod[0] # 0X THEN Files.Write(msg.r, ElemChar) END + END; + u := u.next + END; + r := msg.r; + END Store; + + PROCEDURE Close* (T: Text; name: ARRAY OF CHAR); + VAR f: Files.File; r: Files.Rider; i, res: INTEGER; bak: ARRAY 64 OF CHAR; + BEGIN + f := Files.New(name); Files.Set(r, f, 0); Files.Write(r, textTag); Files.Write(r, version); Store(r, T); + i := 0; WHILE name[i] # 0X DO INC(i) END; + COPY(name, bak); bak[i] := "."; bak[i+1] := "B"; bak[i+2] := "a"; bak[i+3] := "k"; bak[i+4] := 0X; + Files.Rename(name, bak, res); Files.Register(f) + END Close; + +BEGIN del := NIL; NEW(FontsDefault); FontsDefault.name := "Syntax10.Scn.Fnt" +END Texts0. diff --git a/src/lib/system/freebsd/clang/x86_64/Args.Mod b/src/lib/system/freebsd/clang/x86_64/Args.Mod new file mode 100644 index 00000000..c6b7b56e --- /dev/null +++ b/src/lib/system/freebsd/clang/x86_64/Args.Mod @@ -0,0 +1,65 @@ +MODULE Args; (* jt, 8.12.94 *) + + (* command line argument handling for voc (jet backend) *) + + + IMPORT SYSTEM; + + TYPE + ArgPtr = POINTER TO ARRAY 1024 OF CHAR; + ArgVec = POINTER TO ARRAY 1024 OF ArgPtr; + + VAR argc-, argv-: LONGINT; + (*PROCEDURE -includestdlib() "#include ";*) + PROCEDURE -externgetenv() "extern char *getenv(const char *name);"; (* took this from stdlib.h*) + PROCEDURE -Argc(): INTEGER "SYSTEM_argc"; + PROCEDURE -Argv(): LONGINT "(long)SYSTEM_argv"; + PROCEDURE -getenv(var: ARRAY OF CHAR): ArgPtr + "(Args_ArgPtr)getenv(var)"; + + PROCEDURE Get*(n: INTEGER; VAR val: ARRAY OF CHAR); + VAR av: ArgVec; + BEGIN + IF n < argc THEN av := SYSTEM.VAL(ArgVec, argv); COPY(av[n]^, val) END + END Get; + + PROCEDURE GetInt*(n: INTEGER; VAR val: LONGINT); + VAR s: ARRAY 64 OF CHAR; k, d, i: LONGINT; + BEGIN + s := ""; Get(n, s); i := 0; + IF s[0] = "-" THEN i := 1 END ; + k := 0; d := ORD(s[i]) - ORD("0"); + WHILE (d >= 0 ) & (d <= 9) DO k := k*10 + d; INC(i); d := ORD(s[i]) - ORD("0") END ; + IF s[0] = "-" THEN d := -d; DEC(i) END ; + IF i > 0 THEN val := k END + END GetInt; + + PROCEDURE Pos*(s: ARRAY OF CHAR): INTEGER; + VAR i: INTEGER; arg: ARRAY 256 OF CHAR; + BEGIN + i := 0; Get(i, arg); + WHILE (i < argc) & (s # arg) DO INC(i); Get(i, arg) END ; + RETURN i + END Pos; + + PROCEDURE GetEnv*(var: ARRAY OF CHAR; VAR val: ARRAY OF CHAR); + VAR p: ArgPtr; + BEGIN + p := getenv(var); + IF p # NIL THEN COPY(p^, val) END + END GetEnv; + + PROCEDURE getEnv*(var: ARRAY OF CHAR; VAR val: ARRAY OF CHAR): BOOLEAN; + VAR p: ArgPtr; + BEGIN + p := getenv(var); + IF p # NIL THEN + COPY(p^, val); + RETURN TRUE + ELSE + RETURN FALSE + END + END getEnv; + +BEGIN argc := Argc(); argv := Argv() +END Args. diff --git a/src/lib/system/freebsd/clang/x86_64/SYSTEM.c0 b/src/lib/system/freebsd/clang/x86_64/SYSTEM.c0 new file mode 100644 index 00000000..17801802 --- /dev/null +++ b/src/lib/system/freebsd/clang/x86_64/SYSTEM.c0 @@ -0,0 +1,205 @@ +/* +* The body prefix file of the voc(jet backend) runtime system, Version 1.0 +* +* Copyright (c) Software Templ, 1994, 1995 +* +* Module SYSTEM is subject to change any time without prior notification. +* Software Templ disclaims all warranties with regard to module SYSTEM, +* in particular shall Software Templ not be liable for any damage resulting +* from inappropriate use or modification of module SYSTEM. +* +* Version 1.1 jt, 24.11.95 fixes for correct pointer arithmetic on Cray computers +* jt 31.1.2007 ANSI prototypes for malloc and exit in order to avoid cc warnings +* +*/ + +#include "SYSTEM.h" +#ifdef __STDC__ +#include "stdarg.h" +#else +#include "varargs.h" +#endif + +extern void *malloc(size_t size); +extern void exit(int status); + +void (*SYSTEM_Halt)(); +LONGINT SYSTEM_halt; /* x in HALT(x) */ +LONGINT SYSTEM_assert; /* x in ASSERT(cond, x) */ +LONGINT SYSTEM_argc; +LONGINT SYSTEM_argv; +LONGINT SYSTEM_lock; +BOOLEAN SYSTEM_interrupted; +static LONGINT SYSTEM_mainfrm; /* adr of main proc stack frame, used for stack collection */ + +#define Lock SYSTEM_lock++ +#define Unlock SYSTEM_lock--; if (SYSTEM_interrupted && (SYSTEM_lock == 0)) __HALT(-9) + + +static void SYSTEM_InitHeap(); +void *SYSTEM__init(); + +void SYSTEM_INIT(argc, argvadr) + int argc; long argvadr; +{ + SYSTEM_mainfrm = argvadr; + SYSTEM_argc = argc; + SYSTEM_argv = *(long*)argvadr; + SYSTEM_InitHeap(); + SYSTEM_halt = -128; + SYSTEM__init(); +} + +void SYSTEM_FINI() +{ + SYSTEM_FINALL(); +} + +long SYSTEM_XCHK(i, ub) long i, ub; {return __X(i, ub);} +long SYSTEM_RCHK(i, ub) long i, ub; {return __R(i, ub);} +long SYSTEM_ASH(i, n) long i, n; {return __ASH(i, n);} +long SYSTEM_ABS(i) long i; {return __ABS(i);} +double SYSTEM_ABSD(i) double i; {return __ABS(i);} + +void SYSTEM_INHERIT(t, t0) + long *t, *t0; +{ + t -= __TPROC0OFF; + t0 -= __TPROC0OFF; + while (*t0 != __EOM) {*t = *t0; t--; t0--;} +} + +void SYSTEM_ENUMP(adr, n, P) + long *adr; + long n; + void (*P)(); +{ + while (n > 0) {P(*adr); adr++; n--;} +} + +void SYSTEM_ENUMR(adr, typ, size, n, P) + char *adr; + long *typ, size, n; + void (*P)(); +{ + long *t, off; + typ++; + while (n > 0) { + t = typ; + off = *t; + while (off >= 0) {P(*(long*)(adr+off)); t++; off = *t;} + adr += size; n--; + } +} + +long SYSTEM_DIV(x, y) + unsigned long x, y; +{ if ((long) x >= 0) return (x / y); + else return -((y - 1 - x) / y); +} + +long SYSTEM_MOD(x, y) + unsigned long x, y; +{ unsigned long m; + if ((long) x >= 0) return (x % y); + else { m = (-x) % y; + if (m != 0) return (y - m); else return 0; + } +} + +long SYSTEM_ENTIER(x) + double x; +{ + long y; + if (x >= 0) + return (long)x; + else { + y = (long)x; + if (y <= x) return y; else return y - 1; + } +} + +void SYSTEM_HALT(n) + int n; +{ + SYSTEM_halt = n; + if (SYSTEM_Halt!=0) SYSTEM_Halt(n); + exit(n); +} + +#ifdef __STDC__ +SYSTEM_PTR SYSTEM_NEWARR(long *typ, long elemsz, int elemalgn, int nofdim, int nofdyn, ...) +#else +SYSTEM_PTR SYSTEM_NEWARR(typ, elemsz, elemalgn, nofdim, nofdyn, va_alist) + long *typ, elemsz; + int elemalgn, nofdim, nofdyn; + va_dcl +#endif +{ + long nofelems, size, dataoff, n, nptr, *x, *p, nofptrs, i, *ptab, off; + va_list ap; +#ifdef __STDC__ + va_start(ap, nofdyn); +#else + va_start(ap); +#endif + nofelems = 1; + while (nofdim > 0) { + nofelems = nofelems * va_arg(ap, long); nofdim--; + if (nofelems <= 0) __HALT(-20); + } + va_end(ap); + dataoff = nofdyn * sizeof(long); + if (elemalgn > sizeof(long)) { + n = dataoff % elemalgn; + if (n != 0) dataoff += elemalgn - n; + } + size = dataoff + nofelems * elemsz; + Lock; + if (typ == NIL) { + /* element typ does not contain pointers */ + x = SYSTEM_NEWBLK(size); + } + else if (typ == POINTER__typ) { + /* element type is a pointer */ + x = SYSTEM_NEWBLK(size + nofelems * sizeof(long)); + p = (long*)x[-1]; + p[-nofelems] = *p; /* build new type desc in situ: 1. copy block size; 2. setup ptr tab; 3. set sentinel; 4. patch tag */ + p -= nofelems - 1; n = 1; /* n =1 for skipping the size field */ + while (n <= nofelems) {*p = n*sizeof(long); p++; n++;} + *p = - (nofelems + 1) * sizeof(long); /* sentinel */ + x[-1] -= nofelems * sizeof(long); + } + else { + /* element type is a record that contains pointers */ + ptab = typ + 1; nofptrs = 0; + while (ptab[nofptrs] >= 0) {nofptrs++;} /* number of pointers per element */ + nptr = nofelems * nofptrs; /* total number of pointers */ + x = SYSTEM_NEWBLK(size + nptr * sizeof(long)); + p = (long*)x[- 1]; + p[-nptr] = *p; /* build new type desc in situ; 1. copy block size; 2. setup ptr tab; 3. set sentinel; 4. patch tag */ + p -= nptr - 1; n = 0; off = dataoff; + while (n < nofelems) {i = 0; + while (i < nofptrs) {*p = off + ptab[i]; p++; i++;} + off += elemsz; n++; + } + *p = - (nptr + 1) * sizeof(long); /* sentinel */ + x[-1] -= nptr * sizeof(long); + } + if (nofdyn != 0) { + /* setup len vector for index checks */ +#ifdef __STDC__ + va_start(ap, nofdyn); +#else + va_start(ap); +#endif + p = x; + while (nofdyn > 0) {*p = va_arg(ap, long); p++, nofdyn--;} + va_end(ap); + } + Unlock; + return x; +} + +/* ----------- end of SYSTEM.co ------------- */ + diff --git a/src/lib/system/freebsd/clang/x86_64/SYSTEM.h b/src/lib/system/freebsd/clang/x86_64/SYSTEM.h new file mode 100644 index 00000000..c0f1a95d --- /dev/null +++ b/src/lib/system/freebsd/clang/x86_64/SYSTEM.h @@ -0,0 +1,236 @@ +#ifndef SYSTEM__h +#define SYSTEM__h + +/* + +voc (jet backend) runtime system interface and macros library +copyright (c) Josef Templ, 1995, 1996 + +clang for Darwin version +uses double # as concatenation operator + +*/ +#include +//#include +//#include + +extern void *memcpy(void *dest, const void *src, unsigned long n); +extern void *malloc(size_t size); +extern void exit(int status); + +#define export +#define import extern + +/* constants */ +#define __MAXEXT 16 +#define NIL 0L +#define POINTER__typ (long*)1L /* not NIL and not a valid type */ + +/* basic types */ +//typedef char BOOLEAN; +#define BOOLEAN char +//typedef unsigned char CHAR; +#define CHAR unsigned char +//exactly two bytes +#define LONGCHAR unsigned short int +//typedef signed char SHORTINT; +#define SHORTINT signed char +//for x86 GNU/Linux +//typedef short int INTEGER; +//for x86_64 GNU/Linux +//typedef int INTEGER; +#define INTEGER int +//typedef long LONGINT; +#define LONGINT long +//typedef float REAL; +#define REAL float +//typedef double LONGREAL; +#define LONGREAL double +//typedef unsigned long SET; +#define SET unsigned long +typedef void *SYSTEM_PTR; +//#define *SYSTEM_PTR void +//typedef unsigned char SYSTEM_BYTE; +#define SYSTEM_BYTE unsigned char + +/* runtime system routines */ +extern long SYSTEM_DIV(); +extern long SYSTEM_MOD(); +extern long SYSTEM_ENTIER(); +extern long SYSTEM_ASH(); +extern long SYSTEM_ABS(); +extern long SYSTEM_XCHK(); +extern long SYSTEM_RCHK(); +extern double SYSTEM_ABSD(); +extern SYSTEM_PTR SYSTEM_NEWREC(); +extern SYSTEM_PTR SYSTEM_NEWBLK(); +#ifdef __STDC__ +extern SYSTEM_PTR SYSTEM_NEWARR(long*, long, int, int, int, ...); +#else +extern SYSTEM_PTR SYSTEM_NEWARR(); +#endif +extern SYSTEM_PTR SYSTEM_REGMOD(); +extern void SYSTEM_INCREF(); +extern void SYSTEM_REGCMD(); +extern void SYSTEM_REGTYP(); +extern void SYSTEM_REGFIN(); +extern void SYSTEM_FINALL(); +extern void SYSTEM_INIT(); +extern void SYSTEM_FINI(); +extern void SYSTEM_HALT(); +extern void SYSTEM_INHERIT(); +extern void SYSTEM_ENUMP(); +extern void SYSTEM_ENUMR(); + +/* module registry */ +#define __DEFMOD static void *m; if(m!=0)return m +#define __REGMOD(name, enum) if(m==0)m=SYSTEM_REGMOD((CHAR*)name,enum); else return m +#define __ENDMOD return m +#define __INIT(argc, argv) static void *m; SYSTEM_INIT(argc, (long)&argv); +#define __REGMAIN(name, enum) m=SYSTEM_REGMOD(name,enum) +#define __FINI SYSTEM_FINI(); return 0 +#define __IMPORT(name) SYSTEM_INCREF(name##__init()) +#define __REGCMD(name, cmd) SYSTEM_REGCMD(m, name, cmd) + +/* SYSTEM ops */ +#define __SYSNEW(p, len) p=SYSTEM_NEWBLK((long)(len)) +#define __VAL(t, x) (*(t*)&(x)) +#define __GET(a, x, t) x= *(t*)(a) +#define __PUT(a, x, t) *(t*)(a)=x +#define __LSHL(x, n, t) ((t)((unsigned t)(x)<<(n))) +#define __LSHR(x, n, t) ((t)((unsigned t)(x)>>(n))) +#define __LSH(x, n, t) ((n)>=0? __LSHL(x, n, t): __LSHR(x, -(n), t)) +#define __ROTL(x, n, t) ((t)((unsigned t)(x)<<(n)|(unsigned t)(x)>>(8*sizeof(t)-(n)))) +#define __ROTR(x, n, t) ((t)((unsigned t)(x)>>(n)|(unsigned t)(x)<<(8*sizeof(t)-(n)))) +#define __LSHR(x, n, t) ((t)((unsigned t)(x)>>(n))) +#define __LSH(x, n, t) ((n)>=0? __LSHL(x, n, t): __LSHR(x, -(n), t)) +#define __ROTL(x, n, t) ((t)((unsigned t)(x)<<(n)|(unsigned t)(x)>>(8*sizeof(t)-(n)))) +#define __ROTR(x, n, t) ((t)((unsigned t)(x)>>(n)|(unsigned t)(x)<<(8*sizeof(t)-(n)))) +#define __ROT(x, n, t) ((n)>=0? __ROTL(x, n, t): __ROTR(x, -(n), t)) +#define __BIT(x, n) (*(unsigned long*)(x)>>(n)&1) +#define __MOVE(s, d, n) memcpy((char*)(d),(char*)(s),n) + +/* std procs and operator mappings */ +#define __SHORT(x, y) ((int)((unsigned long)(x)+(y)<(y)+(y)?(x):(__HALT(-8),0))) +#define __SHORTF(x, y) ((int)(__RF((x)+(y),(y)+(y))-(y))) +#define __CHR(x) ((CHAR)__R(x, 256)) +#define __CHRF(x) ((CHAR)__RF(x, 256)) +#define __DIV(x, y) ((x)>=0?(x)/(y):-(((y)-1-(x))/(y))) +#define __DIVF(x, y) SYSTEM_DIV((long)(x),(long)(y)) +#define __MOD(x, y) ((x)>=0?(x)%(y):__MODF(x,y)) +#define __MODF(x, y) SYSTEM_MOD((long)(x),(long)(y)) +#define __NEW(p, t) p=SYSTEM_NEWREC((long)t##__typ) +#define __NEWARR SYSTEM_NEWARR +#define __HALT(x) SYSTEM_HALT(x) +#define __ASSERT(cond, x) if (!(cond)) {SYSTEM_assert = x; SYSTEM_HALT(-1);} +#define __ENTIER(x) SYSTEM_ENTIER(x) +#define __ABS(x) (((x)<0)?-(x):(x)) +#define __ABSF(x) SYSTEM_ABS((long)(x)) +#define __ABSFD(x) SYSTEM_ABSD((double)(x)) +#define __CAP(ch) ((CHAR)((ch)&0x5f)) +#define __ODD(x) ((x)&1) +#define __IN(x, s) (((s)>>(x))&1) +#define __SETOF(x) ((SET)1<<(x)) +#define __SETRNG(l, h) ((~(SET)0<<(l))&~(SET)0>>(8*sizeof(SET)-1-(h))) +#define __MASK(x, m) ((x)&~(m)) +#define __COPY(s, d, n) {char*_a=(void*)s,*_b=(void*)d;long _i=0,_t=n-1;while(_i<_t&&((_b[_i]=_a[_i])!=0)){_i++;};_b[_i]=0;} +static int __STRCMP(x, y) + CHAR *x, *y; +{long i = 0; CHAR ch1, ch2; + do {ch1 = x[i]; ch2 = y[i]; i++; + if (!ch1) return -(int)ch2; + } while (ch1==ch2); + return (int)ch1 - (int)ch2; +} +#define __ASH(x, n) ((n)>=0?__ASHL(x,n):__ASHR(x,-(n))) +#define __ASHL(x, n) ((long)(x)<<(n)) +#define __ASHR(x, n) ((long)(x)>>(n)) +#define __ASHF(x, n) SYSTEM_ASH((long)(x), (long)(n)) +// commented out to use malloc -- noch +//#define __DUP(x, l, t) x=(void*)memcpy(alloca(l*sizeof(t)),x,l*sizeof(t)) +#define __DUP(x, l, t) x=(void*)memcpy(malloc(l*sizeof(t)),x,l*sizeof(t)) +#define __DUPARR(v, t) v=(void*)memcpy(v##__copy,v,sizeof(t)) +#define __DEL(x) /* DUP with alloca frees storage automatically */ +#define __IS(tag, typ, level) (*(tag-(__BASEOFF-level))==(long)typ##__typ) +#define __TYPEOF(p) (*(((long**)(p))-1)) +#define __ISP(p, typ, level) __IS(__TYPEOF(p),typ,level) + +/* runtime checks */ +#define __X(i, ub) (((unsigned)(long)(i)<(unsigned long)(ub))?i:(__HALT(-2),0)) +#define __XF(i, ub) SYSTEM_XCHK((long)(i), (long)(ub)) +#define __RETCHK __retchk: __HALT(-3) +#define __CASECHK __HALT(-4) +#define __GUARDP(p, typ, level) ((typ*)(__ISP(p,typ,level)?p:(__HALT(-5),p))) +#define __GUARDR(r, typ, level) (*((typ*)(__IS(r##__typ,typ,level)?r:(__HALT(-5),r)))) +#define __GUARDA(p, typ, level) ((struct typ*)(__IS(__TYPEOF(p),typ,level)?p:(__HALT(-5),p))) +#define __GUARDEQR(p, dyntyp, typ) if(dyntyp!=typ##__typ) __HALT(-6);*(p) +#define __GUARDEQP(p, typ) if(__TYPEOF(p)!=typ##__typ)__HALT(-6);*(p) +#define __WITHCHK __HALT(-7) +#define __R(i, ub) (((unsigned)(long)(i)<(unsigned long)(ub))?i:(__HALT(-8),0)) +#define __RF(i, ub) SYSTEM_RCHK((long)(i),(long)(ub)) + +/* record type descriptors */ +#define __TDESC(t, m, n) \ + static struct t##__desc {\ + long tproc[m]; \ + long tag, next, level, module; \ + char name[24]; \ + long *base[__MAXEXT]; \ + char *rsrvd; \ + long blksz, ptr[n+1]; \ + } t##__desc + +#define __BASEOFF (__MAXEXT+1) +#define __TPROC0OFF (__BASEOFF+24/sizeof(long)+5) +#define __EOM 1 +#define __TDFLDS(name, size) {__EOM}, 1, 0, 0, 0, name, {0}, 0, size +#define __ENUMP(adr, n, P) SYSTEM_ENUMP(adr, (long)(n), P) +#define __ENUMR(adr, typ, size, n, P) SYSTEM_ENUMR(adr, typ, (long)(size), (long)(n), P) + +#define __INITYP(t, t0, level) \ + t##__typ= &t##__desc.blksz; \ + memcpy(t##__desc.base, t0##__typ - __BASEOFF, level*sizeof(long)); \ + t##__desc.base[level]=t##__typ; \ + t##__desc.module=(long)m; \ + if(t##__desc.blksz!=sizeof(struct t)) __HALT(-15); \ + t##__desc.blksz=(t##__desc.blksz+5*sizeof(long)-1)/(4*sizeof(long))*(4*sizeof(long)); \ + SYSTEM_REGTYP(m, (long)&t##__desc.next); \ + SYSTEM_INHERIT(t##__typ, t0##__typ) + +/* Oberon-2 type bound procedures support */ +#define __INITBP(t, proc, num) *(t##__typ-(__TPROC0OFF+num))=(long)proc +#define __SEND(typ, num, funtyp, parlist) ((funtyp)(*(typ-(__TPROC0OFF+num))))parlist + +/* runtime system variables */ +extern LONGINT SYSTEM_argc; +extern LONGINT SYSTEM_argv; +extern void (*SYSTEM_Halt)(); +extern LONGINT SYSTEM_halt; +extern LONGINT SYSTEM_assert; +extern SYSTEM_PTR SYSTEM_modules; +extern LONGINT SYSTEM_heapsize; +extern LONGINT SYSTEM_allocated; +extern LONGINT SYSTEM_lock; +extern SHORTINT SYSTEM_gclock; +extern BOOLEAN SYSTEM_interrupted; + +/* ANSI prototypes; not used so far +static int __STRCMP(CHAR *x, CHAR *y); +void SYSTEM_INIT(int argc, long argvadr); +void SYSTEM_FINI(void); +long SYSTEM_XCHK(long i, long ub); +long SYSTEM_RCHK(long i, long ub); +long SYSTEM_ASH(long i, long n); +long SYSTEM_ABS(long i); +double SYSTEM_ABSD(double i); +void SYSTEM_INHERIT(long *t, long *t0); +void SYSTEM_ENUMP(long *adr, long n, void (*P)(void*)); +void SYSTEM_ENUMR(char *adr, long *typ, long size, long n, void (*P)(void*)); +long SYSTEM_DIV(unsigned long x, unsigned long y); +long SYSTEM_MOD(unsigned long x, unsigned long y); +long SYSTEM_ENTIER(double x); +void SYSTEM_HALT(int n); +*/ + +#endif + diff --git a/src/lib/system/freebsd/clang/x86_64/Unix.Mod b/src/lib/system/freebsd/clang/x86_64/Unix.Mod new file mode 100644 index 00000000..b1382eb2 --- /dev/null +++ b/src/lib/system/freebsd/clang/x86_64/Unix.Mod @@ -0,0 +1,562 @@ +MODULE Unix; (* Josef Templ, 5.3.90 Linux system calls *) +(* ported to gnu x86_64 and added system function, noch *) +(* Module Unix provides a system call interface to Linux. + Naming conventions: + Procedure and Type-names always start with a capital letter. + error numbers as defined in Unix + other constants start with lower case letters *) + +IMPORT SYSTEM; + +CONST + +(* various important constants *) + + stdin* = 0; stdout* =1; stderr* = 2; + + LOCKEX* = 2; LOCKUN* = 8; (* /usr/include/file.h *) + AFINET* = 2; (* /usr/include/sys/socket.h *) + PFINET* = AFINET; (* /usr/include/linux/socket.h *) + SOCKSTREAM* = 1; (* /usr/include/linux/socket.h *) + FIONREAD* = 541BH; (* in /usr/include/asm/termios.h *) + SETFL* = 4; (* set file descriptor flags; in asm/fcntl.h *) + TCP* = 0; + +(* flag sets, cf. /usr/include/asm/fcntl.h *) + rdonly* = {}; wronly* = {0}; rdwr* = {1}; creat* = {6}; excl* = {7}; trunc* = {9}; append* = {10}; ndelay = {11}; + +(* error numbers *) + + EPERM* = 1; (* Not owner *) + ENOENT* = 2; (* No such file or directory *) + ESRCH* = 3; (* No such process *) + EINTR* = 4; (* Interrupted system call *) + EIO* = 5; (* I/O error *) + ENXIO* = 6; (* No such device or address *) + E2BIG* = 7; (* Arg list too long *) + ENOEXEC* = 8; (* Exec format error *) + EBADF* = 9; (* Bad file number *) + ECHILD* = 10; (* No children *) + EAGAIN* = 11; (* No more processes *) + ENOMEM* = 12; (* Not enough core *) + EACCES* = 13; (* Permission denied *) + EFAULT* = 14; (* Bad address *) + ENOTBLK* = 15; (* Block device required *) + EBUSY* = 16; (* Mount device busy *) + EEXIST* = 17; (* File exists *) + EXDEV* = 18; (* Cross-device link *) + ENODEV* = 19; (* No such device *) + ENOTDIR* = 20; (* Not a directory*) + EISDIR* = 21; (* Is a directory *) + EINVAL* = 22; (* Invalid argument *) + ENFILE* = 23; (* File table overflow *) + EMFILE* = 24; (* Too many open files *) + ENOTTY* = 25; (* Not a typewriter *) + ETXTBSY* = 26; (* Text file busy *) + EFBIG* = 27; (* File too large *) + ENOSPC* = 28; (* No space left on device *) + ESPIPE* = 29; (* Illegal seek *) + EROFS* = 30; (* Read-only file system *) + EMLINK* = 31; (* Too many links *) + EPIPE* = 32; (* Broken pipe *) + EDOM* = 33; (* Argument too large *) + ERANGE* = 34; (* Result too large *) + EDEADLK* = 35; (* Resource deadlock would occur *) + ENAMETOOLONG* = 36; (* File name too long *) + ENOLCK* = 37; (* No record locks available *) + ENOSYS* = 38; (* Function not implemented *) + ENOTEMPTY* = 39; (* Directory not empty *) + ELOOP* = 40; (* Too many symbolic links encountered *) + EWOULDBLOCK* = EAGAIN; (* Operation would block *) + ENOMSG* = 42; (* No message of desired type *) + EIDRM* = 43; (* Identifier removed *) + ECHRNG* = 44; (* Channel number out of range *) + EL2NSYNC* = 45; (* Level 2 not synchronized *) + EL3HLT* = 46; (* Level 3 halted *) + EL3RST* = 47; (* Level 3 reset *) + ELNRNG* = 48; (* Link number out of range *) + EUNATCH* = 49; (* Protocol driver not attached *) + ENOCSI* = 50; (* No CSI structure available *) + EL2HLT* = 51; (* Level 2 halted *) + EBADE* = 52; (* Invalid exchange *) + EBADR* = 53; (* Invalid request descriptor *) + EXFULL* = 54; (* Exchange full *) + ENOANO* = 55; (* No anode *) + EBADRQC* = 56; (* Invalid request code *) + EBADSLT* = 57; (* Invalid slot *) + EDEADLOCK* = 58; (* File locking deadlock error *) + EBFONT* = 59; (* Bad font file format *) + ENOSTR* = 60; (* Device not a stream *) + ENODATA* = 61; (* No data available *) + ETIME* = 62; (* Timer expired *) + ENOSR* = 63; (* Out of streams resources *) + ENONET* = 64; (* Machine is not on the network *) + ENOPKG* = 65; (* Package not installed *) + EREMOTE* = 66; (* Object is remote *) + ENOLINK* = 67; (* Link has been severed *) + EADV* = 68; (* Advertise error *) + ESRMNT* = 69; (* Srmount error *) + ECOMM* = 70; (* Communication error on send *) + EPROTO* = 71; (* Protocol error *) + EMULTIHOP* = 72; (* Multihop attempted *) + EDOTDOT* = 73; (* RFS specific error *) + EBADMSG* = 74; (* Not a data message *) + EOVERFLOW* = 75; (* Value too large for defined data type *) + ENOTUNIQ* = 76; (* Name not unique on network *) + EBADFD* = 77; (* File descriptor in bad state *) + EREMCHG* = 78; (* Remote address changed *) + ELIBACC* = 79; (* Can not access a needed shared library *) + ELIBBAD* = 80; (* Accessing a corrupted shared library *) + ELIBSCN* = 81; (* .lib section in a.out corrupted *) + ELIBMAX* = 82; (* Attempting to link in too many shared libraries *) + ELIBEXEC* = 83; (* Cannot exec a shared library directly *) + EILSEQ* = 84; (* Illegal byte sequence *) + ERESTART* = 85; (* Interrupted system call should be restarted *) + ESTRPIPE* = 86; (* Streams pipe error *) + EUSERS* = 87; (* Too many users *) + ENOTSOCK* = 88; (* Socket operation on non-socket *) + EDESTADDRREQ* = 89; (* Destination address required *) + EMSGSIZE* = 90; (* Message too long *) + EPROTOTYPE* = 91; (* Protocol wrong type for socket *) + ENOPROTOOPT* = 92; (* Protocol not available *) + EPROTONOSUPPORT* = 93; (* Protocol not supported *) + ESOCKTNOSUPPORT* = 94; (* Socket type not supported *) + EOPNOTSUPP* = 95; (* Operation not supported on transport endpoint *) + EPFNOSUPPORT* = 96; (* Protocol family not supported *) + EAFNOSUPPORT* = 97; (* Address family not supported by protocol *) + EADDRINUSE* = 98; (* Address already in use *) + EADDRNOTAVAIL* = 99; (* Cannot assign requested address *) + ENETDOWN* = 100; (* Network is down *) + ENETUNREACH* = 101; (* Network is unreachable *) + ENETRESET* = 102; (* Network dropped connection because of reset *) + ECONNABORTED* = 103; (* Software caused connection abort *) + ECONNRESET* = 104; (* Connection reset by peer *) + ENOBUFS* = 105; (* No buffer space available *) + EISCONN* = 106; (* Transport endpoint is already connected *) + ENOTCONN* = 107; (* Transport endpoint is not connected *) + ESHUTDOWN* = 108; (* Cannot send after transport endpoint shutdown *) + ETOOMANYREFS* = 109; (* Too many references: cannot splice *) + ETIMEDOUT* = 110; (* Connection timed out *) + ECONNREFUSED* = 111; (* Connection refused *) + EHOSTDOWN* = 112; (* Host is down *) + EHOSTUNREACH* = 113; (* No route to host *) + EALREADY* = 114; (* Operation already in progress *) + EINPROGRESS* = 115; (* Operation now in progress *) + ESTALE* = 116; (* Stale NFS file handle *) + EUCLEAN* = 117; (* Structure needs cleaning *) + ENOTNAM* = 118; (* Not a XENIX named type file *) + ENAVAIL* = 119; (* No XENIX semaphores available *) + EISNAM* = 120; (* Is a named type file *) + EREMOTEIO* = 121; (* Remote I/O error *) + EDQUOT* = 122; (* Quota exceeded *) + +CONST sigsetarrlength = 1024 / 8 * SIZE(LONGINT); + + +TYPE +(* bits/sigset.h + _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int))) + + 1024 / 8*8 = 16 + 1024 / 8*4 = 32 +*) + sigsett* = RECORD + val : ARRAY 16 OF LONGINT (* 32 for 32 bit *) + (*val : ARRAY sigsetarrlength OF LONGINT *) + END; + + JmpBuf* = RECORD + (* macosx darwin 64bit, cpp /usr/include/setjmp.h + typedef int jmp_buf[((9 * 2) + 3 + 16)]; + *) + + (*bx*, si*, di*, bp*, sp*, pc*: LONGINT;*) + (* bits/setjmp.h sets up longer array in GNU libc *) + (* + # if __WORDSIZE == 64 + typedef long int __jmp_buf[8]; + # else + typedef int __jmp_buf[6]; + # endif + *) + (*bx*, si*, di*, bp*, sp*, pc*, ki*, ku*: LONGINT;*) + f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, + f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, + f30, f31, f32, f33, f34, f35, f36: INTEGER; + (* setjmp.h +/* Calling environment, plus possibly a saved signal mask. */ +struct __jmp_buf_tag + { + /* NOTE: The machine-dependent definitions of `__sigsetjmp' + assume that a `jmp_buf' begins with a `__jmp_buf' and that + `__mask_was_saved' follows it. Do not move these members + or add others before it. */ + __jmp_buf __jmpbuf; /* Calling environment. */ + int __mask_was_saved; /* Saved the signal mask? */ + __sigset_t __saved_mask; /* Saved signal mask. */ + }; + + *) + (*maskWasSaved*, savedMask*: LONGINT;*) + (*maskWasSaved*: INTEGER; *) + (* + # define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int))) +typedef struct + { + unsigned long int __val[_SIGSET_NWORDS]; + } __sigset_t; + + *) + (*savedMask*: sigsett;*) + END ; +(* + Status* = RECORD (* struct stat *) + dev* : INTEGER; (* dev_t 4 *) + mode*: SHORTINT; mode1*: SHORTINT; (* mode_t 2 *) + nlink* : SHORTINT; nlink1*: SHORTINT; (* nlink_t 2 *) + ino* : LONGINT; (* __darwin_ino64_t 8 *) + uid*, gid*: INTEGER; (* uid_t, gid_t 4 *) + rdev*: INTEGER; (* dev_t 4 *) + atime* : LONGINT; atimences* : LONGINT; (* struct timespec 16 *) + mtime* : LONGINT; mtimences* : LONGINT; (* struct timespec 16 *) + ctime* : LONGINT; ctimences* : LONGINT; (* struct timespec 16 *) + birthtime* : LONGINT; birthtimences* : LONGINT; (* struct timespec 16 *) + size*: LONGINT; (* off_t 8 *) + blocks* : LONGINT; + blksize* : INTEGER; + flags* : INTEGER; + gen* : INTEGER; + lspare* : INTEGER; + qspare*, qspare1*: LONGINT; + END ; +*) + Status* = RECORD (* struct stat *) + dev* : INTEGER; (* dev_t 4 *) + ino* : INTEGER; (* ino_t 4 *) + mode*: SHORTINT; mode1*: SHORTINT; (* mode_t 2 *) + nlink* : SHORTINT; nlink1*: SHORTINT; (* nlink_t 2 *) + uid*, gid*: INTEGER; (* uid_t, gid_t 4 *) + rdev*: INTEGER; (* dev_t 4 *) + atime* : LONGINT; atimences* : LONGINT; (* struct timespec 16 *) + mtime* : LONGINT; mtimences* : LONGINT; (* struct timespec 16 *) + ctime* : LONGINT; ctimences* : LONGINT; (* struct timespec 16 *) + size*: LONGINT; (* off_t 8 *) + blocks* : LONGINT; + blksize* : INTEGER; + flags* : INTEGER; + gen* : INTEGER; + lspare* : INTEGER; + birthtime* : LONGINT; birthtimences* : LONGINT; (* struct timespec 16 *) + qspare*, qspare1*: INTEGER; + END ; + + +(* from /usr/include/bits/time.h + +struct timeval + { + __time_t tv_sec; /* Seconds. */ //__time_t 8 + __suseconds_t tv_usec; /* Microseconds. */ __suseconds_t 8 + }; + + +*) + + Timeval* = RECORD + sec*, usec*: LONGINT + END ; + + +(* +from man gettimeofday + + struct timezone { + int tz_minuteswest; /* minutes west of Greenwich */ int 4 + int tz_dsttime; /* type of DST correction */ int 4 + }; +*) + + + Timezone* = RECORD + (*minuteswest*, dsttime*: LONGINT*) + minuteswest*, dsttime*: INTEGER + END ; + + Itimerval* = RECORD + interval*, value*: Timeval + END ; + + FdSet* = ARRAY 8 OF SET; + + SigCtxPtr* = POINTER TO SigContext; + SigContext* = RECORD + END ; + + SignalHandler* = PROCEDURE (sig, code: LONGINT; scp: SigCtxPtr); + + Dirent* = RECORD + ino, off: LONGINT; + reclen: INTEGER; + name: ARRAY 256 OF CHAR; + END ; + + Rusage* = RECORD + utime*, stime*: Timeval; + maxrss*, ixrss*, idrss*, isrss*, + minflt*, majflt*, nswap*, inblock*, + oublock*, msgsnd*, msgrcv*, nsignals*, + nvcsw*, nivcsw*: LONGINT + END ; + + Iovec* = RECORD + base*, len*: LONGINT + END ; + + SocketPair* = ARRAY 2 OF LONGINT; + + Pollfd* = RECORD + fd*: LONGINT; + events*, revents*: INTEGER + END ; + + Sockaddr* = RECORD + family*: INTEGER; + port*: INTEGER; + internetAddr*: LONGINT; + pad*: ARRAY 8 OF CHAR; + END ; + + HostEntry* = POINTER [1] TO Hostent; + Hostent* = RECORD + name*, aliases*: LONGINT; + addrtype*, length*: LONGINT; + addrlist*: LONGINT; (*POINTER TO POINTER TO LONGINT, network byte order*) + END; + + Name* = ARRAY OF CHAR; + + PROCEDURE -includeStat() + "#include "; + + (* for select() *) + PROCEDURE -includeSelect() + "#include "; + + (* for kill() *) + PROCEDURE -includeSignal() + "#include "; + + (* for read() also *) + PROCEDURE -includeTypes() + "#include "; + + PROCEDURE -includeUio() + "#include "; + + (* for getpid(), lseek(), close(), fsync(), ftruncate(), read(), sleep() *) + PROCEDURE -includeUnistd() + "#include "; + + + (* for rename() *) + PROCEDURE -includeStdio() + "#include "; + + PROCEDURE -includeErrno() + "#include "; + + (* for open() *) + PROCEDURE -includeFcntl() + "#include "; + + PROCEDURE -err(): LONGINT + "errno"; + + PROCEDURE errno*(): LONGINT; + BEGIN + RETURN err() + END errno; + + PROCEDURE -Exit*(n: LONGINT) + "exit(n)"; + + PROCEDURE -Fork*(): LONGINT + "fork()"; + + PROCEDURE -Wait*(VAR status: LONGINT): LONGINT + "wait(status)"; + + PROCEDURE -Select*(width: LONGINT; VAR readfds, writefds, exceptfds: FdSet; VAR timeout: Timeval): LONGINT + "select(width, readfds, writefds, exceptfds, timeout)"; + + PROCEDURE -Gettimeofday* (VAR tv: Timeval; VAR tz: Timezone) : LONGINT + "gettimeofday(tv, tz)"; + + PROCEDURE -Read* (fd, buf, nbyte: LONGINT): LONGINT + "read(fd, buf, nbyte)"; + + PROCEDURE -ReadBlk* (fd: LONGINT; VAR buf: ARRAY OF SYSTEM.BYTE): LONGINT + "read(fd, buf, buf__len)"; + + PROCEDURE -Write* (fd, buf, nbyte: LONGINT): LONGINT + "write(fd, buf, nbyte)"; + + PROCEDURE -WriteBlk* (fd: LONGINT; VAR buf: ARRAY OF SYSTEM.BYTE): LONGINT + "write(fd, buf, buf__len)"; + + PROCEDURE -Dup*(fd: LONGINT): LONGINT + "dup(fd)"; + + PROCEDURE -Dup2*(fd1, fd2: LONGINT): LONGINT + "dup(fd1, fd2)"; + + PROCEDURE -Pipe*(fds : LONGINT): LONGINT + "pipe(fds)"; + + PROCEDURE -Getpid*(): LONGINT + "getpid()"; + + PROCEDURE -Getuid*(): LONGINT + "getuid()"; + + PROCEDURE -Geteuid*(): LONGINT + "geteuid()"; + + PROCEDURE -Getgid*(): LONGINT + "getgid()"; + + PROCEDURE -Getegid*(): LONGINT + "getegid()"; + + PROCEDURE -Unlink*(name: Name): LONGINT + "unlink(name)"; + + PROCEDURE -Open*(name: Name; flag, mode: SET): LONGINT + "open(name, flag, mode)"; + + PROCEDURE -Close*(fd: LONGINT): LONGINT + "close(fd)"; + + PROCEDURE -stat(name: Name; VAR statbuf: Status): LONGINT + "stat((const char*)name, (struct stat*)statbuf)"; + + PROCEDURE Stat*(name: Name; VAR statbuf: Status): LONGINT; + VAR res: LONGINT; + BEGIN + res := stat(name, statbuf); + (* make the first 4 bytes as unique as possible (used in module Files for caching!) *) + (* don't understand this + INC(statbuf.dev, statbuf.devX); + INC(statbuf.rdev, statbuf.rdevX); *) + RETURN res; + END Stat; + + PROCEDURE -fstat(fd: LONGINT; VAR statbuf: Status): LONGINT + "fstat(fd, (struct stat*)statbuf)"; + + PROCEDURE Fstat*(fd: LONGINT; VAR statbuf: Status): LONGINT; + VAR res: LONGINT; + BEGIN + res := fstat(fd, statbuf); + (* make the first 4 bytes as unique as possible (used in module Files for caching!) *) + (*INC(statbuf.dev, statbuf.devX); + INC(statbuf.rdev, statbuf.rdevX); *) + RETURN res; + END Fstat; + + PROCEDURE -Fchmod*(fd, mode: LONGINT): LONGINT + "fchmod(fd, mode)"; + + PROCEDURE -Chmod*(path: Name; mode: LONGINT): LONGINT + "chmod(path, mode)"; + + PROCEDURE -Lseek*(fd, offset, origin: LONGINT): LONGINT + "lseek(fd, offset, origin)"; + + PROCEDURE -Fsync*(fd: LONGINT): LONGINT + "fsync(fd)"; + + PROCEDURE -Fcntl*(fd, cmd, arg: LONGINT ): LONGINT + "fcntl(fd, cmd, arg)"; + + PROCEDURE -Flock*(fd, operation: LONGINT): LONGINT + "flock(fd, operation)"; + + PROCEDURE -Ftruncate*(fd, length: LONGINT): LONGINT + "ftruncate(fd, length)"; + + PROCEDURE -Readblk*(fd: LONGINT; VAR buf: ARRAY OF SYSTEM.BYTE; len: LONGINT): LONGINT + "read(fd, buf, len)"; + + PROCEDURE -Rename*(old, new: Name): LONGINT + "rename(old, new)"; + + PROCEDURE -Chdir*(path: Name): LONGINT + "chdir(path)"; + + PROCEDURE -Ioctl*(fd, request, arg: LONGINT): LONGINT + "ioctl(fd, request, arg)"; + + PROCEDURE -Kill*(pid, sig: LONGINT): LONGINT + "kill(pid, sig)"; + + PROCEDURE -Sigsetmask*(mask: LONGINT): LONGINT + "sigsetmask(mask)"; + + PROCEDURE -Sleep*(ms : INTEGER): INTEGER + "sleep(ms)"; + + PROCEDURE -Nanosleep*(VAR req : Timeval; VAR rem : Timeval): INTEGER + "nanosleep(req, rem)"; + + (* TCP/IP networking *) + + PROCEDURE -Gethostbyname*(name: Name): HostEntry + "(Unix_HostEntry)gethostbyname(name)"; + + PROCEDURE -Gethostname*(VAR name: Name): LONGINT + "gethostname(name, name__len)"; + + PROCEDURE -Socket*(af, type, protocol: LONGINT): LONGINT + "socket(af, type, protocol)"; + + PROCEDURE -Connect*(socket: LONGINT; name: Sockaddr; namelen: LONGINT): LONGINT + "connect(socket, &(name), namelen)"; + + PROCEDURE -Getsockname*(socket: LONGINT; VAR name: Sockaddr; VAR namelen: LONGINT): LONGINT + "getsockname(socket, name, namelen)"; + + PROCEDURE -Bind*(socket: LONGINT; name: Sockaddr; namelen: LONGINT): LONGINT + "bind(socket, &(name), namelen)"; + + PROCEDURE -Listen*(socket, backlog: LONGINT): LONGINT + "listen(socket, backlog)"; + + PROCEDURE -Accept*(socket: LONGINT; VAR addr: Sockaddr; VAR addrlen: LONGINT): LONGINT + "accept(socket, addr, addrlen)"; + + PROCEDURE -Recv*(socket, bufadr, buflen, flags: LONGINT): LONGINT + "recv(socket, bufadr, buflen, flags)"; + + PROCEDURE -Send*(socket, bufadr, buflen, flags: LONGINT): LONGINT + "send(socket, bufadr, buflen, flags)"; + + PROCEDURE -sys(str: ARRAY OF CHAR): INTEGER (* need this to call external tools like gcc or gas; noch *) + "system(str)"; + + PROCEDURE system*(cmd : ARRAY OF CHAR); + VAR r : INTEGER; + BEGIN + r := sys(cmd); + END system; + + PROCEDURE System*(cmd : ARRAY OF CHAR): INTEGER; + VAR r : INTEGER; + BEGIN + r := sys(cmd); + RETURN r + END System; + + + +END Unix. diff --git a/src/voc/freebsd/clang/extTools.Mod b/src/voc/freebsd/clang/extTools.Mod new file mode 100644 index 00000000..62f7368a --- /dev/null +++ b/src/voc/freebsd/clang/extTools.Mod @@ -0,0 +1,88 @@ +MODULE extTools; + IMPORT Args, Unix, Strings, Console, version; +(* +INCLUDEPATH = -Isrc/lib/system/gnuc/x86_64 +CCOPT = -fPIC $(INCLUDEPATH) -g +CLOBERONOPTS = -fPIC $(INCLUDEPATH) -L. -L/usr/lib -lOberon -static -g +CC = cc $(CCOPT) -c +*) +CONST compiler="clang"; + +VAR incPath0, incPath1, ccOpt, ccString, CFLAGS, tmp0, tmp1 : ARRAY 1023 OF CHAR; + +PROCEDURE Assemble*(m : ARRAY OF CHAR); +VAR cmd : ARRAY 1023 OF CHAR; +cc : ARRAY 1023 OF CHAR; +ext : ARRAY 5 OF CHAR; +BEGIN +COPY (ccString, cc); +Strings.Append (" -c ", cc); +COPY(cc, cmd); +Strings.Append (" ", cmd); +Strings.Append (ccOpt, cmd); +ext := ".c"; +Strings.Append (ext, m); +Strings.Append(m, cmd); +(*Console.Ln; Console.String (cmd); Console.Ln;*) +Unix.system(cmd); +END Assemble; + + +PROCEDURE LinkMain*(VAR m : ARRAY OF CHAR; statically : BOOLEAN; additionalopts : ARRAY OF CHAR); +VAR lpath : ARRAY 1023 OF CHAR; +cc : ARRAY 1023 OF CHAR; +ccopt : ARRAY 1023 OF CHAR; +cmd : ARRAY 1023 OF CHAR; +ext : ARRAY 5 OF CHAR; +BEGIN +(* +gcc -g -o hello hello.c -I $RPATH/src/lib/system/gnuc/x86_64 -I. -I$RPATH -lOberon -L. -L$RPATH -static +*) +cmd := ""; +cc := ""; +ext := ".c"; +COPY(ccString, cc); +COPY (cc, cmd); +Strings.Append(" ", cmd); +Strings.Append(m, cmd); +Strings.Append(ext, cmd); +Strings.Append(additionalopts, cmd); +IF statically THEN Strings.Append(" -static ", cmd) END; +Strings.Append(" -o ", cmd); +Strings.Append(m, cmd); +Strings.Append(" ", cmd); + +Strings.Append (" -lVishapOberon -L. -L", ccOpt); +Strings.Append (version.prefix, ccOpt); +Strings.Append ("/lib ", ccOpt); + +Strings.Append(ccOpt, cmd); +Console.Ln; Console.String(cmd); Console.Ln; (* may be it's feasible to add debug mode later *) +Unix.system(cmd); +END LinkMain; + +BEGIN + +incPath0 := "src/lib/system/freebsd/"; +Strings.Append (compiler, incPath0); +incPath1 := "lib/voc/obj "; +ccOpt := " -fPIC -g "; + +COPY ("-I ", tmp1); +Strings.Append (version.prefix, tmp1); +Strings.Append("/", tmp1); +Strings.Append(incPath0, tmp1); +Strings.Append("/", tmp1); +Strings.Append(version.arch, tmp1); +Strings.Append(" -I ", tmp1); +Strings.Append(version.prefix, tmp1); +Strings.Append("/", tmp1); +Strings.Append(incPath1, tmp1); +Strings.Append(tmp1, ccOpt); +Args.GetEnv("CFLAGS", CFLAGS); +Strings.Append (CFLAGS, ccOpt); +Strings.Append (" ", ccOpt); +ccString := compiler; +Strings.Append (" ", ccString); + +END extTools. diff --git a/src/voc/freebsd/clang/x86_64/architecture.Mod b/src/voc/freebsd/clang/x86_64/architecture.Mod new file mode 100644 index 00000000..1f95d2fd --- /dev/null +++ b/src/voc/freebsd/clang/x86_64/architecture.Mod @@ -0,0 +1,4 @@ +MODULE architecture; +CONST arch* = "x86_64"; + +END architecture. diff --git a/vocstatic.freebsd.clang.x86_64 b/vocstatic.freebsd.clang.x86_64 new file mode 100755 index 0000000000000000000000000000000000000000..3102cf5be406d3bca412d79d65e37a3ac4cafaa9 GIT binary patch literal 790110 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¨5(e5` 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 z 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 jt_~ZkWh;zCythD