]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/source-file.cc
resolve merge
[lilypond.git] / lily / source-file.cc
index f1dd4a36942ed73d973f5f139795f4ae23ef0512..82c13fc45b6911338d6996760de97e5ddf2b6f9f 100644 (file)
@@ -1,22 +1,32 @@
 /*
-  source-file.cc -- implement Source_file
+  This file is part of LilyPond, the GNU music typesetter.
 
-  source file of the GNU LilyPond music typesetter
-
-  (c) 1997--2006 Jan Nieuwenhuizen <janneke@gnu.org>
+  Copyright (C) 1997--2011 Jan Nieuwenhuizen <janneke@gnu.org>
   Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+  LilyPond is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#include "source-file.hh"
+#if GCC_MAJOR < 4
+#define _GLIBCXX_HAVE_MBSTATE_T
+#include <wchar.h>
+#endif /* GCC_MAJOR < 4 */
 
+#include "source-file.hh"
+#include <cstring>
 #include "config.hh"
 
-#if HAVE_UTF8_WCHAR_H
-#include <utf8/wchar.h>  /* mbrtowc */
-#else
-#include <cwchar> /* mbrtowc */
-#endif
-
 #include <cstdio>
 
 #if HAVE_SSTREAM
@@ -29,6 +39,7 @@ using namespace std;
 
 #include "file-name-map.hh"
 #include "international.hh"
+#include "misc.hh"
 #include "warn.hh"
 
 void
@@ -37,7 +48,7 @@ Source_file::load_stdin ()
   characters_.clear ();
   int c;
   while ((c = fgetc (stdin)) != EOF)
-    characters_.push_back (c);
+    characters_.push_back ((char)c);
 }
 
 /*
@@ -51,7 +62,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<char> cxx_arr;
       return cxx_arr;
@@ -138,9 +149,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_));
 }
 
 
@@ -168,8 +179,8 @@ Source_file::file_line_column_string (char const *context_str0) const
     return " (" + _ ("position unknown") + ")";
   else
     {
-      int l, ch, col;
-      get_counts (context_str0, &l, &ch, &col);
+      int l, ch, col, offset;
+      get_counts (context_str0, &l, &ch, &col, &offset);
 
       return name_string () + ":" + to_string (l)
        + ":" + to_string (col);
@@ -182,13 +193,13 @@ Source_file::quote_input (char const *pos_str0) const
   if (!contains (pos_str0))
     return " (" + _ ("position unknown") + ")";
 
-  int l, ch, col;
-  get_counts (pos_str0, &l, &ch, &col);
+  int l, ch, col, offset;
+  get_counts (pos_str0, &l, &ch, &col, &offset);
   string line = line_string (pos_str0);
-  string context = line.substr (0, ch)
+  string context = line.substr (0, offset)
     + to_string ('\n')
     + to_string (' ', col)
-    + line.substr (ch, line.length()-ch);
+    + line.substr (offset, line.length () - offset);
   return context;
 }
 
@@ -248,11 +259,10 @@ void
 Source_file::get_counts (char const *pos_str0,
                         int *line_number,
                         int *line_char,
-                        int *column) const
+                        int *column,
+                        int *byte_offset) const
 {
   *line_number = 0;
-  *line_char = 0;
-  *column = 0;
     
   if (!contains (pos_str0))
     return;
@@ -267,37 +277,13 @@ Source_file::get_counts (char const *pos_str0,
   string line_begin (line_start, left);
   char const *line_chars = line_begin.c_str ();
 
-  *column = 0;
   *line_char = 0;
-
-  mbstate_t state;
-
-  /* Initialize the state.  */
-  memset (&state, '\0', sizeof (state));
+  *column = 0;
+  *byte_offset = 0;
 
   while (left > 0)
     {
-      wchar_t multibyte[2];
-
-      /*
-       FIXME, this is apparently locale dependent.
-      */
-#if HAVE_MBRTOWC
-      size_t thislen = mbrtowc (multibyte, line_chars, left, &state);
-#else
-      size_t thislen = 1;
-#endif /* !HAVE_MBRTOWC */
-
-      /* Stop converting at invalid character;
-        this can mean we have read just the first part
-        of a valid character.  */
-      if (thislen == (size_t) -1)
-       break;
-
-      /* We want to handle embedded NUL bytes
-        but the return value is 0.  Correct this.  */
-      if (thislen == 0)
-       thislen = 1;
+      size_t thislen = utf8_char_len (*line_chars);
 
       if (thislen == 1 && line_chars[0] == '\t')
        (*column) = (*column / 8 + 1) * 8;
@@ -305,6 +291,14 @@ Source_file::get_counts (char const *pos_str0,
        (*column)++;
 
       (*line_char)++;
+
+      /*
+       To have decent output in UTF-8 aware terminals,
+       we must keep track of the number of bytes from
+       the left edge of the terminal.
+      */
+      *byte_offset += thislen;
+
       /* Advance past this character. */
       line_chars += thislen;
       left -= thislen;
@@ -326,23 +320,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;
-
-  binary_search_bounds (newline_locations_,
-                       (char const*&)pos_str0,
-                       default_compare,
-                       &lo, &hi);
+  /* this will find the '\n' character at the end of our line */
+  vsize lo = lower_bound (newline_locations_,
+                         pos_str0,
+                         less<char const*> ());
 
-  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 +360,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)