Merge branch 'master' into keyserver-via-dirmngr
[gnupg.git] / common / yesno.c
1 /* yesno.c - Yes/No questions
2  * Copyright (C) 1998, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
6  * GnuPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * GnuPG is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <config.h>
21 #include <stdlib.h>
22 #include <errno.h>
23
24 #include "i18n.h"
25 #include "util.h"
26
27
28 /* Check the string S for a YES or NO answer and take care of
29    localization.  If no valid string is given the value of DEF_ANSWER
30    is returned.  Returns 1 for yes and 0 for no.  */
31 int
32 answer_is_yes_no_default (const char *s, int def_answer)
33 {
34   /* TRANSLATORS: See doc/TRANSLATE about this string. */
35   const char *long_yes = _("yes");
36   const char *short_yes = _("yY");
37   /* TRANSLATORS: See doc/TRANSLATE about this string. */
38   const char *long_no = _("no");
39   const char *short_no = _("nN");
40
41   /* Note: we have to use the local dependent compare here. */
42   if ( match_multistr(long_yes,s) )
43     return 1;
44   if ( *s && strchr( short_yes, *s ) && !s[1] )
45     return 1;
46   /* Test for "no" strings to catch ambiguities for the next test. */
47   if ( match_multistr(long_no,s) )
48     return 0;
49   if ( *s && strchr( short_no, *s ) && !s[1] )
50     return 0;
51   /* Test for the english version (for those who are used to type yes). */
52   if ( !ascii_strcasecmp(s, "yes" ) )
53     return 1;
54   if ( *s && strchr( "yY", *s ) && !s[1] )
55     return 1;
56   return def_answer;
57 }
58
59 int
60 answer_is_yes ( const char *s )
61 {
62   return answer_is_yes_no_default(s,0);
63 }
64
65 /****************
66  * Return 1 for yes, -1 for quit, or 0 for no
67  */
68 int
69 answer_is_yes_no_quit ( const char *s )
70 {
71   /* TRANSLATORS: See doc/TRANSLATE about this string. */
72   const char *long_yes = _("yes");
73   /* TRANSLATORS: See doc/TRANSLATE about this string. */
74   const char *long_no = _("no");
75   /* TRANSLATORS: See doc/TRANSLATE about this string. */
76   const char *long_quit = _("quit");
77   const char *short_yes = _("yY");
78   const char *short_no = _("nN");
79   const char *short_quit = _("qQ");
80
81   /* Note: we have to use a local dependent compare here. */
82   if ( match_multistr(long_no,s) )
83     return 0;
84   if ( match_multistr(long_yes,s) )
85     return 1;
86   if ( match_multistr(long_quit,s) )
87     return -1;
88   if ( *s && strchr( short_no, *s ) && !s[1] )
89     return 0;
90   if ( *s && strchr( short_yes, *s ) && !s[1] )
91       return 1;
92   if ( *s && strchr( short_quit, *s ) && !s[1] )
93     return -1;
94   /* but not here. */
95   if ( !ascii_strcasecmp(s, "yes" ) )
96     return 1;
97   if ( !ascii_strcasecmp(s, "quit" ) )
98       return -1;
99   if ( *s && strchr( "yY", *s ) && !s[1] )
100     return 1;
101   if ( *s && strchr( "qQ", *s ) && !s[1] )
102     return -1;
103   return 0;
104 }
105
106 /*
107    Return 1 for okay, 0 for for cancel or DEF_ANSWER for default. 
108  */
109 int
110 answer_is_okay_cancel (const char *s, int def_answer)
111 {
112   /* TRANSLATORS: See doc/TRANSLATE about this string. */
113   const char *long_okay = _("okay|okay");
114   /* TRANSLATORS: See doc/TRANSLATE about this string. */
115   const char *long_cancel = _("cancel|cancel");
116   const char *short_okay = _("oO");
117   const char *short_cancel = _("cC");
118   
119   /* Note: We have to use the locale dependent compare. */
120   if ( match_multistr(long_okay,s) )
121     return 1;
122   if ( match_multistr(long_cancel,s) )
123     return 0;
124   if ( *s && strchr( short_okay, *s ) && !s[1] )
125     return 1;
126   if ( *s && strchr( short_cancel, *s ) && !s[1] )
127     return 0;
128   /* Always test for the English values (not locale here). */
129   if ( !ascii_strcasecmp(s, "okay" ) )
130     return 1;
131   if ( !ascii_strcasecmp(s, "ok" ) )
132     return 1;
133   if ( !ascii_strcasecmp(s, "cancel" ) )
134     return 0;
135   if ( *s && strchr( "oO", *s ) && !s[1] )
136     return 1;
137   if ( *s && strchr( "cC", *s ) && !s[1] )
138     return 0;
139   return def_answer;
140 }
141