Commit | Line | Data |
---|---|---|
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 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
18 | NSSVTSSSSSN | Mark: 100000 (strlen) | |
19 | ||
20 | @ Create a length counter. | |
21 | SSSSN | PUSH 0 | |
22 | SNT | SWAP | |
23 | ||
24 | @ Increment the counter (and pointer) on each pass through the loop. | |
25 | NSSVSSTSSSSSSSSSSSSSN | Mark: 00100000 00000000 | |
26 | SNS | DUP | |
27 | TTT | LOAD | |
28 | NTSSSTSSSSSSSSSSSSTN | BRZ > 00100000 00000001 | |
29 | SNT | SWAP | |
30 | SSSTN | PUSH 1 | |
31 | TSSS | ADD | |
32 | SNT | SWAP | |
33 | SSSTN | PUSH 1 | |
34 | TSSS | ADD | |
35 | NSNSSTSSSSSSSSSSSSSN | JMP > 00100000 00000000 | |
36 | ||
37 | @ Clean up and return. | |
38 | NSSVSSTSSSSSSSSSSSSTN | Mark: 00100000 00000001 | |
39 | SNN | DROP | |
40 | NTN | 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 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
53 | NSSVTSSSSTN | Mark: 100001 (isdigit) | |
54 | ||
55 | SSSSSTTSSSSN | PUSH 48 (ASCII '0') | |
56 | TSST | SUBTRACT | |
57 | SNS | DUP | |
58 | NTTSSTSSSSTSSSSSSSSN | BMI > 00100001 00000000 (not digit) | |
59 | SNS | DUP | |
60 | SSSTSTSN | PUSH 10 | |
61 | TSST | SUBTRACT | |
62 | NTTSSTSSSSTSSSSSSSTN | BMI > 00100001 00000001 (is digit) | |
63 | ||
64 | NSSVSSTSSSSTSSSSSSSSN | Mark: 00100001 00000000 (not digit) | |
65 | SNN | DROP | |
66 | SSSSN | PUSH 0 | |
67 | NTN | RTS | |
68 | ||
69 | NSSVSSTSSSSTSSSSSSSTN | Mark: 00100001 00000001 (is digit) | |
70 | SNN | DROP | |
71 | SSSTN | PUSH 1 | |
72 | NTN | 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> | |
88 | NSSVTSSSTSN | MARK: 100010 (get_user_string) | |
89 | ||
90 | @ Verify we were handed a plausible buffer size. | |
91 | SNT | SWAP | |
92 | SNS | DUP | |
93 | NTSSSTSSSTSSSSSSSSSN | BRZ > 00100010 00000000 (get_user_string:bad_buffer_size) | |
94 | SNS | DUP | |
95 | NTTSSTSSSTSSSSSSSSSN | BMI > 00100010 00000000 (get_user_string:bad_buffer_size) | |
96 | SNT | SWAP | |
97 | ||
98 | @ Push an offset counter on to the stack for use inside the loop. | |
99 | SSSSN | PUSH 0 | |
100 | ||
101 | @ Get one character from user on each pass through this loop. | |
102 | @ TOS> offset, buffer_addr, buffer_size | |
103 | NSSVSSTSSSTSSSSSSSSTN | MARK: 00100010 00000001 (get_user_string:main_loop) | |
104 | @ Have we reached the end of the buffer? | |
105 | SSSTTN | PUSH 3 | |
106 | NSTTTSSN | JSR > 1100 (deepdup) | |
107 | SSSTSN | PUSH 2 | |
108 | NSTTTSSN | JSR > 1100 (deepdup) | |
109 | TSST | SUBTRACT | |
110 | SSSTN | PUSH 1 | |
111 | TSST | SUBTRACT | |
112 | NTSSSTSSSTSSSSSSSTTN | BRZ > 00100010 00000011 (get_user_string:end_of_buffer) | |
113 | @ Get a character, store it in the buffer, and echo it back to user. | |
114 | SNS | DUP | |
115 | SSSTTN | PUSH 3 | |
116 | NSTTTSSN | JSR > 1100 (deepdup) | |
117 | TSSS | ADD | |
118 | SNS | DUP | |
119 | TNTS | GETCHAR | |
120 | TTT | LOAD | |
121 | SNS | DUP (for later testing) | |
122 | TNSS | PUTCHAR | |
123 | @ Did the user press ENTER? | |
124 | SSSTSTSN | PUSH 10 (ASCII '\n') | |
125 | TSST | SUBTRACT | |
126 | NTSSSTSSSTSSSSSSSTSN | BRZ > 00100010 00000010 (get_user_string:end_of_line) | |
127 | @ User did not press ENTER. Increment offset and loop again. | |
128 | SSSTN | PUSH 1 | |
129 | TSSS | ADD | |
130 | NSNSSTSSSTSSSSSSSSTN | JMP > 00100010 00000001 (get_user_string:main_loop) | |
131 | ||
132 | NSSVSSTSSSTSSSSSSSTSN | MARK: 00100010 00000010 (get_user_string:end_of_line) | |
133 | TSSS | ADD | |
134 | SSSSN | PUSH 0 (ASCII '\0') | |
135 | TTS | STORE | |
136 | SNN | DROP | |
137 | NTN | RTS | |
138 | ||
139 | NSSVSSTSSSTSSSSSSSTTN | MARK: 00100010 00000011 (get_user_string:end_of_buffer) | |
140 | SNN | DROP | |
141 | TSSS | ADD | |
142 | SSSTN | PUSH 1 | |
143 | TSST | SUBTRACT | |
144 | SSSSN | PUSH 0 (ASCII '\0') | |
145 | TTS | STORE | |
146 | NTN | RTS | |
147 | ||
148 | NSSVSSTSSSTSSSSSSSSSN | MARK: 00100010 00000000 (get_user_string:bad_buffer_size) | |
149 | SNN | DROP | |
150 | SNN | DROP | |
151 | NNN | DIE | |
152 | ||
ae1f85a1 | 153 | #endif |