mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-16 08:40:19 +02:00
* readline.c: terminate option list with NULL.
* read.c: idem. * print.c: idem. * eval.c: terminate option lists with 0. * options.c: remove n (for length) from scm_option_X functions. Detect option list length by looking for NULL name.
This commit is contained in:
parent
42ddb3cb8b
commit
6256065013
11 changed files with 77 additions and 47 deletions
5
NEWS
5
NEWS
|
@ -19,7 +19,10 @@ Changes in 1.9.XXXXXXXX:
|
|||
* Changes to the distribution
|
||||
* Changes to the stand-alone interpreter
|
||||
* Changes to Scheme functions and syntax
|
||||
* Changes to the C interface
|
||||
* Changes to the C interface
|
||||
|
||||
** Functions for handling scm_option now no longer require an argument
|
||||
indicating length of the scm_t_option array.
|
||||
|
||||
|
||||
Changes in 1.8.2 (since 1.8.1):
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2007-01-19 Han-Wen Nienhuys <hanwen@lilypond.org>
|
||||
|
||||
* readline.c: terminate option list with NULL.
|
||||
|
||||
2006-10-06 Neil Jerram <neil@ossau.uklinux.net>
|
||||
|
||||
* ice-9/readline.scm (new-input-prompt): Renamed from "prompt".
|
||||
|
|
|
@ -52,7 +52,8 @@ scm_t_option scm_readline_opts[] = {
|
|||
{ SCM_OPTION_INTEGER, "history-length", 200,
|
||||
"History length." },
|
||||
{ SCM_OPTION_INTEGER, "bounce-parens", 500,
|
||||
"Time (ms) to show matching opening parenthesis (0 = off)."}
|
||||
"Time (ms) to show matching opening parenthesis (0 = off)."},
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
extern void stifle_history (int max);
|
||||
|
|
|
@ -1,3 +1,14 @@
|
|||
2007-01-19 Han-Wen Nienhuys <hanwen@lilypond.org>
|
||||
|
||||
* read.c: idem.
|
||||
|
||||
* print.c: idem.
|
||||
|
||||
* eval.c: terminate option lists with 0.
|
||||
|
||||
* options.c: remove n (for length) from scm_option_X
|
||||
functions. Detect option list length by looking for NULL name.
|
||||
|
||||
2007-01-19 Ludovic Courtès <ludovic.courtes@laas.fr>
|
||||
|
||||
* struct.c (scm_i_struct_equalp): Skip comparison if both FIELD1
|
||||
|
|
|
@ -59,10 +59,10 @@ SCM_DEFINE (scm_debug_options, "debug-options-interface", 0, 1, 0,
|
|||
scm_dynwind_begin (0);
|
||||
scm_dynwind_critical_section (SCM_BOOL_F);
|
||||
|
||||
ans = scm_options (setting, scm_debug_opts, SCM_N_DEBUG_OPTIONS, FUNC_NAME);
|
||||
ans = scm_options (setting, scm_debug_opts, FUNC_NAME);
|
||||
if (!(1 <= SCM_N_FRAMES && SCM_N_FRAMES <= SCM_MAX_FRAME_SIZE))
|
||||
{
|
||||
scm_options (ans, scm_debug_opts, SCM_N_DEBUG_OPTIONS, FUNC_NAME);
|
||||
scm_options (ans, scm_debug_opts, FUNC_NAME);
|
||||
SCM_OUT_OF_RANGE (1, setting);
|
||||
}
|
||||
SCM_RESET_DEBUG_MODE;
|
||||
|
@ -526,7 +526,7 @@ SCM_DEFINE (scm_debug_hang, "debug-hang", 0, 1, 0,
|
|||
void
|
||||
scm_init_debug ()
|
||||
{
|
||||
scm_init_opts (scm_debug_options, scm_debug_opts, SCM_N_DEBUG_OPTIONS);
|
||||
scm_init_opts (scm_debug_options, scm_debug_opts);
|
||||
|
||||
scm_tc16_memoized = scm_make_smob_type ("memoized", 0);
|
||||
scm_set_smob_mark (scm_tc16_memoized, scm_markcdr);
|
||||
|
|
|
@ -3065,7 +3065,8 @@ int scm_check_exit_p;
|
|||
long scm_eval_stack;
|
||||
|
||||
scm_t_option scm_eval_opts[] = {
|
||||
{ SCM_OPTION_INTEGER, "stack", 22000, "Size of thread stacks (in machine words)." }
|
||||
{ SCM_OPTION_INTEGER, "stack", 22000, "Size of thread stacks (in machine words)." },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
scm_t_option scm_debug_opts[] = {
|
||||
|
@ -3088,17 +3089,21 @@ scm_t_option scm_debug_opts[] = {
|
|||
{ SCM_OPTION_BOOLEAN, "debug", 0, "Use the debugging evaluator." },
|
||||
{ SCM_OPTION_INTEGER, "stack", 20000, "Stack size limit (measured in words; 0 = no check)." },
|
||||
{ SCM_OPTION_SCM, "show-file-name", (unsigned long)SCM_BOOL_T, "Show file names and line numbers in backtraces when not `#f'. A value of `base' displays only base names, while `#t' displays full names."},
|
||||
{ SCM_OPTION_BOOLEAN, "warn-deprecated", 0, "Warn when deprecated features are used." }
|
||||
{ SCM_OPTION_BOOLEAN, "warn-deprecated", 0, "Warn when deprecated features are used." },
|
||||
{ 0 },
|
||||
};
|
||||
|
||||
|
||||
|
||||
scm_t_option scm_evaluator_trap_table[] = {
|
||||
{ SCM_OPTION_BOOLEAN, "traps", 0, "Enable evaluator traps." },
|
||||
{ SCM_OPTION_BOOLEAN, "enter-frame", 0, "Trap when eval enters new frame." },
|
||||
{ SCM_OPTION_BOOLEAN, "apply-frame", 0, "Trap when entering apply." },
|
||||
{ SCM_OPTION_BOOLEAN, "exit-frame", 0, "Trap when exiting eval or apply." },
|
||||
{ SCM_OPTION_SCM, "enter-frame-handler", (unsigned long)SCM_BOOL_F, "Handler for enter-frame traps." },
|
||||
{ SCM_OPTION_BOOLEAN, "apply-frame", 0, "Trap when entering apply." },
|
||||
{ SCM_OPTION_SCM, "apply-frame-handler", (unsigned long)SCM_BOOL_F, "Handler for apply-frame traps." },
|
||||
{ SCM_OPTION_SCM, "exit-frame-handler", (unsigned long)SCM_BOOL_F, "Handler for exit-frame traps." }
|
||||
{ SCM_OPTION_BOOLEAN, "exit-frame", 0, "Trap when exiting eval or apply." },
|
||||
{ SCM_OPTION_SCM, "exit-frame-handler", (unsigned long)SCM_BOOL_F, "Handler for exit-frame traps." },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
SCM_DEFINE (scm_eval_options_interface, "eval-options-interface", 0, 1, 0,
|
||||
|
@ -3114,7 +3119,6 @@ SCM_DEFINE (scm_eval_options_interface, "eval-options-interface", 0, 1, 0,
|
|||
scm_dynwind_critical_section (SCM_BOOL_F);
|
||||
ans = scm_options (setting,
|
||||
scm_eval_opts,
|
||||
SCM_N_EVAL_OPTIONS,
|
||||
FUNC_NAME);
|
||||
scm_eval_stack = SCM_EVAL_STACK * sizeof (void *);
|
||||
scm_dynwind_end ();
|
||||
|
@ -3133,7 +3137,6 @@ SCM_DEFINE (scm_evaluator_traps, "evaluator-traps-interface", 0, 1, 0,
|
|||
SCM_CRITICAL_SECTION_START;
|
||||
ans = scm_options (setting,
|
||||
scm_evaluator_trap_table,
|
||||
SCM_N_EVALUATOR_TRAPS,
|
||||
FUNC_NAME);
|
||||
/* njrev: same again. */
|
||||
SCM_RESET_DEBUG_MODE;
|
||||
|
@ -6025,11 +6028,9 @@ scm_init_eval ()
|
|||
scm_i_pthread_mutexattr_recursive);
|
||||
|
||||
scm_init_opts (scm_evaluator_traps,
|
||||
scm_evaluator_trap_table,
|
||||
SCM_N_EVALUATOR_TRAPS);
|
||||
scm_evaluator_trap_table);
|
||||
scm_init_opts (scm_eval_options_interface,
|
||||
scm_eval_opts,
|
||||
SCM_N_EVAL_OPTIONS);
|
||||
scm_eval_opts);
|
||||
|
||||
scm_tc16_promise = scm_make_smob_type ("promise", 0);
|
||||
scm_set_smob_mark (scm_tc16_promise, promise_mark);
|
||||
|
@ -6057,3 +6058,4 @@ scm_init_eval ()
|
|||
c-file-style: "gnu"
|
||||
End:
|
||||
*/
|
||||
|
||||
|
|
|
@ -45,12 +45,11 @@ SCM_API SCM scm_eval_options_interface (SCM setting);
|
|||
|
||||
#define SCM_TRAPS_P scm_evaluator_trap_table[0].val
|
||||
#define SCM_ENTER_FRAME_P scm_evaluator_trap_table[1].val
|
||||
#define SCM_APPLY_FRAME_P scm_evaluator_trap_table[2].val
|
||||
#define SCM_EXIT_FRAME_P scm_evaluator_trap_table[3].val
|
||||
#define SCM_ENTER_FRAME_HDLR (SCM_PACK (scm_evaluator_trap_table[4].val))
|
||||
#define SCM_APPLY_FRAME_HDLR (SCM_PACK (scm_evaluator_trap_table[5].val))
|
||||
#define SCM_ENTER_FRAME_HDLR (SCM_PACK (scm_evaluator_trap_table[2].val))
|
||||
#define SCM_APPLY_FRAME_P scm_evaluator_trap_table[3].val
|
||||
#define SCM_APPLY_FRAME_HDLR (SCM_PACK (scm_evaluator_trap_table[4].val))
|
||||
#define SCM_EXIT_FRAME_P scm_evaluator_trap_table[5].val
|
||||
#define SCM_EXIT_FRAME_HDLR (SCM_PACK (scm_evaluator_trap_table[6].val))
|
||||
#define SCM_N_EVALUATOR_TRAPS 7
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -95,11 +95,11 @@ static SCM protected_objects = SCM_EOL;
|
|||
/* Return a list of the current option setting. The format of an
|
||||
* option setting is described in the above documentation. */
|
||||
static SCM
|
||||
get_option_setting (const scm_t_option options[], unsigned int n)
|
||||
get_option_setting (const scm_t_option options[])
|
||||
{
|
||||
unsigned int i;
|
||||
SCM ls = SCM_EOL;
|
||||
for (i = 0; i != n; ++i)
|
||||
for (i = 0; options[i].name; ++i)
|
||||
{
|
||||
switch (options[i].type)
|
||||
{
|
||||
|
@ -123,12 +123,12 @@ get_option_setting (const scm_t_option options[], unsigned int n)
|
|||
/* Return a list of sublists, where each sublist contains option name, value
|
||||
* and documentation string. */
|
||||
static SCM
|
||||
get_documented_option_setting (const scm_t_option options[], unsigned int n)
|
||||
get_documented_option_setting (const scm_t_option options[])
|
||||
{
|
||||
SCM ans = SCM_EOL;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i != n; ++i)
|
||||
for (i = 0; options[i].name; ++i)
|
||||
{
|
||||
SCM ls = scm_cons (scm_from_locale_string (options[i].doc), SCM_EOL);
|
||||
switch (options[i].type)
|
||||
|
@ -149,6 +149,16 @@ get_documented_option_setting (const scm_t_option options[], unsigned int n)
|
|||
}
|
||||
|
||||
|
||||
static int
|
||||
options_length (scm_t_option options[])
|
||||
{
|
||||
unsigned int i = 0;
|
||||
for (; options[i].name != NULL; ++i)
|
||||
;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
/* Alters options according to the given option setting 'args'. The value of
|
||||
* args is known to be a list, but it is not known whether the list is a well
|
||||
* formed option setting, i. e. if for every non-boolean option a value is
|
||||
|
@ -156,14 +166,14 @@ get_documented_option_setting (const scm_t_option options[], unsigned int n)
|
|||
* original setting in memory. Only if 'args' was successfully processed,
|
||||
* the new setting will overwrite the old one. */
|
||||
static void
|
||||
change_option_setting (SCM args, scm_t_option options[], unsigned int n, const char *s)
|
||||
change_option_setting (SCM args, scm_t_option options[], const char *s)
|
||||
{
|
||||
unsigned int i;
|
||||
SCM locally_protected_args = args;
|
||||
SCM malloc_obj = scm_malloc_obj (n * sizeof (scm_t_bits));
|
||||
SCM malloc_obj = scm_malloc_obj (options_length (options) * sizeof (scm_t_bits));
|
||||
scm_t_bits *flags = (scm_t_bits *) SCM_MALLOCDATA (malloc_obj);
|
||||
|
||||
for (i = 0; i != n; ++i)
|
||||
for (i = 0; options[i].name; ++i)
|
||||
{
|
||||
if (options[i].type == SCM_OPTION_BOOLEAN)
|
||||
flags[i] = 0;
|
||||
|
@ -176,7 +186,7 @@ change_option_setting (SCM args, scm_t_option options[], unsigned int n, const c
|
|||
SCM name = SCM_CAR (args);
|
||||
int found = 0;
|
||||
|
||||
for (i = 0; i != n && !found; ++i)
|
||||
for (i = 0; options[i].name && !found; ++i)
|
||||
{
|
||||
if (scm_is_eq (name, SCM_PACK (options[i].name)))
|
||||
{
|
||||
|
@ -204,7 +214,7 @@ change_option_setting (SCM args, scm_t_option options[], unsigned int n, const c
|
|||
args = SCM_CDR (args);
|
||||
}
|
||||
|
||||
for (i = 0; i != n; ++i)
|
||||
for (i = 0; options[i].name; ++i)
|
||||
{
|
||||
if (options[i].type == SCM_OPTION_SCM)
|
||||
{
|
||||
|
@ -223,32 +233,32 @@ change_option_setting (SCM args, scm_t_option options[], unsigned int n, const c
|
|||
|
||||
|
||||
SCM
|
||||
scm_options (SCM args, scm_t_option options[], unsigned int n, const char *s)
|
||||
scm_options (SCM args, scm_t_option options[], const char *s)
|
||||
{
|
||||
if (SCM_UNBNDP (args))
|
||||
return get_option_setting (options, n);
|
||||
return get_option_setting (options);
|
||||
else if (!SCM_NULL_OR_NIL_P (args) && !scm_is_pair (args))
|
||||
/* Dirk:FIXME:: This criterion should be improved. IMO it is better to
|
||||
* demand that args is #t if documentation should be shown than to say
|
||||
* that every argument except a list will print out documentation. */
|
||||
return get_documented_option_setting (options, n);
|
||||
return get_documented_option_setting (options);
|
||||
else
|
||||
{
|
||||
SCM old_setting;
|
||||
SCM_ASSERT (scm_is_true (scm_list_p (args)), args, 1, s);
|
||||
old_setting = get_option_setting (options, n);
|
||||
change_option_setting (args, options, n, s);
|
||||
old_setting = get_option_setting (options);
|
||||
change_option_setting (args, options, s);
|
||||
return old_setting;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
scm_init_opts (SCM (*func) (SCM), scm_t_option options[], unsigned int n)
|
||||
scm_init_opts (SCM (*func) (SCM), scm_t_option options[])
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i != n; ++i)
|
||||
for (i = 0; options[i].name; ++i)
|
||||
{
|
||||
SCM name = scm_from_locale_symbol (options[i].name);
|
||||
options[i].name = (char *) SCM_UNPACK (name);
|
||||
|
|
|
@ -40,8 +40,8 @@ typedef struct scm_t_option
|
|||
#define SCM_OPTION_SCM 2
|
||||
|
||||
|
||||
SCM_API SCM scm_options (SCM, scm_t_option [], unsigned int, const char*);
|
||||
SCM_API void scm_init_opts (SCM (*) (SCM), scm_t_option [], unsigned int n);
|
||||
SCM_API SCM scm_options (SCM, scm_t_option [], const char*);
|
||||
SCM_API void scm_init_opts (SCM (*) (SCM), scm_t_option []);
|
||||
SCM_API void scm_init_options (void);
|
||||
|
||||
#endif /* SCM_OPTIONS_H */
|
||||
|
|
|
@ -83,7 +83,9 @@ scm_t_option scm_print_opts[] = {
|
|||
"How to print symbols that have a colon as their first or last character. "
|
||||
"The value '#f' does not quote the colons; '#t' quotes them; "
|
||||
"'reader' quotes them when the reader option 'keywords' is not '#f'."
|
||||
}
|
||||
},
|
||||
{ 0 },
|
||||
|
||||
};
|
||||
|
||||
SCM_DEFINE (scm_print_options, "print-options-interface", 0, 1, 0,
|
||||
|
@ -96,7 +98,6 @@ SCM_DEFINE (scm_print_options, "print-options-interface", 0, 1, 0,
|
|||
{
|
||||
SCM ans = scm_options (setting,
|
||||
scm_print_opts,
|
||||
SCM_N_PRINT_OPTIONS,
|
||||
FUNC_NAME);
|
||||
return ans;
|
||||
}
|
||||
|
@ -1165,7 +1166,7 @@ scm_init_print ()
|
|||
{
|
||||
SCM vtable, layout, type;
|
||||
|
||||
scm_init_opts (scm_print_options, scm_print_opts, SCM_N_PRINT_OPTIONS);
|
||||
scm_init_opts (scm_print_options, scm_print_opts);
|
||||
|
||||
scm_print_options (scm_list_4 (scm_from_locale_symbol ("highlight-prefix"),
|
||||
scm_from_locale_string ("{"),
|
||||
|
|
|
@ -52,14 +52,14 @@ scm_t_option scm_read_opts[] = {
|
|||
{ SCM_OPTION_BOOLEAN, "case-insensitive", 0,
|
||||
"Convert symbols to lower case."},
|
||||
{ SCM_OPTION_SCM, "keywords", SCM_UNPACK (SCM_BOOL_F),
|
||||
"Style of keyword recognition: #f or 'prefix."}
|
||||
"Style of keyword recognition: #f or 'prefix."},
|
||||
#if SCM_ENABLE_ELISP
|
||||
,
|
||||
{ SCM_OPTION_BOOLEAN, "elisp-vectors", 0,
|
||||
"Support Elisp vector syntax, namely `[...]'."},
|
||||
{ SCM_OPTION_BOOLEAN, "elisp-strings", 0,
|
||||
"Support `\\(' and `\\)' in strings."}
|
||||
"Support `\\(' and `\\)' in strings."},
|
||||
#endif
|
||||
{ 0, },
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -112,7 +112,6 @@ SCM_DEFINE (scm_read_options, "read-options-interface", 0, 1, 0,
|
|||
{
|
||||
SCM ans = scm_options (setting,
|
||||
scm_read_opts,
|
||||
SCM_N_READ_OPTIONS,
|
||||
FUNC_NAME);
|
||||
if (SCM_COPY_SOURCE_P)
|
||||
SCM_RECORD_POSITIONS_P = 1;
|
||||
|
@ -979,7 +978,7 @@ scm_init_read ()
|
|||
scm_read_hash_procedures =
|
||||
SCM_VARIABLE_LOC (scm_c_define ("read-hash-procedures", SCM_EOL));
|
||||
|
||||
scm_init_opts (scm_read_options, scm_read_opts, SCM_N_READ_OPTIONS);
|
||||
scm_init_opts (scm_read_options, scm_read_opts);
|
||||
#include "libguile/read.x"
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue