- Lily_parser *parser = unsmob_my_lily_parser (parser_smob);
- Book *book = unsmob_book (book_smob);
- Output_def *bp = unsmob_output_def (parser->lexer_->lookup_identifier ("$defaultpaper"));
-
- SCM_ASSERT_TYPE (parser, parser_smob, SCM_ARG1, __FUNCTION__, "Lilypond parser");
- SCM_ASSERT_TYPE (book, book_smob, SCM_ARG2, __FUNCTION__, "Book");
-
- /* ugh. changing argument.*/
- book->paper_ = bp;
-
- File_name outname (parser->output_basename_);
- int *c = &parser->book_count_;
- if (*c)
- outname.base_ += "-" + to_string (*c);
- (*c)++;
-
- Output_def *layout = get_layout (parser);
- Paper_book* pb = book->process (outname.to_string (), layout);
-
- if (pb)
- {
- pb->output (outname.to_string ());
- scm_gc_unprotect_object (pb->self_scm ());
- }
+ LY_ASSERT_SMOB (Lily_parser, parser, 1);
+ Lily_parser *p = unsmob_lily_parser (parser);
+
+ return ly_string2scm (p->output_basename_);
+}
+
+LY_DEFINE (ly_parser_error, "ly:parser-error",
+ 2, 1, 0, (SCM parser, SCM msg, SCM input),
+ "Display an error message and make the parser fail.")
+{
+ LY_ASSERT_SMOB (Lily_parser, parser, 1);
+ Lily_parser *p = unsmob_lily_parser (parser);
+
+ LY_ASSERT_TYPE (scm_is_string, msg, 2);
+ string s = ly_scm2string (msg);
+
+ Input *i = unsmob_input (input);
+ if (i)
+ p->parser_error (*i, s);
+ else
+ p->parser_error (s);
+
+ return parser;
+}
+
+LY_DEFINE (ly_parser_clear_error, "ly:parser-clear-error",
+ 1, 0, 0, (SCM parser),
+ "Clear the error flag for the parser.")
+{
+ LY_ASSERT_SMOB (Lily_parser, parser, 1);
+ Lily_parser *p = unsmob_lily_parser (parser);
+
+ p->error_level_ = 0;
+ p->lexer_->error_level_ = 0;