summary refs log tree commit diff stats
path: root/lib/pure/strutils.nim
diff options
context:
space:
mode:
authorZach Aysan <zachaysan@gmail.com>2015-07-17 16:25:58 -0400
committerZach Aysan <zachaysan@gmail.com>2015-07-17 16:25:58 -0400
commita291f2c2718091e34dbe4a94db1753ea61aed2eb (patch)
tree4193e9e14eb109b33c56a6edb8bc22043daf0596 /lib/pure/strutils.nim
parent728fc441ef7d1e81b7f2cc5cb2df04a7b7ced179 (diff)
downloadNim-a291f2c2718091e34dbe4a94db1753ea61aed2eb.tar.gz
Create Ruby-like chomp proc to allow for easy string ending removal
Diffstat (limited to 'lib/pure/strutils.nim')
-rw-r--r--lib/pure/strutils.nim47
1 files changed, 46 insertions, 1 deletions
diff --git a/lib/pure/strutils.nim b/lib/pure/strutils.nim
index 93fcf4d3d..a0fa7a237 100644
--- a/lib/pure/strutils.nim
+++ b/lib/pure/strutils.nim
@@ -168,9 +168,54 @@ proc cmpIgnoreStyle*(a, b: string): int {.noSideEffect,
     inc(i)
     inc(j)
 
+proc chomp*(s: string, chars: set[char] = Newlines): string {.noSideEffect, rtl.} =
+  var last = len(s) - 1
+
+  if chars == Newlines:
+    if s[last] == '\10':
+      last -= 1
+
+    if s[last] == '\13':
+      last -= 1
+
+  else:
+    if s[last] in chars:
+      last -= 1
+
+  return s[0..last]
+
+proc chomp*(s: string, c: char): string {.noSideEffect, rtl.} =
+  chomp(s, chars = {c})
+
+proc chomp*(s: string, suffix: string): string {.noSideEffect, rtl.} =
+  var last = len(s) - 1
+
+  if suffix == "":
+    var previous: char
+    while last > 0:
+
+      if s[last] == '\13' and previous == '\13':
+          break
+
+      elif s[last] == '\13':
+        last -= 1
+        previous = '\13'
+
+      elif s[last] == '\10':
+        last -= 1
+        previous = '\10'
+
+      else:
+        break
+
+  if s.endsWith(suffix):
+    last -= len(suffix)
+
+  return s[0..last]
+
 {.pop.}
 
-proc strip*(s: string, leading = true, trailing = true, chars: set[char] = Whitespace): string 
+proc strip*(s: string, leading = true, trailing = true, chars: set[char] = Whitespace): string
   {.noSideEffect, rtl, extern: "nsuStrip".} =
   ## Strips `chars` from `s` and returns the resulting string.
   ##