]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/parse-scm.cc
* lily/modified-font-metric.cc (text_dimension): try
[lilypond.git] / lily / parse-scm.cc
index bd183b2bf2bf0396abeabed828c09cd4b050e9d5..2f55783edf46ddfdf70a6bd372b1b6ce364b9d21 100644 (file)
@@ -1,11 +1,18 @@
-#include <stdio.h>
+/*
+  parse-scm --
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+*/
+
+#include "parse-scm.hh"
+
+#include <cstdio>
 
 #include "ly-module.hh"
-#include "lily-guile.hh"
 #include "main.hh"
 #include "paper-book.hh"
-#include "parse-scm.hh"
-#include "string.hh"
 #include "source-file.hh"
 
 /* Pass string to scm parser, evaluate one expression.
    
    Thanks to Gary Houston <ghouston@freewire.co.uk>  */
 SCM
-internal_ly_parse_scm (Parse_start * ps, bool safe)
+internal_ly_parse_scm (Parse_start * ps)
 {
-  Source_file* sf =ps->start_location_.source_file_;
+  Source_file *sf = ps->start_location_.source_file_;
   SCM port = sf->get_port ();
 
-  int off = ps->start_location_.defined_str0_ - sf->to_str0();
+  int off = ps->start_location_.defined_str0_ - sf->to_str0 ();
   
   scm_seek (port, scm_long2num (off), scm_long2num (SEEK_SET));
   SCM from = scm_ftell (port);
@@ -26,18 +33,18 @@ internal_ly_parse_scm (Parse_start * ps, bool safe)
   SCM form;
   SCM answer = SCM_UNSPECIFIED;
 
-  /* Read expression from port */
+  /* Read expression from port */
   if (!SCM_EOF_OBJECT_P (form = scm_read (port)))
     {
-      if (safe)
+      if (ps->safe_)
        {
-         static SCM safe_module;
-         if (!safe_module)
+         static SCM module = SCM_BOOL_F;
+         if (module == SCM_BOOL_F)
            {
-             safe_module = scm_primitive_eval (ly_symbol2scm ("safe-module"));
-             ly_import_module (safe_module, scm_c_resolve_module ("lily"));
+             SCM function = ly_lily_module_constant ("make-safe-lilypond-module");
+             module = scm_call_0 (function);
            }
-         answer = scm_eval (form, safe_module);
+         answer = scm_eval (form, module);
        }
       else
        answer = scm_primitive_eval (form);
@@ -47,7 +54,7 @@ internal_ly_parse_scm (Parse_start * ps, bool safe)
      Shouldn't scm_read () do this for us?  */
   scm_fill_input (port);
   SCM to = scm_ftell (port);
-  ps->nchars = ly_scm2int (to) - ly_scm2int (from);
+  ps->nchars = scm_to_int (to) - scm_to_int (from);
 
   /* Don't close the port here; if we re-enter this function via a
      continuation, then the next time we enter it, we'll get an error.
@@ -62,26 +69,20 @@ SCM
 catch_protected_parse_body (void *p)
 {
   Parse_start *ps = (Parse_start*) p;
-  return internal_ly_parse_scm (ps, false);
-}
-
-SCM
-safe_catch_protected_parse_body (void *p)
-{
-  Parse_start *ps = (Parse_start*) p;
-  return internal_ly_parse_scm (ps, true);
+  
+  return internal_ly_parse_scm (ps);
 }
 
 SCM 
-parse_handler (void * data, SCM tag, SCM args)
+parse_handler (void *data, SCM tag, SCM args)
 {
-  Parse_start* ps = (Parse_start*) data;
-  (void) tag;                  // prevent warning
+  Parse_start* ps = (Parse_start *) data;
+  (void) tag;
   
   ps->start_location_.error (_("GUILE signaled an error for the expression beginning here"));
 
   if (scm_ilength (args) > 2)
-    scm_display_error_message (ly_cadr (args), ly_caddr (args), scm_current_error_port ());
+    scm_display_error_message (scm_cadr (args), scm_caddr (args), scm_current_error_port ());
 
   /*
     The following is a kludge; we should probably search for
@@ -105,27 +106,28 @@ parse_handler (void * data, SCM tag, SCM args)
 #endif
 
 SCM
-protected_ly_parse_scm (Parse_start *ps, bool safe)
+protected_ly_parse_scm (Parse_start *ps)
 {
   return scm_internal_catch (ly_symbol2scm (READ_ERROR),
-                            (safe ? &safe_catch_protected_parse_body
-                             : catch_protected_parse_body),
+                            &catch_protected_parse_body,
                             (void*) ps,
                             &parse_handler, (void*) ps);
 }
 
 bool parse_protect_global = true; 
 
-/* Try parsing.  Upon failure return SCM_UNDEFINED. */
+/* Try parsing.  Upon failure return SCM_UNDEFINED.
+   FIXME: shouldn't we return SCM_UNSCPECIFIED -- jcn  */
 SCM
-ly_parse_scm (char consts, int *n, Input i, bool safe)
+ly_parse_scm (char const *s, int *n, Input i, bool safe)
 {
-  Parse_start ps ;
+  Parse_start ps;
   ps.str = s;
   ps.start_location_ = i;
-
-  SCM ans = parse_protect_global ? protected_ly_parse_scm (&ps, safe)
-    : internal_ly_parse_scm (&ps, safe);
+  ps.safe_ = safe;
+  
+  SCM ans = parse_protect_global ? protected_ly_parse_scm (&ps)
+    : internal_ly_parse_scm (&ps);
   *n = ps.nchars;
 
   return ans;