#ifndef VVS_STDLIB_STRING #define VVS_STDLIB_STRING @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ strlen (100000) @ Description: @ Counts number of words in a null-terminated string. @ Returned number does not include the null-terminator. @ Call Stack: @ pointer to first character <-- TOS @ Return Stack: @ number of words in string <-- TOS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTSSSSSN | Mark: 100000 (strlen) @ Create a length counter. SSSSN | PUSH 0 SNT | SWAP @ Increment the counter (and pointer) on each pass through the loop. NSSVSSTSSSSSSSSSSSSSN | Mark: 00100000 00000000 SNS | DUP TTT | LOAD NTSSSTSSSSSSSSSSSSTN | BRZ > 00100000 00000001 SNT | SWAP SSSTN | PUSH 1 TSSS | ADD SNT | SWAP SSSTN | PUSH 1 TSSS | ADD NSNSSTSSSSSSSSSSSSSN | JMP > 00100000 00000000 @ Clean up and return. NSSVSSTSSSSSSSSSSSSTN | Mark: 00100000 00000001 SNN | DROP NTN | RTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ isdigit (100001) @ Description: @ Tests 'character' on stack. Is it an ASCII number? @ Returns 1 or 0 representing True/False. @ Call Stack: @ character <-- TOS @ Return Stack: @ 1 or 0 <-- TOS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTSSSSTN | Mark: 100001 (isdigit) SSSSSTTSSSSN | PUSH 48 (ASCII '0') TSST | SUBTRACT SNS | DUP NTTSSTSSSSTSSSSSSSSN | BMI > 00100001 00000000 (not digit) SNS | DUP SSSTSTSN | PUSH 10 TSST | SUBTRACT NTTSSTSSSSTSSSSSSSTN | BMI > 00100001 00000001 (is digit) NSSVSSTSSSSTSSSSSSSSN | Mark: 00100001 00000000 (not digit) SNN | DROP SSSSN | PUSH 0 NTN | RTS NSSVSSTSSSSTSSSSSSSTN | Mark: 00100001 00000001 (is digit) SNN | DROP SSSTN | PUSH 1 NTN | RTS #endif