+
+LY_DEFINE (ly_effective_prefix, "ly:effective-prefix",
+ 0, 0, 0, (),
+ "Return effective prefix.")
+{
+ return scm_makfrom0str (prefix_directory.c_str ());
+}
+
+LY_DEFINE (ly_chain_assoc_get, "ly:chain-assoc-get",
+ 2, 1, 0, (SCM key, SCM achain, SCM dfault),
+ "Return value for @var{key} from a list of alists @var{achain}. "
+ "If no if no entry is found, return DFAULT, "
+ "or #f if no DFAULT not specified.")
+{
+ if (scm_is_pair (achain))
+ {
+ SCM handle = scm_assoc (key, scm_car (achain));
+ if (scm_is_pair (handle))
+ return scm_cdr (handle);
+ else
+ return ly_chain_assoc_get (key, scm_cdr (achain), dfault);
+ }
+ return dfault == SCM_UNDEFINED ? SCM_BOOL_F : dfault;
+}
+
+LY_DEFINE (ly_stderr_redirect, "ly:stderr-redirect",
+ 1, 1, 0, (SCM file_name, SCM mode),
+ "Redirect stderr to FILE-NAME, opened with MODE.")
+{
+ SCM_ASSERT_TYPE (scm_string_p (file_name), file_name, SCM_ARG1,
+ __FUNCTION__, "file_name");
+ char const *m = "w";
+ if (mode != SCM_UNDEFINED && scm_string_p (mode))
+ m = ly_scm2newstr (mode, 0);
+ /* dup2 and (fileno (current-error-port)) do not work with mingw'c
+ gcc -mwindows. */
+ freopen (ly_scm2newstr (file_name, 0), m, stderr);
+ return SCM_UNSPECIFIED;
+}