diff options
Diffstat (limited to 'compiler/prefixmatches.nim')
-rw-r--r-- | compiler/prefixmatches.nim | 46 |
1 files changed, 6 insertions, 40 deletions
diff --git a/compiler/prefixmatches.nim b/compiler/prefixmatches.nim index 00e2c537d..bfbe3d888 100644 --- a/compiler/prefixmatches.nim +++ b/compiler/prefixmatches.nim @@ -7,7 +7,7 @@ # distribution, for details about the copyright. # -from strutils import toLowerAscii +from std/strutils import toLowerAscii type PrefixMatch* {.pure.} = enum @@ -20,14 +20,13 @@ proc prefixMatch*(p, s: string): PrefixMatch = template eq(a, b): bool = a.toLowerAscii == b.toLowerAscii if p.len > s.len: return PrefixMatch.None var i = 0 - let L = s.len # check for prefix/contains: - while i < L: + while i < s.len: if s[i] == '_': inc i - if eq(s[i], p[0]): + if i < s.len and eq(s[i], p[0]): var ii = i+1 var jj = 1 - while ii < L and jj < p.len: + while ii < s.len and jj < p.len: if p[jj] == '_': inc jj if s[ii] == '_': inc ii if not eq(s[ii], p[jj]): break @@ -43,10 +42,10 @@ proc prefixMatch*(p, s: string): PrefixMatch = i = 1 var j = 1 while i < s.len: - if s[i] == '_' and i < s.len-1: + if i < s.len-1 and s[i] == '_': if j < p.len and eq(p[j], s[i+1]): inc j else: return PrefixMatch.None - if s[i] in {'A'..'Z'} and s[i-1] notin {'A'..'Z'}: + if i < s.len and s[i] in {'A'..'Z'} and s[i-1] notin {'A'..'Z'}: if j < p.len and eq(p[j], s[i]): inc j else: return PrefixMatch.None inc i @@ -55,36 +54,3 @@ proc prefixMatch*(p, s: string): PrefixMatch = else: return PrefixMatch.None return PrefixMatch.None - -when isMainModule: - import macros - - macro check(val, body: untyped): untyped = - result = newStmtList() - expectKind body, nnkStmtList - for b in body: - expectKind b, nnkPar - expectLen b, 2 - let p = b[0] - let s = b[1] - result.add quote do: - echo prefixMatch(`p`, `s`) == `val` - - check PrefixMatch.Prefix: - ("abc", "abc") - ("a", "abc") - ("xyz", "X_yzzzZe") - - check PrefixMatch.Substr: - ("b", "abc") - ("abc", "fooabcabc") - ("abC", "foo_AB_c") - - check PrefixMatch.Abbrev: - ("abc", "AxxxBxxxCxxx") - ("xyz", "X_yabcZe") - - check PrefixMatch.None: - ("foobar", "afkslfjd_as") - ("xyz", "X_yuuZuuZe") - ("ru", "remotes") |