|
|
1.1 root 1: #include "../h/rt.h"
2:
3: /*
4: * bal(c1,c2,c3,s,i,j) - find end of a balanced substring of s[i:j].
5: * Generates successive positions.
6: */
7:
8: Xbal(nargs, arg6, arg5, arg4, arg3, arg2, arg1, arg0)
9: int nargs;
10: struct descrip arg6, arg5, arg4, arg3, arg2, arg1, arg0;
11: {
12: register int i, j, cnt;
13: register c;
14: int t;
15: long l1, l2;
16: int *cs1, *cs2, *cs3;
17: int csbuf1[CSETSIZE], csbuf2[CSETSIZE], csbuf3[CSETSIZE];
18: char sbuf[MAXSTRING];
19: static int lpar[CSETSIZE] = /* '(' */
20: cset_display(0, 0, 0400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
21: static int rpar[CSETSIZE] = /* ')' */
22: cset_display(0, 0, 01000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
23:
24: /*
25: * c1 defaults to &cset; c2 defaults to '(' (lpar); c3 defaults to
26: * ')' (rpar); s to &subject; i to &pos if s defaulted, 1 otherwise;
27: * j defaults to 0.
28: */
29: defcset(&arg1, &cs1, csbuf1, k_cset.bits);
30: defcset(&arg2, &cs2, csbuf2, lpar);
31: defcset(&arg3, &cs3, csbuf3, rpar);
32: if (defstr(&arg4, sbuf, &k_subject))
33: defint(&arg5, &l1, k_pos);
34: else
35: defint(&arg5, &l1, 1);
36: defint(&arg6, &l2, 0);
37:
38: /*
39: * Convert i and j to positions in s and order them.
40: */
41: i = cvpos(l1, STRLEN(arg4));
42: j = cvpos(l2, STRLEN(arg4));
43: if (i > j) {
44: t = i;
45: i = j;
46: j = t;
47: }
48:
49: /*
50: * Loop through characters in s[i:j]. When a character in cs2 is
51: * found, increment cnt; when a chracter in cs3 is found, decrement
52: * cnt. When cnt is 0 there have been an equal number of occurrences
53: * of characters in cs2 and cs3, i.e., the string to the left of
54: * i is balanced. If the string is balanced and the current character
55: * (s[i]) is in c1, suspend i. Note that if cnt drops below zero,
56: * bal fails.
57: */
58: cnt = 0;
59: while (i < j) {
60: c = STRLOC(arg4)[i-1];
61: if (cnt == 0 && tstb(c, cs1)) {
62: arg0.type = D_INTEGER;
63: INTVAL(arg0) = i;
64: suspend();
65: }
66: if (tstb(c, cs2))
67: cnt++;
68: else if (tstb(c, cs3))
69: cnt--;
70: if (cnt < 0)
71: fail();
72: i++;
73: }
74: /*
75: * Eventually fail.
76: */
77: fail();
78: }
79:
80: Procblock(bal,6)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.