Pristine Ack-5.5
[Ack-5.5.git] / include / occam / dec.ocm
1 -- decin/decout - Decimal i/o
2
3 proc decin(chan in, var d, c)=
4 -- Reads a decimal number from input into d.  c is used as the first input
5 -- character, and it contains the character just after the decimal number
6 -- when decin exits.
7
8         var neg:
9         seq
10                 while (c='*s') or (c='*t') or (c='*n')
11                         in ? c
12                 if
13                         (c='-') or (c='+')
14                                 seq
15                                         neg:=(c='-')
16                                         in ? c
17                         true
18                                 neg:=false
19                 d:=0
20                 while ('0'<=c) and (c<='9')
21                         seq
22                                 d:=(d*10)+(c-'0')
23                                 in ? c
24                 if
25                         neg
26                                 d:= -d
27 :
28 proc decout(chan out, value d, w)=
29 -- Sends d to channel out in decimal on a field of w spaces.  It is just like
30 -- fprintf(out, "%*d", w, d);
31
32         var dec[BYTE 12], di, dd, d0, neg:
33         seq
34                 di:=0
35                 if
36                         d<0
37                                 seq
38                                         neg:=true
39                                         dd:= -d
40                         d>=0
41                                 seq
42                                         neg:=false
43                                         dd:=d
44                 d0:=1
45                 while d0<>0
46                         seq
47                                 dec[BYTE di]:=(dd\10)+'0'
48                                 di:=di+1
49                                 dd:=dd/10
50                                 d0:=dd
51                 if
52                         neg
53                                 seq
54                                         dec[BYTE di]:='-'
55                                         di:=di+1
56                 seq i=[0 for w-di]
57                         out ! '*s'
58                 while di<>0
59                         seq
60                                 di:=di-1
61                                 out ! dec[BYTE di]              
62 :