StringStream and parseJson, parseCfg, parseSql et al for the vm (#10746)

This commit is contained in:
Arne Döring 2019-02-28 22:57:57 +01:00 • committed by Andreas Rumpf
commit 1102b8ac6e
15 changed files with 354 additions and 403 deletions

View file

@ -124,9 +124,8 @@ proc handleHexChar(c: char, x: var int): bool =
proc parseString(my: var SexpParser): TTokKind =
result = tkString
var pos = my.bufpos + 1
var buf = my.buf
while true:
case buf[pos]
case my.buf[pos]
of '\0':
my.err = errQuoteExpected
result = tkError
@ -135,9 +134,9 @@ proc parseString(my: var SexpParser): TTokKind =
inc(pos)
break
of '\\':
case buf[pos+1]
case my.buf[pos+1]
of '\\', '"', '\'', '/':
add(my.a, buf[pos+1])
add(my.a, my.buf[pos+1])
inc(pos, 2)
of 'b':
add(my.a, '\b')
@ -157,65 +156,61 @@ proc parseString(my: var SexpParser): TTokKind =
of 'u':
inc(pos, 2)
var r: int
if handleHexChar(buf[pos], r): inc(pos)
if handleHexChar(buf[pos], r): inc(pos)
if handleHexChar(buf[pos], r): inc(pos)
if handleHexChar(buf[pos], r): inc(pos)
if handleHexChar(my.buf[pos], r): inc(pos)
if handleHexChar(my.buf[pos], r): inc(pos)
if handleHexChar(my.buf[pos], r): inc(pos)
if handleHexChar(my.buf[pos], r): inc(pos)
add(my.a, toUTF8(Rune(r)))
else:
# don't bother with the error
add(my.a, buf[pos])
add(my.a, my.buf[pos])
inc(pos)
of '\c':
pos = lexbase.handleCR(my, pos)
buf = my.buf
add(my.a, '\c')
of '\L':
pos = lexbase.handleLF(my, pos)
buf = my.buf
add(my.a, '\L')
else:
add(my.a, buf[pos])
add(my.a, my.buf[pos])
inc(pos)
my.bufpos = pos # store back
proc parseNumber(my: var SexpParser) =
var pos = my.bufpos
var buf = my.buf
if buf[pos] == '-':
if my.buf[pos] == '-':
add(my.a, '-')
inc(pos)
if buf[pos] == '.':
if my.buf[pos] == '.':
add(my.a, "0.")
inc(pos)
else:
while buf[pos] in Digits:
add(my.a, buf[pos])
while my.buf[pos] in Digits:
add(my.a, my.buf[pos])
inc(pos)
if buf[pos] == '.':
if my.buf[pos] == '.':
add(my.a, '.')
inc(pos)
# digits after the dot:
while buf[pos] in Digits:
add(my.a, buf[pos])
while my.buf[pos] in Digits:
add(my.a, my.buf[pos])
inc(pos)
if buf[pos] in {'E', 'e'}:
add(my.a, buf[pos])
if my.buf[pos] in {'E', 'e'}:
add(my.a, my.buf[pos])
inc(pos)
if buf[pos] in {'+', '-'}:
add(my.a, buf[pos])
if my.buf[pos] in {'+', '-'}:
add(my.a, my.buf[pos])
inc(pos)
while buf[pos] in Digits:
add(my.a, buf[pos])
while my.buf[pos] in Digits:
add(my.a, my.buf[pos])
inc(pos)
my.bufpos = pos
proc parseSymbol(my: var SexpParser) =
var pos = my.bufpos
var buf = my.buf
if buf[pos] in IdentStartChars:
while buf[pos] in IdentChars:
add(my.a, buf[pos])
if my.buf[pos] in IdentStartChars:
while my.buf[pos] in IdentChars:
add(my.a, my.buf[pos])
inc(pos)
my.bufpos = pos