From 5e7866f33d3699603192d82244062d797ae194f9 Mon Sep 17 00:00:00 2001 From: ceriel Date: Tue, 31 Mar 1987 12:14:08 +0000 Subject: [PATCH] Initial revision --- include/occam/dec.ocm | 62 ++++++++++++++++++++++++++++++++++++++++ include/occam/printd.ocm | 36 +++++++++++++++++++++++ include/occam/prints.ocm | 40 ++++++++++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 include/occam/dec.ocm create mode 100644 include/occam/printd.ocm create mode 100644 include/occam/prints.ocm diff --git a/include/occam/dec.ocm b/include/occam/dec.ocm new file mode 100644 index 00000000..352ef46d --- /dev/null +++ b/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] +: diff --git a/include/occam/printd.ocm b/include/occam/printd.ocm new file mode 100644 index 00000000..2e806509 --- /dev/null +++ b/include/occam/printd.ocm @@ -0,0 +1,36 @@ +proc printd(chan out, value fmt[], d)= +-- Like fprintf(out, fmt, d), with only %d or %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 +: diff --git a/include/occam/prints.ocm b/include/occam/prints.ocm new file mode 100644 index 00000000..3596f22b --- /dev/null +++ b/include/occam/prints.ocm @@ -0,0 +1,40 @@ +proc prints(chan out, value fmt[], str[]) = +-- Like fprintf(out, fmt, str), with only %s or %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 +: