diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2016-06-14 10:06:22 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2016-06-15 17:15:27 +0200 |
commit | 42251f0b6bbee0734b9b0805ab85b3770a28a78c (patch) | |
tree | d3229064575a39ee0a111ca5d91284e2ad446c6f | |
parent | 9950bc39365e809b385b3ba94cf3eca2c5be8e02 (diff) | |
download | Nim-42251f0b6bbee0734b9b0805ab85b3770a28a78c.tar.gz |
moved expandTabs to strmisc
-rw-r--r-- | lib/pure/strmisc.nim | 43 | ||||
-rw-r--r-- | lib/pure/strutils.nim | 40 | ||||
-rw-r--r-- | web/news/version_0_15_released.rst | 5 |
3 files changed, 38 insertions, 50 deletions
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", ""] diff --git a/web/news/version_0_15_released.rst b/web/news/version_0_15_released.rst index 7adc545d4..76d78ce71 100644 --- a/web/news/version_0_15_released.rst +++ b/web/news/version_0_15_released.rst @@ -20,14 +20,15 @@ Library Additions a lightweight alternative to python's ``csv.DictReader``. - Added ``setStdIoUnbuffered`` proc to ``system.nim`` to enable unbuffered I/O. -- Added ``center``, ``rsplit``, and ``expandTabs`` to ``strutils.nim`` to +- Added ``center`` and ``rsplit`` to ``strutils.nim`` to provide similar Python functionality for Nim's strings. - Added ``isTitle``, ``title``, and ``swapCase`` to ``unicode.nim`` to provide unicode aware string case manipulation. - Added a new module ``lib/pure/strmisc.nim`` to hold uncommon string - operations. Currently contains ``partition`` and ``rpartition``. + operations. Currently contains ``partition``, ``rpartition`` + and ``expandTabs``. Compiler Additions ------------------ |