aboutsummaryrefslogtreecommitdiff
path: root/pseudocode-lib
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-23 01:19:28 +0000
committer_ov4 <ov4@ov4.org>2026-10-23 01:19:28 +0000
commit90fc80c193453e8d5038530f310fc007f9ff9789 (patch)
treee324ea2c88f63610cc5f13f0b55114f12b5b8f98 /pseudocode-lib
parent7c681c33e17550bfc8a0dc969129a2ea855a39fe (diff)
fix(stdlib)!: return CHAR from CHR
BREAKING CHANGE: CHR now returns CHAR instead of STRING, so user overloads and templates select or deduce CHAR for CHR(...). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'pseudocode-lib')
-rw-r--r--pseudocode-lib/README.md2
-rw-r--r--pseudocode-lib/string.cc6
-rw-r--r--pseudocode-lib/string.cps8
3 files changed, 5 insertions, 11 deletions
diff --git a/pseudocode-lib/README.md b/pseudocode-lib/README.md
index 4e70a44..f3c683f 100644
--- a/pseudocode-lib/README.md
+++ b/pseudocode-lib/README.md
@@ -33,7 +33,7 @@ The library provides `&`, six case-sensitive content comparisons, and these ordi
- `MID(S, Start, Count)` uses a one-based Start. Starts below 1 clamp to 1; starts beyond the end and nonpositive counts return empty. Counts clamp to the remaining bytes.
- `LCASE(CHAR)` and `UCASE(CHAR)` return CHAR, following guide section 5.5. STRING overloads return independent strings. Nonletters and embedded NUL bytes are preserved; use ASCII for predictable case conversion.
- `ASC(CHAR)` and `ASC(STRING)` return the unsigned character or first-byte code; an empty string returns zero.
-- `CHR(Code)` returns a one-byte STRING containing the low eight bits. `LENGTH(CHR(0))` is 1.
+- `CHR(Code)` returns a CHAR containing the low eight bits. `LENGTH(CHR(0))` is 1.
- `NUM_TO_STR(INTEGER)` and `NUM_TO_STR(REAL)` convert INTEGER to decimal text and REAL to the shortest round-trip text (Python `repr` style, identical to OUTPUT: `2.0`, `0.1`, `1e-07`, `inf`).
- `STR_TO_NUM(S)` returns REAL through the same `parseNumber` helper as IS_NUM (`strtod`, full consumption). Invalid text and trailing junk throw `STR_TO_NUM: '<text>' is not a number`; overflow throws `... is out of the REAL range`; underflow is accepted.
- `IS_NUM(S)` agrees with STR_TO_NUM: full consumption by `strtod` and no overflow, without throwing. Leading whitespace is accepted; trailing whitespace, trailing junk, empty input, embedded NUL bytes, and overflowing values (`1e999`) are rejected.
diff --git a/pseudocode-lib/string.cc b/pseudocode-lib/string.cc
index c47899c..4395304 100644
--- a/pseudocode-lib/string.cc
+++ b/pseudocode-lib/string.cc
@@ -163,11 +163,7 @@ long long _string_impl_asc(void *Handle) {
long long _string_impl_asc_char(char Ch) {
return checked([&]() -> long long { return static_cast<unsigned char>(Ch); });
}
-void _string_impl_chr(void *Target, long long Code) {
- checked([&] {
- text(Target).assign(1, static_cast<char>(static_cast<unsigned char>(Code)));
- });
-}
+char _string_impl_chr_char(long long Code) { return static_cast<char>(static_cast<unsigned char>(Code)); }
int _string_impl_is_num(void *Handle) {
return checked([&]() -> int {
double Number = 0;
diff --git a/pseudocode-lib/string.cps b/pseudocode-lib/string.cps
index a118326..1ad63d3 100644
--- a/pseudocode-lib/string.cps
+++ b/pseudocode-lib/string.cps
@@ -23,7 +23,7 @@ EXTERN "C" EXTERN_PROCEDURE _string_impl_ucase(_STRING_HANDLE, _STRING_HANDLE)
EXTERN "C" EXTERN_FUNCTION _string_impl_ucase_char(C_CHAR) RETURNS C_CHAR
EXTERN "C" EXTERN_FUNCTION _string_impl_asc(_STRING_HANDLE) RETURNS _STRING_C_INTEGER
EXTERN "C" EXTERN_FUNCTION _string_impl_asc_char(C_CHAR) RETURNS _STRING_C_INTEGER
-EXTERN "C" EXTERN_PROCEDURE _string_impl_chr(_STRING_HANDLE, _STRING_C_INTEGER)
+EXTERN "C" EXTERN_FUNCTION _string_impl_chr_char(_STRING_C_INTEGER) RETURNS C_CHAR
EXTERN "C" EXTERN_FUNCTION _string_impl_is_num(_STRING_HANDLE) RETURNS C_INT
EXTERN "C" EXTERN_FUNCTION _string_impl_c_str(_STRING_HANDLE) RETURNS C_STRING
EXTERN "C" EXTERN_PROCEDURE _string_impl_input(_STRING_HANDLE)
@@ -121,10 +121,8 @@ ENDFUNCTION
OVERLOAD FUNCTION ASC(Ch : CHAR) RETURNS INTEGER
RETURN (INTEGER)_string_impl_asc_char((C_CHAR)Ch)
ENDFUNCTION
-FUNCTION CHR(Code : INTEGER) RETURNS STRING
- DECLARE Result : STRING
- CALL _string_impl_chr(Result._HANDLE, (_STRING_C_INTEGER)Code)
- RETURN Result
+FUNCTION CHR(Code : INTEGER) RETURNS CHAR
+ RETURN (CHAR)_string_impl_chr_char((_STRING_C_INTEGER)Code)
ENDFUNCTION
FUNCTION IS_NUM(S : STRING) RETURNS BOOLEAN
RETURN (BOOLEAN)_string_impl_is_num(S._HANDLE)