From a2822926040c39285760b2ca2d350fe8229ac177 Mon Sep 17 00:00:00 2001 From: "Johan B.W. de Vries" Date: Sun, 25 Jan 2026 12:47:58 +0100 Subject: [PATCH] Adds strlen as a builtin function --- 0-lang0py/lang0py.py | 5 ++++ 1-lang0py/lang0py.lang0 | 5 ++++ 2-lang0c/lang0c.lang0 | 14 +++++++++++ README.md | 4 ++++ tests/test_stdlib_functions/test_add.lang0 | 11 --------- .../test_strlen.exp.stdout | 4 ++++ tests/test_stdlib_functions/test_strlen.lang0 | 23 +++++++++++++++++++ 7 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 tests/test_stdlib_functions/test_strlen.exp.stdout create mode 100644 tests/test_stdlib_functions/test_strlen.lang0 diff --git a/0-lang0py/lang0py.py b/0-lang0py/lang0py.py index f4c5a99..cea3e4c 100644 --- a/0-lang0py/lang0py.py +++ b/0-lang0py/lang0py.py @@ -475,6 +475,9 @@ def emitheader(): emitln(" sys.stderr.flush()") emitln(" exit(1)") emitln("") + emitln("def __strlen(a: str) -> str:") + emitln(" return str(len(a))") + emitln("") emitln("# ### END OF RUNTIME ### #") emitln("") @@ -518,6 +521,8 @@ def main(): mapsetkey("REGISTERID", "stdincolno", "__stdincolno") mapsetkey("FUNCREG", "stdinlineno", "1") mapsetkey("REGISTERID", "stdinlineno", "__stdinlineno") + mapsetkey("FUNCREG", "strlen", "1") + mapsetkey("REGISTERID", "strlen", "__strlen") while True: if eof == peek(): diff --git a/1-lang0py/lang0py.lang0 b/1-lang0py/lang0py.lang0 index 0a207e4..abea5db 100644 --- a/1-lang0py/lang0py.lang0 +++ b/1-lang0py/lang0py.lang0 @@ -534,6 +534,9 @@ emitheader: emitln " sys.stderr.flush()" emitln " exit(1)" emitln "" + emitln "def __strlen(a: str) -> str:" + emitln " return str(len(a))" + emitln "" emitln "# ### END OF RUNTIME ### #" emitln "" / @@ -579,6 +582,8 @@ main: mapsetkey "REGISTERID" "stdincolno" "__stdincolno" mapsetkey "FUNCREG" "stdinlineno" "1" mapsetkey "REGISTERID" "stdinlineno" "__stdinlineno" + mapsetkey "FUNCREG" "strlen" "1" + mapsetkey "REGISTERID" "strlen" "__strlen" forever diff --git a/2-lang0c/lang0c.lang0 b/2-lang0c/lang0c.lang0 index edb1aaa..a297535 100644 --- a/2-lang0c/lang0c.lang0 +++ b/2-lang0c/lang0c.lang0 @@ -798,6 +798,18 @@ emitheader: emitln ";" emitln "}" emitln "" + emitln "char * __strlen(char * inp)" + emitln "{" + emitln " char * buffer = malloc(20);" + emitln " size_t len = strlen(inp);" + emit " snprintf(buffer, 20, " + emit quote + emit "%zu" + emit quote + emitln ", len);" + emitln " return buffer;" + emitln "}" + emitln "" emitln "// ### END OF RUNTIME ### //" emitln "" return @@ -852,6 +864,8 @@ main: mapsetkey "REGISTERID" "stdincolno" "__stdincolno" mapsetkey "FUNCREG" "stdinlineno" "1" mapsetkey "REGISTERID" "stdinlineno" "__stdinlineno" + mapsetkey "FUNCREG" "strlen" "1" + mapsetkey "REGISTERID" "strlen" "__strlen" forever calc char peek diff --git a/README.md b/README.md index 24a3656..7d66304 100644 --- a/README.md +++ b/README.md @@ -194,6 +194,10 @@ Returns the column number for stdin (starting at 1) Returns the line number for stdin (starting at 1) +#### strlen a + +Returns a string with the length of a. + ### Typing Every variable is of type string. Every function gets a number of strings as output, and returns another string. diff --git a/tests/test_stdlib_functions/test_add.lang0 b/tests/test_stdlib_functions/test_add.lang0 index 0b63293..d7721df 100644 --- a/tests/test_stdlib_functions/test_add.lang0 +++ b/tests/test_stdlib_functions/test_add.lang0 @@ -1,14 +1,3 @@ -func tst a b: - declare var - calc var add a b - emit a - emit " + " - emit b - emit " = " - emit var - emit eol -/ - main: declare var diff --git a/tests/test_stdlib_functions/test_strlen.exp.stdout b/tests/test_stdlib_functions/test_strlen.exp.stdout new file mode 100644 index 0000000..3daeb47 --- /dev/null +++ b/tests/test_stdlib_functions/test_strlen.exp.stdout @@ -0,0 +1,4 @@ +strlen()=0 +strlen()=1 +strlen()=1 +strlen()=8 diff --git a/tests/test_stdlib_functions/test_strlen.lang0 b/tests/test_stdlib_functions/test_strlen.lang0 new file mode 100644 index 0000000..98dbe7d --- /dev/null +++ b/tests/test_stdlib_functions/test_strlen.lang0 @@ -0,0 +1,23 @@ +main: + declare var + + calc var strlen "" + emit "strlen()=" + emit var + emit eol + + calc var strlen "0" + emit "strlen()=" + emit var + emit eol + + calc var strlen "1" + emit "strlen()=" + emit var + emit eol + + calc var strlen "abcdefgh" + emit "strlen()=" + emit var + emit eol +/