aboutsummaryrefslogtreecommitdiff
path: root/unix/boot/spp/rpp/rpprat/caslab.r
diff options
context:
space:
mode:
Diffstat (limited to 'unix/boot/spp/rpp/rpprat/caslab.r')
-rw-r--r--unix/boot/spp/rpp/rpprat/caslab.r48
1 files changed, 48 insertions, 0 deletions
diff --git a/unix/boot/spp/rpp/rpprat/caslab.r b/unix/boot/spp/rpp/rpprat/caslab.r
new file mode 100644
index 00000000..12d3c0da
--- /dev/null
+++ b/unix/boot/spp/rpp/rpprat/caslab.r
@@ -0,0 +1,48 @@
+include defs
+
+# caslab - get one case label
+
+integer function caslab (n, t)
+
+integer n, t
+character tok(MAXTOK)
+integer i, s, lev
+integer gnbtok, ctoi
+
+ t = gnbtok (tok, MAXTOK)
+ while (t == NEWLINE)
+ t = gnbtok (tok, MAXTOK)
+
+ if (t == EOF)
+ return (t)
+
+ for (lev=0; t == LPAREN; t = gnbtok (tok, MAXTOK))
+ lev = lev + 1
+
+ if (t == MINUS)
+ s = -1
+ else
+ s = +1
+ if (t == MINUS | t == PLUS)
+ t = gnbtok (tok, MAXTOK)
+
+ if (t != DIGIT)
+ goto 99
+ else {
+ i = 1
+ n = s * ctoi (tok, i)
+ }
+
+ for (t=gnbtok(tok,MAXTOK); t == RPAREN; t=gnbtok(tok,MAXTOK))
+ lev = lev - 1
+ if (lev != 0)
+ goto 99
+
+ while (t == NEWLINE)
+ t = gnbtok (tok, MAXTOK)
+
+ return
+
+ 99 call synerr ("Invalid case label.")
+ n = 0
+end