extpar.c revision 1.4
1/*	$NetBSD: extpar.c,v 1.4 2022/10/08 16:12:50 christos Exp $	*/
2
3/*++
4/* NAME
5/*	extpar 3
6/* SUMMARY
7/*	extract text from parentheses
8/* SYNOPSIS
9/*	#include <stringops.h>
10/*
11/*	char	*extpar(bp, parens, flags)
12/*	char	**bp;
13/*	const char *parens;
14/*	int	flags;
15/* DESCRIPTION
16/*	extpar() extracts text from an input string that is enclosed
17/*	in the specified parentheses, and updates the buffer pointer
18/*	to point to that text.
19/*
20/*	Arguments:
21/* .IP bp
22/*	Pointer to buffer pointer. Both the buffer and the buffer
23/*	pointer are modified.
24/* .IP parens
25/*	One matching pair of parentheses, opening parenthesis first.
26/* .IP flags
27/*	EXTPAR_FLAG_NONE, or the bitwise OR of one or more flags:
28/* .RS
29/* .IP EXTPAR_FLAG_EXTRACT
30/*	This flag is intended to instruct extpar() callers that
31/*	extpar() should be invoked. It has no effect on expar()
32/*	itself.
33/* .IP EXTPAR_FLAG_STRIP
34/*	Skip whitespace after the opening parenthesis, and trim
35/*	whitespace before the closing parenthesis.
36/* .RE
37/* DIAGNOSTICS
38/*	In case of error the result value is a dynamically-allocated
39/*	string with a description of the problem that includes a
40/*	copy of the offending input.  A non-null result value should
41/*	be destroyed with myfree(). The following describes the errors
42/*	and the state of the buffer and buffer pointer.
43/* .IP "no opening parenthesis at start of text"
44/*	The buffer pointer points to the input text.
45/* .IP "missing closing parenthesis"
46/*	The buffer pointer points to text as if a closing parenthesis
47/*	were present at the end of the input.
48/* .IP "text after closing parenthesis"
49/*	The buffer pointer points to text as if the offending text
50/*	were not present.
51/* SEE ALSO
52/*	balpar(3) determine length of string in parentheses
53/* LICENSE
54/* .ad
55/* .fi
56/*	The Secure Mailer license must be distributed with this software.
57/* AUTHOR(S)
58/*	Wietse Venema
59/*	IBM T.J. Watson Research
60/*	P.O. Box 704
61/*	Yorktown Heights, NY 10598, USA
62/*
63/*	Wietse Venema
64/*	Google, Inc.
65/*	111 8th Avenue
66/*	New York, NY 10011, USA
67/*--*/
68
69 /*
70  * System library.
71  */
72#include <sys_defs.h>
73#include <ctype.h>
74
75 /*
76  * Utility library.
77  */
78#include <vstring.h>
79#include <stringops.h>
80
81/* extpar - extract text from parentheses */
82
83char   *extpar(char **bp, const char *parens, int flags)
84{
85    char   *cp = *bp;
86    char   *err = 0;
87    size_t  len;
88
89    if (cp[0] != parens[0]) {
90	err = vstring_export(vstring_sprintf(vstring_alloc(100),
91		      "no '%c' at start of text in \"%s\"", parens[0], cp));
92	len = 0;
93    } else if ((len = balpar(cp, parens)) == 0) {
94	err = concatenate("missing '", parens + 1, "' in \"",
95			  cp, "\"", (char *) 0);
96	cp += 1;
97    } else {
98	if (cp[len] != 0)
99	    err = concatenate("syntax error after '", parens + 1, "' in \"",
100			      cp, "\"", (char *) 0);
101	cp += 1;
102	cp[len -= 2] = 0;
103    }
104    if (flags & EXTPAR_FLAG_STRIP) {
105	trimblanks(cp, len)[0] = 0;
106	while (ISSPACE(*cp))
107	    cp++;
108    }
109    *bp = cp;
110    return (err);
111}
112