summary refs log tree commit diff stats
path: root/lib/pure/strutils.nim
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2011-07-21 00:57:39 +0200
committerAraq <rumpf_a@web.de>2011-07-21 00:57:39 +0200
commit569c1ce5ec7cedd2c28d3272aae92062638cad0d (patch)
tree835e4667fd6efcda72fe878982ec01eeb4ae92af /lib/pure/strutils.nim
parent81a917390bdb61d07310c8faf31092f65acbfb53 (diff)
downloadNim-569c1ce5ec7cedd2c28d3272aae92062638cad0d.tar.gz
bugfix: proper cache for generic instantiations
Diffstat (limited to 'lib/pure/strutils.nim')
-rwxr-xr-xlib/pure/strutils.nim123
1 files changed, 61 insertions, 62 deletions
diff --git a/lib/pure/strutils.nim b/lib/pure/strutils.nim
index 58e1e5fed..9b4b09fae 100755
--- a/lib/pure/strutils.nim
+++ b/lib/pure/strutils.nim
@@ -480,40 +480,40 @@ proc align*(s: string, count: int): string {.
     for i in spaces..count-1: result[i] = s[i-spaces]

   else:

     result = s

-
-iterator tokenize*(s: string, seps: set[char] = Whitespace): tuple[
-  token: string, isSep: bool] =
-  ## Tokenizes the string `s` into substrings.
-  ##
-  ## Substrings are separated by a substring containing only `seps`.
-  ## Examples:
-  ##
-  ## .. code-block:: nimrod
-  ##   for word in tokenize("  this is an  example  "):
-  ##     writeln(stdout, word)
-  ##
-  ## Results in:
-  ##
-  ## .. code-block:: nimrod
-  ##   ("  ", true)
-  ##   ("this", false)
-  ##   (" ", true)
-  ##   ("is", false)
-  ##   (" ", true)
-  ##   ("an", false)
-  ##   ("  ", true)
-  ##   ("example", false)
-  ##   ("  ", true)
-  var i = 0
-  while true:
-    var j = i
-    var isSep = s[j] in seps
-    while j < s.len and (s[j] in seps) == isSep: inc(j)
-    if j > i:
-      yield (substr(s, i, j-1), isSep)
-    else:
-      break
-    i = j
+

+iterator tokenize*(s: string, seps: set[char] = Whitespace): tuple[

+  token: string, isSep: bool] =

+  ## Tokenizes the string `s` into substrings.

+  ##

+  ## Substrings are separated by a substring containing only `seps`.

+  ## Examples:

+  ##

+  ## .. code-block:: nimrod

+  ##   for word in tokenize("  this is an  example  "):

+  ##     writeln(stdout, word)

+  ##

+  ## Results in:

+  ##

+  ## .. code-block:: nimrod

+  ##   ("  ", true)

+  ##   ("this", false)

+  ##   (" ", true)

+  ##   ("is", false)

+  ##   (" ", true)

+  ##   ("an", false)

+  ##   ("  ", true)

+  ##   ("example", false)

+  ##   ("  ", true)

+  var i = 0

+  while true:

+    var j = i

+    var isSep = s[j] in seps

+    while j < s.len and (s[j] in seps) == isSep: inc(j)

+    if j > i:

+      yield (substr(s, i, j-1), isSep)

+    else:

+      break

+    i = j

 

 proc wordWrap*(s: string, maxLineWidth = 80, 

                splitLongWords = true,

@@ -544,6 +544,33 @@ proc wordWrap*(s: string, maxLineWidth = 80,
       SpaceLeft = SpaceLeft - len(Word)

       result.add(word)

 

+proc unindent*(s: string, eatAllIndent = false): string {.

+               noSideEffect, rtl, extern: "nsuUnindent".} = 

+  ## unindents `s`.

+  result = newStringOfCap(s.len)

+  var i = 0

+  var pattern = true

+  var indent = 0

+  while s[i] == ' ': inc i

+  var level = if i == 0: -1 else: i

+  while i < s.len:

+    if s[i] == ' ':

+      if i > 0 and s[i-1] in {'\l', '\c'}:

+        pattern = true

+        indent = 0

+      if pattern:

+        inc(indent)

+        if indent > level and not eatAllIndent:

+          result.add(s[i])

+        if level < 0: level = indent

+      else:

+        # a space somewhere: do not delete

+        result.add(s[i])

+    else:

+      pattern = false

+      result.add(s[i])

+    inc i

+

 proc startsWith*(s, prefix: string): bool {.noSideEffect,

   rtl, extern: "nsuStartsWith".} =

   ## Returns true iff ``s`` starts with ``prefix``.

@@ -827,34 +854,6 @@ proc escape*(s: string, prefix = "\"", suffix = "\""): string {.noSideEffect,
     of '\"': add(result, "\\\"")

     else: add(result, c)

   add(result, suffix)

-

-proc validEmailAddress*(s: string): bool {.noSideEffect,

-  rtl, extern: "nsuValidEmailAddress".} = 

-  ## returns true if `s` seems to be a valid e-mail address. 

-  ## The checking also uses a domain list.

-  ## Note: This will be moved to another module soon.

-  const

-    chars = Letters + Digits + {'!','#','$','%','&',

-      '\'','*','+','/','=','?','^','_','`','{','}','|','~','-','.'}

-  var i = 0

-  if s[i] notin chars or s[i] == '.': return false

-  while s[i] in chars: 

-    if s[i] == '.' and s[i+1] == '.': return false

-    inc(i)

-  if s[i] != '@': return false

-  var j = len(s)-1

-  if s[j] notin letters: return false

-  while j >= i and s[j] in letters: dec(j)

-  inc(i) # skip '@'

-  while s[i] in {'0'..'9', 'a'..'z', '-', '.'}: inc(i) 

-  if s[i] != '\0': return false

-  

-  var x = substr(s, j+1)

-  if len(x) == 2 and x[0] in Letters and x[1] in Letters: return true

-  case toLower(x)

-  of "com", "org", "net", "gov", "mil", "biz", "info", "mobi", "name",

-     "aero", "jobs", "museum": return true

-  return false

   

 proc validIdentifier*(s: string): bool {.noSideEffect,

   rtl, extern: "nsuValidIdentifier".} =