* readline.c: terminate option list with NULL.
authorHan-Wen Nienhuys <hanwen@lilypond.org>
Fri, 19 Jan 2007 19:26:36 +0000 (19:26 +0000)
committerHan-Wen Nienhuys <hanwen@lilypond.org>
Fri, 19 Jan 2007 19:26:36 +0000 (19:26 +0000)
* 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.

NEWS
guile-readline/ChangeLog
guile-readline/readline.c
libguile/ChangeLog
libguile/debug.c
libguile/eval.c
libguile/eval.h
libguile/options.c
libguile/options.h
libguile/print.c
libguile/read.c

diff --git a/NEWS b/NEWS
index a68cff0..9da8def 100644 (file)
--- a/NEWS
+++ b/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.
 
 \f
 Changes in 1.8.2 (since 1.8.1):
index b7bddd5..e3569b2 100644 (file)
@@ -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".
index 4eab675..4a87ae2 100644 (file)
@@ -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);
index f62f11a..2107ea3 100644 (file)
@@ -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
index b546b6c..01b8204 100644 (file)
@@ -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);
index 26d90f1..f667fa6 100644 (file)
@@ -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:
 */
+
index 7d856a0..cc6f8e1 100644 (file)
@@ -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
 
 \f
 
index 47cf60a..412192f 100644 (file)
@@ -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);
index 650081c..7176124 100644 (file)
@@ -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 */
index 8bed722..fa6ea8c 100644 (file)
@@ -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 ("{"),
index 53283ad..d0c4a87 100644 (file)
@@ -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"
 }