From d2888c8920912178e5648bf4aa129a6f180eb503 Mon Sep 17 00:00:00 2001 From: fred Date: Tue, 26 Mar 2002 22:42:42 +0000 Subject: [PATCH] lilypond-1.3.0 --- lily/lily-guile.cc | 82 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 76 insertions(+), 6 deletions(-) diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc index 311397cdd8..51b56ca726 100644 --- a/lily/lily-guile.cc +++ b/lily/lily-guile.cc @@ -33,6 +33,62 @@ ly_ch_C_eval_scm (char const*c) return gh_eval_str ((char*)c); } + +/* + Pass string to scm parser, evaluate one expression. + Return result value and #chars read. + + Thanks to Gary Houston + + Need guile-1.3.4 (>1.3 anyway) for ftell on str ports -- jcn +*/ +SCM +ly_parse_scm (char const* s, int* n) +{ + SCM str = gh_str02scm ((char*)s); + SCM port = scm_mkstrport (SCM_INUM0, str, SCM_OPN | SCM_RDNG, + "scm_eval_0str"); + SCM from = scm_ftell (port); + + SCM form; + SCM answer = SCM_UNSPECIFIED; + + /* Read expression from port */ + if (!SCM_EOF_OBJECT_P (form = scm_read (port))) + answer = scm_eval_x (form); + + /* + After parsing + + (begin (foo 1 2)) + + all seems fine, but after parsing + + (foo 1 2) + + read_buf has been advanced to read_pos - 1, + so that scm_ftell returns 1, instead of #parsed chars + */ + + /* + urg: reset read_buf for scm_ftell + shouldn't scm_read () do this for us? + */ + scm_fill_input (port); + SCM to = scm_ftell (port); + *n = gh_scm2int (to) - gh_scm2int (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. + It's a string port anyway, so there's no advantage to closing it + early. + + scm_close_port (port); + */ + + return answer; +} + /* scm_m_quote doesn't use any env, but needs one for a good signature in GUILE. */ @@ -129,7 +185,7 @@ ly_scm2string (SCM s) char * p = gh_scm2newstr (s , &len); String r (p); - // delete p; + free (p); return r; } @@ -168,14 +224,28 @@ init_functions () scm_make_gsubr ("ly-gulp-file", 1,0, 0, (SCM(*)(...))ly_gulp_file); } -extern void init_symbols (); -extern void init_smobs (); // guh -> .hh +ADD_SCM_INIT_FUNC(funcs, init_functions); + +typedef void (*Void_fptr)(); +Array *scm_init_funcs_; + +void add_scm_init_func (void (*f)()) +{ + if (!scm_init_funcs_) + scm_init_funcs_ = new Array; + + scm_init_funcs_->push (f); +} void init_lily_guile () { - init_symbols(); - init_functions (); - init_smobs (); + for (int i=scm_init_funcs_->size() ; i--;) + (scm_init_funcs_->elem (i)) (); +} + +unsigned int ly_scm_hash (SCM s) +{ + return scm_ihashv (s, ~1u); } -- 2.39.5