date and time created 87/02/15 16:16:43 by lepreau
authorJay Lepreau <lepreau@ucbvax.Berkeley.EDU>
Mon, 16 Feb 1987 08:16:43 +0000 (00:16 -0800)
committerJay Lepreau <lepreau@ucbvax.Berkeley.EDU>
Mon, 16 Feb 1987 08:16:43 +0000 (00:16 -0800)
SCCS-vsn: local/sccscmds/sccscmds.2/util/bal.c 1.1
SCCS-vsn: local/sccscmds/sccscmds.ok/util/bal.c 1.1

usr/src/local/sccscmds/sccscmds.2/util/bal.c [new file with mode: 0644]
usr/src/local/sccscmds/sccscmds.ok/util/bal.c [new file with mode: 0644]

diff --git a/usr/src/local/sccscmds/sccscmds.2/util/bal.c b/usr/src/local/sccscmds/sccscmds.2/util/bal.c
new file mode 100644 (file)
index 0000000..9a3fd6b
--- /dev/null
@@ -0,0 +1,34 @@
+static char Sccsid[] "@(#)bal  2.1";
+#
+/*
+       Function to find the position, in str, of the first of the char-
+       acters in end occurring outside a balanced string.  A balanced string
+       contains matched occurrences of any character in open and the corres-
+       ponding character in clos.  Balanced strings may be nested.  The null
+       at the end of str is considered to belong to end.  Unmatched members
+       of open or clos result in an error return.
+*/
+
+#define ifany(x) for (p=x; *p; p++) if (c == *p)
+#define matching_clos clos[p-open]
+#define error -1
+#define position s-str-1
+
+balbrk(str,open,clos,end)
+char *str,*open,*clos,*end;
+{
+       register char *p, *s, c;
+       char opp[2];
+       opp[1] = '\0';
+       for (s = str; c = *s++;  ) {
+               ifany(end) return position;
+               ifany(clos) return error;
+               ifany(open) {
+                       opp[0] = matching_clos;
+                       s =+ balbrk(s,open,clos,opp);
+                       if (*s++ != matching_clos) return error;
+                       break;
+               }
+       }
+       return position;
+}
diff --git a/usr/src/local/sccscmds/sccscmds.ok/util/bal.c b/usr/src/local/sccscmds/sccscmds.ok/util/bal.c
new file mode 100644 (file)
index 0000000..9a3fd6b
--- /dev/null
@@ -0,0 +1,34 @@
+static char Sccsid[] "@(#)bal  2.1";
+#
+/*
+       Function to find the position, in str, of the first of the char-
+       acters in end occurring outside a balanced string.  A balanced string
+       contains matched occurrences of any character in open and the corres-
+       ponding character in clos.  Balanced strings may be nested.  The null
+       at the end of str is considered to belong to end.  Unmatched members
+       of open or clos result in an error return.
+*/
+
+#define ifany(x) for (p=x; *p; p++) if (c == *p)
+#define matching_clos clos[p-open]
+#define error -1
+#define position s-str-1
+
+balbrk(str,open,clos,end)
+char *str,*open,*clos,*end;
+{
+       register char *p, *s, c;
+       char opp[2];
+       opp[1] = '\0';
+       for (s = str; c = *s++;  ) {
+               ifany(end) return position;
+               ifany(clos) return error;
+               ifany(open) {
+                       opp[0] = matching_clos;
+                       s =+ balbrk(s,open,clos,opp);
+                       if (*s++ != matching_clos) return error;
+                       break;
+               }
+       }
+       return position;
+}