From 66c583b70ec38dd47019835cda53e1db7f0f00fc Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Fri, 21 Mar 2014 04:00:44 +0800 Subject: [PATCH] separated Kernel, Files. Texts modules for bootstrapping and general use Former-commit-id: e1f76da27804f23e804a2012937320fb6c7f92b2 --- makefile | 38 +- makefile.darwin.clang.x86_64 | 59 +- makefile.linux.gnuc.armv6j | 38 +- makefile.linux.gnuc.armv6j_hardfp | 38 +- makefile.linux.gnuc.armv7a_hardfp | 38 +- makefile.linux.gnuc.powerpc | 38 +- makefile.linux.gnuc.x86 | 38 +- makefile.linux.gnuc.x86_64 | 38 +- ocat | Bin 210646 -> 151012 bytes showdef.REMOVED.git-id | 2 +- src/lib/ooc/oocRts.Mod | 2 +- src/lib/s3/ethBTrees.Mod | 2 +- src/lib/s3/ethGZReaders.Mod | 2 +- src/lib/s3/ethGZWriters.Mod | 2 +- src/lib/s3/ethSets.Mod | 2 +- src/lib/s3/ethZip.Mod | 2 +- src/lib/s3/ethZlibReaders.Mod | 2 +- src/lib/s3/ethZlibWriters.Mod | 2 +- src/lib/system/darwin/clang/Files.Mod | 47 +- .../OakFiles.Mod => darwin/clang/Files0.Mod} | 56 +- src/lib/system/darwin/clang/Kernel.Mod | 26 +- src/lib/system/darwin/clang/Kernel0.Mod | 179 ++++ .../darwin/clang/Texts.Mod} | 4 +- src/lib/system/darwin/clang/Texts0.Mod | 859 ++++++++++++++++++ src/lib/system/linux/gnuc/Files.Mod | 43 +- .../OakFiles.Mod => linux/gnuc/Files0.Mod} | 60 +- src/lib/system/linux/gnuc/Kernel.Mod | 23 +- src/lib/system/linux/gnuc/Kernel0.Mod | 179 ++++ src/lib/system/linux/gnuc/Texts.Mod | 859 ++++++++++++++++++ src/lib/system/linux/gnuc/Texts0.Mod | 859 ++++++++++++++++++ src/lib/v4/Sets.Mod | 2 +- src/tools/browser/BrowserCmd.Mod | 2 +- src/tools/ocat/OCatCmd.Mod | 2 +- src/{lib/v4 => tools/vmake}/compatIn.Mod | 0 src/tools/vmake/makefile | 2 +- src/voc/OPM.cmdln.Mod | 2 +- src/voc/version.Mod | 2 +- src/voc/voc.Mod | 2 +- voc.REMOVED.git-id | 2 +- vocstatic.REMOVED.git-id | 1 - vocstatic.linux.gnuc.x86_64.REMOVED.git-id | 2 +- 41 files changed, 3229 insertions(+), 327 deletions(-) rename src/lib/system/{linux/gnuc/OakFiles.Mod => darwin/clang/Files0.Mod} (94%) create mode 100644 src/lib/system/darwin/clang/Kernel0.Mod rename src/lib/{v4/CmdlnTexts.Mod => system/darwin/clang/Texts.Mod} (99%) create mode 100644 src/lib/system/darwin/clang/Texts0.Mod rename src/lib/system/{darwin/clang/OakFiles.Mod => linux/gnuc/Files0.Mod} (94%) create mode 100644 src/lib/system/linux/gnuc/Kernel0.Mod create mode 100644 src/lib/system/linux/gnuc/Texts.Mod create mode 100644 src/lib/system/linux/gnuc/Texts0.Mod rename src/{lib/v4 => tools/vmake}/compatIn.Mod (100%) delete mode 100644 vocstatic.REMOVED.git-id diff --git a/makefile b/makefile index 3bf878bb..e0113f87 100644 --- a/makefile +++ b/makefile @@ -78,10 +78,9 @@ stage3: $(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 oocOakStrings.Mod architecture.Mod version.Mod Kernel.Mod Modules.Mod - $(VOCSTATIC0) -sxPS Files.Mod - $(VOCSTATIC0) -sxPS OakFiles.Mod - $(VOCSTATIC0) -sPS Reals.Mod CmdlnTexts.Mod errors.Mod + $(VOCSTATIC0) -sPS oocOakStrings.Mod architecture.Mod version.Mod Kernel0.Mod Modules.Mod + $(VOCSTATIC0) -sxPS Files0.Mod + $(VOCSTATIC0) -sPS Reals.Mod Texts0.Mod errors.Mod # build the compiler stage4: @@ -97,24 +96,32 @@ stage4: #this is a way to create a bootstrap binary. stage5: $(CC) SYSTEM.c Args.c Console.c Modules.c Unix.c \ - oocOakStrings.c architecture.c prf.c version.c Kernel.c Files.c OakFiles.c Reals.c CmdlnTexts.c \ + oocOakStrings.c architecture.c prf.c version.c Kernel0.c Files0.c Reals.c Texts0.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 \ - oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o \ + oocOakStrings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.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 oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o \ + SYSTEM.o Args.o Console.o Modules.o Unix.o oocOakStrings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.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 oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o + SYSTEM.o Args.o Console.o Modules.o Unix.o oocOakStrings.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 @@ -214,13 +221,6 @@ stage6: $(VOCSTATIC) -sP ulmRandomGenerators.Mod $(VOCSTATIC) -sP ulmTCrypt.Mod - #more v4 libs - $(VOCSTATIC) -sP Printer.Mod - $(VOCSTATIC) -sP Strings.Mod - $(VOCSTATIC) -sP Sets.Mod - $(VOCSTATIC) -sP Sets0.Mod - $(VOCSTATIC) -sP compatIn.Mod - #pow32 libs $(VOCSTATIC) -sP powStrings.Mod @@ -250,13 +250,13 @@ stage6: # $(VOCSTATIC0) -sPS compatIn.Mod # $(VOCSTATIC0) -smPS vmake.Mod # $(CC) compatIn.c -# $(CL) vmake.c -o vmake SYSTEM.o Args.o compatIn.o CmdlnTexts.o Console.o Files.o Reals.o Modules.o Kernel.o Unix.o oocOakStrings.o oocIntStr.o oocConvTypes.o oocIntConv.o prf.o version.o architecture.o +# $(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 oocOakStrings.o oocIntStr.o oocConvTypes.o oocIntConv.o stage7: #remove non library objects - rm -f architecture.o prf.o version.o extTools.o OPM.o OPS.o OPT.o OPC.o OPV.o OPB.o OPP.o errors.o + 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 @@ -267,10 +267,10 @@ stage7: clean: # rm_objects := rm $(wildcard *.o) # objects - rm *.o - rm *.sym rm *.h rm *.c + rm *.sym + rm *.o rm *.a rm *.so diff --git a/makefile.darwin.clang.x86_64 b/makefile.darwin.clang.x86_64 index 8810a4cc..28e4fb04 100644 --- a/makefile.darwin.clang.x86_64 +++ b/makefile.darwin.clang.x86_64 @@ -8,10 +8,8 @@ RELEASE = 1.0 INCLUDEPATH = -Isrc/lib/system/$(TOS)/$(CCOMP)/$(TARCH) -#ADDITIONALFLAGS = "-Wno-implicit-function-declaration -Wno-pointer-sign -Wno-implicit-int -Wno-logical-op-parentheses" -ADDITIONALFLAGS = "" -SETPATH = CFLAGS="$(ADDITIONALFLAGS) $(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 +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) @@ -22,18 +20,15 @@ LIBNAME = VishapOberon LIBRARY = lib$(LIBNAME) ifndef PRF -#PRF = "/opt" -PRF = "/Users/noch/local/voc" +PRF = "/opt" endif PREFIX = $(PRF)/voc-$(RELEASE) PREFIXLN = $(PRF)/voc - -CCOPT = -fPIC $(ADDITIONALFLAGS) $(INCLUDEPATH) -g +CCOPT = -fPIC $(INCLUDEPATH) -g CC = cc $(CCOPT) -c CL = cc $(CCOPT) -#LD = cc -shared -o $(LIBRARY).so LD = cc -dynamiclib -o $(LIBRARY).dylib # s is necessary to create index inside a archive ARCHIVE = ar rcs $(LIBRARY).a @@ -83,10 +78,9 @@ stage3: $(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 oocOakStrings.Mod architecture.Mod version.Mod Kernel.Mod Modules.Mod - $(VOCSTATIC0) -sxPS Files.Mod - $(VOCSTATIC0) -sxPS OakFiles.Mod - $(VOCSTATIC0) -sPS Reals.Mod CmdlnTexts.Mod errors.Mod + $(VOCSTATIC0) -sPS oocOakStrings.Mod architecture.Mod version.Mod Kernel0.Mod Modules.Mod + $(VOCSTATIC0) -sxPS Files0.Mod + $(VOCSTATIC0) -sPS Reals.Mod Texts0.Mod errors.Mod # build the compiler stage4: @@ -102,24 +96,32 @@ stage4: #this is a way to create a bootstrap binary. stage5: $(CC) SYSTEM.c Args.c Console.c Modules.c Unix.c \ - oocOakStrings.c architecture.c prf.c version.c Kernel.c Files.c OakFiles.c Reals.c CmdlnTexts.c \ + oocOakStrings.c architecture.c prf.c version.c Kernel0.c Files0.c Reals.c Texts0.c \ extTools.c \ OPM.c OPS.c OPT.c OPC.c OPV.c OPB.c OPP.c errors.c - $(CL) voc.c -o voc \ + $(CL) voc.c -o voc \ SYSTEM.o Args.o Console.o Modules.o Unix.o \ - oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o \ + oocOakStrings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.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 oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o \ + SYSTEM.o Args.o Console.o Modules.o Unix.o oocOakStrings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.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 oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o + SYSTEM.o Args.o Console.o Modules.o Unix.o oocOakStrings.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 @@ -159,7 +161,7 @@ stage6: $(VOCSTATIC) -sP oocFilenames.Mod $(VOCSTATIC) -sP oocwrapperlibc.Mod $(VOCSTATIC) -sP oocC.Mod - #no X11 under macosx + #no X11 on macosx #$(VOCSTATIC) -sP oocX11.Mod #$(VOCSTATIC) -sP oocXutil.Mod #$(VOCSTATIC) -sP oocXYplane.Mod @@ -220,13 +222,6 @@ stage6: $(VOCSTATIC) -sP ulmRandomGenerators.Mod $(VOCSTATIC) -sP ulmTCrypt.Mod - #more v4 libs - $(VOCSTATIC) -sP Printer.Mod - $(VOCSTATIC) -sP Strings.Mod - $(VOCSTATIC) -sP Sets.Mod - $(VOCSTATIC) -sP Sets0.Mod - $(VOCSTATIC) -sP compatIn.Mod - #pow32 libs $(VOCSTATIC) -sP powStrings.Mod @@ -256,27 +251,27 @@ stage6: # $(VOCSTATIC0) -sPS compatIn.Mod # $(VOCSTATIC0) -smPS vmake.Mod # $(CC) compatIn.c -# $(CL) vmake.c -o vmake SYSTEM.o Args.o compatIn.o CmdlnTexts.o Console.o Files.o Reals.o Modules.o Kernel.o Unix.o oocOakStrings.o oocIntStr.o oocConvTypes.o oocIntConv.o prf.o version.o architecture.o +# $(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 oocOakStrings.o oocIntStr.o oocConvTypes.o oocIntConv.o stage7: #remove non library objects - rm -f architecture.o prf.o version.o extTools.o OPM.o OPS.o OPT.o OPC.o OPV.o OPB.o OPP.o errors.o + 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 + echo "$(PREFIX)/lib" > 05vishap.conf clean: # rm_objects := rm $(wildcard *.o) # objects - rm *.o - rm *.sym rm *.h rm *.c + rm *.sym + rm *.o rm *.a rm *.dylib @@ -293,13 +288,13 @@ install: 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).so $(PREFIX)/lib + cp $(LIBRARY).dylib $(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/ + #cp 05vishap.conf /etc/ld.so.conf.d/ ldconfig ln -s $(PREFIX) $(PREFIXLN) diff --git a/makefile.linux.gnuc.armv6j b/makefile.linux.gnuc.armv6j index b8beb104..7bebbde2 100644 --- a/makefile.linux.gnuc.armv6j +++ b/makefile.linux.gnuc.armv6j @@ -78,10 +78,9 @@ stage3: $(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 oocOakStrings.Mod architecture.Mod version.Mod Kernel.Mod Modules.Mod - $(VOCSTATIC0) -sxPS Files.Mod - $(VOCSTATIC0) -sxPS OakFiles.Mod - $(VOCSTATIC0) -sPS Reals.Mod CmdlnTexts.Mod errors.Mod + $(VOCSTATIC0) -sPS oocOakStrings.Mod architecture.Mod version.Mod Kernel0.Mod Modules.Mod + $(VOCSTATIC0) -sxPS Files0.Mod + $(VOCSTATIC0) -sPS Reals.Mod Texts0.Mod errors.Mod # build the compiler stage4: @@ -97,24 +96,32 @@ stage4: #this is a way to create a bootstrap binary. stage5: $(CC) SYSTEM.c Args.c Console.c Modules.c Unix.c \ - oocOakStrings.c architecture.c prf.c version.c Kernel.c Files.c OakFiles.c Reals.c CmdlnTexts.c \ + oocOakStrings.c architecture.c prf.c version.c Kernel0.c Files0.c Reals.c Texts0.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 \ - oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o \ + oocOakStrings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.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 oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o \ + SYSTEM.o Args.o Console.o Modules.o Unix.o oocOakStrings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.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 oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o + SYSTEM.o Args.o Console.o Modules.o Unix.o oocOakStrings.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 @@ -214,13 +221,6 @@ stage6: $(VOCSTATIC) -sP ulmRandomGenerators.Mod $(VOCSTATIC) -sP ulmTCrypt.Mod - #more v4 libs - $(VOCSTATIC) -sP Printer.Mod - $(VOCSTATIC) -sP Strings.Mod - $(VOCSTATIC) -sP Sets.Mod - $(VOCSTATIC) -sP Sets0.Mod - $(VOCSTATIC) -sP compatIn.Mod - #pow32 libs $(VOCSTATIC) -sP powStrings.Mod @@ -250,13 +250,13 @@ stage6: # $(VOCSTATIC0) -sPS compatIn.Mod # $(VOCSTATIC0) -smPS vmake.Mod # $(CC) compatIn.c -# $(CL) vmake.c -o vmake SYSTEM.o Args.o compatIn.o CmdlnTexts.o Console.o Files.o Reals.o Modules.o Kernel.o Unix.o oocOakStrings.o oocIntStr.o oocConvTypes.o oocIntConv.o prf.o version.o architecture.o +# $(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 oocOakStrings.o oocIntStr.o oocConvTypes.o oocIntConv.o stage7: #remove non library objects - rm -f architecture.o prf.o version.o extTools.o OPM.o OPS.o OPT.o OPC.o OPV.o OPB.o OPP.o errors.o + 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 @@ -267,10 +267,10 @@ stage7: clean: # rm_objects := rm $(wildcard *.o) # objects - rm *.o - rm *.sym rm *.h rm *.c + rm *.sym + rm *.o rm *.a rm *.so diff --git a/makefile.linux.gnuc.armv6j_hardfp b/makefile.linux.gnuc.armv6j_hardfp index 2894402d..f53966b6 100644 --- a/makefile.linux.gnuc.armv6j_hardfp +++ b/makefile.linux.gnuc.armv6j_hardfp @@ -78,10 +78,9 @@ stage3: $(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 oocOakStrings.Mod architecture.Mod version.Mod Kernel.Mod Modules.Mod - $(VOCSTATIC0) -sxPS Files.Mod - $(VOCSTATIC0) -sxPS OakFiles.Mod - $(VOCSTATIC0) -sPS Reals.Mod CmdlnTexts.Mod errors.Mod + $(VOCSTATIC0) -sPS oocOakStrings.Mod architecture.Mod version.Mod Kernel0.Mod Modules.Mod + $(VOCSTATIC0) -sxPS Files0.Mod + $(VOCSTATIC0) -sPS Reals.Mod Texts0.Mod errors.Mod # build the compiler stage4: @@ -97,24 +96,32 @@ stage4: #this is a way to create a bootstrap binary. stage5: $(CC) SYSTEM.c Args.c Console.c Modules.c Unix.c \ - oocOakStrings.c architecture.c prf.c version.c Kernel.c Files.c OakFiles.c Reals.c CmdlnTexts.c \ + oocOakStrings.c architecture.c prf.c version.c Kernel0.c Files0.c Reals.c Texts0.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 \ - oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o \ + oocOakStrings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.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 oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o \ + SYSTEM.o Args.o Console.o Modules.o Unix.o oocOakStrings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.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 oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o + SYSTEM.o Args.o Console.o Modules.o Unix.o oocOakStrings.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 @@ -214,13 +221,6 @@ stage6: $(VOCSTATIC) -sP ulmRandomGenerators.Mod $(VOCSTATIC) -sP ulmTCrypt.Mod - #more v4 libs - $(VOCSTATIC) -sP Printer.Mod - $(VOCSTATIC) -sP Strings.Mod - $(VOCSTATIC) -sP Sets.Mod - $(VOCSTATIC) -sP Sets0.Mod - $(VOCSTATIC) -sP compatIn.Mod - #pow32 libs $(VOCSTATIC) -sP powStrings.Mod @@ -250,13 +250,13 @@ stage6: # $(VOCSTATIC0) -sPS compatIn.Mod # $(VOCSTATIC0) -smPS vmake.Mod # $(CC) compatIn.c -# $(CL) vmake.c -o vmake SYSTEM.o Args.o compatIn.o CmdlnTexts.o Console.o Files.o Reals.o Modules.o Kernel.o Unix.o oocOakStrings.o oocIntStr.o oocConvTypes.o oocIntConv.o prf.o version.o architecture.o +# $(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 oocOakStrings.o oocIntStr.o oocConvTypes.o oocIntConv.o stage7: #remove non library objects - rm -f architecture.o prf.o version.o extTools.o OPM.o OPS.o OPT.o OPC.o OPV.o OPB.o OPP.o errors.o + 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 @@ -267,10 +267,10 @@ stage7: clean: # rm_objects := rm $(wildcard *.o) # objects - rm *.o - rm *.sym rm *.h rm *.c + rm *.sym + rm *.o rm *.a rm *.so diff --git a/makefile.linux.gnuc.armv7a_hardfp b/makefile.linux.gnuc.armv7a_hardfp index 5ebc97c7..fc15b5ed 100644 --- a/makefile.linux.gnuc.armv7a_hardfp +++ b/makefile.linux.gnuc.armv7a_hardfp @@ -78,10 +78,9 @@ stage3: $(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 oocOakStrings.Mod architecture.Mod version.Mod Kernel.Mod Modules.Mod - $(VOCSTATIC0) -sxPS Files.Mod - $(VOCSTATIC0) -sxPS OakFiles.Mod - $(VOCSTATIC0) -sPS Reals.Mod CmdlnTexts.Mod errors.Mod + $(VOCSTATIC0) -sPS oocOakStrings.Mod architecture.Mod version.Mod Kernel0.Mod Modules.Mod + $(VOCSTATIC0) -sxPS Files0.Mod + $(VOCSTATIC0) -sPS Reals.Mod Texts0.Mod errors.Mod # build the compiler stage4: @@ -97,24 +96,32 @@ stage4: #this is a way to create a bootstrap binary. stage5: $(CC) SYSTEM.c Args.c Console.c Modules.c Unix.c \ - oocOakStrings.c architecture.c prf.c version.c Kernel.c Files.c OakFiles.c Reals.c CmdlnTexts.c \ + oocOakStrings.c architecture.c prf.c version.c Kernel0.c Files0.c Reals.c Texts0.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 \ - oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o \ + oocOakStrings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.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 oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o \ + SYSTEM.o Args.o Console.o Modules.o Unix.o oocOakStrings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.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 oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o + SYSTEM.o Args.o Console.o Modules.o Unix.o oocOakStrings.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 @@ -214,13 +221,6 @@ stage6: $(VOCSTATIC) -sP ulmRandomGenerators.Mod $(VOCSTATIC) -sP ulmTCrypt.Mod - #more v4 libs - $(VOCSTATIC) -sP Printer.Mod - $(VOCSTATIC) -sP Strings.Mod - $(VOCSTATIC) -sP Sets.Mod - $(VOCSTATIC) -sP Sets0.Mod - $(VOCSTATIC) -sP compatIn.Mod - #pow32 libs $(VOCSTATIC) -sP powStrings.Mod @@ -250,13 +250,13 @@ stage6: # $(VOCSTATIC0) -sPS compatIn.Mod # $(VOCSTATIC0) -smPS vmake.Mod # $(CC) compatIn.c -# $(CL) vmake.c -o vmake SYSTEM.o Args.o compatIn.o CmdlnTexts.o Console.o Files.o Reals.o Modules.o Kernel.o Unix.o oocOakStrings.o oocIntStr.o oocConvTypes.o oocIntConv.o prf.o version.o architecture.o +# $(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 oocOakStrings.o oocIntStr.o oocConvTypes.o oocIntConv.o stage7: #remove non library objects - rm -f architecture.o prf.o version.o extTools.o OPM.o OPS.o OPT.o OPC.o OPV.o OPB.o OPP.o errors.o + 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 @@ -267,10 +267,10 @@ stage7: clean: # rm_objects := rm $(wildcard *.o) # objects - rm *.o - rm *.sym rm *.h rm *.c + rm *.sym + rm *.o rm *.a rm *.so diff --git a/makefile.linux.gnuc.powerpc b/makefile.linux.gnuc.powerpc index 076c3ea8..90fdf8de 100644 --- a/makefile.linux.gnuc.powerpc +++ b/makefile.linux.gnuc.powerpc @@ -78,10 +78,9 @@ stage3: $(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 oocOakStrings.Mod architecture.Mod version.Mod Kernel.Mod Modules.Mod - $(VOCSTATIC0) -sxPS Files.Mod - $(VOCSTATIC0) -sxPS OakFiles.Mod - $(VOCSTATIC0) -sPS Reals.Mod CmdlnTexts.Mod errors.Mod + $(VOCSTATIC0) -sPS oocOakStrings.Mod architecture.Mod version.Mod Kernel0.Mod Modules.Mod + $(VOCSTATIC0) -sxPS Files0.Mod + $(VOCSTATIC0) -sPS Reals.Mod Texts0.Mod errors.Mod # build the compiler stage4: @@ -97,24 +96,32 @@ stage4: #this is a way to create a bootstrap binary. stage5: $(CC) SYSTEM.c Args.c Console.c Modules.c Unix.c \ - oocOakStrings.c architecture.c prf.c version.c Kernel.c Files.c OakFiles.c Reals.c CmdlnTexts.c \ + oocOakStrings.c architecture.c prf.c version.c Kernel0.c Files0.c Reals.c Texts0.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 \ - oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o \ + oocOakStrings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.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 oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o \ + SYSTEM.o Args.o Console.o Modules.o Unix.o oocOakStrings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.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 oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o + SYSTEM.o Args.o Console.o Modules.o Unix.o oocOakStrings.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 @@ -214,13 +221,6 @@ stage6: $(VOCSTATIC) -sP ulmRandomGenerators.Mod $(VOCSTATIC) -sP ulmTCrypt.Mod - #more v4 libs - $(VOCSTATIC) -sP Printer.Mod - $(VOCSTATIC) -sP Strings.Mod - $(VOCSTATIC) -sP Sets.Mod - $(VOCSTATIC) -sP Sets0.Mod - $(VOCSTATIC) -sP compatIn.Mod - #pow32 libs $(VOCSTATIC) -sP powStrings.Mod @@ -250,13 +250,13 @@ stage6: # $(VOCSTATIC0) -sPS compatIn.Mod # $(VOCSTATIC0) -smPS vmake.Mod # $(CC) compatIn.c -# $(CL) vmake.c -o vmake SYSTEM.o Args.o compatIn.o CmdlnTexts.o Console.o Files.o Reals.o Modules.o Kernel.o Unix.o oocOakStrings.o oocIntStr.o oocConvTypes.o oocIntConv.o prf.o version.o architecture.o +# $(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 oocOakStrings.o oocIntStr.o oocConvTypes.o oocIntConv.o stage7: #remove non library objects - rm -f architecture.o prf.o version.o extTools.o OPM.o OPS.o OPT.o OPC.o OPV.o OPB.o OPP.o errors.o + 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 @@ -267,10 +267,10 @@ stage7: clean: # rm_objects := rm $(wildcard *.o) # objects - rm *.o - rm *.sym rm *.h rm *.c + rm *.sym + rm *.o rm *.a rm *.so diff --git a/makefile.linux.gnuc.x86 b/makefile.linux.gnuc.x86 index caedd065..812cb0ea 100644 --- a/makefile.linux.gnuc.x86 +++ b/makefile.linux.gnuc.x86 @@ -78,10 +78,9 @@ stage3: $(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 oocOakStrings.Mod architecture.Mod version.Mod Kernel.Mod Modules.Mod - $(VOCSTATIC0) -sxPS Files.Mod - $(VOCSTATIC0) -sxPS OakFiles.Mod - $(VOCSTATIC0) -sPS Reals.Mod CmdlnTexts.Mod errors.Mod + $(VOCSTATIC0) -sPS oocOakStrings.Mod architecture.Mod version.Mod Kernel0.Mod Modules.Mod + $(VOCSTATIC0) -sxPS Files0.Mod + $(VOCSTATIC0) -sPS Reals.Mod Texts0.Mod errors.Mod # build the compiler stage4: @@ -97,24 +96,32 @@ stage4: #this is a way to create a bootstrap binary. stage5: $(CC) SYSTEM.c Args.c Console.c Modules.c Unix.c \ - oocOakStrings.c architecture.c prf.c version.c Kernel.c Files.c OakFiles.c Reals.c CmdlnTexts.c \ + oocOakStrings.c architecture.c prf.c version.c Kernel0.c Files0.c Reals.c Texts0.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 \ - oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o \ + oocOakStrings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.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 oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o \ + SYSTEM.o Args.o Console.o Modules.o Unix.o oocOakStrings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.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 oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o + SYSTEM.o Args.o Console.o Modules.o Unix.o oocOakStrings.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 @@ -214,13 +221,6 @@ stage6: $(VOCSTATIC) -sP ulmRandomGenerators.Mod $(VOCSTATIC) -sP ulmTCrypt.Mod - #more v4 libs - $(VOCSTATIC) -sP Printer.Mod - $(VOCSTATIC) -sP Strings.Mod - $(VOCSTATIC) -sP Sets.Mod - $(VOCSTATIC) -sP Sets0.Mod - $(VOCSTATIC) -sP compatIn.Mod - #pow32 libs $(VOCSTATIC) -sP powStrings.Mod @@ -250,13 +250,13 @@ stage6: # $(VOCSTATIC0) -sPS compatIn.Mod # $(VOCSTATIC0) -smPS vmake.Mod # $(CC) compatIn.c -# $(CL) vmake.c -o vmake SYSTEM.o Args.o compatIn.o CmdlnTexts.o Console.o Files.o Reals.o Modules.o Kernel.o Unix.o oocOakStrings.o oocIntStr.o oocConvTypes.o oocIntConv.o prf.o version.o architecture.o +# $(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 oocOakStrings.o oocIntStr.o oocConvTypes.o oocIntConv.o stage7: #remove non library objects - rm -f architecture.o prf.o version.o extTools.o OPM.o OPS.o OPT.o OPC.o OPV.o OPB.o OPP.o errors.o + 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 @@ -267,10 +267,10 @@ stage7: clean: # rm_objects := rm $(wildcard *.o) # objects - rm *.o - rm *.sym rm *.h rm *.c + rm *.sym + rm *.o rm *.a rm *.so diff --git a/makefile.linux.gnuc.x86_64 b/makefile.linux.gnuc.x86_64 index 3bf878bb..e0113f87 100644 --- a/makefile.linux.gnuc.x86_64 +++ b/makefile.linux.gnuc.x86_64 @@ -78,10 +78,9 @@ stage3: $(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 oocOakStrings.Mod architecture.Mod version.Mod Kernel.Mod Modules.Mod - $(VOCSTATIC0) -sxPS Files.Mod - $(VOCSTATIC0) -sxPS OakFiles.Mod - $(VOCSTATIC0) -sPS Reals.Mod CmdlnTexts.Mod errors.Mod + $(VOCSTATIC0) -sPS oocOakStrings.Mod architecture.Mod version.Mod Kernel0.Mod Modules.Mod + $(VOCSTATIC0) -sxPS Files0.Mod + $(VOCSTATIC0) -sPS Reals.Mod Texts0.Mod errors.Mod # build the compiler stage4: @@ -97,24 +96,32 @@ stage4: #this is a way to create a bootstrap binary. stage5: $(CC) SYSTEM.c Args.c Console.c Modules.c Unix.c \ - oocOakStrings.c architecture.c prf.c version.c Kernel.c Files.c OakFiles.c Reals.c CmdlnTexts.c \ + oocOakStrings.c architecture.c prf.c version.c Kernel0.c Files0.c Reals.c Texts0.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 \ - oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o \ + oocOakStrings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.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 oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o \ + SYSTEM.o Args.o Console.o Modules.o Unix.o oocOakStrings.o architecture.o prf.o version.o Kernel0.o Files0.o Reals.o Texts0.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 oocOakStrings.o architecture.o prf.o version.o Kernel.o Files.o Reals.o CmdlnTexts.o + SYSTEM.o Args.o Console.o Modules.o Unix.o oocOakStrings.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 @@ -214,13 +221,6 @@ stage6: $(VOCSTATIC) -sP ulmRandomGenerators.Mod $(VOCSTATIC) -sP ulmTCrypt.Mod - #more v4 libs - $(VOCSTATIC) -sP Printer.Mod - $(VOCSTATIC) -sP Strings.Mod - $(VOCSTATIC) -sP Sets.Mod - $(VOCSTATIC) -sP Sets0.Mod - $(VOCSTATIC) -sP compatIn.Mod - #pow32 libs $(VOCSTATIC) -sP powStrings.Mod @@ -250,13 +250,13 @@ stage6: # $(VOCSTATIC0) -sPS compatIn.Mod # $(VOCSTATIC0) -smPS vmake.Mod # $(CC) compatIn.c -# $(CL) vmake.c -o vmake SYSTEM.o Args.o compatIn.o CmdlnTexts.o Console.o Files.o Reals.o Modules.o Kernel.o Unix.o oocOakStrings.o oocIntStr.o oocConvTypes.o oocIntConv.o prf.o version.o architecture.o +# $(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 oocOakStrings.o oocIntStr.o oocConvTypes.o oocIntConv.o stage7: #remove non library objects - rm -f architecture.o prf.o version.o extTools.o OPM.o OPS.o OPT.o OPC.o OPV.o OPB.o OPP.o errors.o + 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 @@ -267,10 +267,10 @@ stage7: clean: # rm_objects := rm $(wildcard *.o) # objects - rm *.o - rm *.sym rm *.h rm *.c + rm *.sym + rm *.o rm *.a rm *.so diff --git a/ocat b/ocat index 61f65e8fe56f778ebd614f03a059eb487218b2a9..98f6c0c253a7bbe6f4a3280ed694e83e0a23d02d 100755 GIT binary patch literal 151012 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𗶭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� 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�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'; - PROCEDURE -localtime(VAR clock: LONGINT): Time "(Files_Time) localtime(clock)"; @@ -189,7 +185,7 @@ MODULE Files; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix files 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 @@ -207,7 +203,7 @@ MODULE Files; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix files 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]; @@ -243,7 +239,10 @@ MODULE Files; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix files 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) + 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(); @@ -274,7 +273,8 @@ END ; RETURN f END ELSIF dir = "" THEN RETURN NIL - ELSE MakeFileName(dir, name, path); ScanPath(pos, dir) + ELSE (*MakeFileName(dir, name, path);*) (*ScanPath(pos, dir)*) + RETURN NIL END END ELSE RETURN NIL @@ -392,6 +392,11 @@ 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 @@ -427,6 +432,7 @@ BEGIN buf.data[offset] := x; r.offset := offset + 1; buf.chg := TRUE END Write; + PROCEDURE WriteBytes ... PROCEDURE Read* (VAR r: Rider; VAR x: SYSTEM.BYTE); @@ -554,7 +560,23 @@ Especially Length would become fairly complex. 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); @@ -610,6 +632,11 @@ Especially Length would become fairly complex. 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 diff --git a/src/lib/system/linux/gnuc/OakFiles.Mod b/src/lib/system/darwin/clang/Files0.Mod similarity index 94% rename from src/lib/system/linux/gnuc/OakFiles.Mod rename to src/lib/system/darwin/clang/Files0.Mod index 77449c30..f889db57 100644 --- a/src/lib/system/linux/gnuc/OakFiles.Mod +++ b/src/lib/system/darwin/clang/Files0.Mod @@ -1,6 +1,9 @@ -MODULE OakFiles; (* 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; +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 @@ -67,7 +70,7 @@ MODULE OakFiles; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix fil '#include "time.h"'; PROCEDURE -localtime(VAR clock: LONGINT): Time - "(OakFiles_Time) localtime(clock)"; + "(Files0_Time) localtime(clock)"; PROCEDURE -getcwd(VAR cwd: Unix.Name) "getcwd(cwd, cwd__len)"; @@ -185,7 +188,7 @@ MODULE OakFiles; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix fil 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 @@ -203,7 +206,7 @@ MODULE OakFiles; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix fil 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]; @@ -239,10 +242,7 @@ MODULE OakFiles; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix fil 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)*) + 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(); @@ -258,7 +258,7 @@ MODULE OakFiles; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix fil 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("warning Files0.Old "); Console.String(name); Console.String(" errno = "); Console.Int(errno, 0); Console.Ln; END ; IF done THEN @@ -273,8 +273,7 @@ END ; RETURN f END ELSIF dir = "" THEN RETURN NIL - ELSE (*MakeFileName(dir, name, path);*) (*ScanPath(pos, dir)*) - RETURN NIL + ELSE MakeFileName(dir, name, path); ScanPath(pos, dir) END END ELSE RETURN NIL @@ -392,11 +391,6 @@ 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 @@ -432,7 +426,6 @@ BEGIN buf.data[offset] := x; r.offset := offset + 1; buf.chg := TRUE END Write; - PROCEDURE WriteBytes ... PROCEDURE Read* (VAR r: Rider; VAR x: SYSTEM.BYTE); @@ -560,23 +553,7 @@ Especially Length would become fairly complex. 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); @@ -632,11 +609,6 @@ Especially Length would become fairly complex. 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 @@ -655,4 +627,4 @@ Especially Length would become fairly complex. END Init; BEGIN Init -END OakFiles. +END Files0. diff --git a/src/lib/system/darwin/clang/Kernel.Mod b/src/lib/system/darwin/clang/Kernel.Mod index ecfc166d..e84e5eae 100644 --- a/src/lib/system/darwin/clang/Kernel.Mod +++ b/src/lib/system/darwin/clang/Kernel.Mod @@ -4,13 +4,12 @@ MODULE Kernel; communication with C-runtime and storage management *) - IMPORT SYSTEM, Unix, Args, Strings := oocOakStrings, version; + IMPORT SYSTEM, Unix, Args; 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; @@ -36,20 +35,15 @@ MODULE Kernel; 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"'; -(* for getcwd() *) - PROCEDURE -includeUnistd() - '#include '; PROCEDURE -Lock*() "SYSTEM_lock++"; @@ -61,13 +55,13 @@ MODULE Kernel; "exit(n)"; PROCEDURE -sigsetjmp*(VAR env: Unix.JmpBuf; savemask: LONGINT): LONGINT - "__sigsetjmp(env, savemask)"; + "__sigsetjmp(env, savemask)"; - PROCEDURE -siglongjmp*(VAR env:Unix.JmpBuf; val: LONGINT) - "siglongjmp(env, val)"; + PROCEDURE -siglongjmp*(VAR env:Unix. JmpBuf; val: LONGINT) + "siglongjmp(env, val)"; PROCEDURE -heapsize*(): LONGINT - "SYSTEM_heapsize"; + "SYSTEM_heapsize"; PROCEDURE -allocated*(): LONGINT "SYSTEM_allocated"; @@ -166,16 +160,8 @@ 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 Kernel. diff --git a/src/lib/system/darwin/clang/Kernel0.Mod b/src/lib/system/darwin/clang/Kernel0.Mod new file mode 100644 index 00000000..99f7777d --- /dev/null +++ b/src/lib/system/darwin/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 := oocOakStrings, 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/v4/CmdlnTexts.Mod b/src/lib/system/darwin/clang/Texts.Mod similarity index 99% rename from src/lib/v4/CmdlnTexts.Mod rename to src/lib/system/darwin/clang/Texts.Mod index 43167f93..320f426b 100644 --- a/src/lib/v4/CmdlnTexts.Mod +++ b/src/lib/system/darwin/clang/Texts.Mod @@ -1,4 +1,4 @@ -MODULE CmdlnTexts; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91**) (* << RC, MB, JT *) +MODULE Texts; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91**) (* << RC, MB, JT *) IMPORT Files, Modules, Reals; @@ -856,4 +856,4 @@ MODULE CmdlnTexts; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12 END Close; BEGIN del := NIL; NEW(FontsDefault); FontsDefault.name := "Syntax10.Scn.Fnt" -END CmdlnTexts. +END Texts. diff --git a/src/lib/system/darwin/clang/Texts0.Mod b/src/lib/system/darwin/clang/Texts0.Mod new file mode 100644 index 00000000..7b95e031 --- /dev/null +++ b/src/lib/system/darwin/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/linux/gnuc/Files.Mod b/src/lib/system/linux/gnuc/Files.Mod index 454736be..60b81e43 100644 --- a/src/lib/system/linux/gnuc/Files.Mod +++ b/src/lib/system/linux/gnuc/Files.Mod @@ -1,5 +1,5 @@ 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 @@ -185,7 +185,7 @@ MODULE Files; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix files 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 @@ -203,7 +203,7 @@ MODULE Files; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix files 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]; @@ -239,7 +239,10 @@ MODULE Files; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix files 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) + 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(); @@ -270,7 +273,8 @@ END ; RETURN f END ELSIF dir = "" THEN RETURN NIL - ELSE MakeFileName(dir, name, path); ScanPath(pos, dir) + ELSE (*MakeFileName(dir, name, path);*) (*ScanPath(pos, dir)*) + RETURN NIL END END ELSE RETURN NIL @@ -388,6 +392,11 @@ 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 @@ -423,6 +432,7 @@ BEGIN buf.data[offset] := x; r.offset := offset + 1; buf.chg := TRUE END Write; + PROCEDURE WriteBytes ... PROCEDURE Read* (VAR r: Rider; VAR x: SYSTEM.BYTE); @@ -550,7 +560,23 @@ Especially Length would become fairly complex. 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); @@ -606,6 +632,11 @@ Especially Length would become fairly complex. 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 diff --git a/src/lib/system/darwin/clang/OakFiles.Mod b/src/lib/system/linux/gnuc/Files0.Mod similarity index 94% rename from src/lib/system/darwin/clang/OakFiles.Mod rename to src/lib/system/linux/gnuc/Files0.Mod index 44ee35d4..f889db57 100644 --- a/src/lib/system/darwin/clang/OakFiles.Mod +++ b/src/lib/system/linux/gnuc/Files0.Mod @@ -1,6 +1,9 @@ -MODULE OakFiles; (* 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; +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 @@ -66,12 +69,8 @@ MODULE OakFiles; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix fil PROCEDURE -includetime() '#include "time.h"'; -(* for getcwd() *) - PROCEDURE -includeUnistd() - '#include '; - PROCEDURE -localtime(VAR clock: LONGINT): Time - "(OakFiles_Time) localtime(clock)"; + "(Files0_Time) localtime(clock)"; PROCEDURE -getcwd(VAR cwd: Unix.Name) "getcwd(cwd, cwd__len)"; @@ -189,7 +188,7 @@ MODULE OakFiles; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix fil 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 @@ -207,7 +206,7 @@ MODULE OakFiles; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix fil 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]; @@ -243,10 +242,7 @@ MODULE OakFiles; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix fil 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)*) + 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(); @@ -262,7 +258,7 @@ MODULE OakFiles; (* J. Templ 1.12. 89/12.4.95 Oberon files mapped onto Unix fil 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("warning Files0.Old "); Console.String(name); Console.String(" errno = "); Console.Int(errno, 0); Console.Ln; END ; IF done THEN @@ -277,8 +273,7 @@ END ; RETURN f END ELSIF dir = "" THEN RETURN NIL - ELSE (*MakeFileName(dir, name, path);*) (*ScanPath(pos, dir)*) - RETURN NIL + ELSE MakeFileName(dir, name, path); ScanPath(pos, dir) END END ELSE RETURN NIL @@ -396,11 +391,6 @@ 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 @@ -436,7 +426,6 @@ BEGIN buf.data[offset] := x; r.offset := offset + 1; buf.chg := TRUE END Write; - PROCEDURE WriteBytes ... PROCEDURE Read* (VAR r: Rider; VAR x: SYSTEM.BYTE); @@ -564,23 +553,7 @@ Especially Length would become fairly complex. 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); @@ -636,11 +609,6 @@ Especially Length would become fairly complex. 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 @@ -659,4 +627,4 @@ Especially Length would become fairly complex. END Init; BEGIN Init -END OakFiles. +END Files0. diff --git a/src/lib/system/linux/gnuc/Kernel.Mod b/src/lib/system/linux/gnuc/Kernel.Mod index a13f9d3b..e84e5eae 100644 --- a/src/lib/system/linux/gnuc/Kernel.Mod +++ b/src/lib/system/linux/gnuc/Kernel.Mod @@ -4,13 +4,12 @@ MODULE Kernel; communication with C-runtime and storage management *) - IMPORT SYSTEM, Unix, Args, Strings := oocOakStrings, version; + IMPORT SYSTEM, Unix, Args; 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; @@ -36,12 +35,10 @@ MODULE Kernel; 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 *) @@ -58,13 +55,13 @@ MODULE Kernel; "exit(n)"; PROCEDURE -sigsetjmp*(VAR env: Unix.JmpBuf; savemask: LONGINT): LONGINT - "__sigsetjmp(env, savemask)"; + "__sigsetjmp(env, savemask)"; - PROCEDURE -siglongjmp*(VAR env:Unix.JmpBuf; val: LONGINT) - "siglongjmp(env, val)"; + PROCEDURE -siglongjmp*(VAR env:Unix. JmpBuf; val: LONGINT) + "siglongjmp(env, val)"; PROCEDURE -heapsize*(): LONGINT - "SYSTEM_heapsize"; + "SYSTEM_heapsize"; PROCEDURE -allocated*(): LONGINT "SYSTEM_allocated"; @@ -163,16 +160,8 @@ 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 Kernel. diff --git a/src/lib/system/linux/gnuc/Kernel0.Mod b/src/lib/system/linux/gnuc/Kernel0.Mod new file mode 100644 index 00000000..99f7777d --- /dev/null +++ b/src/lib/system/linux/gnuc/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 := oocOakStrings, 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/linux/gnuc/Texts.Mod b/src/lib/system/linux/gnuc/Texts.Mod new file mode 100644 index 00000000..320f426b --- /dev/null +++ b/src/lib/system/linux/gnuc/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/linux/gnuc/Texts0.Mod b/src/lib/system/linux/gnuc/Texts0.Mod new file mode 100644 index 00000000..7b95e031 --- /dev/null +++ b/src/lib/system/linux/gnuc/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/v4/Sets.Mod b/src/lib/v4/Sets.Mod index 6f9f982f..3b46f090 100644 --- a/src/lib/v4/Sets.Mod +++ b/src/lib/v4/Sets.Mod @@ -1,6 +1,6 @@ MODULE Sets; -IMPORT Texts := CmdlnTexts; +IMPORT Texts; CONST (*size* = 32;*) size* = MAX(SET) + 1; diff --git a/src/tools/browser/BrowserCmd.Mod b/src/tools/browser/BrowserCmd.Mod index def80912..a49e7551 100644 --- a/src/tools/browser/BrowserCmd.Mod +++ b/src/tools/browser/BrowserCmd.Mod @@ -2,7 +2,7 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver IMPORT OPM, OPS, OPT, OPV, - Texts := CmdlnTexts, Console, Args; + Texts := Texts0, Console, Args; CONST OptionChar = "-"; diff --git a/src/tools/ocat/OCatCmd.Mod b/src/tools/ocat/OCatCmd.Mod index c845c484..030011a1 100644 --- a/src/tools/ocat/OCatCmd.Mod +++ b/src/tools/ocat/OCatCmd.Mod @@ -2,7 +2,7 @@ MODULE OCatCmd; (* J. Templ, 13-Jan-96 *) (* looks at the OBERON search path and writes one or more Oberon or ascii texts to standard out *) - IMPORT Args, Console, Files, Texts := CmdlnTexts; + IMPORT Args, Console, Files := Files0, Texts := Texts0; PROCEDURE Cat*; VAR path: ARRAY 128 OF CHAR; i: INTEGER; T: Texts.Text; R: Texts.Reader; ch: CHAR; tab: BOOLEAN; diff --git a/src/lib/v4/compatIn.Mod b/src/tools/vmake/compatIn.Mod similarity index 100% rename from src/lib/v4/compatIn.Mod rename to src/tools/vmake/compatIn.Mod diff --git a/src/tools/vmake/makefile b/src/tools/vmake/makefile index 3d0e0de2..764ee959 100644 --- a/src/tools/vmake/makefile +++ b/src/tools/vmake/makefile @@ -5,7 +5,7 @@ VOC = /opt/voc/bin/voc all: - $(VOC) -M vmake.Mod + $(VOC) -s compatIn.Mod vmake.Mod -M clean: rm *.o diff --git a/src/voc/OPM.cmdln.Mod b/src/voc/OPM.cmdln.Mod index 2452cdb7..86ddfafb 100644 --- a/src/voc/OPM.cmdln.Mod +++ b/src/voc/OPM.cmdln.Mod @@ -4,7 +4,7 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *) 31.1.2007 jt synchronized with BlackBox version, in particular PromoteIntConstToLInt added *) - IMPORT SYSTEM, Texts := CmdlnTexts, Files, Args, Console, errors, version; + IMPORT SYSTEM, Texts := Texts0, Files := Files0, Args, Console, errors, version; CONST OptionChar* = "-"; diff --git a/src/voc/version.Mod b/src/voc/version.Mod index dfff575e..fa89170c 100644 --- a/src/voc/version.Mod +++ b/src/voc/version.Mod @@ -20,7 +20,7 @@ Strings.Append(date, versionLong); COPY (prefix0, prefix); Strings.Append ("/voc-", prefix); Strings.Append(version, prefix); (* /opt/voc-1.0 *) - (* will be used later in Kernel.Mod to set OBERON default path *) + (* will be used later in Kernel0.Mod to set OBERON default path *) IF arch = "x86_64" THEN defaultTarget := gnux8664 diff --git a/src/voc/voc.Mod b/src/voc/voc.Mod index 572bb58f..2fcc6c80 100644 --- a/src/voc/voc.Mod +++ b/src/voc/voc.Mod @@ -1,7 +1,7 @@ MODULE voc; (* J. Templ 3.2.95 *) IMPORT - SYSTEM, Unix, Kernel, + SYSTEM, Unix, Kernel := Kernel0, OPP, OPB, OPT, OPV, OPC, OPM, extTools, Strings := oocOakStrings; diff --git a/voc.REMOVED.git-id b/voc.REMOVED.git-id index bc7356fc..b97068f7 100644 --- a/voc.REMOVED.git-id +++ b/voc.REMOVED.git-id @@ -1 +1 @@ -7a2e4239363cb69847cb7f5ab6f2cd5ff1f5e1f5 \ No newline at end of file +333eeef2144c1ef803126d3273b69ca32cfca91d \ No newline at end of file diff --git a/vocstatic.REMOVED.git-id b/vocstatic.REMOVED.git-id deleted file mode 100644 index c61e4cc1..00000000 --- a/vocstatic.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -99591bf85a5b55a73eadb7ede936147844672838 \ No newline at end of file diff --git a/vocstatic.linux.gnuc.x86_64.REMOVED.git-id b/vocstatic.linux.gnuc.x86_64.REMOVED.git-id index 4652eb5a..901011aa 100644 --- a/vocstatic.linux.gnuc.x86_64.REMOVED.git-id +++ b/vocstatic.linux.gnuc.x86_64.REMOVED.git-id @@ -1 +1 @@ -09acf3b2f6d3f33994333fc479a84f9e07a4620a \ No newline at end of file +1ca0276819a9bf5057381a36394ebd436928059a \ No newline at end of file