From 15ff89cec14ea6d1bc05a5975dedfcb6e712720b Mon Sep 17 00:00:00 2001 From: Miran Date: Tue, 25 Aug 2020 09:57:15 +0200 Subject: [PATCH] [backport] fix #15064, strscans.scanf edge case for '$+' (#15223) --- lib/pure/strscans.nim | 2 +- tests/stdlib/tstrscans.nim | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/pure/strscans.nim b/lib/pure/strscans.nim index 0125a19266..f078b0d207 100644 --- a/lib/pure/strscans.nim +++ b/lib/pure/strscans.nim @@ -396,7 +396,7 @@ macro scanf*(input: string; pattern: static[string]; results: varargs[typed]): b var resLen = genSym(nskLet, "resLen") conds.add newLetStmt(resLen, newCall(bindSym"parseUntil", inp, results[i], newLit(token), idx)) - conds.add newCall(bindSym"!=", resLen, newLit min) + conds.add newCall(bindSym">=", resLen, newLit min) conds.add resLen else: matchError diff --git a/tests/stdlib/tstrscans.nim b/tests/stdlib/tstrscans.nim index 08fc14e455..6f952368c9 100644 --- a/tests/stdlib/tstrscans.nim +++ b/tests/stdlib/tstrscans.nim @@ -79,8 +79,22 @@ block EmptyTuple: block Arrow: let text = "foo;bar;baz;" var idx = 0 - var res = "" doAssert scanp(text, idx, +(~{';','\0'} -> (discard $_)), ';') doAssert scanp(text, idx, +(~{';','\0'} -> (discard $_)), ';') doAssert scanp(text, idx, +(~{';','\0'} -> (discard $_)), ';') doAssert scanp(text, idx, +(~{';','\0'} -> (discard $_)), ';') == false + + +block issue15064: + var nick1, msg1: string + doAssert scanf(" a", "<$+> $+", nick1, msg1) + doAssert nick1 == "abcd" + doAssert msg1 == "a" + + var nick2, msg2: string + doAssert(not scanf(" ", "<$+> $+", nick2, msg2)) + + var nick3, msg3: string + doAssert scanf(" ", "<$+> $*", nick3, msg3) + doAssert nick3 == "abcd" + doAssert msg3 == ""