From: DeaDDooMER Date: Sun, 16 Jun 2019 11:07:10 +0000 (+0300) Subject: added conversion modes in HostLang X-Git-Tag: v0.2~17 X-Git-Url: https://deadsoftware.ru/gitweb?p=cpc.git;a=commitdiff_plain;h=d10ed94458a936c8a20510a86a80ebc244695b4a added conversion modes in HostLang --- diff --git a/src/generic/Dev2/Mod/LnkChmod.odc b/src/generic/Dev2/Mod/LnkChmod.odc index 220b6b9..165e9c6 100644 Binary files a/src/generic/Dev2/Mod/LnkChmod.odc and b/src/generic/Dev2/Mod/LnkChmod.odc differ diff --git a/src/posix/generic/Host/Mod/Console.cp b/src/posix/generic/Host/Mod/Console.cp index d29048e..95820c7 100644 --- a/src/posix/generic/Host/Mod/Console.cp +++ b/src/posix/generic/Host/Mod/Console.cp @@ -9,7 +9,7 @@ MODULE HostConsole; VAR res: INTEGER; s: ARRAY 2 OF CHAR; ss: ARRAY 12 OF SHORTCHAR; BEGIN s[0] := ch; s[1] := 0X; - HostLang.StringToHost(s, ss, TRUE, res); + HostLang.StringToHost(s, ss, HostLang.replace, res); ASSERT(res = 0, 100); res := unistd.write(1, S.ADR(ss[0]), LEN(ss$)); res := unistd.fsync(1) @@ -19,7 +19,7 @@ MODULE HostConsole; VAR ss: POINTER TO ARRAY OF SHORTCHAR; res: INTEGER; BEGIN NEW(ss, LEN(s$) * 4 + 1); - HostLang.StringToHost(s, ss, TRUE, res); + HostLang.StringToHost(s, ss, HostLang.replace, res); ASSERT(res = 0, 100); res := unistd.write(1, S.ADR(ss[0]), LEN(ss$)); res := unistd.fsync(1) diff --git a/src/posix/generic/Host/Mod/Files.cp b/src/posix/generic/Host/Mod/Files.cp index 8b0fc00..7f5b91d 100644 --- a/src/posix/generic/Host/Mod/Files.cp +++ b/src/posix/generic/Host/Mod/Files.cp @@ -179,11 +179,11 @@ MODULE HostFiles; ASSERT(f.state = new, 20); ASSERT(name # "", 21); ASSERT(IsName(name), 22); - HostLang.StringToHost(f.pathname, p0, FALSE, err); + HostLang.StringToHost(f.pathname, p0, HostLang.pep383, err); IF err = 0 THEN dir := f.pathname$; DirName(dir); - HostLang.StringToHost(dir + "/" + name, p1, FALSE, err); + HostLang.StringToHost(dir + "/" + name, p1, HostLang.pep383, err); IF err = 0 THEN x := stdio.rename(p0, p1); IF x = 0 THEN res := 0 (* no error *) @@ -205,7 +205,7 @@ MODULE HostFiles; IF f.state # closed THEN f.Flush; IF f.state = new THEN - HostLang.StringToHost(f.pathname, path, FALSE, err); + HostLang.StringToHost(f.pathname, path, HostLang.pep383, err); ASSERT(err = 0, 100); res := unistd.unlink(path); ASSERT(res = 0, 101); @@ -363,7 +363,7 @@ MODULE HostFiles; BEGIN ASSERT(loc # NIL, 20); WITH loc: Locator DO - HostLang.StringToHost(loc.path, pathname, FALSE, err); + HostLang.StringToHost(loc.path, pathname, HostLang.pep383, err); IF err = 0 THEN MakeDir(pathname, res); IF res = 0 THEN @@ -371,7 +371,7 @@ MODULE HostFiles; pathname := pathname + "/" + ".newXXXXXX"; fd := stdlib.mkstemp(pathname); IF fd # -1 THEN - NEW(f); HostLang.HostToString(pathname, f.pathname, FALSE, err); + NEW(f); HostLang.HostToString(pathname, f.pathname, HostLang.pep383, err); IF err = 0 THEN (* !!! get valid inode? *) f.fd := fd; f.len := 0; f.state := new; f.ino := 0; @@ -421,7 +421,7 @@ MODULE HostFiles; ASSERT(name # "", 21); WITH loc: Locator DO IF IsName(name) THEN - HostLang.StringToHost(loc.path + "/" + name, pathname, FALSE, err); + HostLang.StringToHost(loc.path + "/" + name, pathname, HostLang.pep383, err); IF err = 0 THEN res := macro.stat(pathname, s); IF res = 0 THEN @@ -443,7 +443,7 @@ MODULE HostFiles; lock.l_pid := 0; res := fcntl.fcntl(fd, fcntl.F_SETLK, S.ADR(lock)); IF res # -1 THEN - NEW(f); HostLang.HostToString(pathname, f.pathname, FALSE, err); + NEW(f); HostLang.HostToString(pathname, f.pathname, HostLang.pep383, err); IF err = 0 THEN f.fd := fd; f.len := s.st_size; f.ino := s.st_ino; IF isShared THEN f.state := shared @@ -501,7 +501,7 @@ MODULE HostFiles; ASSERT(IsName(name), 21); WITH loc: Locator DO IF IsName(name) THEN - HostLang.StringToHost(loc.path + "/" + name, pathname, FALSE, err); + HostLang.StringToHost(loc.path + "/" + name, pathname, HostLang.pep383, err); IF err = 0 THEN res := unistd.unlink(pathname); IF res = 0 THEN loc.res := 0 (* no error *) @@ -526,9 +526,9 @@ MODULE HostFiles; ASSERT(new # "", 22); WITH loc: Locator DO IF IsName(old) & IsName(new) THEN - HostLang.StringToHost(loc.path + "/" + old, p0, FALSE, err); + HostLang.StringToHost(loc.path + "/" + old, p0, HostLang.pep383, err); IF err = 0 THEN - HostLang.StringToHost(loc.path + "/" + new, p1, FALSE, err); + HostLang.StringToHost(loc.path + "/" + new, p1, HostLang.pep383, err); IF err = 0 THEN res := stdio.rename(p0, p1); IF res = 0 THEN loc.res := 0 (* no error *) @@ -559,11 +559,11 @@ MODULE HostFiles; WITH loc0: Locator DO WITH loc1: Locator DO IF IsName(name0) & IsName(name1) THEN - HostLang.StringToHost(loc0.path + "/" + name0, a0, FALSE, err); + HostLang.StringToHost(loc0.path + "/" + name0, a0, HostLang.pep383, err); IF err = 0 THEN err := macro.stat(a0, s0); IF err = 0 THEN - HostLang.StringToHost(loc1.path + "/" + name1, a1, FALSE, err); + HostLang.StringToHost(loc1.path + "/" + name1, a1, HostLang.pep383, err); IF err = 0 THEN err := macro.stat(a1, s1); IF err = 0 THEN @@ -621,15 +621,15 @@ MODULE HostFiles; BEGIN ASSERT(loc # NIL, 20); WITH loc: Locator DO - HostLang.StringToHost(loc.path, pathname, FALSE, err); + HostLang.StringToHost(loc.path, pathname, HostLang.pep383, err); IF err = 0 THEN p := dirent.opendir(pathname); IF p # NIL THEN ent := dirent.readdir(p); WHILE ent # NIL DO - HostLang.HostToString(ent.d_name, name, FALSE, err); + HostLang.HostToString(ent.d_name, name, HostLang.pep383, err); IF err = 0 THEN - HostLang.StringToHost(loc.path + "/" + name, pathname, FALSE, err); + HostLang.StringToHost(loc.path + "/" + name, pathname, HostLang.pep383, err); IF err = 0 THEN res := macro.stat(pathname, s); IF (res = 0) & ~IsDir(s) THEN @@ -683,15 +683,15 @@ MODULE HostFiles; BEGIN ASSERT(loc # NIL, 20); WITH loc: Locator DO - HostLang.StringToHost(loc.path, pathname, FALSE, err); + HostLang.StringToHost(loc.path, pathname, HostLang.pep383, err); IF err = 0 THEN p := dirent.opendir(pathname); IF p # NIL THEN ent := dirent.readdir(p); WHILE ent # NIL DO - HostLang.HostToString(ent.d_name, name, FALSE, err); + HostLang.HostToString(ent.d_name, name, HostLang.pep383, err); IF err = 0 THEN - HostLang.StringToHost(loc.path + "/" + name, pathname, FALSE, err); + HostLang.StringToHost(loc.path + "/" + name, pathname, HostLang.pep383, err); IF err = 0 THEN res := macro.stat(pathname, s); IF (res = 0) & IsDir(s) & (name # ".") & (name # "..") THEN diff --git a/src/posix/generic/Host/Mod/Lang.cp b/src/posix/generic/Host/Mod/Lang.cp index 00a7935..c3b60a2 100644 --- a/src/posix/generic/Host/Mod/Lang.cp +++ b/src/posix/generic/Host/Mod/Lang.cp @@ -6,15 +6,17 @@ MODULE HostLang; CONST maxLen = 32; + (* modes *) + replace* = 0; pep383x* = 1; pep383* = 2; + VAR lang-, country-, encoding-: ARRAY maxLen OF CHAR; c2sc, sc2c, invalid: iconv.iconv_t; - (* PEP 383 *) - - PROCEDURE StringToHost* (IN in: ARRAY OF CHAR; OUT out: ARRAY OF SHORTCHAR; low: BOOLEAN; OUT res: INTEGER); - VAR i, j, err: INTEGER; maxlen, len, count: iconv.size_t; inadr, outadr: Kernel.ADDRESS; ch: SHORTCHAR; + PROCEDURE StringToHost* (IN in: ARRAY OF CHAR; OUT out: ARRAY OF SHORTCHAR; mode: INTEGER; OUT res: INTEGER); + VAR i, j, err: INTEGER; maxlen, len, count: iconv.size_t; inadr, outadr: Kernel.ADDRESS; sch: SHORTCHAR; BEGIN + ASSERT(mode IN {replace..pep383}, 20); ASSERT(c2sc # invalid, 100); i := 0; err := 0; outadr := S.ADR(out[0]); @@ -29,18 +31,21 @@ MODULE HostLang; IF count # 0 THEN CASE macro.errno() OF | errno.EILSEQ: - (* !!! HALT(101)*) (* invalid input char *) - IF maxlen < 1 THEN - err := 1 + IF mode = replace THEN + IF maxlen < 1 THEN + err := 1 + ELSE + sch := "?"; + S.PUT(outadr, sch); INC(outadr); DEC(maxlen); + INC(j); DEC(len, 2) + END ELSE - ch := "?"; - S.PUT(outadr, ch); INC(outadr); DEC(maxlen); - INC(j); DEC(len, 2) - END + err := 3 + END; | errno.E2BIG: err := 1 (* unexpected end of out *) - | errno.EINVAL: HALT(102) (* unexpected end of input *) - | errno.EBADF: HALT(103) (* invalid iconv descriptor *) - ELSE HALT(104) (* unknown error *) + | errno.EINVAL: HALT(101) (* unexpected end of input *) + | errno.EBADF: HALT(102) (* invalid iconv descriptor *) + ELSE HALT(103) (* unknown error *) END END END; @@ -48,24 +53,25 @@ MODULE HostLang; IF maxlen < 1 THEN err := 1 ELSE - ch := SHORT(CHR(ORD(in[i]) MOD 256)); - IF low OR (ch > 7FX) THEN - S.PUT(outadr, ch); INC(outadr); DEC(maxlen); + sch := SHORT(CHR(ORD(in[i]) MOD 256)); + IF (mode IN {replace, pep383x}) OR (sch > 7FX) THEN + S.PUT(outadr, sch); INC(outadr); DEC(maxlen); INC(i) ELSE - err := 3 (* invalid char *) + err := 3 END END END END; - ch := 0X; - S.PUT(outadr, ch); + sch := 0X; + S.PUT(outadr, sch); res := err END StringToHost; - PROCEDURE HostToString* (IN in: ARRAY OF SHORTCHAR; OUT out: ARRAY OF CHAR; low: BOOLEAN; OUT res: INTEGER); + PROCEDURE HostToString* (IN in: ARRAY OF SHORTCHAR; OUT out: ARRAY OF CHAR; mode: INTEGER; OUT res: INTEGER); VAR err: INTEGER; maxin, maxout, count: iconv.size_t; inadr, outadr: Kernel.ADDRESS; sch: SHORTCHAR; ch: CHAR; BEGIN + ASSERT(mode IN {replace..pep383}, 20); ASSERT(sc2c # invalid, 100); err := 0; inadr := S.ADR(in[0]); @@ -81,9 +87,13 @@ MODULE HostLang; ELSIF maxin < 1 THEN err := 2 (* unexpected end of input buffer *) ELSE - S.GET(inadr, sch); INC(inadr); DEC(maxin); - ch := CHR(0D800H + ORD(sch)); - IF low OR (ch > 7FX) THEN + IF mode = replace THEN + sch := "?"; ch := "?"; INC(inadr); DEC(maxin); + ELSE + S.GET(inadr, sch); INC(inadr); DEC(maxin); + ch := CHR(0D800H + ORD(sch)); + END; + IF (mode IN {replace, pep383x}) OR (sch > 7FX) THEN S.PUT(outadr, ch); INC(outadr, 2); DEC(maxout, 2) ELSE err := 3 (* invalid char *)