]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/general-scheme.cc
Merge branch 'master' of git://git.sv.gnu.org/lilypond
[lilypond.git] / lily / general-scheme.cc
index 71621aafe494537165c591ad82da91497ee9aeff..1cb51a10ff27b34cea174434eee275511b1fa529 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2005 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2006 Jan Nieuwenhuizen <janneke@gnu.org>
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
@@ -16,7 +16,6 @@ using namespace std;
 #include "international.hh"
 #include "libc-extension.hh"
 #include "lily-guile.hh"
-#include "string.hh"
 #include "misc.hh"
 #include "warn.hh"
 #include "version.hh"
@@ -31,12 +30,12 @@ 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);
-  if (file_name.is_empty ())
+  string nm = ly_scm2string (name);
+  string file_name = global_path.find (nm);
+  if (file_name.empty ())
     return SCM_BOOL_F;
 
-  return scm_makfrom0str (file_name.to_str0 ());
+  return scm_makfrom0str (file_name.c_str ());
 }
 
 /*
@@ -49,15 +48,15 @@ LY_DEFINE (ly_gulp_file, "ly:gulp-file",
           "The file is looked up using the search path. ")
 {
   SCM_ASSERT_TYPE (scm_is_string (name), name, SCM_ARG1, __FUNCTION__, "string");
-  int sz = -1;
+  int sz = INT_MAX;
   if (size != SCM_UNDEFINED)
     {
       SCM_ASSERT_TYPE (scm_is_number (size), size, SCM_ARG2, __FUNCTION__, "number");
       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 +166,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);
 }
@@ -209,14 +208,14 @@ LY_DEFINE (ly_gettext, "ly:gettext",
 {
   SCM_ASSERT_TYPE (scm_is_string (string), string, SCM_ARG1,
                   __FUNCTION__, "string");
-  return scm_makfrom0str (_ (scm_i_string_chars (string)).to_str0 ());
+  return scm_makfrom0str (_ (scm_i_string_chars (string)).c_str ());
 }
 
 LY_DEFINE (ly_output_backend, "ly:output-backend",
           0, 0, 0, (),
           "Return name of output backend.")
 {
-  return scm_makfrom0str (output_backend_global.to_str0 ());
+  return scm_makfrom0str (output_backend_global.c_str ());
 }
 
 LY_DEFINE (ly_output_formats, "ly:output-formats",
@@ -224,19 +223,19 @@ LY_DEFINE (ly_output_formats, "ly:output-formats",
           "Formats passed to --format as a list of strings, "
           "used for the output.")
 {
-  Array<String> output_formats = split_string (output_format_global, ',');
+  vector<string> output_formats = string_split (output_format_global, ',');
 
   SCM lst = SCM_EOL;
   int output_formats_count = output_formats.size ();
   for (int i = 0; i < output_formats_count; i++)
-    lst = scm_cons (scm_makfrom0str (output_formats[i].to_str0 ()), lst);
+    lst = scm_cons (scm_makfrom0str (output_formats[i].c_str ()), lst);
 
   return lst;
 }
 
 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];
 
@@ -273,7 +272,7 @@ LY_DEFINE (ly_effective_prefix, "ly:effective-prefix",
           0, 0, 0, (),
           "Return effective prefix.")
 {
-  return scm_makfrom0str (prefix_directory.to_str0 ());
+  return scm_makfrom0str (prefix_directory.c_str ());
 }
 
 LY_DEFINE (ly_chain_assoc_get, "ly:chain-assoc-get",
@@ -297,7 +296,7 @@ LY_DEFINE (ly_stderr_redirect, "ly:stderr-redirect",
           1, 1, 0, (SCM file_name, SCM mode),
           "Redirect stderr to FILE-NAME, opened with MODE.")
 {
-  SCM_ASSERT_TYPE (scm_string_p (file_name), file_name, SCM_ARG1,
+  SCM_ASSERT_TYPE (scm_is_string (file_name), file_name, SCM_ARG1,
                   __FUNCTION__, "file_name");
   char const *m = "w";
   if (mode != SCM_UNDEFINED && scm_string_p (mode))
@@ -307,3 +306,36 @@ 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_Bla to foo-bar-bla 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);
+  string result = camel_case_to_lisp_identifier (in);
+
+  return ly_symbol2scm (result.c_str ());
+}