Mercurial > projects > dil
diff trunk/src/dil/lexer/Funcs.d @ 577:9e811db780a6
Moved LexerFuncs.d to package 'lexer'.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sat, 05 Jan 2008 17:01:15 +0100 |
parents | trunk/src/dil/LexerFuncs.d@2a8d0ed0d71e |
children | b6c6baa41267 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/trunk/src/dil/lexer/Funcs.d Sat Jan 05 17:01:15 2008 +0100 @@ -0,0 +1,82 @@ +/++ + Author: Aziz Köksal + License: GPL3 ++/ +module dil.lexer.Funcs; + +const char[3] LS = \u2028; /// Line separator. +const char[3] PS = \u2029; /// Paragraph separator. +const dchar LSd = 0x2028; +const dchar PSd = 0x2029; +static assert(LS[0] == PS[0] && LS[1] == PS[1]); + +const uint _Z_ = 26; /// Control+Z + +/// Returns true if d is a Unicode line or paragraph separator. +bool isUnicodeNewlineChar(dchar d) +{ + return d == LSd || d == PSd; +} + +/// Returns true if p points to a line or paragraph separator. +bool isUnicodeNewline(char* p) +{ + return *p == LS[0] && p[1] == LS[1] && (p[2] == LS[2] || p[2] == PS[2]); +} + +/++ + Returns true if p points to the start of a Newline. + Newline: \n | \r | \r\n | LS | PS ++/ +bool isNewline(char* p) +{ + return *p == '\n' || *p == '\r' || isUnicodeNewline(p); +} + +/// Returns if c is a Newline character. +bool isNewline(dchar c) +{ + return c == '\n' || c == '\r' || isUnicodeNewlineChar(c); +} + +/++ + Returns true if p points to an EOF character. + EOF: 0 | _Z_ ++/ +bool isEOF(dchar c) +{ + return c == 0 || c == _Z_; +} + +/++ + Returns true if p points to the first character of an EndOfLine. + EndOfLine: Newline | EOF ++/ +bool isEndOfLine(char* p) +{ + return isNewline(p) || isEOF(*p); +} + +/++ + Scans a Newline and sets p one character past it. + Returns '\n' if scanned or 0 otherwise. ++/ +dchar scanNewline(ref char* p) +{ + switch (*p) + { + case '\r': + if (p[1] == '\n') + ++p; + case '\n': + ++p; + return '\n'; + default: + if (isUnicodeNewline(p)) + { + p += 3; + return '\n'; + } + } + return 0; +}