|
@@ -0,0 +1,62 @@
|
|
|
+-- decin/decout - Decimal i/o
|
|
|
+
|
|
|
+proc decin(chan in, var d, c)=
|
|
|
+-- Reads a decimal number from input into d. c is used as the first input
|
|
|
+-- character, and it contains the character just after the decimal number
|
|
|
+-- when decin exits.
|
|
|
+
|
|
|
+ var neg:
|
|
|
+ seq
|
|
|
+ while (c='*s') or (c='*t') or (c='*n')
|
|
|
+ in ? c
|
|
|
+ if
|
|
|
+ (c='-') or (c='+')
|
|
|
+ seq
|
|
|
+ neg:=(c='-')
|
|
|
+ in ? c
|
|
|
+ true
|
|
|
+ neg:=false
|
|
|
+ d:=0
|
|
|
+ while ('0'<=c) and (c<='9')
|
|
|
+ seq
|
|
|
+ d:=(d*10)+(c-'0')
|
|
|
+ in ? c
|
|
|
+ if
|
|
|
+ neg
|
|
|
+ d:= -d
|
|
|
+:
|
|
|
+proc decout(chan out, value d, w)=
|
|
|
+-- Sends d to channel out in decimal on a field of w spaces. It is just like
|
|
|
+-- fprintf(out, "%*d", w, d);
|
|
|
+
|
|
|
+ var dec[BYTE 12], di, dd, d0, neg:
|
|
|
+ seq
|
|
|
+ di:=0
|
|
|
+ if
|
|
|
+ d<0
|
|
|
+ seq
|
|
|
+ neg:=true
|
|
|
+ dd:= -d
|
|
|
+ d>=0
|
|
|
+ seq
|
|
|
+ neg:=false
|
|
|
+ dd:=d
|
|
|
+ d0:=1
|
|
|
+ while d0<>0
|
|
|
+ seq
|
|
|
+ dec[BYTE di]:=(dd\10)+'0'
|
|
|
+ di:=di+1
|
|
|
+ dd:=dd/10
|
|
|
+ d0:=dd
|
|
|
+ if
|
|
|
+ neg
|
|
|
+ seq
|
|
|
+ dec[BYTE di]:='-'
|
|
|
+ di:=di+1
|
|
|
+ seq i=[0 for w-di]
|
|
|
+ out ! '*s'
|
|
|
+ while di<>0
|
|
|
+ seq
|
|
|
+ di:=di-1
|
|
|
+ out ! dec[BYTE di]
|
|
|
+:
|