aboutsummaryrefslogtreecommitdiff
path: root/unix/boot/spp/rpp/rpprat/brknxt.r
diff options
context:
space:
mode:
Diffstat (limited to 'unix/boot/spp/rpp/rpprat/brknxt.r')
-rw-r--r--unix/boot/spp/rpp/rpprat/brknxt.r45
1 files changed, 45 insertions, 0 deletions
diff --git a/unix/boot/spp/rpp/rpprat/brknxt.r b/unix/boot/spp/rpp/rpprat/brknxt.r
new file mode 100644
index 00000000..154dc31e
--- /dev/null
+++ b/unix/boot/spp/rpp/rpprat/brknxt.r
@@ -0,0 +1,45 @@
+#-h- brknxt 1077 local 12/01/80 15:53:46
+# brknxt - generate code for break n and next n; n = 1 is default
+ include defs
+
+ subroutine brknxt (sp, lextyp, labval, token)
+ integer labval (MAXSTACK), lextyp (MAXSTACK), sp, token
+
+ integer i, n
+ integer alldig, ctoi
+
+ character t, ptoken (MAXTOK)
+ character gnbtok
+
+ include COMMON_BLOCKS
+
+ n = 0
+ t = gnbtok (ptoken, MAXTOK)
+ if (alldig (ptoken) == YES) { # have break n or next n
+ i = 1
+ n = ctoi (ptoken, i) - 1
+ }
+ else if (t != SEMICOL) # default case
+ call pbstr (ptoken)
+ for (i = sp; i > 0; i = i - 1)
+ if (lextyp (i) == LEXWHILE | lextyp (i) == LEXDO
+ | lextyp (i) == LEXFOR | lextyp (i) == LEXREPEAT) {
+ if (n > 0) {
+ n = n - 1
+ next # seek proper level
+ }
+ else if (token == LEXBREAK)
+ call outgo (labval (i) + 1)
+ else
+ call outgo (labval (i))
+ xfer = YES
+ return
+ }
+
+ if (token == LEXBREAK)
+ call synerr ("illegal break.")
+ else
+ call synerr ("illegal next.")
+
+ return
+ end