Added test for all stdio.pvvs subroutines.
[vvhitespace] / stdlib / stdio.pvvs
index 539df7d..2b77d1d 100644 (file)
@@ -61,8 +61,8 @@ NTN                     | RTS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTSSTN               | Mark: 1001 (print number from stack)
 SNS                     | DUP
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTSSTN               | Mark: 1001 (print number from stack)
 SNS                     | DUP
-NSTTSSSSTSN             | JSR > 1000010
-NSTTSSSSTTN             | JSR > 1000011
+NSTTSSSSTSN             | JSR > 1000010 (printstacknumbersign)
+NSTTSSSSTTN             | JSR > 1000011 (printstacknumbermagnitude)
 NTN                     | RTS
 
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NTN                     | RTS
 
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@ -97,8 +97,17 @@ NTN                     | RTS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 #include <math.pvvs>
 NSSVTSSSSTTN            | Mark: 1000011 (print magnitude of number from stack)
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 #include <math.pvvs>
 NSSVTSSSSTTN            | Mark: 1000011 (print magnitude of number from stack)
-NSTTSSSTN               | JSR > 10001 (absolute value)
 
 
+@ Catch -(2^63) as a special case since its absolute value will overflow
+@ a twos-complement 64-bit word.
+SNS                     | DUP
+SSTTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSN | -(2^63)
+TSST                    | SUBTRACT
+NTSSTSSSSTTSSSSSSTSN    | BRZ > 01000011 00000010
+
+@ No special case applies. Prepare for computation by converting the number
+@ to absolute value and preparing a string on the stack.
+NSTTSSSTN               | JSR > 10001 (absolute value)
 SSSSN                   | PUSH ASCII '\0'
 SNT                     | SWAP
 
 SSSSN                   | PUSH ASCII '\0'
 SNT                     | SWAP
 
@@ -126,6 +135,12 @@ SNN                     | DROP
 NSTTSSSTSSN             | JSR > 1000100 (print string from stack)
 NTN                     | RTS
 
 NSTTSSSTSSN             | JSR > 1000100 (print string from stack)
 NTN                     | RTS
 
+@ Replace the number on the stack with its decimal ASCII representation.
+NSSVSTSSSSTTSSSSSSTSN   | BRZ > 01000011 00000010
+SNN                     | DROP
+A"-9223372036854775808"
+NSNSTSSSSTTSSSSSSSTN    | JMP > 01000011 00000001
+
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @ Name:
 @   printf
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @ Name:
 @   printf
@@ -154,8 +169,7 @@ NTN                     | RTS
 @ Return Stack:
 @   <empty>
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @ Return Stack:
 @   <empty>
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-#include <heap.pvvs>
-#include <string.pvvs>
+#include <stack.pvvs>
 NSSVTSSSN               | Mark: 1000 (printf)
 
 @ If the stack contains an empty string (i.e. just an ASCII '\0'), the next
 NSSVTSSSN               | Mark: 1000 (printf)
 
 @ If the stack contains an empty string (i.e. just an ASCII '\0'), the next
@@ -245,7 +259,7 @@ TSST                    | SUBTRACT
 NTSSSSSTSSSSSSSSTSSN    | BRZ > 00001000 00000100
 @ Check for ASCII '\t'
 SNS                     | DUP
 NTSSSSSTSSSSSSSSTSSN    | BRZ > 00001000 00000100
 @ Check for ASCII '\t'
 SNS                     | DUP
-SSSTSSTN                | PUSH ASCII '\t'
+SSSTTTSTSSN             | PUSH ASCII 't'
 TSST                    | SUBTRACT
 NTSSSSSTSSSSSSSSTSTN    | BRZ > 00001000 00000101
 @ No substitution necessary. Print literally.
 TSST                    | SUBTRACT
 NTSSSSSTSSSSSSSSTSTN    | BRZ > 00001000 00000101
 @ No substitution necessary. Print literally.