X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flily-guile.cc;h=e317ea543815e3a466ef1f2440f75eb0235fa652;hb=bb36bac02a64770871780231ecc709cb18b20932;hp=7fd60380af192ffedecf821611b38f51fd60f113;hpb=43c708d5857fd1a15f0ebcf41d04f5a24441dc9a;p=lilypond.git diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc index 7fd60380af..e317ea5438 100644 --- a/lily/lily-guile.cc +++ b/lily/lily-guile.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--1999 Jan Nieuwenhuizen + (c) 1998--2000 Jan Nieuwenhuizen Han-Wen Nienhuys */ @@ -18,6 +18,8 @@ #include "simple-file-storage.hh" #include "file-path.hh" #include "debug.hh" +#include "direction.hh" +#include "offset.hh" SCM ly_str02scm (char const*c) @@ -27,10 +29,10 @@ ly_str02scm (char const*c) } SCM -ly_ch_C_eval_scm (char const*c) +ly_eval_str (String s) { // this all really sucks, guile should take char const* arguments! - return gh_eval_str ((char*)c); + return gh_eval_str ((char*)s.ch_C ()); } @@ -92,38 +94,26 @@ ly_parse_scm (char const* s, int* n) /* scm_m_quote doesn't use any env, but needs one for a good signature in GUILE. */ - SCM ly_quote_scm (SCM s) { - return scm_m_quote (scm_cons2 (SCM_EOL, s, SCM_EOL) ,SCM_EOL); // apparently env arg is ignored. + return gh_list (ly_symbol2scm ("quote"), s, SCM_UNDEFINED); } -/* - See: libguile/symbols.c - SCM - scm_string_to_symbol(s) - -*/ SCM -ly_symbol (String name) +ly_symbol2scm(const char *s) { - return gh_symbol2scm ((char*)name.ch_C()); + return gh_symbol2scm ((char *)s); } String -symbol_to_string (SCM s) +ly_symbol2string (SCM s) { + assert (gh_symbol_p (s)); return String((Byte*)SCM_CHARS (s), (int) SCM_LENGTH(s)); } -SCM -ly_set_scm (String name, SCM val) -{ - return scm_sysintern ((char*)name.ch_C(), val); - -} /** Read a file, and shove it down GUILE. GUILE also has file read @@ -141,13 +131,13 @@ read_lily_scm_file (String fn) error (e); } else - *mlog << '[' << s; + progress_indication ("[" + s); Simple_file_storage f(s); - ly_ch_C_eval_scm ((char *) f.ch_C()); - *mlog << "]" << flush; + ly_eval_str ((char *) f.ch_C()); + progress_indication ("]"); } @@ -164,11 +154,13 @@ ly_gulp_file (SCM name) error (e); } else - *mlog << '[' << s; + progress_indication ("[" + s ); Simple_file_storage f(s); - return ly_str02scm (f.ch_C()); + SCM result = ly_str02scm (f.ch_C()); + progress_indication ("]"); + return result; } void @@ -181,6 +173,7 @@ ly_display_scm (SCM s) String ly_scm2string (SCM s) { + assert (gh_string_p (s)); int len; char * p = gh_scm2newstr (s , &len); @@ -194,21 +187,19 @@ SCM index_cell (SCM s, Direction d) { assert (d); - return (d == LEFT) ? SCM_CAR (s) : SCM_CDR (s); + return (d == LEFT) ? gh_car (s) : gh_cdr (s); } - SCM -array_to_list (SCM *a , int l) +index_set_cell (SCM s, Direction d, SCM v) { - SCM list = SCM_EOL; - for (int i= l; i--; ) - { - list = gh_cons (a[i], list); - } - return list; + if (d == LEFT) + gh_set_car_x (s, v); + else if (d == RIGHT) + gh_set_cdr_x (s, v); + return s; } - + SCM ly_warning (SCM str) { @@ -217,11 +208,24 @@ ly_warning (SCM str) return SCM_BOOL_T; } +SCM +ly_isdir_p (SCM s) +{ + if (gh_number_p (s)) + { + int i = gh_scm2int (s); + return (i>= -1 && i <= 1) ? SCM_BOOL_T : SCM_BOOL_F; + } + return SCM_BOOL_F; +} + + void init_functions () { scm_make_gsubr ("ly-warn", 1, 0, 0, (SCM(*)(...))ly_warning); scm_make_gsubr ("ly-gulp-file", 1,0, 0, (SCM(*)(...))ly_gulp_file); + scm_make_gsubr ("dir?", 1,0, 0, (SCM(*)(...))ly_isdir_p); } ADD_SCM_INIT_FUNC(funcs, init_functions); @@ -249,3 +253,87 @@ unsigned int ly_scm_hash (SCM s) { return scm_ihashv (s, ~1u); } + + + +bool +isdir_b (SCM s) +{ + if (gh_number_p (s)) + { + int i = gh_scm2int (s); + return i>= -1 && i <= 1; + } + return false; +} + +Direction +to_dir (SCM s) +{ + return (Direction) gh_scm2int (s); +} + + +SCM +to_scm (int i) +{ + return gh_int2scm (i); +} + +/* + UGR. junkme. + */ +int +scm_to (SCM s, int* ) +{ + return gh_number_p (s) ? gh_scm2int (s) : 0; +} + +SCM +to_scm (Real r) +{ + return gh_double2scm (r); +} + +Real +scm_to (SCM s, Real* ) +{ + return gh_number_p (s) ? gh_scm2double (s) : 0; +} + +bool +to_boolean (SCM s) +{ + return gh_boolean_p (s) && gh_scm2bool (s); +} + +/* + Appendable list L: the cdr contains the list, the car the last cons + in the list. + + */ + +SCM +appendable_list () +{ + SCM s = gh_cons (SCM_EOL, SCM_EOL); + gh_set_car_x (s, s); + + return s; +} + +void +appendable_list_append (SCM l, SCM elt) +{ + SCM newcons = gh_cons (elt, SCM_EOL); + + gh_set_cdr_x (gh_car (l), newcons); + gh_set_car_x (l, newcons); +} + + +SCM +ly_offset2scm (Offset o) +{ + return gh_cons (gh_double2scm (o[X_AXIS]), gh_double2scm(o[Y_AXIS])); +}