X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsource-file.cc;h=49d8eb4f214f7f669c94e282d5d1c233aa2e9c8f;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=56b2e57d72937d0a2501fa83c132b0e3ee5af16d;hpb=fb5d36ef6d026fdaa2b5d6c207eefd39374bff97;p=lilypond.git diff --git a/lily/source-file.cc b/lily/source-file.cc index 56b2e57d72..49d8eb4f21 100644 --- a/lily/source-file.cc +++ b/lily/source-file.cc @@ -3,19 +3,24 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Jan Nieuwenhuizen + (c) 1997--2008 Jan Nieuwenhuizen Han-Wen Nienhuys */ +#if GCC_MAJOR < 4 +#define _GLIBCXX_HAVE_MBSTATE_T +#include +#endif /* GCC_MAJOR < 4 */ + #include "source-file.hh" #include "config.hh" #if HAVE_UTF8_WCHAR_H #include /* mbrtowc */ -#else +#else /* !HAVE_UTF8_WCHAR_H */ #include /* mbrtowc */ -#endif +#endif /* HAVE_UTF8_WCHAR_H */ #include @@ -51,7 +56,7 @@ gulp_file (string filename, int desired_size) FILE *f = fopen (filename.c_str (), "rb"); if (!f) { - warning (_f ("can't open file: `%s'", filename.c_str ())); + warning (_f ("cannot open file: `%s'", filename.c_str ())); vector cxx_arr; return cxx_arr; @@ -138,9 +143,9 @@ Source_file::Source_file (string filename_string) void Source_file::init_port () { - SCM str = scm_makfrom0str (c_str ()); + SCM str = scm_from_locale_string (c_str ()); str_port_ = scm_mkstrport (SCM_INUM0, str, SCM_OPN | SCM_RDNG, __FUNCTION__); - scm_set_port_filename_x (str_port_, scm_makfrom0str (name_.c_str ())); + scm_set_port_filename_x (str_port_, ly_string2scm (name_)); } @@ -188,7 +193,7 @@ Source_file::quote_input (char const *pos_str0) const string context = line.substr (0, ch) + to_string ('\n') + to_string (' ', col) - + line.substr (ch, line.length()-ch); + + line.substr (ch, line.length ()-ch); return context; } @@ -277,12 +282,11 @@ Source_file::get_counts (char const *pos_str0, while (left > 0) { - wchar_t multibyte[2]; - /* FIXME, this is apparently locale dependent. */ #if HAVE_MBRTOWC + wchar_t multibyte[2]; size_t thislen = mbrtowc (multibyte, line_chars, left, &state); #else size_t thislen = 1; @@ -326,23 +330,13 @@ Source_file::get_line (char const *pos_str0) const if (!newline_locations_.size ()) return 1; - vsize lo = 0; - vsize hi = newline_locations_.size (); - - if (newline_locations_[lo] > pos_str0) - return 1; - - if (newline_locations_[hi - 1] < pos_str0) - return hi; - - lo = lower_bound (newline_locations_, - pos_str0, - less (), - lo, hi); + /* this will find the '\n' character at the end of our line */ + vsize lo = lower_bound (newline_locations_, + pos_str0, + less ()); - if (*pos_str0 == '\n') - lo--; - return lo + 2 + line_offset_; + /* the return value will be indexed from 1 */ + return lo + 1 + line_offset_; } void @@ -376,9 +370,9 @@ Source_file::get_port () const #include "ly-smobs.icc" -IMPLEMENT_SMOBS(Source_file); -IMPLEMENT_DEFAULT_EQUAL_P(Source_file); -IMPLEMENT_TYPE_P(Source_file, "ly:source-file?"); +IMPLEMENT_SMOBS (Source_file); +IMPLEMENT_DEFAULT_EQUAL_P (Source_file); +IMPLEMENT_TYPE_P (Source_file, "ly:source-file?"); SCM Source_file::mark_smob (SCM smob)