Mercurial > projects > dil
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; +}