diff options
-rwxr-xr-x | lib/pure/parseutils.nim | 16 | ||||
-rwxr-xr-x | lib/pure/strtabs.nim | 22 |
2 files changed, 29 insertions, 9 deletions
diff --git a/lib/pure/parseutils.nim b/lib/pure/parseutils.nim index ea4b17b65..07c54f88c 100755 --- a/lib/pure/parseutils.nim +++ b/lib/pure/parseutils.nim @@ -77,7 +77,7 @@ proc parseIdent*(s: string, ident: var string, start = 0): int = result = i-start proc parseToken*(s: string, token: var string, validChars: set[char], - start = 0): int = + start = 0): int {.inline.} = ## parses a token and stores it in ``token``. Returns ## the number of the parsed characters or 0 in case of an error. A token ## consists of the characters in `validChars`. @@ -91,14 +91,24 @@ proc skipWhitespace*(s: string, start = 0): int {.inline.} = ## skipped characters. while s[start+result] in Whitespace: inc(result) -proc skip*(s, token: string, start = 0): int = +proc skip*(s, token: string, start = 0): int {.inline.} = while result < token.len and s[result+start] == token[result]: inc(result) if result != token.len: result = 0 proc skipIgnoreCase*(s, token: string, start = 0): int = while result < token.len and toLower(s[result+start]) == toLower(token[result]): inc(result) - if result != token.len: result = 0 + if result != token.len: result = 0 + +proc skipUntil*(s: string, until: set[char], start = 0): int {.inline.} = + ## Skips all characters until one char from the set `token` is found. + ## Returns number of characters skipped. + while s[result+start] notin until and s[result+start] != '\0': inc(result) + +proc skipWhile*(s: string, toSkip: set[char], start = 0): int {.inline.} = + ## Skips all characters while one char from the set `token` is found. + ## Returns number of characters skipped. + while s[result+start] in toSkip and s[result+start] != '\0': inc(result) {.push overflowChecks: on.} # this must be compiled with overflow checking turned on: diff --git a/lib/pure/strtabs.nim b/lib/pure/strtabs.nim index 1ac8930b0..d11ff31c8 100755 --- a/lib/pure/strtabs.nim +++ b/lib/pure/strtabs.nim @@ -77,8 +77,7 @@ proc nextTry(h, maxHash: THash): THash {.inline.} = result = ((5 * h) + 1) and maxHash proc RawGet(t: PStringTable, key: string): int = - var h: THash - h = myhash(t, key) and high(t.data) # start with real hash value + var h: THash = myhash(t, key) and high(t.data) # start with real hash value while not isNil(t.data[h].key): if mycmp(t, t.data[h].key, key): return h @@ -89,8 +88,7 @@ proc `[]`*(t: PStringTable, key: string): string {.rtl, extern: "nstGet".} = ## retrieves the value at ``t[key]``. If `key` is not in `t`, "" is returned ## and no exception is raised. One can check with ``hasKey`` whether the key ## exists. - var index: int - index = RawGet(t, key) + var index = RawGet(t, key) if index >= 0: result = t.data[index].val else: result = "" @@ -99,8 +97,7 @@ proc hasKey*(t: PStringTable, key: string): bool {.rtl, extern: "nst$1".} = result = rawGet(t, key) >= 0 proc RawInsert(t: PStringTable, data: var TKeyValuePairSeq, key, val: string) = - var h: THash - h = myhash(t, key) and high(data) + var h: THash = myhash(t, key) and high(data) while not isNil(data[h].key): h = nextTry(h, high(data)) data[h].key = key @@ -188,3 +185,16 @@ proc `%`*(f: string, t: PStringTable, flags: set[TFormatFlag] = {}): string {. add(result, f[i]) inc(i) +proc `$`*(t: PStringTable): string {.rtl, extern: "nstDollar".} = + ## The `$` operator for string tables. + if t.len == 0: + result = "{:}" + else: + result = "{" + for key, val in pairs(t): + if result.len > 1: result.add(", ") + result.add(key) + result.add(": ") + result.add(val) + result.add("}") + |