diff options
| author | _ov4 <ov4@ov4.org> | 2026-10-23 01:19:28 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-10-23 01:19:28 +0000 |
| commit | 90fc80c193453e8d5038530f310fc007f9ff9789 (patch) | |
| tree | e324ea2c88f63610cc5f13f0b55114f12b5b8f98 /pseudocode-lib | |
| parent | 7c681c33e17550bfc8a0dc969129a2ea855a39fe (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.md | 2 | ||||
| -rw-r--r-- | pseudocode-lib/string.cc | 6 | ||||
| -rw-r--r-- | pseudocode-lib/string.cps | 8 |
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) |
