From: Aaron Taylor Date: Mon, 30 Mar 2020 03:35:47 +0000 (-0700) Subject: Added get_user_string to stdlib. X-Git-Url: http://git.subgeniuskitty.com/vvhitespace/.git/commitdiff_plain/fada5085eb1308ee7ad1a3fe53f3ef987e877ed5 Added get_user_string to stdlib. --- diff --git a/stdlib/README.md b/stdlib/README.md index ebf8323..efa3220 100644 --- a/stdlib/README.md +++ b/stdlib/README.md @@ -55,6 +55,7 @@ header comment for each function to learn the call and return stack. 100xxx - string functions 100000 ----- strlen (string.pvvs) 100001 ----- isdigit (string.pvvs) + 100010 ----- get_user_string (string.pvvs) 101xxx - logic functions 101000 ----- not (logic.pvvs) 101001 ----- and (logic.pvvs) diff --git a/stdlib/string.pvvs b/stdlib/string.pvvs index 8b68e22..e3135c2 100644 --- a/stdlib/string.pvvs +++ b/stdlib/string.pvvs @@ -68,4 +68,83 @@ SNN | DROP SSSTN | PUSH 1 NTN | RTS +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ Name: +@ get_user_string +@ Description: +@ Read one line of user input or read buffer_size characters, whichever comes +@ first, and store at buffer_address. +@ Appends null terminator to end of string. +@ Call Stack: +@ buffer_size (>0) +@ buffer_address <-- TOS +@ Return Stack: +@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#include +NSSVTSSSTSN | MARK: 100010 (get_user_string) + +@ Verify we were handed a plausible buffer size. +SNT | SWAP +SNS | DUP +NTSSSTSSSTSSSSSSSSSN | BRZ > 00100010 00000000 (get_user_string:bad_buffer_size) +SNS | DUP +NTTSSTSSSTSSSSSSSSSN | BMI > 00100010 00000000 (get_user_string:bad_buffer_size) +SNT | SWAP + +@ Push an offset counter on to the stack for use inside the loop. +SSSSN | PUSH 0 + +@ Get one character from user on each pass through this loop. +@ TOS> offset, buffer_addr, buffer_size +NSSVSSTSSSTSSSSSSSSTN | MARK: 00100010 00000001 (get_user_string:main_loop) +@ Have we reached the end of the buffer? +SSSTTN | PUSH 3 +NSTTTSSN | JSR > 1100 (deepdup) +SSSTSN | PUSH 2 +NSTTTSSN | JSR > 1100 (deepdup) +TSST | SUBTRACT +SSSTN | PUSH 1 +TSST | SUBTRACT +NTSSSTSSSTSSSSSSSTTN | BRZ > 00100010 00000011 (get_user_string:end_of_buffer) +@ Get a character, store it in the buffer, and echo it back to user. +SNS | DUP +SSSTTN | PUSH 3 +NSTTTSSN | JSR > 1100 (deepdup) +TSSS | ADD +SNS | DUP +TNTS | GETCHAR +TTT | LOAD +SNS | DUP (for later testing) +TNSS | PUTCHAR +@ Did the user press ENTER? +SSSTSTSN | PUSH 10 (ASCII '\n') +TSST | SUBTRACT +NTSSSTSSSTSSSSSSSTSN | BRZ > 00100010 00000010 (get_user_string:end_of_line) +@ User did not press ENTER. Increment offset and loop again. +SSSTN | PUSH 1 +TSSS | ADD +NSNSSTSSSTSSSSSSSSTN | JMP > 00100010 00000001 (get_user_string:main_loop) + +NSSVSSTSSSTSSSSSSSTSN | MARK: 00100010 00000010 (get_user_string:end_of_line) +TSSS | ADD +SSSSN | PUSH 0 (ASCII '\0') +TTS | STORE +SNN | DROP +NTN | RTS + +NSSVSSTSSSTSSSSSSSTTN | MARK: 00100010 00000011 (get_user_string:end_of_buffer) +SNN | DROP +TSSS | ADD +SSSTN | PUSH 1 +TSST | SUBTRACT +SSSSN | PUSH 0 (ASCII '\0') +TTS | STORE +NTN | RTS + +NSSVSSTSSSTSSSSSSSSSN | MARK: 00100010 00000000 (get_user_string:bad_buffer_size) +SNN | DROP +SNN | DROP +NNN | DIE + #endif diff --git a/stdlib_tests/4003_get_user_string.pvvs b/stdlib_tests/4003_get_user_string.pvvs new file mode 100644 index 0000000..3f170a7 --- /dev/null +++ b/stdlib_tests/4003_get_user_string.pvvs @@ -0,0 +1,32 @@ +SSSTN | PUSH 1 (buffer_size) +SSSTSSSSSSSSSSSSN | PUSH 0x1000 (buffer_address) +NSTTSSSTSN | JSR > 100010 (get_user_string) +SSSTSSSSSSSSSSSSN | PUSH 0x1000 (buffer_address) +NSTTSSSSSN | JSR > 100000 (strlen) +NSTTTTTSTN | JSR > 111101 (debug:printsignednumber) + +SSSTSN | PUSH 2 (buffer_size) +SSSTSSSSSSSSSSSSN | PUSH 0x1000 (buffer_address) +NSTTSSSTSN | JSR > 100010 (get_user_string) +SSSTSSSSSSSSSSSSN | PUSH 0x1000 (buffer_address) +NSTTSSSSSN | JSR > 100000 (strlen) +NSTTTTTSTN | JSR > 111101 (debug:printsignednumber) + +SSSTSSN | PUSH 4 (buffer_size) +SSSTSSSSSSSSSSSSN | PUSH 0x1000 (buffer_address) +NSTTSSSTSN | JSR > 100010 (get_user_string) +SSSTSSSSSSSSSSSSN | PUSH 0x1000 (buffer_address) +NSTTSSSSSN | JSR > 100000 (strlen) +NSTTTTTSTN | JSR > 111101 (debug:printsignednumber) + +SSSTSSN | PUSH 4 (buffer_size) +SSSTSSSSSSSSSSSSN | PUSH 0x1000 (buffer_address) +NSTTSSSTSN | JSR > 100010 (get_user_string) +SSSTSSSSSSSSSSSSN | PUSH 0x1000 (buffer_address) +NSTTSSSSSN | JSR > 100000 (strlen) +NSTTTTTSTN | JSR > 111101 (debug:printsignednumber) + +NNN | DIE + +#include +#include diff --git a/stdlib_tests/vv_test.py b/stdlib_tests/vv_test.py index a10696f..34d8a26 100755 --- a/stdlib_tests/vv_test.py +++ b/stdlib_tests/vv_test.py @@ -42,6 +42,7 @@ tests = [ ['3006_xor', '', '+0+1+0-2-1'], ['4001_strlen', '', '+11'], ['4002_isdigit', '', '+0+1+1+0'], + ['4003_get_user_string', 'aas\nasdf', '+0a+1as\n+2asd+3'], ['5001_abs', '', '+1+1+0+0'], ['5002_random', '', ''], ['5003_gcd', '', '+0+4+4+3+3+3'],