62 lines
		
	
	
	
		
			1,023 B
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
	
		
			1,023 B
		
	
	
	
		
			Text
		
	
	
	
	
	
| -- 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]		
 | |
| :
 |