+/*
+ junkme?
+ */
+bool store_locations_global_b;
+
+/* Do not append `!' suffix, since 1st argument is not modified. */
+LY_DEFINE (ly_set_point_and_click, "ly:set-point-and-click", 1, 0, 0,
+ (SCM what),
+ "Set the options for Point-and-click source specials output. The\n"
+"argument is a symbol. Possible options are @code{none} (no source specials),\n"
+"@code{line} and @code{line-column}")
+{
+ /* UGH. */
+ SCM val = SCM_BOOL_F;
+ if (ly_symbol2scm ("line-column") == what)
+ val = ly_scheme_function ("line-column-location");
+ else if (what == ly_symbol2scm ("line"))
+ val = ly_scheme_function ("line-location");
+
+ scm_module_define (global_lily_module, ly_symbol2scm ("point-and-click"),
+ val);
+ store_locations_global_b = ly_c_procedure_p (val);
+ return SCM_UNSPECIFIED;
+}
+
+LY_DEFINE (ly_parse_file, "ly:parse-file",
+ 1, 0, 0,
+ (SCM name),
+ "Parse a single @code{.ly} file. "
+ "Upon failure, throw @code{ly-file-failed} key.")
+{
+ SCM_ASSERT_TYPE (ly_c_string_p (name), name, SCM_ARG1, __FUNCTION__, "string");
+ char const *file = SCM_STRING_CHARS (name);
+ char const *extensions[] = {"ly", "", 0};
+ String file_name = global_path.find (file, extensions);
+
+ /* By default, use base name of input file for output file name,
+ write output to cwd; do not use root and directory parts of input
+ file name. */
+ File_name out_file_name (file_name);
+ out_file_name.ext_ = "";
+ out_file_name.root_ = "";
+ out_file_name.dir_ = "";
+
+ if (!output_name_global.is_empty ())
+ out_file_name = File_name (output_name_global);
+
+ String init;
+ if (!init_name_global.is_empty ())
+ init = init_name_global;
+ else
+ init = "init.ly";
+
+ String out_file = out_file_name.to_string ();
+
+ if (init.length () && global_path.find (init).is_empty ())
+ {
+ warning (_f ("can't find init file: `%s'", init));
+ warning (_f ("(search path: `%s')",
+ global_path.to_string ().to_str0 ()));
+ exit (2);
+ }
+
+ if ((file_name != "-") && global_path.find (file_name).is_empty ())
+ {
+ warning (_f ("can't find file: `%s'", file_name));
+ scm_throw (ly_symbol2scm ("ly-file-failed"),
+ scm_list_1 (scm_makfrom0str (file_name.to_str0 ())));
+ }
+ else
+ {
+ Sources sources;
+ sources.set_path (&global_path);
+
+ progress_indication (_f ("Now processing `%s'", file_name.to_str0 ()));
+ progress_indication ("\n");
+
+ My_lily_parser *parser = new My_lily_parser (&sources);
+ scm_module_define (global_lily_module, ly_symbol2scm ("parser"),
+ parser->self_scm ());
+ parser->parse_file (init, file_name, out_file);
+
+ bool error = parser->error_level_;
+ parser = 0;
+ if (error)
+ /* TODO: pass renamed input file too. */
+ scm_throw (ly_symbol2scm ("ly-file-failed"),
+ scm_list_1 (scm_makfrom0str (file_name.to_str0 ())));
+ }
+ return SCM_UNSPECIFIED;
+}
+
+LY_DEFINE (ly_parse_string, "ly:parse-string",
+ 1, 0, 0,
+ (SCM ly_code),
+ "Parse the string LY_CODE. "
+ "Upon failure, throw @code{ly-file-failed} key.")
+{
+ SCM_ASSERT_TYPE (ly_c_string_p (ly_code), ly_code, SCM_ARG1, __FUNCTION__, "string");
+
+ Sources sources;
+ sources.set_path (&global_path);
+ My_lily_parser *parser = new My_lily_parser (&sources);
+ scm_module_define (global_lily_module, ly_symbol2scm ("parser"),
+ parser->self_scm ());
+ parser->parse_string (ly_scm2string (ly_code));
+ parser = 0;
+
+ return SCM_UNSPECIFIED;
+}
+
+LY_DEFINE (ly_clone_parser, "ly:clone-parser",
+ 1, 0, 0,
+ (SCM parser_smob),
+ "Return a clone of PARSER_SMOB.")
+{
+ My_lily_parser *parser = unsmob_my_lily_parser (parser_smob);
+ My_lily_parser *clone = new My_lily_parser (*parser);
+ return scm_gc_unprotect_object (clone->self_scm ());
+}
+
+LY_DEFINE(ly_parser_define, "ly:parser-define",
+ 3, 0, 0,
+ (SCM parser_smob, SCM symbol, SCM val),
+ "Bind SYMBOL to VAL in PARSER_SMOB's module.")
+{
+ My_lily_parser *parser = unsmob_my_lily_parser (parser_smob);
+ SCM_ASSERT_TYPE (ly_c_symbol_p (symbol), symbol, SCM_ARG2, __FUNCTION__, "symbol");
+ SCM_ASSERT_TYPE (parser, parser_smob, SCM_ARG2, __FUNCTION__, "parser");
+
+
+ parser->lexer_->set_identifier (scm_symbol_to_string (symbol), val);
+ return SCM_UNSPECIFIED;
+}
+LY_DEFINE(ly_parser_lookup, "ly:parser-lookup",
+ 2, 0, 0,
+ (SCM parser_smob, SCM symbol),
+ "Lookup @var{symbol} in @var{parser_smob}'s module. Undefined is '().")
+{
+ My_lily_parser *parser = unsmob_my_lily_parser (parser_smob);
+
+ SCM_ASSERT_TYPE (ly_c_symbol_p (symbol), symbol, SCM_ARG2, __FUNCTION__, "symbol");
+ SCM_ASSERT_TYPE (parser, parser_smob, SCM_ARG2, __FUNCTION__, "parser");
+
+ SCM val= parser->lexer_->lookup_identifier (ly_scm2string (scm_symbol_to_string (symbol)));
+ if (val != SCM_UNDEFINED)
+ return val;
+ else
+ return SCM_EOL;
+}
+
+LY_DEFINE (ly_parser_parse_string, "ly:parser-parse-string",
+ 2, 0, 0,
+ (SCM parser_smob, SCM ly_code),
+ "Parse the string LY_CODE with PARSER_SMOB."
+ "Upon failure, throw @code{ly-file-failed} key.")
+{
+
+ My_lily_parser *parser = unsmob_my_lily_parser (parser_smob);
+
+ SCM_ASSERT_TYPE (parser, parser_smob, SCM_ARG1, __FUNCTION__, "parser");
+ SCM_ASSERT_TYPE (ly_c_string_p (ly_code), ly_code, SCM_ARG2, __FUNCTION__, "string");
+
+ parser->parse_string (ly_scm2string (ly_code));
+
+ return SCM_UNSPECIFIED;
+}
+
+Output_def*
+get_paper (My_lily_parser *parser)
+{
+ SCM id = parser->lexer_->lookup_identifier ("$defaultpaper");
+ Output_def *paper = unsmob_output_def (id);
+ paper = paper ? paper->clone () : new Output_def;
+ paper->set_variable (ly_symbol2scm ("is-paper"), SCM_BOOL_T);
+
+ paper->parent_ =unsmob_output_def (parser->lexer_->lookup_identifier ("$defaultbookpaper"));
+ return paper;
+}
+
+
+Output_def*
+get_midi (My_lily_parser *parser)