1 static char Sccsid[] = "@(#)bal.c 1.2 02/15/87";
2
3 /*
4 Function to find the position, in str, of the first of the char-
5 acters in end occurring outside a balanced string. A balanced string
6 contains matched occurrences of any character in open and the corres-
7 ponding character in clos. Balanced strings may be nested. The null
8 at the end of str is considered to belong to end. Unmatched members
9 of open or clos result in an error return.
10 */
11
12 #define ifany(x) for (p=x; *p; p++) if (c == *p)
13 #define matching_clos clos[p-open]
14 #define error -1
15 #define position s-str-1
16
balbrk(str,open,clos,end)17 balbrk(str,open,clos,end)
18 char *str,*open,*clos,*end;
19 {
20 register char *p, *s, c;
21 char opp[2];
22 opp[1] = '\0';
23 for (s = str; c = *s++; ) {
24 ifany(end) return position;
25 ifany(clos) return error;
26 ifany(open) {
27 opp[0] = matching_clos;
28 s += balbrk(s,open,clos,opp);
29 if (*s++ != matching_clos) return error;
30 break;
31 }
32 }
33 return position;
34 }
35