Added get_user_string to stdlib.
authorAaron Taylor <ataylor@subgeniuskitty.com>
Mon, 30 Mar 2020 03:35:47 +0000 (20:35 -0700)
committerAaron Taylor <ataylor@subgeniuskitty.com>
Mon, 30 Mar 2020 03:35:47 +0000 (20:35 -0700)
stdlib/README.md
stdlib/string.pvvs
stdlib_tests/4003_get_user_string.pvvs [new file with mode: 0644]
stdlib_tests/vv_test.py

index ebf8323..efa3220 100644 (file)
@@ -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)
          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)
          101xxx - logic functions
          101000 ----- not                           (logic.pvvs)
          101001 ----- and                           (logic.pvvs)
index 8b68e22..e3135c2 100644 (file)
@@ -68,4 +68,83 @@ SNN                     | DROP
 SSSTN                   | PUSH 1
 NTN                     | RTS
 
 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:
+@   <empty>
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+#include <stack.pvvs>
+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
 #endif
diff --git a/stdlib_tests/4003_get_user_string.pvvs b/stdlib_tests/4003_get_user_string.pvvs
new file mode 100644 (file)
index 0000000..3f170a7
--- /dev/null
@@ -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 <debug.pvvs>
+#include <string.pvvs>
index a10696f..34d8a26 100755 (executable)
@@ -42,6 +42,7 @@ tests = [
         ['3006_xor', '', '+0+1+0-2-1'],
         ['4001_strlen', '', '+11'],
         ['4002_isdigit', '', '+0+1+1+0'],
         ['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'],
         ['5001_abs', '', '+1+1+0+0'],
         ['5002_random', '', ''],
         ['5003_gcd', '', '+0+4+4+3+3+3'],