@ (c) 2020 Aaron Taylor <ataylor at subgeniuskitty dot com>
@ See LICENSE.txt file for copyright and license details.
#ifndef VVS_STDLIB_STRING
#define VVS_STDLIB_STRING
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Counts number of words in a null-terminated string.
@ Returned number does not include the null-terminator.
@ pointer to first character <-- TOS
@ number of words in string <-- TOS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTSSSSSN | Mark: 100000 (strlen)
@ Create a length counter.
@ Increment the counter (and pointer) on each pass through the loop.
NSSVSSTSSSSSSSSSSSSSN | Mark: 00100000 00000000
NTSSSTSSSSSSSSSSSSTN | BRZ > 00100000 00000001
NSNSSTSSSSSSSSSSSSSN | JMP > 00100000 00000000
NSSVSSTSSSSSSSSSSSSTN | Mark: 00100000 00000001
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Tests 'character' on stack. Is it an ASCII number?
@ Returns 1 or 0 representing True/False.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTSSSSTN | Mark: 100001 (isdigit)
SSSSSTTSSSSN | PUSH 48 (ASCII '0')
NTTSSTSSSSTSSSSSSSSN | BMI > 00100001 00000000 (not digit)
NTTSSTSSSSTSSSSSSSTN | BMI > 00100001 00000001 (is digit)
NSSVSSTSSSSTSSSSSSSSN | Mark: 00100001 00000000 (not digit)
NSSVSSTSSSSTSSSSSSSTN | Mark: 00100001 00000001 (is digit)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTSSSTSN | MARK: 100010 (get_user_string)
@ Verify we were handed a plausible buffer size.
NTSSSTSSSTSSSSSSSSSN | BRZ > 00100010 00000000 (get_user_string:bad_buffer_size)
NTTSSTSSSTSSSSSSSSSN | BMI > 00100010 00000000 (get_user_string:bad_buffer_size)
@ Push an offset counter on to the stack for use inside the loop.
@ 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?
NSTTTSSN | JSR > 1100 (deepdup)
NSTTTSSN | JSR > 1100 (deepdup)
NTSSSTSSSTSSSSSSSTTN | BRZ > 00100010 00000011 (get_user_string:end_of_buffer)
@ Get a character, store it in the buffer, and echo it back to user.
NSTTTSSN | JSR > 1100 (deepdup)
SNS | DUP (for later testing)
@ Did the user press ENTER?
SSSTSTSN | PUSH 10 (ASCII '\n')
NTSSSTSSSTSSSSSSSTSN | BRZ > 00100010 00000010 (get_user_string:end_of_line)
@ User did not press ENTER. Increment offset and loop again.
NSNSSTSSSTSSSSSSSSTN | JMP > 00100010 00000001 (get_user_string:main_loop)
NSSVSSTSSSTSSSSSSSTSN | MARK: 00100010 00000010 (get_user_string:end_of_line)
SSSSN | PUSH 0 (ASCII '\0')
NSSVSSTSSSTSSSSSSSTTN | MARK: 00100010 00000011 (get_user_string:end_of_buffer)
SSSSN | PUSH 0 (ASCII '\0')
NSSVSSTSSSTSSSSSSSSSN | MARK: 00100010 00000000 (get_user_string:bad_buffer_size)