view trunk/src/dil/Location.d @ 798:c24be8d4f6ab

Added documentation comments.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Sat, 01 Mar 2008 02:53:06 +0100
parents 7173ece1b696
children
line wrap: on
line source

/++
  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;
}