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