X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fgeneral-scheme.cc;h=2ba1cb3b368661b333a7c354d3747b7790d72a4e;hb=45e73c21395bfa26f928c216fc6ee72fc9fa68d9;hp=3ecb45fbd554e285fad30c13b839fc108d128c9b;hpb=8a719f6eec1bd84269a55d1ec99adb3f17c04e64;p=lilypond.git diff --git a/lily/general-scheme.cc b/lily/general-scheme.cc index 3ecb45fbd5..2ba1cb3b36 100644 --- a/lily/general-scheme.cc +++ b/lily/general-scheme.cc @@ -16,7 +16,7 @@ using namespace std; #include "international.hh" #include "libc-extension.hh" #include "lily-guile.hh" -#include "string.hh" +#include "std-string.hh" #include "misc.hh" #include "warn.hh" #include "version.hh" @@ -31,8 +31,8 @@ LY_DEFINE (ly_find_file, "ly:find-file", { SCM_ASSERT_TYPE (scm_is_string (name), name, SCM_ARG1, __FUNCTION__, "string"); - String nm = ly_scm2string (name); - String file_name = global_path.find (nm); + string nm = ly_scm2string (name); + string file_name = global_path.find (nm); if (file_name.empty ()) return SCM_BOOL_F; @@ -56,8 +56,8 @@ LY_DEFINE (ly_gulp_file, "ly:gulp-file", sz = scm_to_int (size); } - String contents = gulp_file_to_string (ly_scm2string (name), true, sz); - return scm_from_locale_stringn (contents.get_str0 (), contents.length ()); + string contents = gulp_file_to_string (ly_scm2string (name), true, sz); + return scm_from_locale_stringn (contents.c_str (), contents.length ()); } LY_DEFINE (ly_error, "ly:error", @@ -167,7 +167,7 @@ LY_DEFINE (ly_number2string, "ly:number->string", snprintf (str, sizeof (str), "%08.4f", r); } else - snprintf (str, sizeof (str), "%d", scm_to_int (s)); + snprintf (str, sizeof (str), "%d", int (scm_to_int (s))); return scm_makfrom0str (str); } @@ -224,7 +224,7 @@ LY_DEFINE (ly_output_formats, "ly:output-formats", "Formats passed to --format as a list of strings, " "used for the output.") { - Array output_formats = split_string (output_format_global, ','); + vector output_formats = string_split (output_format_global, ','); SCM lst = SCM_EOL; int output_formats_count = output_formats.size (); @@ -236,7 +236,7 @@ LY_DEFINE (ly_output_formats, "ly:output-formats", LY_DEFINE (ly_wchar_to_utf_8, "ly:wide-char->utf-8", 1, 0, 0, (SCM wc), - "Encode the Unicode codepoint @var{wc} as UTF-8") + "Encode the Unicode codepoint @var{wc}, an integer, as UTF-8") { char buf[5]; @@ -307,3 +307,48 @@ LY_DEFINE (ly_stderr_redirect, "ly:stderr-redirect", freopen (ly_scm2newstr (file_name, 0), m, stderr); return SCM_UNSPECIFIED; } + +static SCM +accumulate_symbol (void *closure, SCM key, SCM val, SCM result) +{ + (void) closure; + (void) val; + return scm_cons (key, result); +} + +LY_DEFINE(ly_hash_table_keys, "ly:hash-table-keys", + 1,0,0, (SCM tab), + "return a list of keys in @var{tab}") +{ + return scm_internal_hash_fold ((Hash_closure_function) & accumulate_symbol, + NULL, SCM_EOL, tab); +} + +LY_DEFINE (ly_camel_case_to_lisp_identifier, "ly:camel-case->lisp-identifier", + 1, 0, 0, (SCM name_sym), + "Convert FooBar to foo-bar style symbol.") +{ + SCM_ASSERT_TYPE(scm_is_symbol (name_sym), name_sym, + SCM_ARG1, __FUNCTION__, "symbol"); + + /* + TODO: should use strings instead? + */ + + const string in = ly_symbol2string (name_sym); + + vector out; + + /* don't add '-' before first character */ + out.push_back (tolower (in[0])); + + for (size_t inpos = 1; inpos < in.size (); inpos++) + { + if (isupper (in[inpos])) + out.push_back ('-'); + out.push_back (tolower (in[inpos])); + } + + string result (&out[0], out.size ()); + return ly_symbol2scm (result.c_str ()); +}