Adds strlen as a builtin function

This commit is contained in:
Johan B.W. de Vries 2026-01-25 12:47:58 +01:00
parent 1be24ef771
commit a282292604
7 changed files with 55 additions and 11 deletions

View File

@ -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():

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -0,0 +1,4 @@
strlen()=0
strlen()=1
strlen()=1
strlen()=8

View File

@ -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
/