From b24134ae4e56ea73c46e6db8f544863bc9829cc4 Mon Sep 17 00:00:00 2001 From: NikolajDanger Date: Thu, 16 Apr 2026 18:26:17 +0200 Subject: [PATCH] :goat: LONGITVDO on strings --- README.md | 4 ++-- centvrion/ast_nodes.py | 6 +++--- centvrion/compiler/runtime/cent_runtime.c | 7 ++++--- tests.py | 3 +++ 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 0d94854..5c62ede 100644 --- a/README.md +++ b/README.md @@ -191,9 +191,9 @@ Skips the rest of the current loop body and continues to the next iteration (`DV Breaks out of the current loop (`DVM` or `PER`). Has no meaningful return value. ### LONGITVDO -`LONGITVDO array` +`LONGITVDO array` or `LONGITVDO string` -Returns the length of `array` as an integer. +Returns the length of `array` (element count) or `string` (character count) as an integer. ## Modules Modules are additions to the base `CENTVRION` syntax. They add or change certain features. Modules are included in your code by having diff --git a/centvrion/ast_nodes.py b/centvrion/ast_nodes.py index 38c8f5d..baae3f5 100644 --- a/centvrion/ast_nodes.py +++ b/centvrion/ast_nodes.py @@ -909,9 +909,9 @@ class BuiltIn(Node): raise CentvrionError("FORTIS_ELECTIONIS: cannot select from an empty array") return vtable, lst[random.randint(0, len(lst) - 1)] case "LONGITVDO": - if not isinstance(params[0], ValList): - raise CentvrionError("LONGITVDO requires an array") - return vtable, ValInt(len(params[0].value())) + if isinstance(params[0], (ValList, ValStr)): + return vtable, ValInt(len(params[0].value())) + raise CentvrionError("LONGITVDO requires an array or string") case "EVERRO": print("\033[2J\033[H", end="", flush=True) return vtable, ValNul() diff --git a/centvrion/compiler/runtime/cent_runtime.c b/centvrion/compiler/runtime/cent_runtime.c index 1dad2f7..eca116b 100644 --- a/centvrion/compiler/runtime/cent_runtime.c +++ b/centvrion/compiler/runtime/cent_runtime.c @@ -481,9 +481,10 @@ CentValue cent_avdi_numerus(void) { } CentValue cent_longitudo(CentValue v) { - if (v.type != CENT_LIST) - cent_type_error("'LONGITVDO' requires a list"); - return cent_int(v.lval.len); + if (v.type == CENT_LIST) return cent_int(v.lval.len); + if (v.type == CENT_STR) return cent_int((long)strlen(v.sval)); + cent_type_error("'LONGITVDO' requires a list or string"); + return cent_null(); /* unreachable; silences warning */ } CentValue cent_fortis_numerus(CentValue lo, CentValue hi) { diff --git a/tests.py b/tests.py index 95adad7..65baed2 100644 --- a/tests.py +++ b/tests.py @@ -388,6 +388,9 @@ builtin_tests = [ ("CVM FORS\nFORTIS_NVMERVS(I, X)", Program([ModuleCall("FORS")], [ExpressionStatement(BuiltIn("FORTIS_NVMERVS", [Numeral("I"), Numeral("X")]))]), ValInt(3)), ("AVDI()", Program([], [ExpressionStatement(BuiltIn("AVDI", []))]), ValStr("hello"), "", ["hello"]), ("LONGITVDO([I, II, III])", Program([], [ExpressionStatement(BuiltIn("LONGITVDO", [DataArray([Numeral("I"), Numeral("II"), Numeral("III")])]))]), ValInt(3)), + ("LONGITVDO([])", Program([], [ExpressionStatement(BuiltIn("LONGITVDO", [DataArray([])]))]), ValInt(0)), + ('LONGITVDO("salve")', Program([], [ExpressionStatement(BuiltIn("LONGITVDO", [String("salve")]))]), ValInt(5)), + ('LONGITVDO("")', Program([], [ExpressionStatement(BuiltIn("LONGITVDO", [String("")]))]), ValInt(0)), ("CVM FORS\nFORTIS_ELECTIONIS([I, II, III])", Program([ModuleCall("FORS")], [ExpressionStatement(BuiltIn("FORTIS_ELECTIONIS", [DataArray([Numeral("I"), Numeral("II"), Numeral("III")])]))]), ValInt(1)), ]