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>
*/
void
ly_init_anonymous_module (void * data)
{
- scm_c_use_module ("lily");
+ scm_c_use_module ("lily");
}
Protected_scm anon_modules;
{
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;
}
{
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
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)
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);
}
/*
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)