This commit is contained in:
Araq 2013-06-04 08:02:53 +02:00
commit f7c0cc976d

View file

@ -67,7 +67,8 @@ type
# implementation # implementation
const const
SymChars: TCharSet = {'a'..'z', 'A'..'Z', '0'..'9', '_', '\x80'..'\xFF', '.'} SymChars: TCharSet = {'a'..'z', 'A'..'Z', '0'..'9', '_', '\x80'..'\xFF', '.',
'/', '\\'}
proc rawGetTok(c: var TCfgParser, tok: var TToken) proc rawGetTok(c: var TCfgParser, tok: var TToken)
@ -149,7 +150,7 @@ proc getEscapedChar(c: var TCfgParser, tok: var TToken) =
of 't', 'T': of 't', 'T':
add(tok.literal, '\t') add(tok.literal, '\t')
Inc(c.bufpos) Inc(c.bufpos)
of '\'', '\"': of '\'', '"':
add(tok.literal, c.buf[c.bufpos]) add(tok.literal, c.buf[c.bufpos])
Inc(c.bufpos) Inc(c.bufpos)
of '\\': of '\\':
@ -178,7 +179,7 @@ proc getString(c: var TCfgParser, tok: var TToken, rawMode: bool) =
var pos = c.bufPos + 1 # skip " var pos = c.bufPos + 1 # skip "
var buf = c.buf # put `buf` in a register var buf = c.buf # put `buf` in a register
tok.kind = tkSymbol tok.kind = tkSymbol
if (buf[pos] == '\"') and (buf[pos + 1] == '\"'): if (buf[pos] == '"') and (buf[pos + 1] == '"'):
# long string literal: # long string literal:
inc(pos, 2) # skip "" inc(pos, 2) # skip ""
# skip leading newline: # skip leading newline:
@ -186,9 +187,9 @@ proc getString(c: var TCfgParser, tok: var TToken, rawMode: bool) =
buf = c.buf buf = c.buf
while true: while true:
case buf[pos] case buf[pos]
of '\"': of '"':
if (buf[pos + 1] == '\"') and (buf[pos + 2] == '\"'): break if (buf[pos + 1] == '"') and (buf[pos + 2] == '"'): break
add(tok.literal, '\"') add(tok.literal, '"')
Inc(pos) Inc(pos)
of '\c', '\L': of '\c', '\L':
pos = HandleCRLF(c, pos) pos = HandleCRLF(c, pos)
@ -205,7 +206,7 @@ proc getString(c: var TCfgParser, tok: var TToken, rawMode: bool) =
# ordinary string literal # ordinary string literal
while true: while true:
var ch = buf[pos] var ch = buf[pos]
if ch == '\"': if ch == '"':
inc(pos) # skip '"' inc(pos) # skip '"'
break break
if ch in {'\c', '\L', lexbase.EndOfFile}: if ch in {'\c', '\L', lexbase.EndOfFile}:
@ -278,7 +279,7 @@ proc rawGetTok(c: var TCfgParser, tok: var TToken) =
tok.kind = tkBracketRi tok.kind = tkBracketRi
Inc(c.bufpos) Inc(c.bufpos)
tok.literal = "]" tok.literal = "]"
of '\"': of '"':
getString(c, tok, false) getString(c, tok, false)
of lexbase.EndOfFile: of lexbase.EndOfFile:
tok.kind = tkEof tok.kind = tkEof
@ -351,7 +352,7 @@ proc next*(c: var TCfgParser): TCfgEvent {.rtl, extern: "npc$1".} =
rawGetTok(c, c.tok) rawGetTok(c, c.tok)
else: else:
result.kind = cfgError result.kind = cfgError
result.msg = errorStr(c, "\']\' expected, but found: " & c.tok.literal) result.msg = errorStr(c, "']' expected, but found: " & c.tok.literal)
of tkInvalid, tkEquals, tkColon, tkBracketRi: of tkInvalid, tkEquals, tkColon, tkBracketRi:
result.kind = cfgError result.kind = cfgError
result.msg = errorStr(c, "invalid token: " & c.tok.literal) result.msg = errorStr(c, "invalid token: " & c.tok.literal)