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 --- pseudocode-lib/string.cps | 146 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 pseudocode-lib/string.cps (limited to 'pseudocode-lib/string.cps') diff --git a/pseudocode-lib/string.cps b/pseudocode-lib/string.cps new file mode 100644 index 0000000..41181c4 --- /dev/null +++ b/pseudocode-lib/string.cps @@ -0,0 +1,146 @@ +#LIB +INCLUDE_OBJ "string.o" +TYPE _STRING_HANDLE = C_TYPE("void*") +TYPE _STRING_C_INTEGER = C_TYPE("long long") +EXTERN "C" EXTERN_FUNCTION _string_impl_new() RETURNS _STRING_HANDLE +EXTERN "C" EXTERN_FUNCTION _string_impl_copy(_STRING_HANDLE) RETURNS _STRING_HANDLE +EXTERN "C" EXTERN_FUNCTION _string_impl_from_cstr(C_STRING) RETURNS _STRING_HANDLE +EXTERN "C" EXTERN_FUNCTION _string_impl_from_count_char(_STRING_C_INTEGER, C_CHAR) RETURNS _STRING_HANDLE +EXTERN "C" EXTERN_PROCEDURE _string_impl_delete(_STRING_HANDLE) +EXTERN "C" EXTERN_PROCEDURE _string_impl_assign(_STRING_HANDLE, _STRING_HANDLE) +EXTERN "C" EXTERN_PROCEDURE _string_impl_assign_cstr(_STRING_HANDLE, C_STRING) +EXTERN "C" EXTERN_PROCEDURE _string_impl_concat(_STRING_HANDLE, _STRING_HANDLE, _STRING_HANDLE) +EXTERN "C" EXTERN_PROCEDURE _string_impl_from_int(_STRING_HANDLE, _STRING_C_INTEGER) +EXTERN "C" EXTERN_PROCEDURE _string_impl_from_real(_STRING_HANDLE, C_DOUBLE) +EXTERN "C" EXTERN_FUNCTION _string_impl_to_real(_STRING_HANDLE) RETURNS C_DOUBLE +EXTERN "C" EXTERN_FUNCTION _string_impl_length(_STRING_HANDLE) RETURNS _STRING_C_INTEGER +EXTERN "C" EXTERN_PROCEDURE _string_impl_left(_STRING_HANDLE, _STRING_HANDLE, _STRING_C_INTEGER) +EXTERN "C" EXTERN_PROCEDURE _string_impl_right(_STRING_HANDLE, _STRING_HANDLE, _STRING_C_INTEGER) +EXTERN "C" EXTERN_PROCEDURE _string_impl_mid(_STRING_HANDLE, _STRING_HANDLE, _STRING_C_INTEGER, _STRING_C_INTEGER) +EXTERN "C" EXTERN_PROCEDURE _string_impl_lcase(_STRING_HANDLE, _STRING_HANDLE) +EXTERN "C" EXTERN_FUNCTION _string_impl_lcase_char(C_CHAR) RETURNS C_CHAR +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_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) +EXTERN "C" EXTERN_FUNCTION _string_impl_compare(_STRING_HANDLE, _STRING_HANDLE) RETURNS C_INT + +CLASS STRING + PUBLIC _HANDLE : _STRING_HANDLE + OVERLOAD PROCEDURE NEW() + _HANDLE <- _string_impl_new() + ENDPROCEDURE + OVERLOAD PROCEDURE NEW(BYREF Other : STRING) + _HANDLE <- _string_impl_copy(Other._HANDLE) + ENDPROCEDURE + OVERLOAD PROCEDURE NEW(Text : C_STRING) + _HANDLE <- _string_impl_from_cstr(Text) + ENDPROCEDURE + OVERLOAD PROCEDURE NEW(Count : INTEGER, Ch : C_CHAR) + _HANDLE <- _string_impl_from_count_char((_STRING_C_INTEGER)Count, Ch) + ENDPROCEDURE + PROCEDURE DELETE() + CALL _string_impl_delete(_HANDLE) + ENDPROCEDURE + OVERLOAD PROCEDURE OPERATOR<-(BYREF Other : STRING) + CALL _string_impl_assign(_HANDLE, Other._HANDLE) + ENDPROCEDURE + OVERLOAD PROCEDURE OPERATOR<-(Text : C_STRING) + CALL _string_impl_assign_cstr(_HANDLE, Text) + ENDPROCEDURE + FUNCTION C_STR() RETURNS C_STRING + RETURN _string_impl_c_str(_HANDLE) + ENDFUNCTION + PROCEDURE READ_INPUT() + CALL _string_impl_input(_HANDLE) + ENDPROCEDURE +ENDCLASS + +OVERLOAD FUNCTION OPERATOR&(A : STRING, B : STRING) RETURNS STRING + DECLARE Result : STRING + CALL _string_impl_concat(Result._HANDLE, A._HANDLE, B._HANDLE) + RETURN Result +ENDFUNCTION +OVERLOAD FUNCTION NUM_TO_STR(Number : INTEGER) RETURNS STRING + DECLARE Result : STRING + CALL _string_impl_from_int(Result._HANDLE, (_STRING_C_INTEGER)Number) + RETURN Result +ENDFUNCTION +OVERLOAD FUNCTION NUM_TO_STR(Number : REAL) RETURNS STRING + DECLARE Result : STRING + CALL _string_impl_from_real(Result._HANDLE, (C_DOUBLE)Number) + RETURN Result +ENDFUNCTION +FUNCTION STR_TO_NUM(S : STRING) RETURNS REAL + RETURN (REAL)_string_impl_to_real(S._HANDLE) +ENDFUNCTION +FUNCTION LENGTH(S : STRING) RETURNS INTEGER + RETURN (INTEGER)_string_impl_length(S._HANDLE) +ENDFUNCTION +FUNCTION LEFT(S : STRING, Count : INTEGER) RETURNS STRING + DECLARE Result : STRING + CALL _string_impl_left(Result._HANDLE, S._HANDLE, (_STRING_C_INTEGER)Count) + RETURN Result +ENDFUNCTION +FUNCTION RIGHT(S : STRING, Count : INTEGER) RETURNS STRING + DECLARE Result : STRING + CALL _string_impl_right(Result._HANDLE, S._HANDLE, (_STRING_C_INTEGER)Count) + RETURN Result +ENDFUNCTION +FUNCTION MID(S : STRING, Start : INTEGER, Count : INTEGER) RETURNS STRING + DECLARE Result : STRING + CALL _string_impl_mid(Result._HANDLE, S._HANDLE, (_STRING_C_INTEGER)Start, (_STRING_C_INTEGER)Count) + RETURN Result +ENDFUNCTION +OVERLOAD FUNCTION LCASE(S : STRING) RETURNS STRING + DECLARE Result : STRING + CALL _string_impl_lcase(Result._HANDLE, S._HANDLE) + RETURN Result +ENDFUNCTION +OVERLOAD FUNCTION LCASE(Ch : CHAR) RETURNS CHAR + RETURN (CHAR)_string_impl_lcase_char((C_CHAR)Ch) +ENDFUNCTION +OVERLOAD FUNCTION UCASE(S : STRING) RETURNS STRING + DECLARE Result : STRING + CALL _string_impl_ucase(Result._HANDLE, S._HANDLE) + RETURN Result +ENDFUNCTION +OVERLOAD FUNCTION UCASE(Ch : CHAR) RETURNS CHAR + RETURN (CHAR)_string_impl_ucase_char((C_CHAR)Ch) +ENDFUNCTION +OVERLOAD FUNCTION ASC(S : STRING) RETURNS INTEGER + RETURN (INTEGER)_string_impl_asc(S._HANDLE) +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 +ENDFUNCTION +FUNCTION IS_NUM(S : STRING) RETURNS BOOLEAN + RETURN (BOOLEAN)_string_impl_is_num(S._HANDLE) +ENDFUNCTION +OVERLOAD FUNCTION OPERATOR=(A : STRING, B : STRING) RETURNS BOOLEAN + RETURN (INTEGER)_string_impl_compare(A._HANDLE, B._HANDLE) = 0 +ENDFUNCTION +OVERLOAD FUNCTION OPERATOR<>(A : STRING, B : STRING) RETURNS BOOLEAN + RETURN (INTEGER)_string_impl_compare(A._HANDLE, B._HANDLE) <> 0 +ENDFUNCTION +OVERLOAD FUNCTION OPERATOR<(A : STRING, B : STRING) RETURNS BOOLEAN + RETURN (INTEGER)_string_impl_compare(A._HANDLE, B._HANDLE) < 0 +ENDFUNCTION +OVERLOAD FUNCTION OPERATOR>(A : STRING, B : STRING) RETURNS BOOLEAN + RETURN (INTEGER)_string_impl_compare(A._HANDLE, B._HANDLE) > 0 +ENDFUNCTION +OVERLOAD FUNCTION OPERATOR<=(A : STRING, B : STRING) RETURNS BOOLEAN + RETURN (INTEGER)_string_impl_compare(A._HANDLE, B._HANDLE) <= 0 +ENDFUNCTION +OVERLOAD FUNCTION OPERATOR>=(A : STRING, B : STRING) RETURNS BOOLEAN + RETURN (INTEGER)_string_impl_compare(A._HANDLE, B._HANDLE) >= 0 +ENDFUNCTION -- cgit v1.3.1-4-g156e