Browse Source

Initial revision

ceriel 37 years ago
parent
commit
5e7866f33d
3 changed files with 138 additions and 0 deletions
  1. 62 0
      include/occam/dec.ocm
  2. 36 0
      include/occam/printd.ocm
  3. 40 0
      include/occam/prints.ocm

+ 62 - 0
include/occam/dec.ocm

@@ -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]		
+:

+ 36 - 0
include/occam/printd.ocm

@@ -0,0 +1,36 @@
+proc printd(chan out, value fmt[], d)=
+-- Like fprintf(out, fmt, d), with only %d or %<width>d in fmt[]
+
+	def otherwise=true:
+	var i, len:
+	seq
+		len:=fmt[byte 0]
+		i:=1
+
+		while i<=len
+			if
+				fmt[byte i] = '%'
+					var w:
+					seq
+						i:=i+1
+						w:=0
+						while (i<=len) and ('0'<=fmt[byte i]) and (fmt[byte i]<='9')
+							seq
+								w:=(w*10)+(fmt[byte i]-'0')
+								i:=i+1
+						if
+							i<=len
+								var key:
+								seq
+									key:=fmt[byte i]
+									if
+										key='d'
+											decout(out, d, w)
+										otherwise
+											out ! key
+									i:=i+1
+				otherwise
+					seq
+						out ! fmt[byte i]
+						i:=i+1
+:

+ 40 - 0
include/occam/prints.ocm

@@ -0,0 +1,40 @@
+proc prints(chan out, value fmt[], str[]) =
+-- Like fprintf(out, fmt, str), with only %s or %<width>s in fmt[]
+
+	def otherwise=true:
+	var i, len:
+	seq
+		len:=fmt[byte 0]
+		i:=1
+
+		while i<=len
+			if
+				fmt[byte i] = '%'
+					var w:
+					seq
+						i:=i+1
+						w:=0
+						while (i<=len) and ('0'<=fmt[byte i]) and (fmt[byte i]<='9')
+							seq
+								w:=(w*10)+(fmt[byte i]-'0')
+								i:=i+1
+						if
+							i<=len
+								var key:
+								seq
+									key:=fmt[byte i]
+									if
+										key='s'
+											seq
+												seq i=[0 for w-str[byte 0]]
+													out ! ' '
+												seq i=[0 for str[byte 0]]
+													out ! str[byte i]
+										otherwise
+											out ! key
+									i:=i+1
+				otherwise
+					seq
+						out ! fmt[byte i]
+						i:=i+1
+: