summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xlib/pure/strutils.nim23
-rwxr-xr-xlib/system.nim1
-rwxr-xr-xtodo.txt1
-rwxr-xr-xweb/news.txt7
4 files changed, 28 insertions, 4 deletions
diff --git a/lib/pure/strutils.nim b/lib/pure/strutils.nim
index 97748c103..8e3816904 100755
--- a/lib/pure/strutils.nim
+++ b/lib/pure/strutils.nim
@@ -378,6 +378,22 @@ proc parseBool*(s: string): bool =
   of "y", "yes", "true", "1", "on": result = true

   of "n", "no", "false", "0", "off": result = false

   else: raise newException(EInvalidValue, "cannot interpret as a bool: " & s)

+
+proc parseEnum*[T: enum](s: string): T =
+  ## parses an enum ``T``. Raises ``EInvalidValue`` for an invalid value in 
+  ## `s`. The comparison is done in a style insensitive way.
+  for e in low(T)..high(T):
+    if cmpIgnoreStyle(s, $e) == 0:
+      return e
+  raise newException(EInvalidValue, "invalid enum value: " & s)
+
+proc parseEnum*[T: enum](s: string, default: T): T =
+  ## parses an enum ``T``. Uses `default` for an invalid value in 
+  ## `s`. The comparison is done in a style insensitive way.
+  for e in low(T)..high(T):
+    if cmpIgnoreStyle(s, $e) == 0:
+      return e
+  result = default
 

 proc repeatChar*(count: int, c: Char = ' '): string {.noSideEffect,

   rtl, extern: "nsuRepeatChar".} =

@@ -1105,5 +1121,8 @@ when isMainModule:
 

   doAssert "-ld a-ldz -ld".replaceWord("-ld") == " a-ldz "

   doAssert "-lda-ldz -ld abc".replaceWord("-ld") == "-lda-ldz  abc"

-  

-  

+  
+  type TMyEnum = enum enA, enB, enC, enuD, enE

+  doAssert parseEnum[TMyEnum]("enu_D") == enuD

+
+  doAssert parseEnum("invalid enum value", enC) == enC

diff --git a/lib/system.nim b/lib/system.nim
index 07b5e8734..e14a0962b 100755
--- a/lib/system.nim
+++ b/lib/system.nim
@@ -2232,4 +2232,3 @@ template eval*(blk: stmt): stmt =
 
 when defined(initDebugger):
   initDebugger()
-
diff --git a/todo.txt b/todo.txt
index 9772f4001..ae4465326 100755
--- a/todo.txt
+++ b/todo.txt
@@ -1,6 +1,7 @@
 version 0.9.0
 =============
 
+- test and document AVR/embedded systems better
 - make GC realtime capable: GC_step(ms: int)
 - ``=`` should be overloadable; requires specialization for ``=``
 - fix remaining generics bugs
diff --git a/web/news.txt b/web/news.txt
index 897961c25..84f5f7c18 100755
--- a/web/news.txt
+++ b/web/news.txt
@@ -12,6 +12,7 @@ Bugfixes
 
 - Fixed a bug where the compiler would "optimize away" valid constant parts of
   a string concatenation.
+- Fixed a bug concerning implicit type conversions in ``case`` statements.
 
 
 Library Additions
@@ -24,6 +25,9 @@ Library Additions
   compile time as if was a macro.
 - Added ``macros.emit`` that can emit an arbitrary computed string as nimrod
   code during compilation.
+- Added ``strutils.parseEnum``.
+- The stdlib can now be avoided to a point where C code generation for 16bit 
+  micro controllers is feasible.
 
 
 Changes affecting backwards compatibility
@@ -33,7 +37,7 @@ Changes affecting backwards compatibility
   The ``system``, ``os``, ``osproc`` and ``memfiles`` modules use the wide
   string versions of the WinAPI. Use the ``-d:useWinAnsi`` switch to revert
   back to the old behaviour which uses the Ansi string versions.
-- ``static`` is now a keyword.
+- ``static`` and ``do`` are now keywords.
 - Templates now participate in overloading resolution which can break code that
   uses templates in subtle ways. Use the new ``immediate`` pragma for templates
   to get a template of old behaviour.
@@ -56,6 +60,7 @@ Language Additions
 ------------------
 
 - Added explicit ``static`` sections for enforced compile time evaluation.
+- Added an alternative notation for lambdas with ``do``.
 - ``addr`` is now treated like a prefix operator syntactically.