From 42251f0b6bbee0734b9b0805ab85b3770a28a78c Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Tue, 14 Jun 2016 10:06:22 +0200 Subject: moved expandTabs to strmisc --- lib/pure/strmisc.nim | 43 +++++++++++++++++++++++++++++++++++-------- lib/pure/strutils.nim | 40 ---------------------------------------- 2 files changed, 35 insertions(+), 48 deletions(-) (limited to 'lib/pure') diff --git a/lib/pure/strmisc.nim b/lib/pure/strmisc.nim index 359014d8c..89ef2fcd2 100644 --- a/lib/pure/strmisc.nim +++ b/lib/pure/strmisc.nim @@ -14,6 +14,32 @@ import strutils {.deadCodeElim: on.} +proc expandTabs*(s: string, tabSize: int = 8): string {.noSideEffect, + procvar.} = + ## Expand tab characters in `s` by `tabSize` spaces + + result = newStringOfCap(s.len + s.len shr 2) + var pos = 0 + + template addSpaces(n) = + for j in 0 ..< n: + result.add(' ') + pos += 1 + + for i in 0 ..< len(s): + let c = s[i] + if c == '\t': + let + denominator = if tabSize > 0: tabSize else: 1 + numSpaces = tabSize - pos mod denominator + + addSpaces(numSpaces) + else: + result.add(c) + pos += 1 + if c == '\l': + pos = 0 + proc partition*(s: string, sep: string, right: bool = false): (string, string, string) {.noSideEffect, procvar.} = @@ -22,16 +48,9 @@ proc partition*(s: string, sep: string, ## Returns a 3 string tuple of (beforeSep, `sep`, afterSep) or ## (`s`, "", "") if `sep` is not found and `right` is false or ## ("", "", `s`) if `sep` is not found and `right` is true - let position = if right: s.rfind(sep) else: s.find(sep) - if position != -1: - let - beforeSep = s[0 ..< position] - afterSep = s[position + sep.len ..< s.len] - - return (beforeSep, sep, afterSep) - + return (s[0 ..< position], sep, s[position + sep.len ..< s.len]) return if right: ("", "", s) else: (s, "", "") proc rpartition*(s: string, sep: string): (string, string, string) @@ -43,6 +62,14 @@ proc rpartition*(s: string, sep: string): (string, string, string) return partition(s, sep, right = true) when isMainModule: + doAssert expandTabs("\t", 4) == " " + doAssert expandTabs("\tfoo\t", 4) == " foo " + doAssert expandTabs("\tfoo\tbar", 4) == " foo bar" + doAssert expandTabs("\tfoo\tbar\t", 4) == " foo bar " + doAssert expandTabs("", 4) == "" + doAssert expandTabs("", 0) == "" + doAssert expandTabs("\t\t\t", 0) == "" + doAssert partition("foo:bar", ":") == ("foo", ":", "bar") doAssert partition("foobarbar", "bar") == ("foo", "bar", "bar") doAssert partition("foobarbar", "bank") == ("foobarbar", "", "") diff --git a/lib/pure/strutils.nim b/lib/pure/strutils.nim index 708f9ed4b..b6edb834c 100644 --- a/lib/pure/strutils.nim +++ b/lib/pure/strutils.nim @@ -1319,38 +1319,6 @@ proc replace*(s: string, sub, by: char): string {.noSideEffect, else: result[i] = s[i] inc(i) -proc expandTabs*(s: string, tabSize: int = 8): string {.noSideEffect, - procvar, rtl, extern: "nsuExpandTabsStr".} = - ## Expand tab characters in `s` by `tabSize` spaces - - if len(s) == 0: - return s - - result = newStringOfCap(s.len + s.len shr 2) - - var pos = 0 - - template addSpaces(n) = - for j in 0 ..< n: - result.add(' ') - pos += 1 - - for i in 0 ..< len(s): - let c = s[i] - - if c == '\t': - let - denominator = if tabSize > 0: tabSize else: 1 - numSpaces = tabSize - pos mod denominator - - addSpaces(numSpaces) - else: - result.add(c) - pos += 1 - - if c == '\l': - pos = 0 - proc replaceWord*(s, sub: string, by = ""): string {.noSideEffect, rtl, extern: "nsuReplaceWord".} = ## Replaces `sub` in `s` by the string `by`. @@ -2207,14 +2175,6 @@ when isMainModule: doAssert(not isUpper("AAcc")) doAssert(not isUpper("A#$")) - doAssert expandTabs("\t", 4) == " " - doAssert expandTabs("\tfoo\t", 4) == " foo " - doAssert expandTabs("\tfoo\tbar", 4) == " foo bar" - doAssert expandTabs("\tfoo\tbar\t", 4) == " foo bar " - doAssert expandTabs("", 4) == "" - doAssert expandTabs("", 0) == "" - doAssert expandTabs("\t\t\t", 0) == "" - doAssert rsplit("foo bar", seps=Whitespace) == @["foo", "bar"] doAssert rsplit(" foo bar", seps=Whitespace, maxsplit=1) == @[" foo", "bar"] doAssert rsplit(" foo bar ", seps=Whitespace, maxsplit=1) == @[" foo bar", ""] -- cgit 1.4.1-2-gfad0