]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/source-file.cc
Run grand-replace (issue 3765)
[lilypond.git] / lily / source-file.cc
index 17e01dd4533b1b27aaf00854bebb76a7028a870a..e4679bda60060802d0746dd102cbb1ae986feb02 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 1997--2011 Jan Nieuwenhuizen <janneke@gnu.org>
+  Copyright (C) 1997--2014 Jan Nieuwenhuizen <janneke@gnu.org>
   Han-Wen Nienhuys <hanwen@xs4all.nl>
 
   LilyPond is free software: you can redistribute it and/or modify
@@ -55,7 +55,7 @@ Source_file::load_stdin ()
   return contents of FILENAME. *Not 0-terminated!*
  */
 vector<char>
-gulp_file (string filename, int desired_size)
+gulp_file (const string &filename, int desired_size)
 {
   /* "b" must ensure to open literally, avoiding text (CR/LF)
      conversions.  */
@@ -106,7 +106,7 @@ Source_file::init ()
   smobify_self ();
 }
 
-Source_file::Source_file (string filename, string data)
+Source_file::Source_file (const string &filename, const string &data)
 {
   init ();
 
@@ -124,7 +124,7 @@ Source_file::Source_file (string filename, string data)
       newline_locations_.push_back (&characters_[0] + i);
 }
 
-Source_file::Source_file (string filename_string)
+Source_file::Source_file (const string &filename_string)
 {
   init ();
 
@@ -181,8 +181,8 @@ Source_file::file_line_column_string (char const *context_str0) const
       int l, ch, col, offset;
       get_counts (context_str0, &l, &ch, &col, &offset);
 
-      return name_string () + ":" + to_string (l)
-             + ":" + to_string (col);
+      return name_string () + ":" + ::to_string (l)
+             + ":" + ::to_string (col + 1);
     }
 }
 
@@ -196,8 +196,8 @@ Source_file::quote_input (char const *pos_str0) const
   get_counts (pos_str0, &l, &ch, &col, &offset);
   string line = line_string (pos_str0);
   string context = line.substr (0, offset)
-                   + to_string ('\n')
-                   + to_string (' ', col)
+                   + ::to_string ('\n')
+                   + ::to_string (' ', col)
                    + line.substr (offset, line.length () - offset);
   return context;
 }
@@ -277,30 +277,27 @@ Source_file::get_counts (char const *pos_str0,
   char const *line_start = (char const *)data + line[LEFT];
 
   ssize left = (char const *) pos_str0 - line_start;
+  *byte_offset = left;
+
   string line_begin (line_start, left);
   char const *line_chars = line_begin.c_str ();
 
-  while (left > 0)
+  for (; left > 0; --left, ++line_chars)
     {
-      size_t thislen = utf8_char_len (*line_chars);
-
-      if (thislen == 1 && line_chars[0] == '\t')
+      // Skip UTF-8 continuation bytes.  This is simplistic but
+      // robust, and we warn against non-UTF-8 input in the lexer
+      // already.  In the case of non-UTF-8 or of this function being
+      // called in mid-character, the results are somewhat arbitrary,
+      // but there is no really sane definition anyway.
+      if ((*line_chars & 0xc0) == 0x80)
+        continue;
+
+      if (*line_chars == '\t')
         (*column) = (*column / 8 + 1) * 8;
       else
         (*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;
     }
 }
 
@@ -335,7 +332,7 @@ Source_file::set_line (char const *pos_str0, int line)
     {
       int current_line = get_line (pos_str0);
       line_offset_ += line - current_line;
-      
+
       assert (line == get_line (pos_str0));
     }
   else