X-Git-Url: http://git.hcoop.net/bpt/guile.git/blobdiff_plain/62560650136f8c1a321a754e5081e323009b812a..26b263541b56cf79f2c249950c5eadb87ce28b68:/libguile/options.c?ds=sidebyside diff --git a/libguile/options.c b/libguile/options.c index 412192fb9..0e083143c 100644 --- a/libguile/options.c +++ b/libguile/options.c @@ -1,26 +1,29 @@ -/* Copyright (C) 1995,1996,1998,2000,2001, 2006 Free Software Foundation +/* Copyright (C) 1995,1996,1998,2000,2001, 2006, 2008, 2009, 2010 Free Software Foundation * * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 3 of + * the License, or (at your option) any later version. * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of + * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA */ +#ifdef HAVE_CONFIG_H +# include +#endif #include "libguile/_scm.h" #include "libguile/mallocs.h" #include "libguile/strings.h" -#include "libguile/lang.h" #include "libguile/options.h" @@ -145,7 +148,7 @@ get_documented_option_setting (const scm_t_option options[]) ls = scm_cons (SCM_PACK (options[i].name), ls); ans = scm_cons (ls, ans); } - return ans; + return scm_reverse_x (ans, SCM_UNDEFINED); } @@ -164,9 +167,14 @@ options_length (scm_t_option options[]) * formed option setting, i. e. if for every non-boolean option a value is * given. For this reason, the function applies all changes to a copy of the * original setting in memory. Only if 'args' was successfully processed, - * the new setting will overwrite the old one. */ + * the new setting will overwrite the old one. + * + * If DRY_RUN is set, don't change anything. This is useful for trying out an option + * before entering a critical section. + */ static void -change_option_setting (SCM args, scm_t_option options[], const char *s) +change_option_setting (SCM args, scm_t_option options[], const char *s, + int dry_run) { unsigned int i; SCM locally_protected_args = args; @@ -214,6 +222,9 @@ change_option_setting (SCM args, scm_t_option options[], const char *s) args = SCM_CDR (args); } + if (dry_run) + return; + for (i = 0; options[i].name; ++i) { if (options[i].type == SCM_OPTION_SCM) @@ -234,6 +245,13 @@ change_option_setting (SCM args, scm_t_option options[], const char *s) SCM scm_options (SCM args, scm_t_option options[], const char *s) +{ + return scm_options_try (args, options, s, 0); +} + +SCM +scm_options_try (SCM args, scm_t_option options[], const char *s, + int dry_run) { if (SCM_UNBNDP (args)) return get_option_setting (options); @@ -247,7 +265,7 @@ scm_options (SCM args, scm_t_option options[], const char *s) SCM old_setting; SCM_ASSERT (scm_is_true (scm_list_p (args)), args, 1, s); old_setting = get_option_setting (options); - change_option_setting (args, options, s); + change_option_setting (args, options, s, dry_run); return old_setting; } } @@ -262,7 +280,6 @@ scm_init_opts (SCM (*func) (SCM), scm_t_option options[]) { SCM name = scm_from_locale_symbol (options[i].name); options[i].name = (char *) SCM_UNPACK (name); - scm_permanent_object (name); } func (SCM_UNDEFINED); }