# HG changeset patch # User Adam Chlipala # Date 1294930970 18000 # Node ID 65fbb250b8756c38697e9d80a07266e2f3d6ac1d # Parent 9a721f0722d32ec7e6d7399eec4152f7d63a383c More string processing diff -r 9a721f0722d3 -r 65fbb250b875 include/urweb.h --- a/include/urweb.h Tue Jan 11 18:04:52 2011 -0500 +++ b/include/urweb.h Thu Jan 13 10:02:50 2011 -0500 @@ -140,6 +140,7 @@ uw_Basis_string uw_Basis_strcat(uw_context, const char *, const char *); uw_Basis_string uw_Basis_mstrcat(uw_context ctx, ...); uw_Basis_int *uw_Basis_strindex(uw_context, const char *, uw_Basis_char); +uw_Basis_int *uw_Basis_strsindex(uw_context, const char *, const char *needle); 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); diff -r 9a721f0722d3 -r 65fbb250b875 lib/ur/basis.urs --- a/lib/ur/basis.urs Tue Jan 11 18:04:52 2011 -0500 +++ b/lib/ur/basis.urs Thu Jan 13 10:02:50 2011 -0500 @@ -87,6 +87,7 @@ val strsuffix : string -> int -> string val strchr : string -> char -> option string val strindex : string -> char -> option int +val strsindex : string -> string -> option int val strcspn : string -> string -> int val substring : string -> int -> int -> string val str1 : char -> string diff -r 9a721f0722d3 -r 65fbb250b875 lib/ur/string.ur --- a/lib/ur/string.ur Tue Jan 11 18:04:52 2011 -0500 +++ b/lib/ur/string.ur Thu Jan 13 10:02:50 2011 -0500 @@ -10,6 +10,7 @@ val suffix = Basis.strsuffix val index = Basis.strindex +fun sindex r = Basis.strsindex r.Haystack r.Needle val atFirst = Basis.strchr fun mindex {Haystack = s, Needle = chs} = @@ -50,6 +51,12 @@ sub s i, suffix s (i + 1)) +fun ssplit r = + case sindex r of + None => None + | Some i => Some (substring r.Haystack {Start = 0, Len = i}, + suffix r.Haystack (i + length r.Needle)) + fun all f s = let val len = length s diff -r 9a721f0722d3 -r 65fbb250b875 lib/ur/string.urs --- a/lib/ur/string.urs Tue Jan 11 18:04:52 2011 -0500 +++ b/lib/ur/string.urs Thu Jan 13 10:02:50 2011 -0500 @@ -11,6 +11,7 @@ val suffix : t -> int -> string val index : t -> char -> option int +val sindex : {Haystack : t, Needle : t} -> option int val atFirst : t -> char -> option string val mindex : {Haystack : t, Needle : t} -> option int @@ -24,6 +25,8 @@ val split' : t -> char -> option (string * string) (* The matched character is kept at the beginning of the suffix. *) val msplit : {Haystack : t, Needle : t} -> option (string * char * string) +val ssplit : {Haystack : t, Needle : t} -> option (string * string) + val all : (char -> bool) -> string -> bool val mp : (char -> char) -> string -> string diff -r 9a721f0722d3 -r 65fbb250b875 src/c/urweb.c --- a/src/c/urweb.c Tue Jan 11 18:04:52 2011 -0500 +++ b/src/c/urweb.c Thu Jan 13 10:02:50 2011 -0500 @@ -2194,6 +2194,17 @@ } } +uw_Basis_int *uw_Basis_strsindex(uw_context ctx, const char *haystack, const char *needle) { + uw_Basis_string r = strstr(haystack, needle); + if (r == NULL) + return NULL; + else { + uw_Basis_int *nr = uw_malloc(ctx, sizeof(uw_Basis_int)); + *nr = r - haystack; + return nr; + } +} + uw_Basis_string uw_Basis_strcat(uw_context ctx, uw_Basis_string s1, uw_Basis_string s2) { int len = uw_Basis_strlen(ctx, s1) + uw_Basis_strlen(ctx, s2) + 1; char *s;