aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/urweb.h1
-rw-r--r--lib/js/urweb.js7
-rw-r--r--lib/ur/basis.urs1
-rw-r--r--lib/ur/string.ur8
-rw-r--r--lib/ur/string.urs3
-rw-r--r--src/c/urweb.c4
-rw-r--r--src/settings.sml3
7 files changed, 26 insertions, 1 deletions
diff --git a/include/urweb.h b/include/urweb.h
index 8c1fa920..73f06da7 100644
--- a/include/urweb.h
+++ b/include/urweb.h
@@ -117,6 +117,7 @@ uw_Basis_string uw_Basis_strsuffix(uw_context, const char *, uw_Basis_int);
uw_Basis_string uw_Basis_strcat(uw_context, const char *, const char *);
uw_Basis_int *uw_Basis_strindex(uw_context, const char *, uw_Basis_char);
uw_Basis_string uw_Basis_strchr(uw_context, const char *, uw_Basis_char);
+uw_Basis_int uw_Basis_strcspn(uw_context, const char *, const char *);
uw_Basis_string uw_Basis_substring(uw_context, const char *, uw_Basis_int, uw_Basis_int);
uw_Basis_string uw_strdup(uw_context, const char *);
diff --git a/lib/js/urweb.js b/lib/js/urweb.js
index be3d652a..0cc66bc7 100644
--- a/lib/js/urweb.js
+++ b/lib/js/urweb.js
@@ -360,6 +360,13 @@ function sidx(s, ch) {
else
return r;
}
+function sspn(s, chs) {
+ for (var i = 0; i < s.length; ++i)
+ if (chs.indexOf(s[i]) != -1)
+ return i;
+
+ return null;
+}
function schr(s, ch) {
var r = s.indexOf(ch);
if (r == -1)
diff --git a/lib/ur/basis.urs b/lib/ur/basis.urs
index d70ccc24..d3fbe037 100644
--- a/lib/ur/basis.urs
+++ b/lib/ur/basis.urs
@@ -59,6 +59,7 @@ val strsub : string -> int -> char
val strsuffix : string -> int -> string
val strchr : string -> char -> option string
val strindex : string -> char -> option int
+val strcspn : string -> string -> option int
val substring : string -> int -> int -> string
class show
diff --git a/lib/ur/string.ur b/lib/ur/string.ur
index e6d5903e..e31bbc27 100644
--- a/lib/ur/string.ur
+++ b/lib/ur/string.ur
@@ -9,6 +9,8 @@ val suffix = Basis.strsuffix
val index = Basis.strindex
val atFirst = Basis.strchr
+fun mindex {Haystack = s, Needle = chs} = Basis.strcspn s chs
+
fun substring s {Start = start, Len = len} = Basis.substring s start len
fun split s ch =
@@ -16,3 +18,9 @@ fun split s ch =
None => None
| Some i => Some (substring s {Start = 0, Len = i},
substring s {Start = i + 1, Len = length s - i - 1})
+fun msplit {Haystack = s, Needle = chs} =
+ case mindex {Haystack = s, Needle = chs} of
+ None => None
+ | Some i => Some (substring s {Start = 0, Len = i},
+ sub s i,
+ substring s {Start = i + 1, Len = length s - i - 1})
diff --git a/lib/ur/string.urs b/lib/ur/string.urs
index 097a423f..8fd434b4 100644
--- a/lib/ur/string.urs
+++ b/lib/ur/string.urs
@@ -10,6 +10,9 @@ val suffix : t -> int -> string
val index : t -> char -> option int
val atFirst : t -> char -> option string
+val mindex : {Haystack : t, Needle : t} -> option int
+
val substring : t -> {Start : int, Len : int} -> string
val split : t -> char -> option (string * string)
+val msplit : {Haystack : t, Needle : t} -> option (string * char * string)
diff --git a/src/c/urweb.c b/src/c/urweb.c
index d8b606fd..ffef10e7 100644
--- a/src/c/urweb.c
+++ b/src/c/urweb.c
@@ -1815,6 +1815,10 @@ uw_Basis_string uw_Basis_strchr(uw_context ctx, uw_Basis_string s, uw_Basis_char
return strchr(s, ch);
}
+uw_Basis_int uw_Basis_strcspn(uw_context ctx, uw_Basis_string s, uw_Basis_string chs) {
+ return strcspn(s, chs);
+}
+
uw_Basis_int *uw_Basis_strindex(uw_context ctx, uw_Basis_string s, uw_Basis_char ch) {
uw_Basis_string r = strchr(s, ch);
if (r == NULL)
diff --git a/src/settings.sml b/src/settings.sml
index 75302cb9..a71ab872 100644
--- a/src/settings.sml
+++ b/src/settings.sml
@@ -156,7 +156,8 @@ val jsFuncsBase = basisM [("alert", "alert"),
("strlen", "slen"),
("strindex", "sidx"),
("strchr", "schr"),
- ("substring", "ssub")]
+ ("substring", "ssub"),
+ ("strcspn", "sspn")]
val jsFuncs = ref jsFuncsBase
fun setJsFuncs ls = jsFuncs := foldl (fn ((k, v), m) => M.insert (m, k, v)) jsFuncsBase ls
fun jsFunc x = M.find (!jsFuncs, x)