summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xlib/pure/parseutils.nim16
-rwxr-xr-xlib/pure/strtabs.nim22
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("}")
+