changeset 289:0cc956a3216f

Parsing strings for floats and bools
author Adam Chlipala <adamc@hcoop.net>
date Sun, 07 Sep 2008 11:41:04 -0400
parents 4260ad920c36
children df00701f2323
files include/urweb.h lib/basis.urs src/c/urweb.c tests/fromString.ur
diffstat 4 files changed, 48 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/include/urweb.h	Sun Sep 07 11:33:13 2008 -0400
+++ b/include/urweb.h	Sun Sep 07 11:41:04 2008 -0400
@@ -79,3 +79,5 @@
 lw_Basis_string lw_Basis_boolToString(lw_context, lw_Basis_bool);
 
 lw_Basis_int *lw_Basis_stringToInt(lw_context, lw_Basis_string);
+lw_Basis_float *lw_Basis_stringToFloat(lw_context, lw_Basis_string);
+lw_Basis_bool *lw_Basis_stringToBool(lw_context, lw_Basis_string);
--- a/lib/basis.urs	Sun Sep 07 11:33:13 2008 -0400
+++ b/lib/basis.urs	Sun Sep 07 11:41:04 2008 -0400
@@ -31,6 +31,8 @@
 val show_bool : show bool
 
 val stringToInt : string -> option int
+val stringToFloat : string -> option float
+val stringToBool : string -> option bool
 
 
 (** SQL *)
--- a/src/c/urweb.c	Sun Sep 07 11:33:13 2008 -0400
+++ b/src/c/urweb.c	Sun Sep 07 11:41:04 2008 -0400
@@ -769,3 +769,27 @@
   } else
     return NULL;
 }
+
+lw_Basis_float *lw_Basis_stringToFloat(lw_context ctx, lw_Basis_string s) {
+  char *endptr;
+  lw_Basis_float n = strtod(s, &endptr);
+
+  if (*s != '\0' && *endptr == '\0') {
+    lw_Basis_float *r = lw_malloc(ctx, sizeof(lw_Basis_float));
+    *r = n;
+    return r;
+  } else
+    return NULL;
+}
+
+lw_Basis_bool *lw_Basis_stringToBool(lw_context ctx, lw_Basis_string s) {
+  static lw_Basis_bool true = lw_Basis_True;
+  static lw_Basis_bool false = lw_Basis_False;
+
+  if (!strcasecmp (s, "True"))
+    return &true;
+  else if (!strcasecmp (s, "False"))
+    return &false;
+  else
+    return NULL;
+}
--- a/tests/fromString.ur	Sun Sep 07 11:33:13 2008 -0400
+++ b/tests/fromString.ur	Sun Sep 07 11:41:04 2008 -0400
@@ -1,10 +1,26 @@
-fun i2s s =
+fun s2i s =
         case stringToInt s of
           None => 0
         | Some n => n
 
+fun s2f s =
+        case stringToFloat s of
+          None => 0.0
+        | Some n => n
+
+fun s2b s =
+        case stringToBool s of
+          None => False
+        | Some b => b
+
 fun main () : transaction page = return <html><body>
-        Error = {cdata (show _ (i2s "Error"))}<br/>
-        3 = {cdata (show _ (i2s "+3"))}<br/>
+        Error = {cdata (show _ (s2i "Error"))}<br/>
+        3 = {cdata (show _ (s2i "+3"))}<br/>
+        <br/>
+        Error = {cdata (show _ (s2f "Error"))}<br/>
+        98.76 = {cdata (show _ (s2f "98.76"))}<br/>
+        <br/>
+        Error = {cdata (show _ (s2b "Error"))}<br/>
+        False = {cdata (show _ (s2b "false"))}<br/>
+        True = {cdata (show _ (s2b "trUE"))}<br/>
 </body></html>
-