diff src/dil/Location.d @ 806:bcb74c9b895c

Moved out files in the trunk folder to the root.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Sun, 09 Mar 2008 00:12:19 +0100
parents trunk/src/dil/Location.d@c24be8d4f6ab
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/dil/Location.d	Sun Mar 09 00:12:19 2008 +0100
@@ -0,0 +1,85 @@
+/++
+  Author: Aziz Köksal
+  License: GPL3
++/
+module dil.Location;
+
+import dil.lexer.Funcs;
+import dil.Unicode;
+
+/// Represents a location in a source text.
+final class Location
+{
+  char[] filePath; /// The file path.
+  size_t lineNum; /// The line number.
+  char* lineBegin, to; /// Used to calculate the column.
+
+  /// Forwards the parameters to the second constructor.
+  this(char[] filePath, size_t lineNum)
+  {
+    set(filePath, lineNum);
+  }
+
+  /// Constructs a Location object.
+  this(char[] filePath, size_t lineNum, char* lineBegin, char* to)
+  {
+    set(filePath, lineNum, lineBegin, to);
+  }
+
+  void set(char[] filePath, size_t lineNum)
+  {
+    set(filePath, lineNum, null, null);
+  }
+
+  void set(char[] filePath, size_t lineNum, char* lineBegin, char* to)
+  {
+    this.filePath  = filePath;
+    set(lineNum, lineBegin, to);
+  }
+
+  void set(size_t lineNum, char* lineBegin, char* to)
+  {
+    assert(lineBegin <= to);
+    this.lineNum   = lineNum;
+    this.lineBegin = lineBegin;
+    this.to        = to;
+  }
+
+  void setFilePath(char[] filePath)
+  {
+    this.filePath = filePath;
+  }
+
+  /// This is a primitive method to count the number of characters in a string.
+  /// Note: Unicode compound characters and other special characters are not
+  /// taken into account. The tabulator character is counted as one.
+  uint calculateColumn()
+  {
+    uint col;
+    auto p = lineBegin;
+    if (!p)
+      return 0;
+    for (; p <= to; ++p)
+    {
+      assert(delegate ()
+        {
+          // Check that there is no newline between p and to.
+          // But 'to' may point to a newline.
+          if (p != to && isNewline(*p))
+            return false;
+          if (to-p >= 2 && isUnicodeNewline(p))
+            return false;
+          return true;
+        }() == true
+      );
+
+      // Skip this byte if it is a trail byte of a UTF-8 sequence.
+      if (isTrailByte(*p))
+        continue; // *p == 0b10xx_xxxx
+      // Only count ASCII characters and the first byte of a UTF-8 sequence.
+      ++col;
+    }
+    return col;
+  }
+  alias calculateColumn colNum;
+}