Skip to content

Commit

Permalink
add support for parsing chars in scanf macro (nim-lang#16240)
Browse files Browse the repository at this point in the history
  • Loading branch information
narimiran authored and mildred committed Jan 11, 2021
1 parent 73be6bd commit 4046ff5
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 1 deletion.
4 changes: 4 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@

- `writeStackTrace` is available in JS backend now.

- `strscans.scanf` now supports parsing single characters.


## Language changes

- `nimscript` now handles `except Exception as e`.
Expand All @@ -60,6 +63,7 @@

- nil dereference is not allowed at compile time. `cast[ptr int](nil)[]` is rejected at compile time.


## Compiler changes

- Added `--declaredlocs` to show symbol declaration location in messages.
Expand Down
4 changes: 4 additions & 0 deletions lib/pure/parseutils.nim
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,10 @@ proc parseIdent*(s: string, start = 0): string =
while i < s.len and s[i] in IdentChars: inc(i)
result = substr(s, start, i-1)

proc parseChar*(s: string, ident: var char, start = 0): int =
ident = s[start]
result = 1

proc skipWhitespace*(s: string, start = 0): int {.inline.} =
## Skips the whitespace starting at ``s[start]``. Returns the number of
## skipped characters.
Expand Down
7 changes: 7 additions & 0 deletions lib/pure/strscans.nim
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ substrings starting with ``$``. These constructions are available:
``$h`` Matches a hex integer. This uses ``parseutils.parseHex``.
``$f`` Matches a floating pointer number. Uses ``parseFloat``.
``$w`` Matches an ASCII identifier: ``[A-Za-z_][A-Za-z_0-9]*``.
``$c`` Matches a single ASCII character.
``$s`` Skips optional whitespace.
``$$`` Matches a single dollar sign.
``$.`` Matches if the end of the input string has been reached.
Expand Down Expand Up @@ -345,6 +346,12 @@ macro scanf*(input: string; pattern: static[string]; results: varargs[typed]): b
else:
matchError
inc i
of 'c':
if i < results.len and getType(results[i]).typeKind == ntyChar:
matchBind "parseChar"
else:
matchError
inc i
of 'b':
if i < results.len and getType(results[i]).typeKind == ntyInt:
matchBind "parseBin"
Expand Down
19 changes: 18 additions & 1 deletion tests/stdlib/tstrscans.nim
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ discard """
output: ""
"""

import strscans
import strscans, strutils

block ParsePasswd:
proc parsePasswd(content: string): seq[string] =
Expand Down Expand Up @@ -210,3 +210,20 @@ block:
var a: int
discard scanf(test(), ",$i", a)
doAssert count == 1


block:
let input = """1-3 s: abc
15-18 9: def
15-18 A: ghi
15-18 _: jkl
"""
var
lo, hi: int
w: string
c: char
res: int
for line in input.splitLines:
if line.scanf("$i-$i $c: $w", lo, hi, c, w):
inc res
doAssert res == 4

0 comments on commit 4046ff5

Please sign in to comment.