summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/ropes.nim16
-rw-r--r--lib/pure/ropes.nim29
2 files changed, 30 insertions, 15 deletions
diff --git a/compiler/ropes.nim b/compiler/ropes.nim
index af9917d9a..f1d4c1b6f 100644
--- a/compiler/ropes.nim
+++ b/compiler/ropes.nim
@@ -264,12 +264,26 @@ proc `%`*(frmt: TFormatStr, args: openArray[PRope]): PRope =
         while true:
           j = j * 10 + ord(frmt[i]) - ord('0')
           inc(i)
-          if (i > length - 1) or frmt[i] notin {'0'..'9'}: break
+          if (i >= length) or frmt[i] notin {'0'..'9'}: break
         num = j
         if j > high(args) + 1:
           errorHandler(rInvalidFormatStr, $(j))
         else:
           add(result, args[j-1])
+      of '{':
+        inc(i)
+        var j = 0
+        while i < length and frmt[i] in {'0'..'9'}:
+          j = j * 10 + ord(frmt[i]) - ord('0')
+          inc(i)
+        num = j
+        if i < length and frmt[i] == '}': inc(i)
+        else: errorHandler(rInvalidFormatStr, $(frmt[i]))
+
+        if j > high(args) + 1:
+          errorHandler(rInvalidFormatStr, $(j))
+        else:
+          add(result, args[j-1])
       of 'n':
         add(result, softRnl)
         inc(i)
diff --git a/lib/pure/ropes.nim b/lib/pure/ropes.nim
index 4cc64a154..af5c50521 100644
--- a/lib/pure/ropes.nim
+++ b/lib/pure/ropes.nim
@@ -290,8 +290,8 @@ when false:
         else: break 
       if i - 1 >= start: 
         add(result, substr(frmt, start, i-1))
-  
-proc `%`*(frmt: string, args: openArray[Rope]): Rope {. 
+
+proc `%`*(frmt: string, args: openArray[Rope]): Rope {.
   rtl, extern: "nroFormat".} =
   ## `%` substitution operator for ropes. Does not support the ``$identifier``
   ## nor ``${identifier}`` notations.
@@ -299,39 +299,40 @@ proc `%`*(frmt: string, args: openArray[Rope]): Rope {.
   var length = len(frmt)
   result = nil
   var num = 0
-  while i < length: 
-    if frmt[i] == '$': 
+  while i < length:
+    if frmt[i] == '$':
       inc(i)
       case frmt[i]
-      of '$': 
+      of '$':
         add(result, "$")
         inc(i)
-      of '#': 
+      of '#':
         inc(i)
         add(result, args[num])
         inc(num)
-      of '0'..'9': 
+      of '0'..'9':
         var j = 0
-        while true: 
+        while true:
           j = j * 10 + ord(frmt[i]) - ord('0')
           inc(i)
-          if frmt[i] notin {'0'..'9'}: break 
+          if (i >= length) or frmt[i] notin {'0'..'9'}: break
         add(result, args[j-1])
       of '{':
         inc(i)
         var j = 0
-        while frmt[i] in {'0'..'9'}:
+        while i < length and frmt[i] in {'0'..'9'}:
           j = j * 10 + ord(frmt[i]) - ord('0')
           inc(i)
-        if frmt[i] == '}': inc(i)
+        if i < length and frmt[i] == '}': inc(i)
         else: raise newException(ValueError, "invalid format string")
+
         add(result, args[j-1])
       else: raise newException(ValueError, "invalid format string")
     var start = i
-    while i < length: 
+    while i < length:
       if frmt[i] != '$': inc(i)
-      else: break 
-    if i - 1 >= start: 
+      else: break
+    if i - 1 >= start:
       add(result, substr(frmt, start, i - 1))
 
 proc addf*(c: var Rope, frmt: string, args: openArray[Rope]) {.