summary refs log tree commit diff stats
path: root/lib/pure
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2015-06-04 11:37:26 +0200
committerAndreas Rumpf <rumpf_a@web.de>2015-06-04 11:37:26 +0200
commit8264c3cbeef6a4b86f7613c05d036658cbd9a24d (patch)
tree3e62ce8c9ae45b85b3d2d96a752a9f99c7ad8905 /lib/pure
parent874637be32e4dcecb1301a5c436013945fc90cd0 (diff)
parentdd30bab480f59e4bb4ab8fad5aabd13c08aa1b11 (diff)
downloadNim-8264c3cbeef6a4b86f7613c05d036658cbd9a24d.tar.gz
Merge pull request #2849 from ozra/feature-2811-hump-snake-dash
Feature #2811 hump, snake and now dash
Diffstat (limited to 'lib/pure')
-rw-r--r--lib/pure/etcpriv.nim23
-rw-r--r--lib/pure/hashes.nim19
2 files changed, 36 insertions, 6 deletions
diff --git a/lib/pure/etcpriv.nim b/lib/pure/etcpriv.nim
new file mode 100644
index 000000000..e7a525e4d
--- /dev/null
+++ b/lib/pure/etcpriv.nim
@@ -0,0 +1,23 @@
+#
+#
+#            Nim's Runtime Library
+#        (c) Copyright 2015 Nim Authors
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+## This module contains utils that are less then easy to categorize and
+## don't really warrant a specific module. They are private to compiler
+## and stdlib usage, and should not be used outside of that - they may
+## change or disappear at any time.
+
+
+# Used by pure/hashes.nim, and the compiler parsing
+const magicIdentSeparatorRuneByteWidth* = 3
+
+# Used by pure/hashes.nim, and the compiler parsing
+proc isMagicIdentSeparatorRune*(cs: cstring, i: int): bool  {. inline } =
+  result =  cs[i] == '\226' and 
+            cs[i + 1] == '\128' and
+            cs[i + 2] == '\147'     # en-dash  # 145 = nb-hyphen
diff --git a/lib/pure/hashes.nim b/lib/pure/hashes.nim
index 2ce8ac796..132264e4a 100644
--- a/lib/pure/hashes.nim
+++ b/lib/pure/hashes.nim
@@ -38,7 +38,7 @@
 ##    result = !$h
 
 import
-  strutils
+  strutils, etcpriv
 
 type
   THash* = int ## a hash value; hash tables using these values should
@@ -124,13 +124,20 @@ proc hash*(x: string): THash =
 proc hashIgnoreStyle*(x: string): THash =
   ## efficient hashing of strings; style is ignored
   var h: THash = 0
-  for i in 0..x.len-1:
+  var i = 0
+  let xLen = x.len
+  while i < xLen:
     var c = x[i]
     if c == '_':
-      continue                # skip _
-    if c in {'A'..'Z'}:
-      c = chr(ord(c) + (ord('a') - ord('A'))) # toLower()
-    h = h !& ord(c)
+      inc(i)
+    elif isMagicIdentSeparatorRune(cstring(x), i):
+      inc(i, magicIdentSeparatorRuneByteWidth)
+    else:
+      if c in {'A'..'Z'}:
+        c = chr(ord(c) + (ord('a') - ord('A'))) # toLower()
+      h = h !& ord(c)
+      inc(i)
+
   result = !$h
 
 proc hashIgnoreCase*(x: string): THash =