aboutsummaryrefslogtreecommitdiff
path: root/unix/boot/spp/rpp/rpprat/evalr.r
diff options
context:
space:
mode:
Diffstat (limited to 'unix/boot/spp/rpp/rpprat/evalr.r')
-rw-r--r--unix/boot/spp/rpp/rpprat/evalr.r56
1 files changed, 56 insertions, 0 deletions
diff --git a/unix/boot/spp/rpp/rpprat/evalr.r b/unix/boot/spp/rpp/rpprat/evalr.r
new file mode 100644
index 00000000..3752bcd4
--- /dev/null
+++ b/unix/boot/spp/rpp/rpprat/evalr.r
@@ -0,0 +1,56 @@
+#-h- evalr 1126 local 12/01/80 15:54:06
+# evalr - expand args i through j: evaluate builtin or push back defn
+ include defs
+
+ subroutine evalr (argstk, i, j)
+ integer argstk (ARGSIZE), i, j
+
+ include COMMON_BLOCKS
+
+ integer argno, k, m, n, t, td, in_string, delim
+ external index
+ integer index, length
+
+ string digits '0123456789'
+
+ t = argstk (i)
+ td = evalst (t)
+ if (td == MACTYPE)
+ call domac (argstk, i, j)
+ else if (td == INCTYPE)
+ call doincr (argstk, i, j)
+ else if (td == SUBTYPE)
+ call dosub (argstk, i, j)
+ else if (td == IFTYPE)
+ call doif (argstk, i, j)
+ else if (td == ARITHTYPE)
+ call doarth (argstk, i, j)
+ else {
+ in_string = NO
+ for (k = t + length (evalst (t)) - 1; k > t; k = k - 1)
+ if (evalst(k) == SQUOTE | evalst(k) == DQUOTE) {
+ if (in_string == NO) {
+ delim = evalst(k)
+ in_string = YES
+ }
+ else
+ in_string = NO
+ call putbak (evalst(k))
+ }
+ # Don't expand $arg if in a string.
+ else if (evalst(k-1) != ARGFLAG | in_string == YES)
+ call putbak (evalst (k))
+ else {
+ argno = index (digits, evalst (k)) - 1
+ if (argno >= 0 & argno < j - i) {
+ n = i + argno + 1
+ m = argstk (n)
+ call pbstr (evalst (m))
+ }
+ k = k - 1 # skip over $
+ }
+ if (k == t) # do last character
+ call putbak (evalst (k))
+ }
+ return
+ end