diff --git a/src/runtime/In.Mod b/src/runtime/In.Mod index 7f4c72e3..76ceb1e8 100644 --- a/src/runtime/In.Mod +++ b/src/runtime/In.Mod @@ -1,6 +1,6 @@ MODULE In; -IMPORT Platform, SYSTEM, Reals, Out; +IMPORT Platform, SYSTEM, Strings, Out; VAR Done-: BOOLEAN; @@ -136,82 +136,12 @@ PROCEDURE Name*(VAR name: ARRAY OF CHAR); (* Read filename. Presumably using she BEGIN HALT(99) (* Not implemented *) END Name; -PROCEDURE StrToReal(s: ARRAY OF CHAR; VAR r: REAL); -VAR p, e: INTEGER; y, g: REAL; neg, negE: BOOLEAN; -BEGIN - p := 0; - WHILE (s[p] = " ") OR (s[p] = "0") DO INC(p) END; - IF s[p] = "-" THEN neg := TRUE; INC(p) ELSE neg := FALSE END; - WHILE (s[p] = " ") OR (s[p] = "0") DO INC(p) END; - - y := 0; - WHILE ("0" <= s[p]) & (s[p] <= "9") DO - y := y * 10 + (ORD(s[p]) - 30H); - INC(p); - END; - IF s[p] = "." THEN - INC(p); g := 1; - WHILE ("0" <= s[p]) & (s[p] <= "9") DO - g := g / 10; y := y + g * (ORD(s[p]) - 30H); - INC(p); - END; - END; - IF (s[p] = "D") OR (s[p] = "E") THEN - INC(p); e := 0; - IF s[p] = "-" THEN negE := TRUE; INC(p) ELSE negE := FALSE END; - WHILE (s[p] = "0") DO INC(p) END; - WHILE ("0" <= s[p]) & (s[p] <= "9") DO - e := e * 10 + (ORD(s[p]) - 30H); - INC(p); - END; - IF negE THEN y := y / Reals.Ten(e) - ELSE y := y * Reals.Ten(e) END; - END; - IF neg THEN y := -y END; - r := y; -END StrToReal; - -PROCEDURE StrToLongReal(s: ARRAY OF CHAR; VAR r: LONGREAL); -VAR p, e: INTEGER; y, g: LONGREAL; neg, negE: BOOLEAN; -BEGIN - p := 0; - WHILE (s[p] = " ") OR (s[p] = "0") DO INC(p) END; - IF s[p] = "-" THEN neg := TRUE; INC(p) ELSE neg := FALSE END; - WHILE (s[p] = " ") OR (s[p] = "0") DO INC(p) END; - - y := 0; - WHILE ("0" <= s[p]) & (s[p] <= "9") DO - y := y * 10 + (ORD(s[p]) - 30H); - INC(p); - END; - IF s[p] = "." THEN - INC(p); g := 1; - WHILE ("0" <= s[p]) & (s[p] <= "9") DO - g := g / 10; y := y + g * (ORD(s[p]) - 30H); - INC(p); - END; - END; - IF (s[p] = "D") OR (s[p] = "E") THEN - INC(p); e := 0; - IF s[p] = "-" THEN negE := TRUE; INC(p) ELSE negE := FALSE END; - WHILE (s[p] = "0") DO INC(p) END; - WHILE ("0" <= s[p]) & (s[p] <= "9") DO - e := e * 10 + (ORD(s[p]) - 30H); - INC(p); - END; - IF negE THEN y := y / Reals.Ten(e) - ELSE y := y * Reals.Ten(e) END; - END; - IF neg THEN y := -y END; - r := y; -END StrToLongReal; - PROCEDURE Real*(VAR x: REAL); VAR str: ARRAY 16 OF CHAR; BEGIN Line(str); - StrToReal(str, x); + Strings.StrToReal(str, x); END Real; PROCEDURE LongReal*(VAR y: LONGREAL); @@ -219,7 +149,7 @@ VAR str: ARRAY 16 OF CHAR; BEGIN Line(str); - StrToLongReal(str, y); + Strings.StrToLongReal(str, y); END LongReal; diff --git a/src/runtime/Strings.Mod b/src/runtime/Strings.Mod index 0dcfa6d2..89dcaa33 100644 --- a/src/runtime/Strings.Mod +++ b/src/runtime/Strings.Mod @@ -28,8 +28,8 @@ Strings.Cap(s) replaces each lower case letter in s by its upper case equivalent. -------------------------------------------------------------*) (* added from trianus v4 *) -MODULE Strings; (*HM 94-06-22 / *) - +MODULE Strings; (*HM 94-06-22 / *) (* noch 2017-06-21 *) +IMPORT Reals; PROCEDURE Length* (s: ARRAY OF CHAR): INTEGER; VAR i: LONGINT; @@ -153,4 +153,74 @@ BEGIN RETURN M(string, pattern, Length(string)-1, Length(pattern)-1) END Match; +PROCEDURE StrToReal*(s: ARRAY OF CHAR; VAR r: REAL); +VAR p, e: INTEGER; y, g: REAL; neg, negE: BOOLEAN; +BEGIN + p := 0; + WHILE (s[p] = " ") OR (s[p] = "0") DO INC(p) END; + IF s[p] = "-" THEN neg := TRUE; INC(p) ELSE neg := FALSE END; + WHILE (s[p] = " ") OR (s[p] = "0") DO INC(p) END; + + y := 0; + WHILE ("0" <= s[p]) & (s[p] <= "9") DO + y := y * 10 + (ORD(s[p]) - 30H); + INC(p); + END; + IF s[p] = "." THEN + INC(p); g := 1; + WHILE ("0" <= s[p]) & (s[p] <= "9") DO + g := g / 10; y := y + g * (ORD(s[p]) - 30H); + INC(p); + END; + END; + IF (s[p] = "D") OR (s[p] = "E") THEN + INC(p); e := 0; + IF s[p] = "-" THEN negE := TRUE; INC(p) ELSE negE := FALSE END; + WHILE (s[p] = "0") DO INC(p) END; + WHILE ("0" <= s[p]) & (s[p] <= "9") DO + e := e * 10 + (ORD(s[p]) - 30H); + INC(p); + END; + IF negE THEN y := y / Reals.Ten(e) + ELSE y := y * Reals.Ten(e) END; + END; + IF neg THEN y := -y END; + r := y; +END StrToReal; + +PROCEDURE StrToLongReal*(s: ARRAY OF CHAR; VAR r: LONGREAL); +VAR p, e: INTEGER; y, g: LONGREAL; neg, negE: BOOLEAN; +BEGIN + p := 0; + WHILE (s[p] = " ") OR (s[p] = "0") DO INC(p) END; + IF s[p] = "-" THEN neg := TRUE; INC(p) ELSE neg := FALSE END; + WHILE (s[p] = " ") OR (s[p] = "0") DO INC(p) END; + + y := 0; + WHILE ("0" <= s[p]) & (s[p] <= "9") DO + y := y * 10 + (ORD(s[p]) - 30H); + INC(p); + END; + IF s[p] = "." THEN + INC(p); g := 1; + WHILE ("0" <= s[p]) & (s[p] <= "9") DO + g := g / 10; y := y + g * (ORD(s[p]) - 30H); + INC(p); + END; + END; + IF (s[p] = "D") OR (s[p] = "E") THEN + INC(p); e := 0; + IF s[p] = "-" THEN negE := TRUE; INC(p) ELSE negE := FALSE END; + WHILE (s[p] = "0") DO INC(p) END; + WHILE ("0" <= s[p]) & (s[p] <= "9") DO + e := e * 10 + (ORD(s[p]) - 30H); + INC(p); + END; + IF negE THEN y := y / Reals.Ten(e) + ELSE y := y * Reals.Ten(e) END; + END; + IF neg THEN y := -y END; + r := y; +END StrToLongReal; + END Strings. diff --git a/src/tools/make/oberon.mk b/src/tools/make/oberon.mk index 7f159ce8..ca7ac4ef 100644 --- a/src/tools/make/oberon.mk +++ b/src/tools/make/oberon.mk @@ -106,11 +106,11 @@ translate: cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -SsF -A$(ADRSIZE)$(ALIGNMENT) -O$(MODEL) ../../Configuration.Mod cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -SsF -A$(ADRSIZE)$(ALIGNMENT) -O$(MODEL) ../../src/runtime/Platform$(PLATFORM).Mod cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -SsFapx -A$(ADRSIZE)$(ALIGNMENT) -O$(MODEL) ../../src/runtime/Heap.Mod + cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -SsF -A$(ADRSIZE)$(ALIGNMENT) -O$(MODEL) ../../src/runtime/Reals.Mod cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -SsF -A$(ADRSIZE)$(ALIGNMENT) -O$(MODEL) ../../src/runtime/Strings.Mod cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -SsF -A$(ADRSIZE)$(ALIGNMENT) -O$(MODEL) ../../src/runtime/Out.Mod cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -SsF -A$(ADRSIZE)$(ALIGNMENT) -O$(MODEL) ../../src/runtime/Modules.Mod cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -SsFx -A$(ADRSIZE)$(ALIGNMENT) -O$(MODEL) ../../src/runtime/Files.Mod - cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -SsF -A$(ADRSIZE)$(ALIGNMENT) -O$(MODEL) ../../src/runtime/Reals.Mod cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -SsF -A$(ADRSIZE)$(ALIGNMENT) -O$(MODEL) ../../src/runtime/Texts.Mod cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -SsF -A$(ADRSIZE)$(ALIGNMENT) -O$(MODEL) ../../src/runtime/VT100.Mod cd $(BUILDDIR); $(ROOTDIR)/$(OBECOMP) -SsF -A$(ADRSIZE)$(ALIGNMENT) -O$(MODEL) ../../src/compiler/OPM.Mod