summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adamc@hcoop.net>2008-09-07 11:41:04 -0400
committerGravatar Adam Chlipala <adamc@hcoop.net>2008-09-07 11:41:04 -0400
commit9ae8932c978ab9c12f683745b47b3e0898581635 (patch)
tree92fd1f76d01cbe023599cb2d43215f82fb552960
parent5cf1d4d086475575a31f57413c57c22bd6fda378 (diff)
Parsing strings for floats and bools
-rw-r--r--include/urweb.h2
-rw-r--r--lib/basis.urs2
-rw-r--r--src/c/urweb.c24
-rw-r--r--tests/fromString.ur24
4 files changed, 48 insertions, 4 deletions
diff --git a/include/urweb.h b/include/urweb.h
index 84cc6719..83039520 100644
--- a/include/urweb.h
+++ b/include/urweb.h
@@ -79,3 +79,5 @@ lw_Basis_string lw_Basis_floatToString(lw_context, lw_Basis_float);
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);
diff --git a/lib/basis.urs b/lib/basis.urs
index e6072690..4275e195 100644
--- a/lib/basis.urs
+++ b/lib/basis.urs
@@ -31,6 +31,8 @@ val show_string : show string
val show_bool : show bool
val stringToInt : string -> option int
+val stringToFloat : string -> option float
+val stringToBool : string -> option bool
(** SQL *)
diff --git a/src/c/urweb.c b/src/c/urweb.c
index dce33bf1..bf697340 100644
--- a/src/c/urweb.c
+++ b/src/c/urweb.c
@@ -769,3 +769,27 @@ lw_Basis_int *lw_Basis_stringToInt(lw_context ctx, lw_Basis_string s) {
} 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;
+}
diff --git a/tests/fromString.ur b/tests/fromString.ur
index d9a087e4..673503ae 100644
--- a/tests/fromString.ur
+++ b/tests/fromString.ur
@@ -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>
-