4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
34 #include "getresponse.h"
36 /* defaults - C locale values for yesstr, nostr, yesexpr (LC_MESSAGES) */
37 #define DEFAULT_YESSTR "yes"
38 #define DEFAULT_NOSTR "no"
39 #define DEFAULT_YESEXPR "^[yY]"
40 #define DEFAULT_NOEXPR "^[nN]"
52 #define SET_DEFAULT_STRS \
53 yesstr = DEFAULT_YESSTR; \
54 nostr = DEFAULT_NOSTR; \
55 yesexpr = DEFAULT_YESEXPR; \
56 noexpr = DEFAULT_NOEXPR;
58 /* variables used by getresponse functions */
62 /* for regcomp()/regexec() yesexpr and noexpr */
63 static regex_t preg_yes
, preg_no
;
66 * This function compiles a regular expression that is used to match an
67 * affirmative response from the user, and also assigns the strings used
68 * in the prompts that request affirmative or negative responses. The
69 * locale's values for YESEXPR, NOEXPR, YESSTR and NOSTR are used.
71 * If there are any problems using the locale's YESEXPR, NOEXPR, YESSTR or NOSTR
72 * values, default values of YESEXPR, YESSTR and NOSTR will be used
73 * as a fallback. The default values are the same as the C locale values.
82 /* get yes expression and strings for yes/no prompts */
83 yesstr
= strdup(nl_langinfo(YESSTR
));
84 nostr
= strdup(nl_langinfo(NOSTR
));
85 yesexpr
= strdup(nl_langinfo(YESEXPR
));
86 noexpr
= strdup(nl_langinfo(NOEXPR
));
88 if (yesstr
== NULL
|| nostr
== NULL
||
89 yesexpr
== NULL
|| noexpr
== NULL
) {
95 /* if problem with locale strings, use default values */
96 if (*yesstr
== '\0' || *nostr
== '\0' ||
97 *yesexpr
== '\0' || *noexpr
== '\0') {
102 /* Compile the yes and no expressions */
103 while (regcomp(&preg_yes
, yesexpr
, REG_EXTENDED
| REG_NOSUB
) != 0 ||
104 regcomp(&preg_no
, noexpr
, REG_EXTENDED
| REG_NOSUB
) != 0) {
106 /* The fallback yesexpr failed, so exit */
110 /* The locale's yesexpr or noexpr failed so use fallback */
119 yes_no(int (*func
)(char *))
122 char ans
[LINE_MAX
+ 1];
124 /* Get user's answer */
128 if (b
== '\n' || b
== '\0' || b
== EOF
)
135 ans
[LINE_MAX
] = '\0';
143 yes_no_check(char *ans
, regex_t
*reg1
, regex_t
*reg2
)
145 if (regexec(reg1
, ans
, 0, NULL
, 0) == 0) {
146 if (regexec(reg2
, ans
, 0, NULL
, 0) == 0) {
147 /* Both Expressions Match (reg2 conservative) */
157 * yes_check() returns 1 if the input string is matched by yesexpr and is
158 * not matched by noexpr; otherwise yes_check() returns 0.
163 return (yes_no_check(ans
, &preg_yes
, &preg_no
));
167 * no_check() returns 1 if the input string is matched by noexpr and is
168 * not matched by yesexpr; otherwise no_check() returns 0.
173 return (yes_no_check(ans
, &preg_no
, &preg_yes
));
179 return (yes_no(yes_check
));
185 return (yes_no(no_check
));