aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2015-07-15 17:37:27 +0200
committerJan Kratochvil <jan.kratochvil@redhat.com>2015-07-15 17:39:17 +0200
commit6e5b4429db0d66e2d0b27e1bcfe4709f3dae73ed (patch)
tree7936b330582c83cb83293d8e6eca41bc8803dbda
parentddc98fbf2fd9e244a215a4d09e559180dc573a14 (diff)
downloadgdb-6e5b4429db0d66e2d0b27e1bcfe4709f3dae73ed.zip
gdb-6e5b4429db0d66e2d0b27e1bcfe4709f3dae73ed.tar.gz
gdb-6e5b4429db0d66e2d0b27e1bcfe4709f3dae73ed.tar.bz2
Move gdb_regex* to common/
Later patches need regex support also in gdbserver. gdb/ChangeLog 2015-07-15 Jan Kratochvil <jan.kratochvil@redhat.com> * Makefile.in (HFILES_NO_SRCDIR): Change gdb_regex.h to common/gdb_regex.h. (COMMON_OBS): Add gdb_regex.o. (gdb_regex.o): New. * common/common.m4 (GDB_AC_COMMON): Add gdb_use_included_regex, --without-included-regex and USE_INCLUDED_REGEX. * common/gdb_regex.c: New file from utils.c functions. * common/gdb_regex.h: Move it here from gdb_regex.h, update include file wrapping define name. * configure: Rebuilt. * configure.ac (gdb_use_included_regex, --without-included-regex) (USE_INCLUDED_REGEX): Move them to common/common.m4. * gdb_regex.h: Move it to common/gdb_regex.h. * utils.c: Remove include gdb_regex.h. (do_regfree_cleanup, make_regfree_cleanup, get_regcomp_error) (compile_rx_or_error): Move them to common/gdb_regex.c. gdb/gdbserver/ChangeLog 2015-07-15 Jan Kratochvil <jan.kratochvil@redhat.com> * Makefile.in (OBS): Add gdb_regex.o. (gdb_regex.o): New. * config.in: Rebuilt. * configure: Rebuilt.
-rw-r--r--gdb/ChangeLog19
-rw-r--r--gdb/Makefile.in7
-rw-r--r--gdb/common/common.m429
-rw-r--r--gdb/common/gdb_regex.c73
-rw-r--r--gdb/common/gdb_regex.h (renamed from gdb/gdb_regex.h)7
-rwxr-xr-xgdb/configure102
-rw-r--r--gdb/configure.ac29
-rw-r--r--gdb/gdbserver/ChangeLog7
-rw-r--r--gdb/gdbserver/Makefile.in4
-rw-r--r--gdb/gdbserver/config.in3
-rwxr-xr-xgdb/gdbserver/configure56
-rw-r--r--gdb/utils.c55
12 files changed, 251 insertions, 140 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1a5a209..b87a901 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,22 @@
+2015-07-15 Jan Kratochvil <jan.kratochvil@redhat.com>
+
+ * Makefile.in (HFILES_NO_SRCDIR): Change gdb_regex.h to
+ common/gdb_regex.h.
+ (COMMON_OBS): Add gdb_regex.o.
+ (gdb_regex.o): New.
+ * common/common.m4 (GDB_AC_COMMON): Add gdb_use_included_regex,
+ --without-included-regex and USE_INCLUDED_REGEX.
+ * common/gdb_regex.c: New file from utils.c functions.
+ * common/gdb_regex.h: Move it here from gdb_regex.h, update include
+ file wrapping define name.
+ * configure: Rebuilt.
+ * configure.ac (gdb_use_included_regex, --without-included-regex)
+ (USE_INCLUDED_REGEX): Move them to common/common.m4.
+ * gdb_regex.h: Move it to common/gdb_regex.h.
+ * utils.c: Remove include gdb_regex.h.
+ (do_regfree_cleanup, make_regfree_cleanup, get_regcomp_error)
+ (compile_rx_or_error): Move them to common/gdb_regex.c.
+
2015-07-15 Aleksandar Ristovski <aristovski@qnx.com
Jan Kratochvil <jan.kratochvil@redhat.com>
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 237da9d..ea9e804 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -937,7 +937,7 @@ extension.h extension-priv.h \
build-id.h buildsym.h valprint.h \
typeprint.h mi/mi-getopt.h mi/mi-parse.h mi/mi-console.h \
mi/mi-out.h mi/mi-main.h mi/mi-common.h mi/mi-cmds.h linux-nat.h \
-complaints.h gdb_proc_service.h gdb_regex.h xtensa-tdep.h inf-loop.h \
+complaints.h gdb_proc_service.h common/gdb_regex.h xtensa-tdep.h inf-loop.h \
common/gdb_wait.h common/gdb_assert.h solib.h ppc-tdep.h cp-support.h glibc-tdep.h \
interps.h auxv.h gdbcmd.h tramp-frame.h mipsnbsd-tdep.h \
amd64-linux-tdep.h linespec.h i387-tdep.h mn10300-tdep.h \
@@ -1084,6 +1084,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \
format.o registry.o btrace.o record-btrace.o waitstatus.o \
print-utils.o rsp-low.o errors.o common-debug.o debug.o \
common-exceptions.o btrace-common.o fileio.o target-utils.o \
+ gdb_regex.o \
$(SUBDIR_GCC_COMPILE_OBS)
TSOBS = inflow.o
@@ -2272,6 +2273,10 @@ btrace-common.o: ${srcdir}/common/btrace-common.c
fileio.o: ${srcdir}/common/fileio.c
$(COMPILE) $(srcdir)/common/fileio.c
$(POSTCOMPILE)
+
+gdb_regex.o: ${srcdir}/common/gdb_regex.c
+ $(COMPILE) $(srcdir)/common/gdb_regex.c
+ $(POSTCOMPILE)
#
# gdb/target/ dependencies
#
diff --git a/gdb/common/common.m4 b/gdb/common/common.m4
index a87579a..e48dd5a 100644
--- a/gdb/common/common.m4
+++ b/gdb/common/common.m4
@@ -44,4 +44,33 @@ gdb_cv_func_sigsetjmp=yes, gdb_cv_func_sigsetjmp=no)])
if test $gdb_cv_func_sigsetjmp = yes; then
AC_DEFINE(HAVE_SIGSETJMP, 1, [Define if sigsetjmp is available. ])
fi
+
+ # Assume we'll default to using the included libiberty regex.
+ gdb_use_included_regex=yes
+
+ # However, if the system regex is GNU regex, then default to *not*
+ # using the included regex.
+ AC_CACHE_CHECK(
+ [for GNU regex],
+ [gdb_cv_have_gnu_regex],
+ [AC_TRY_COMPILE(
+ [#include <gnu-versions.h>],
+ [#define REGEX_INTERFACE_VERSION 1
+ #if _GNU_REGEX_INTERFACE_VERSION != REGEX_INTERFACE_VERSION
+ # error "Version mismatch"
+ #endif],
+ gdb_cv_have_gnu_regex=yes,
+ gdb_cv_have_gnu_regex=no)])
+ if test $gdb_cv_have_gnu_regex = yes; then
+ gdb_use_included_regex=no
+ fi
+
+ AC_ARG_WITH(included-regex,
+ AS_HELP_STRING([--without-included-regex], [don't use included regex; this is the default on systems with version 2 of the GNU C library (use with caution on other system)]),
+ gdb_with_regex=$withval,
+ gdb_with_regex=$gdb_use_included_regex)
+ if test "$gdb_with_regex" = yes; then
+ AC_DEFINE(USE_INCLUDED_REGEX, 1,
+ [Define to 1 if the regex included in libiberty should be used.])
+ fi
])
diff --git a/gdb/common/gdb_regex.c b/gdb/common/gdb_regex.c
new file mode 100644
index 0000000..73f30a7
--- /dev/null
+++ b/gdb/common/gdb_regex.c
@@ -0,0 +1,73 @@
+/* Shared utility routines for GDB to interact with agent.
+
+ Copyright (C) 2009-2015 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "common-defs.h"
+#include "gdb_regex.h"
+
+/* A cleanup function that calls regfree. */
+
+static void
+do_regfree_cleanup (void *r)
+{
+ regfree (r);
+}
+
+/* Create a new cleanup that frees the compiled regular expression R. */
+
+struct cleanup *
+make_regfree_cleanup (regex_t *r)
+{
+ return make_cleanup (do_regfree_cleanup, r);
+}
+
+/* Return an xmalloc'd error message resulting from a regular
+ expression compilation failure. */
+
+char *
+get_regcomp_error (int code, regex_t *rx)
+{
+ size_t length = regerror (code, rx, NULL, 0);
+ char *result = xmalloc (length);
+
+ regerror (code, rx, result, length);
+ return result;
+}
+
+/* Compile a regexp and throw an exception on error. This returns a
+ cleanup to free the resulting pattern on success. RX must not be
+ NULL. */
+
+struct cleanup *
+compile_rx_or_error (regex_t *pattern, const char *rx, const char *message)
+{
+ int code;
+
+ gdb_assert (rx != NULL);
+
+ code = regcomp (pattern, rx, REG_NOSUB);
+ if (code != 0)
+ {
+ char *err = get_regcomp_error (code, pattern);
+
+ make_cleanup (xfree, err);
+ error (("%s: %s"), message, err);
+ }
+
+ return make_regfree_cleanup (pattern);
+}
diff --git a/gdb/gdb_regex.h b/gdb/common/gdb_regex.h
index 3173a54..c6eb67b 100644
--- a/gdb/gdb_regex.h
+++ b/gdb/common/gdb_regex.h
@@ -16,8 +16,8 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
-#ifndef GDB_REGEX_H
-#define GDB_REGEX_H 1
+#ifndef COMMON_GDB_REGEX_H
+#define COMMON_GDB_REGEX_H 1
#ifdef USE_INCLUDED_REGEX
# include "xregex.h"
@@ -27,10 +27,9 @@
# include <regex.h>
#endif
-/* From utils.c. */
struct cleanup *make_regfree_cleanup (regex_t *);
char *get_regcomp_error (int, regex_t *);
struct cleanup *compile_rx_or_error (regex_t *pattern, const char *rx,
const char *message);
-#endif /* not GDB_REGEX_H */
+#endif /* not COMMON_GDB_REGEX_H */
diff --git a/gdb/configure b/gdb/configure
index e8979f0..027ecf4 100755
--- a/gdb/configure
+++ b/gdb/configure
@@ -11925,6 +11925,57 @@ $as_echo "#define HAVE_SIGSETJMP 1" >>confdefs.h
fi
+ # Assume we'll default to using the included libiberty regex.
+ gdb_use_included_regex=yes
+
+ # However, if the system regex is GNU regex, then default to *not*
+ # using the included regex.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU regex" >&5
+$as_echo_n "checking for GNU regex... " >&6; }
+if test "${gdb_cv_have_gnu_regex+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <gnu-versions.h>
+int
+main ()
+{
+#define REGEX_INTERFACE_VERSION 1
+ #if _GNU_REGEX_INTERFACE_VERSION != REGEX_INTERFACE_VERSION
+ # error "Version mismatch"
+ #endif
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ gdb_cv_have_gnu_regex=yes
+else
+ gdb_cv_have_gnu_regex=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gdb_cv_have_gnu_regex" >&5
+$as_echo "$gdb_cv_have_gnu_regex" >&6; }
+ if test $gdb_cv_have_gnu_regex = yes; then
+ gdb_use_included_regex=no
+ fi
+
+
+# Check whether --with-included-regex was given.
+if test "${with_included_regex+set}" = set; then :
+ withval=$with_included_regex; gdb_with_regex=$withval
+else
+ gdb_with_regex=$gdb_use_included_regex
+fi
+
+ if test "$gdb_with_regex" = yes; then
+
+$as_echo "#define USE_INCLUDED_REGEX 1" >>confdefs.h
+
+ fi
+
# Check the return and argument types of ptrace. No canned test for
# this, so roll our own.
@@ -12187,57 +12238,6 @@ if test $ac_cv_func_setpgrp_void = yes; then
fi
fi
-# Assume we'll default to using the included libiberty regex.
-gdb_use_included_regex=yes
-
-# However, if the system regex is GNU regex, then default to *not*
-# using the included regex.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU regex" >&5
-$as_echo_n "checking for GNU regex... " >&6; }
-if test "${gdb_cv_have_gnu_regex+set}" = set; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <gnu-versions.h>
-int
-main ()
-{
-#define REGEX_INTERFACE_VERSION 1
-#if _GNU_REGEX_INTERFACE_VERSION != REGEX_INTERFACE_VERSION
-# error "Version mismatch"
-#endif
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- gdb_cv_have_gnu_regex=yes
-else
- gdb_cv_have_gnu_regex=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gdb_cv_have_gnu_regex" >&5
-$as_echo "$gdb_cv_have_gnu_regex" >&6; }
-if test $gdb_cv_have_gnu_regex = yes; then
- gdb_use_included_regex=no
-fi
-
-
-# Check whether --with-included-regex was given.
-if test "${with_included_regex+set}" = set; then :
- withval=$with_included_regex; gdb_with_regex=$withval
-else
- gdb_with_regex=$gdb_use_included_regex
-fi
-
-if test "$gdb_with_regex" = yes; then
-
-$as_echo "#define USE_INCLUDED_REGEX 1" >>confdefs.h
-
-fi
-
# Check if <sys/proc.h> defines `struct thread' with a td_pcb member.
ac_fn_c_check_member "$LINENO" "struct thread" "td_pcb" "ac_cv_member_struct_thread_td_pcb" "#include <sys/param.h>
#include <sys/proc.h>
diff --git a/gdb/configure.ac b/gdb/configure.ac
index a40860a..6a7e0c9 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -1444,35 +1444,6 @@ if test $ac_cv_func_setpgrp_void = yes; then
fi
fi
-# Assume we'll default to using the included libiberty regex.
-gdb_use_included_regex=yes
-
-# However, if the system regex is GNU regex, then default to *not*
-# using the included regex.
-AC_CACHE_CHECK(
- [for GNU regex],
- [gdb_cv_have_gnu_regex],
- [AC_TRY_COMPILE(
- [#include <gnu-versions.h>],
- [#define REGEX_INTERFACE_VERSION 1
-#if _GNU_REGEX_INTERFACE_VERSION != REGEX_INTERFACE_VERSION
-# error "Version mismatch"
-#endif],
- gdb_cv_have_gnu_regex=yes,
- gdb_cv_have_gnu_regex=no)])
-if test $gdb_cv_have_gnu_regex = yes; then
- gdb_use_included_regex=no
-fi
-
-AC_ARG_WITH(included-regex,
- AS_HELP_STRING([--without-included-regex], [don't use included regex; this is the default on systems with version 2 of the GNU C library (use with caution on other system)]),
- gdb_with_regex=$withval,
- gdb_with_regex=$gdb_use_included_regex)
-if test "$gdb_with_regex" = yes; then
- AC_DEFINE(USE_INCLUDED_REGEX, 1,
- [Define to 1 if the regex included in libiberty should be used.])
-fi
-
# Check if <sys/proc.h> defines `struct thread' with a td_pcb member.
AC_CHECK_MEMBERS([struct thread.td_pcb], [], [],
[#include <sys/param.h>
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 0ce30b7..e269b97 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,10 @@
+2015-07-15 Jan Kratochvil <jan.kratochvil@redhat.com>
+
+ * Makefile.in (OBS): Add gdb_regex.o.
+ (gdb_regex.o): New.
+ * config.in: Rebuilt.
+ * configure: Rebuilt.
+
2015-07-15 Aleksandar Ristovski <aristovski@qnx.com
Jan Kratochvil <jan.kratochvil@redhat.com>
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index 908061a..fea8e1b 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -195,6 +195,7 @@ OBS = agent.o ax.o inferiors.o regcache.o remote-utils.o server.o signals.o \
common-utils.o ptid.o buffer.o format.o filestuff.o dll.o notif.o \
tdesc.o print-utils.o rsp-low.o errors.o common-debug.o cleanups.o \
common-exceptions.o symbol.o btrace-common.o fileio.o target-utils.o \
+ gdb_regex.o \
$(XML_BUILTIN) $(DEPFILES) $(LIBOBJS)
GDBREPLAY_OBS = gdbreplay.o version.o
GDBSERVER_LIBS = @GDBSERVER_LIBS@
@@ -582,6 +583,9 @@ waitstatus.o: ../target/waitstatus.c
fileio.o: ../common/fileio.c
$(COMPILE) $<
$(POSTCOMPILE)
+gdb_regex.o: ../common/gdb_regex.c
+ $(COMPILE) $<
+ $(POSTCOMPILE)
# Native object files rules from ../nat
diff --git a/gdb/gdbserver/config.in b/gdb/gdbserver/config.in
index f24e6bb..90ea95d 100644
--- a/gdb/gdbserver/config.in
+++ b/gdb/gdbserver/config.in
@@ -317,6 +317,9 @@
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
+/* Define to 1 if the regex included in libiberty should be used. */
+#undef USE_INCLUDED_REGEX
+
/* Define if we should use libthread_db directly. */
#undef USE_LIBTHREAD_DB_DIRECTLY
diff --git a/gdb/gdbserver/configure b/gdb/gdbserver/configure
index e8cf136..c7ae6be 100755
--- a/gdb/gdbserver/configure
+++ b/gdb/gdbserver/configure
@@ -694,6 +694,7 @@ enable_maintainer_mode
enable_largefile
enable_build_with_cxx
enable_libmcheck
+with_included_regex
with_ust
with_ust_include
with_ust_lib
@@ -1345,6 +1346,10 @@ Optional Features:
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --without-included-regex
+ don't use included regex; this is the default on
+ systems with version 2 of the GNU C library (use
+ with caution on other system)
--with-ust=PATH Specify prefix directory for the installed UST package
Equivalent to --with-ust-include=PATH/include
plus --with-ust-lib=PATH/lib
@@ -5747,6 +5752,57 @@ $as_echo "#define HAVE_SIGSETJMP 1" >>confdefs.h
fi
+ # Assume we'll default to using the included libiberty regex.
+ gdb_use_included_regex=yes
+
+ # However, if the system regex is GNU regex, then default to *not*
+ # using the included regex.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU regex" >&5
+$as_echo_n "checking for GNU regex... " >&6; }
+if test "${gdb_cv_have_gnu_regex+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <gnu-versions.h>
+int
+main ()
+{
+#define REGEX_INTERFACE_VERSION 1
+ #if _GNU_REGEX_INTERFACE_VERSION != REGEX_INTERFACE_VERSION
+ # error "Version mismatch"
+ #endif
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ gdb_cv_have_gnu_regex=yes
+else
+ gdb_cv_have_gnu_regex=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gdb_cv_have_gnu_regex" >&5
+$as_echo "$gdb_cv_have_gnu_regex" >&6; }
+ if test $gdb_cv_have_gnu_regex = yes; then
+ gdb_use_included_regex=no
+ fi
+
+
+# Check whether --with-included-regex was given.
+if test "${with_included_regex+set}" = set; then :
+ withval=$with_included_regex; gdb_with_regex=$withval
+else
+ gdb_with_regex=$gdb_use_included_regex
+fi
+
+ if test "$gdb_with_regex" = yes; then
+
+$as_echo "#define USE_INCLUDED_REGEX 1" >>confdefs.h
+
+ fi
+
# Check for UST
ustlibs=""
diff --git a/gdb/utils.c b/gdb/utils.c
index acb4c7d..a2c2710 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -67,7 +67,6 @@
#include "gdb_usleep.h"
#include "interps.h"
-#include "gdb_regex.h"
#if !HAVE_DECL_MALLOC
extern PTR malloc (); /* ARI: PTR */
@@ -1114,60 +1113,6 @@ make_hex_string (const gdb_byte *data, size_t length)
-/* A cleanup function that calls regfree. */
-
-static void
-do_regfree_cleanup (void *r)
-{
- regfree (r);
-}
-
-/* Create a new cleanup that frees the compiled regular expression R. */
-
-struct cleanup *
-make_regfree_cleanup (regex_t *r)
-{
- return make_cleanup (do_regfree_cleanup, r);
-}
-
-/* Return an xmalloc'd error message resulting from a regular
- expression compilation failure. */
-
-char *
-get_regcomp_error (int code, regex_t *rx)
-{
- size_t length = regerror (code, rx, NULL, 0);
- char *result = xmalloc (length);
-
- regerror (code, rx, result, length);
- return result;
-}
-
-/* Compile a regexp and throw an exception on error. This returns a
- cleanup to free the resulting pattern on success. RX must not be
- NULL. */
-
-struct cleanup *
-compile_rx_or_error (regex_t *pattern, const char *rx, const char *message)
-{
- int code;
-
- gdb_assert (rx != NULL);
-
- code = regcomp (pattern, rx, REG_NOSUB);
- if (code != 0)
- {
- char *err = get_regcomp_error (code, pattern);
-
- make_cleanup (xfree, err);
- error (("%s: %s"), message, err);
- }
-
- return make_regfree_cleanup (pattern);
-}
-
-
-
/* This function supports the query, nquery, and yquery functions.
Ask user a y-or-n question and return 0 if answer is no, 1 if
answer is yes, or default the answer to the specified default