From 62b605c6c0ea13e9763c0a0115464007b13a8831 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Tue, 20 Oct 2026 11:57:16 +0000 Subject: refactor(strings): replace compiler builtins with the STRING library Construct literals as STRING values and route string operations through ordinary library functions and operators. Preserve value ownership in records, arrays, constants and file I/O. Co-Authored-By: Claude Opus 5.5 --- tests/i/string-values/case.json | 1 + tests/i/string-values/expected.txt | 8 ++++++++ tests/i/string-values/notes.md | 5 +++++ tests/i/string-values/program.cps | 40 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+) create mode 100644 tests/i/string-values/case.json create mode 100644 tests/i/string-values/expected.txt create mode 100644 tests/i/string-values/notes.md create mode 100644 tests/i/string-values/program.cps (limited to 'tests/i/string-values') diff --git a/tests/i/string-values/case.json b/tests/i/string-values/case.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/tests/i/string-values/case.json @@ -0,0 +1 @@ +{} diff --git a/tests/i/string-values/expected.txt b/tests/i/string-values/expected.txt new file mode 100644 index 0000000..e8badf2 --- /dev/null +++ b/tests/i/string-values/expected.txt @@ -0,0 +1,8 @@ +constant:independent:global:local +changed:two +one +two +TRUE:TRUE:TRUE:TRUE:TRUE +1:1 +matched +B diff --git a/tests/i/string-values/notes.md b/tests/i/string-values/notes.md new file mode 100644 index 0000000..1e821cc --- /dev/null +++ b/tests/i/string-values/notes.md @@ -0,0 +1,5 @@ +# String values + +Human review: pending. Expected output is traced from independent string values. + +Record copies and BYVAL array calls must preserve the source when a copy changes. Self-assignment preserves the value. Global and constant strings remain available to functions. Comparisons use case-sensitive content ordering. Ordinary literals retain the legacy NUL truncation; CHR can construct an owning one-byte NUL string. diff --git a/tests/i/string-values/program.cps b/tests/i/string-values/program.cps new file mode 100644 index 0000000..46822fc --- /dev/null +++ b/tests/i/string-values/program.cps @@ -0,0 +1,40 @@ +GLOBAL + DECLARE Label : STRING + Label <- "global" +ENDGLOBAL +CONSTANT Greeting = "constant" +TYPE Item + DECLARE Text : STRING +ENDTYPE +FUNCTION ReadConstant() RETURNS STRING + CONSTANT Local = "local" + RETURN Local +ENDFUNCTION +FUNCTION Echo(Value : Item) RETURNS Item + RETURN Value +ENDFUNCTION +PROCEDURE Change(Values : ARRAY OF STRING) + Values[1] <- "changed" + OUTPUT Values[1], ":", Values[2] +ENDPROCEDURE +DECLARE A : Item +DECLARE B : Item +A.Text <- Greeting +B <- Echo(A) +B.Text <- "independent" +B <- B +OUTPUT A.Text, ":", B.Text, ":", Label, ":", ReadConstant() +DECLARE Values : ARRAY[1:2] OF STRING +Values[1] <- "one" +Values[2] <- "two" +CALL Change(Values) +OUTPUT Values +OUTPUT "A" < "B", ":", "B" > "A", ":", "A" <= "A", ":", "B" >= "A", ":", "a" <> "A" +OUTPUT LENGTH("a\0b"), ":", LENGTH(CHR(0)) +DECLARE Selected : STRING +Selected <- "B" +CASE OF Selected + "A" : OUTPUT "wrong" + "B" : OUTPUT "matched" +ENDCASE +OUTPUT Selected -- cgit v1.3.1-4-g156e