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