1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- -- 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]
- :
|