xref: /netbsd-src/external/ibm-public/postfix/dist/src/util/balpar.c (revision e89934bbf778a6d6d6894877c4da59d0c7835b0f)
1 /*	$NetBSD: balpar.c,v 1.2 2017/02/14 01:16:49 christos Exp $	*/
2 
3 /*++
4 /* NAME
5 /*	balpar 3
6 /* SUMMARY
7 /*	determine length of string in parentheses
8 /* SYNOPSIS
9 /*	#include <stringops.h>
10 /*
11 /*	size_t	balpar(string, parens)
12 /*	const char *string;
13 /*	const char *parens;
14 /* DESCRIPTION
15 /*	balpar() determines the length of a string enclosed in
16 /*	the specified parentheses, zero in case of error.
17 /* SEE ALSO
18 /*	A balpar() routine appears in Brian W. Kernighan, P.J. Plauger:
19 /*	"Software Tools", Addison-Wesley 1976. This function is different.
20 /* LICENSE
21 /* .ad
22 /* .fi
23 /*	The Secure Mailer license must be distributed with this software.
24 /* AUTHOR(S)
25 /*	Wietse Venema
26 /*	IBM T.J. Watson Research
27 /*	P.O. Box 704
28 /*	Yorktown Heights, NY 10598, USA
29 /*--*/
30 
31 /* System library. */
32 
33 #include <sys_defs.h>
34 
35 /* Utility library. */
36 
37 #include <stringops.h>
38 
39 /* balpar - return length of {text} */
40 
balpar(const char * string,const char * parens)41 size_t  balpar(const char *string, const char *parens)
42 {
43     const char *cp;
44     int     level;
45     int     ch;
46 
47     if (*string != parens[0])
48 	return (0);
49     for (level = 1, cp = string + 1; (ch = *cp) != 0; cp++) {
50 	if (ch == parens[1]) {
51 	    if (--level == 0)
52 		return (cp - string + 1);
53 	} else if (ch == parens[0]) {
54 	    level++;
55 	}
56     }
57     return (0);
58 }
59