]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/ly-module.cc
2003 -> 2004
[lilypond.git] / lily / ly-module.cc
index 3d409cd3f9f12034f75b0875af92f4ec2278bc27..008c4224b1f24c37544a58daa970cee22e0d4a75 100644 (file)
@@ -3,7 +3,7 @@ ly-module.cc --  implement guile module stuff.
 
 source file of the GNU LilyPond music typesetter
 
-(c) 2002--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+(c) 2002--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 
  */
 
@@ -19,7 +19,7 @@ static int module_count;
 void
 ly_init_anonymous_module (void * data)
 {
-  scm_c_use_module ("lily");  
+  scm_c_use_module ("lily");
 }
 
 Protected_scm anon_modules;
@@ -29,7 +29,6 @@ ly_make_anonymous_module ()
 {
   String s = "*anonymous-ly-" + to_string (module_count++) +  "*";
   SCM mod = scm_c_define_module (s.to_str0(), ly_init_anonymous_module, 0);
-
   anon_modules = scm_cons (mod, anon_modules);
   return mod;
 }
@@ -39,31 +38,46 @@ ly_clear_anonymous_modules ()
 {
   SCM s = anon_modules;
   anon_modules = SCM_EOL;
-
+  
   for (; gh_pair_p (s) ; s = gh_cdr (s))
     {
-      scm_vector_fill_x (SCM_MODULE_OBARRAY(gh_car(s)), SCM_EOL);
+      SCM tab= scm_c_make_hash_table (2);
+      /*
+       UGH.
+      */
+      
+      SCM_STRUCT_DATA(gh_car(s))[scm_module_index_obarray] = (long unsigned int) tab;
     }
 }
 
 #define FUNC_NAME __FUNCTION__
 
+SCM
+define_one_var (void * closure, SCM key, SCM val, SCM result)
+{
+  SCM dest =  (SCM) closure;
+  scm_module_define (dest, key, scm_variable_ref (val));
+  return SCM_EOL;
+}
+
+/*
+  Ugh signature of scm_internal_hash_fold () is inaccurate.
+ */
+typedef SCM (*Hash_cl_func)();
+
 void
 ly_copy_module_variables (SCM dest, SCM src)
 {
   SCM_VALIDATE_MODULE (1, src);
 
   SCM obarr= SCM_MODULE_OBARRAY(src);
-  SCM syms = SCM_EOL;
+  scm_internal_hash_fold ((Hash_cl_func) &define_one_var, (void*) dest, SCM_EOL, obarr);
+}
 
-  for (int i = 0;  i < SCM_VECTOR_LENGTH (obarr); i++)
-    {
-      for( SCM s = scm_vector_ref(obarr, SCM_MAKINUM (i));
-          gh_pair_p (s); s = gh_cdr (s))
-       {
-         scm_module_define (dest, gh_caar (s), scm_variable_ref (gh_cdar(s)));
-       }
-    }
+SCM
+accumulate_symbol (void * closure, SCM key, SCM val, SCM result)
+{
+  return scm_cons (key, result);
 }
 
 SCM
@@ -72,20 +86,14 @@ ly_module_symbols (SCM mod)
   SCM_VALIDATE_MODULE (1, mod);
   
   SCM obarr= SCM_MODULE_OBARRAY(mod);
-  SCM syms = SCM_EOL;
-
-  for (int i = 0;  i < SCM_VECTOR_LENGTH (obarr); i++)
-    {
-      for( SCM s = scm_vector_ref(obarr, SCM_MAKINUM (i));
-          gh_pair_p (s); s = gh_cdr (s))
-       {
-         syms = scm_cons (gh_caar (s), syms);
-       }
-    }
-  return syms;
+  return scm_internal_hash_fold ((Hash_cl_func) &accumulate_symbol, NULL, SCM_EOL, obarr); 
 }
 
-
+SCM
+entry_to_alist (void * closure, SCM key, SCM val, SCM result)
+{
+  return scm_cons (scm_cons (key, scm_variable_ref (val)), result);
+}
 
 SCM
 ly_module_to_alist (SCM mod)
@@ -94,18 +102,8 @@ ly_module_to_alist (SCM mod)
   
   
   SCM obarr= SCM_MODULE_OBARRAY(mod);
-  SCM alist = SCM_EOL;
 
-  for (int i = 0;  i < SCM_VECTOR_LENGTH (obarr); i++)
-    {
-      for( SCM s = scm_vector_ref(obarr, SCM_MAKINUM (i));
-          gh_pair_p (s); s = gh_cdr (s))
-       {
-         alist = scm_acons (gh_caar (s), scm_variable_ref (gh_cdar (s)),
-                                                           alist);
-       }
-    }
-  return alist;
+  return scm_internal_hash_fold ((Hash_cl_func) &entry_to_alist, NULL, SCM_EOL, obarr); 
 }
 
 /*
@@ -118,9 +116,10 @@ ly_module_lookup (SCM module, SCM sym)
   SCM_VALIDATE_MODULE (1, module);
 
   return scm_sym2var (sym, scm_module_lookup_closure (module), SCM_BOOL_F);
+#undef FUNC_NAME
 }
 
-SCM export_function ;
+SCM export_function;
 
 void
 ly_export (SCM module, SCM namelist)