diff options
author | Zach Aysan <zachaysan@gmail.com> | 2015-07-17 16:25:58 -0400 |
---|---|---|
committer | Zach Aysan <zachaysan@gmail.com> | 2015-07-17 16:25:58 -0400 |
commit | a291f2c2718091e34dbe4a94db1753ea61aed2eb (patch) | |
tree | 4193e9e14eb109b33c56a6edb8bc22043daf0596 /lib/pure/strutils.nim | |
parent | 728fc441ef7d1e81b7f2cc5cb2df04a7b7ced179 (diff) | |
download | Nim-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.nim | 47 |
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. ## |