From 7666ed94ae7bb7f7c3be577597d02db2099e1fe0 Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Thu, 11 Sep 2014 15:46:09 +0400 Subject: [PATCH] added crlf handling partly following discussion at https://code.google.com/p/ofront/issues/detail?id=3 and by introducing corresponding changes in ShowLine and ShowLineErr functions in OPM module. Former-commit-id: bef25cd7a75853470a6478d3526334c3e182b179 --- src/lib/system/darwin/clang/Texts.Mod | 8 ++++++-- src/lib/system/darwin/clang/Texts0.Mod | 23 ++++++++++++++++++++++- src/lib/system/freebsd/clang/Texts.Mod | 8 ++++++-- src/lib/system/freebsd/clang/Texts0.Mod | 23 ++++++++++++++++++++++- src/lib/system/linux/clang/Texts.Mod | 8 ++++++-- src/lib/system/linux/clang/Texts0.Mod | 23 ++++++++++++++++++++++- src/lib/system/linux/gcc/Texts.Mod | 8 ++++++-- src/lib/system/linux/gcc/Texts0.Mod | 23 ++++++++++++++++++++++- src/voc/OPM.cmdln.Mod | 6 +++++- voc.REMOVED.git-id | 2 +- vocstatic.linux.gcc.x86_64.REMOVED.git-id | 2 +- 11 files changed, 119 insertions(+), 15 deletions(-) diff --git a/src/lib/system/darwin/clang/Texts.Mod b/src/lib/system/darwin/clang/Texts.Mod index 320f426b..2042dcf7 100644 --- a/src/lib/system/darwin/clang/Texts.Mod +++ b/src/lib/system/darwin/clang/Texts.Mod @@ -329,10 +329,14 @@ MODULE Texts; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91** END OpenReader; PROCEDURE Read* (VAR R: Reader; VAR ch: CHAR); - VAR u: Run; + VAR u: Run; pos: LONGINT; nextch: CHAR; 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 *) + IF (ch = 0AX) & u(Piece).ascii THEN ch := CR (* << LF to CR *) + ELSIF (ch = CR) & u(Piece).ascii THEN (* << CR LF to CR *) + pos := Files.Pos(R.rider); Files.Read(R.rider, nextch); + IF nextch = 0AX THEN INC(R.off) ELSE Files.Set(R.rider, u(Piece).file, pos) END + END ELSIF u IS Elem THEN ch := ElemChar; R.elem := u(Elem) ELSE ch := 0X; R.elem := NIL; R.eot := TRUE END; diff --git a/src/lib/system/darwin/clang/Texts0.Mod b/src/lib/system/darwin/clang/Texts0.Mod index 7b95e031..19ecf5a1 100644 --- a/src/lib/system/darwin/clang/Texts0.Mod +++ b/src/lib/system/darwin/clang/Texts0.Mod @@ -327,7 +327,7 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91* 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); @@ -343,6 +343,27 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91* R.run := u; R.off := 0 END END Read; +*) + PROCEDURE Read* (VAR R: Reader; VAR ch: CHAR); + VAR u: Run; pos: LONGINT; nextch: CHAR; + 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 (* << LF to CR *) + ELSIF (ch = CR) & u(Piece).ascii THEN (* << CR LF to CR *) + pos := Files.Pos(R.rider); Files.Read(R.rider, nextch); + IF nextch = 0AX THEN INC(R.off) ELSE Files.Set(R.rider, u(Piece).file, pos) END + END + 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; diff --git a/src/lib/system/freebsd/clang/Texts.Mod b/src/lib/system/freebsd/clang/Texts.Mod index 320f426b..2042dcf7 100644 --- a/src/lib/system/freebsd/clang/Texts.Mod +++ b/src/lib/system/freebsd/clang/Texts.Mod @@ -329,10 +329,14 @@ MODULE Texts; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91** END OpenReader; PROCEDURE Read* (VAR R: Reader; VAR ch: CHAR); - VAR u: Run; + VAR u: Run; pos: LONGINT; nextch: CHAR; 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 *) + IF (ch = 0AX) & u(Piece).ascii THEN ch := CR (* << LF to CR *) + ELSIF (ch = CR) & u(Piece).ascii THEN (* << CR LF to CR *) + pos := Files.Pos(R.rider); Files.Read(R.rider, nextch); + IF nextch = 0AX THEN INC(R.off) ELSE Files.Set(R.rider, u(Piece).file, pos) END + END ELSIF u IS Elem THEN ch := ElemChar; R.elem := u(Elem) ELSE ch := 0X; R.elem := NIL; R.eot := TRUE END; diff --git a/src/lib/system/freebsd/clang/Texts0.Mod b/src/lib/system/freebsd/clang/Texts0.Mod index 7b95e031..19ecf5a1 100644 --- a/src/lib/system/freebsd/clang/Texts0.Mod +++ b/src/lib/system/freebsd/clang/Texts0.Mod @@ -327,7 +327,7 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91* 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); @@ -343,6 +343,27 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91* R.run := u; R.off := 0 END END Read; +*) + PROCEDURE Read* (VAR R: Reader; VAR ch: CHAR); + VAR u: Run; pos: LONGINT; nextch: CHAR; + 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 (* << LF to CR *) + ELSIF (ch = CR) & u(Piece).ascii THEN (* << CR LF to CR *) + pos := Files.Pos(R.rider); Files.Read(R.rider, nextch); + IF nextch = 0AX THEN INC(R.off) ELSE Files.Set(R.rider, u(Piece).file, pos) END + END + 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; diff --git a/src/lib/system/linux/clang/Texts.Mod b/src/lib/system/linux/clang/Texts.Mod index 320f426b..2042dcf7 100644 --- a/src/lib/system/linux/clang/Texts.Mod +++ b/src/lib/system/linux/clang/Texts.Mod @@ -329,10 +329,14 @@ MODULE Texts; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91** END OpenReader; PROCEDURE Read* (VAR R: Reader; VAR ch: CHAR); - VAR u: Run; + VAR u: Run; pos: LONGINT; nextch: CHAR; 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 *) + IF (ch = 0AX) & u(Piece).ascii THEN ch := CR (* << LF to CR *) + ELSIF (ch = CR) & u(Piece).ascii THEN (* << CR LF to CR *) + pos := Files.Pos(R.rider); Files.Read(R.rider, nextch); + IF nextch = 0AX THEN INC(R.off) ELSE Files.Set(R.rider, u(Piece).file, pos) END + END ELSIF u IS Elem THEN ch := ElemChar; R.elem := u(Elem) ELSE ch := 0X; R.elem := NIL; R.eot := TRUE END; diff --git a/src/lib/system/linux/clang/Texts0.Mod b/src/lib/system/linux/clang/Texts0.Mod index 7b95e031..19ecf5a1 100644 --- a/src/lib/system/linux/clang/Texts0.Mod +++ b/src/lib/system/linux/clang/Texts0.Mod @@ -327,7 +327,7 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91* 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); @@ -343,6 +343,27 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91* R.run := u; R.off := 0 END END Read; +*) + PROCEDURE Read* (VAR R: Reader; VAR ch: CHAR); + VAR u: Run; pos: LONGINT; nextch: CHAR; + 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 (* << LF to CR *) + ELSIF (ch = CR) & u(Piece).ascii THEN (* << CR LF to CR *) + pos := Files.Pos(R.rider); Files.Read(R.rider, nextch); + IF nextch = 0AX THEN INC(R.off) ELSE Files.Set(R.rider, u(Piece).file, pos) END + END + 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; diff --git a/src/lib/system/linux/gcc/Texts.Mod b/src/lib/system/linux/gcc/Texts.Mod index 320f426b..2042dcf7 100644 --- a/src/lib/system/linux/gcc/Texts.Mod +++ b/src/lib/system/linux/gcc/Texts.Mod @@ -329,10 +329,14 @@ MODULE Texts; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91** END OpenReader; PROCEDURE Read* (VAR R: Reader; VAR ch: CHAR); - VAR u: Run; + VAR u: Run; pos: LONGINT; nextch: CHAR; 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 *) + IF (ch = 0AX) & u(Piece).ascii THEN ch := CR (* << LF to CR *) + ELSIF (ch = CR) & u(Piece).ascii THEN (* << CR LF to CR *) + pos := Files.Pos(R.rider); Files.Read(R.rider, nextch); + IF nextch = 0AX THEN INC(R.off) ELSE Files.Set(R.rider, u(Piece).file, pos) END + END ELSIF u IS Elem THEN ch := ElemChar; R.elem := u(Elem) ELSE ch := 0X; R.elem := NIL; R.eot := TRUE END; diff --git a/src/lib/system/linux/gcc/Texts0.Mod b/src/lib/system/linux/gcc/Texts0.Mod index 7b95e031..19ecf5a1 100644 --- a/src/lib/system/linux/gcc/Texts0.Mod +++ b/src/lib/system/linux/gcc/Texts0.Mod @@ -327,7 +327,7 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91* 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); @@ -343,6 +343,27 @@ MODULE Texts0; (** CAS/HM 23.9.93 -- interface based on Texts by JG/NW 6.12.91* R.run := u; R.off := 0 END END Read; +*) + PROCEDURE Read* (VAR R: Reader; VAR ch: CHAR); + VAR u: Run; pos: LONGINT; nextch: CHAR; + 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 (* << LF to CR *) + ELSIF (ch = CR) & u(Piece).ascii THEN (* << CR LF to CR *) + pos := Files.Pos(R.rider); Files.Read(R.rider, nextch); + IF nextch = 0AX THEN INC(R.off) ELSE Files.Set(R.rider, u(Piece).file, pos) END + END + 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; diff --git a/src/voc/OPM.cmdln.Mod b/src/voc/OPM.cmdln.Mod index 7210c766..e3e461a9 100644 --- a/src/voc/OPM.cmdln.Mod +++ b/src/voc/OPM.cmdln.Mod @@ -277,6 +277,8 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *) ELSIF curpos MOD 256 # 255 THEN INC(curpos) (* at 255 means: >= 255 *) END + ELSIF ch = 0DX THEN + curpos := Texts.Pos(inR); (* supports CR LF mapping *) ELSE INC(curpos) END ; @@ -384,8 +386,10 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *) INC(i); UNTIL r.eof OR (i >= 1022) OR ((ORD(ch) < 32) & (ORD(ch) # 9)); line[i] := 0X; + IF (line[i-1] = 0AX) OR (line[i-1] = 0DX) THEN line[i-1] := 0X END; (*Console.String(" -- length of line "); Console.Int(i, 0); Console.Ln;*) Console.Ln; Console.Ln; Console.String(" "); Console.String(line); + Console.Ln; i := 0; Console.String(" "); @@ -423,7 +427,7 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *) IF ORD(ch)=9 THEN ch := " " END; line[i] := ch; INC(i); line[i+1] := 0X; ELSE - INC(j); i := 0 + IF ch = 0AX THEN INC(j); i := 0 END END; (* Console.Ln; Console.String("-- line["); Console.Int(i-1, 0); Console.String("] = "); Console.Char(ch); Console.Ln; diff --git a/voc.REMOVED.git-id b/voc.REMOVED.git-id index 66a21669..8614c434 100644 --- a/voc.REMOVED.git-id +++ b/voc.REMOVED.git-id @@ -1 +1 @@ -52363208815ce01643c02a26ecbdd964dae40104 \ No newline at end of file +c2141d5ead9b48d2d3e1f3cb25fb884e3671608d \ No newline at end of file diff --git a/vocstatic.linux.gcc.x86_64.REMOVED.git-id b/vocstatic.linux.gcc.x86_64.REMOVED.git-id index 66a21669..0d40b4b7 100644 --- a/vocstatic.linux.gcc.x86_64.REMOVED.git-id +++ b/vocstatic.linux.gcc.x86_64.REMOVED.git-id @@ -1 +1 @@ -52363208815ce01643c02a26ecbdd964dae40104 \ No newline at end of file +3326a0fc447824a7e2a6d9b35c79b178bfe7ea61 \ No newline at end of file