First draft of a real README for the VVS stdlib.
[vvhitespace] / stdlib / string.pvvs
CommitLineData
48f88489
AT
1@ (c) 2020 Aaron Taylor <ataylor at subgeniuskitty dot com>
2@ See LICENSE.txt file for copyright and license details.
3
ae1f85a1
AT
4#ifndef VVS_STDLIB_STRING
5#define VVS_STDLIB_STRING
6
7@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
8@ Name:
9@ strlen (100000)
10@ Description:
11@ Counts number of words in a null-terminated string.
12@ Returned number does not include the null-terminator.
13@ Call Stack:
14@ pointer to first character <-- TOS
15@ Return Stack:
16@ number of words in string <-- TOS
17@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
18NSSVTSSSSSN | Mark: 100000 (strlen)
19
20@ Create a length counter.
21SSSSN | PUSH 0
22SNT | SWAP
23
24@ Increment the counter (and pointer) on each pass through the loop.
25NSSVSSTSSSSSSSSSSSSSN | Mark: 00100000 00000000
26SNS | DUP
27TTT | LOAD
28NTSSSTSSSSSSSSSSSSTN | BRZ > 00100000 00000001
29SNT | SWAP
30SSSTN | PUSH 1
31TSSS | ADD
32SNT | SWAP
33SSSTN | PUSH 1
34TSSS | ADD
35NSNSSTSSSSSSSSSSSSSN | JMP > 00100000 00000000
36
37@ Clean up and return.
38NSSVSSTSSSSSSSSSSSSTN | Mark: 00100000 00000001
39SNN | DROP
40NTN | RTS
41
0e0d0a4a
AT
42@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
43@ Name:
44@ isdigit (100001)
45@ Description:
46@ Tests 'character' on stack. Is it an ASCII number?
47@ Returns 1 or 0 representing True/False.
48@ Call Stack:
49@ character <-- TOS
50@ Return Stack:
51@ 1 or 0 <-- TOS
52@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
53NSSVTSSSSTN | Mark: 100001 (isdigit)
54
55SSSSSTTSSSSN | PUSH 48 (ASCII '0')
56TSST | SUBTRACT
57SNS | DUP
58NTTSSTSSSSTSSSSSSSSN | BMI > 00100001 00000000 (not digit)
59SNS | DUP
60SSSTSTSN | PUSH 10
61TSST | SUBTRACT
62NTTSSTSSSSTSSSSSSSTN | BMI > 00100001 00000001 (is digit)
63
64NSSVSSTSSSSTSSSSSSSSN | Mark: 00100001 00000000 (not digit)
65SNN | DROP
66SSSSN | PUSH 0
67NTN | RTS
68
69NSSVSSTSSSSTSSSSSSSTN | Mark: 00100001 00000001 (is digit)
70SNN | DROP
71SSSTN | PUSH 1
72NTN | RTS
73
fada5085
AT
74@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
75@ Name:
76@ get_user_string
77@ Description:
78@ Read one line of user input or read buffer_size characters, whichever comes
79@ first, and store at buffer_address.
80@ Appends null terminator to end of string.
81@ Call Stack:
82@ buffer_size (>0)
83@ buffer_address <-- TOS
84@ Return Stack:
85@ <empty>
86@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
87#include <stack.pvvs>
88NSSVTSSSTSN | MARK: 100010 (get_user_string)
89
90@ Verify we were handed a plausible buffer size.
91SNT | SWAP
92SNS | DUP
93NTSSSTSSSTSSSSSSSSSN | BRZ > 00100010 00000000 (get_user_string:bad_buffer_size)
94SNS | DUP
95NTTSSTSSSTSSSSSSSSSN | BMI > 00100010 00000000 (get_user_string:bad_buffer_size)
96SNT | SWAP
97
98@ Push an offset counter on to the stack for use inside the loop.
99SSSSN | PUSH 0
100
101@ Get one character from user on each pass through this loop.
102@ TOS> offset, buffer_addr, buffer_size
103NSSVSSTSSSTSSSSSSSSTN | MARK: 00100010 00000001 (get_user_string:main_loop)
104@ Have we reached the end of the buffer?
105SSSTTN | PUSH 3
106NSTTTSSN | JSR > 1100 (deepdup)
107SSSTSN | PUSH 2
108NSTTTSSN | JSR > 1100 (deepdup)
109TSST | SUBTRACT
110SSSTN | PUSH 1
111TSST | SUBTRACT
112NTSSSTSSSTSSSSSSSTTN | BRZ > 00100010 00000011 (get_user_string:end_of_buffer)
113@ Get a character, store it in the buffer, and echo it back to user.
114SNS | DUP
115SSSTTN | PUSH 3
116NSTTTSSN | JSR > 1100 (deepdup)
117TSSS | ADD
118SNS | DUP
119TNTS | GETCHAR
120TTT | LOAD
121SNS | DUP (for later testing)
122TNSS | PUTCHAR
123@ Did the user press ENTER?
124SSSTSTSN | PUSH 10 (ASCII '\n')
125TSST | SUBTRACT
126NTSSSTSSSTSSSSSSSTSN | BRZ > 00100010 00000010 (get_user_string:end_of_line)
127@ User did not press ENTER. Increment offset and loop again.
128SSSTN | PUSH 1
129TSSS | ADD
130NSNSSTSSSTSSSSSSSSTN | JMP > 00100010 00000001 (get_user_string:main_loop)
131
132NSSVSSTSSSTSSSSSSSTSN | MARK: 00100010 00000010 (get_user_string:end_of_line)
133TSSS | ADD
134SSSSN | PUSH 0 (ASCII '\0')
135TTS | STORE
136SNN | DROP
137NTN | RTS
138
139NSSVSSTSSSTSSSSSSSTTN | MARK: 00100010 00000011 (get_user_string:end_of_buffer)
140SNN | DROP
141TSSS | ADD
142SSSTN | PUSH 1
143TSST | SUBTRACT
144SSSSN | PUSH 0 (ASCII '\0')
145TTS | STORE
146NTN | RTS
147
148NSSVSSTSSSTSSSSSSSSSN | MARK: 00100010 00000000 (get_user_string:bad_buffer_size)
149SNN | DROP
150SNN | DROP
151NNN | DIE
152
ae1f85a1 153#endif