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