# HG changeset patch # User Adam Chlipala # Date 1294772634 18000 # Node ID 3913cbfd72e9ddcb2f01b9ede3370cbb840ca11f # Parent dd99e17024324e4766a6b54052c72a99b5221c3e String processing optimizations diff -r dd99e1702432 -r 3913cbfd72e9 include/urweb.h --- a/include/urweb.h Thu Jan 06 19:26:31 2011 -0500 +++ b/include/urweb.h Tue Jan 11 14:03:54 2011 -0500 @@ -134,6 +134,7 @@ uw_Basis_time uw_Basis_unurlifyTime(uw_context, char **); uw_Basis_int uw_Basis_strlen(uw_context, const char *); +uw_Basis_bool uw_Basis_strlenGe(uw_context, uw_Basis_string, uw_Basis_int); uw_Basis_char uw_Basis_strsub(uw_context, const char *, uw_Basis_int); 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 *); diff -r dd99e1702432 -r 3913cbfd72e9 lib/ur/basis.urs --- a/lib/ur/basis.urs Thu Jan 06 19:26:31 2011 -0500 +++ b/lib/ur/basis.urs Tue Jan 11 14:03:54 2011 -0500 @@ -81,6 +81,7 @@ (** String operations *) val strlen : string -> int +val strlenGe : string -> int -> bool val strcat : string -> string -> string val strsub : string -> int -> char val strsuffix : string -> int -> string diff -r dd99e1702432 -r 3913cbfd72e9 lib/ur/string.ur --- a/lib/ur/string.ur Thu Jan 06 19:26:31 2011 -0500 +++ b/lib/ur/string.ur Tue Jan 11 14:03:54 2011 -0500 @@ -3,6 +3,7 @@ val str = Basis.str1 val length = Basis.strlen +val lengthGe = Basis.strlenGe val append = Basis.strcat val sub = Basis.strsub diff -r dd99e1702432 -r 3913cbfd72e9 lib/ur/string.urs --- a/lib/ur/string.urs Thu Jan 06 19:26:31 2011 -0500 +++ b/lib/ur/string.urs Tue Jan 11 14:03:54 2011 -0500 @@ -3,6 +3,7 @@ val str : char -> t val length : t -> int +val lengthGe : t -> int -> bool val append : t -> t -> t diff -r dd99e1702432 -r 3913cbfd72e9 src/c/urweb.c --- a/src/c/urweb.c Thu Jan 06 19:26:31 2011 -0500 +++ b/src/c/urweb.c Tue Jan 11 14:03:54 2011 -0500 @@ -2133,23 +2133,48 @@ } uw_Basis_char uw_Basis_strsub(uw_context ctx, uw_Basis_string s, uw_Basis_int n) { - if (n >= 0 && n < strlen(s)) - return s[n]; - else - uw_error(ctx, FATAL, "Out-of-bounds strsub"); + while (n >= 0) { + if (*s == 0) + uw_error(ctx, FATAL, "Out-of-bounds strsub"); + + if (n == 0) + return *s; + + --n; + ++s; + } + + uw_error(ctx, FATAL, "Negative strsub bound"); } uw_Basis_string uw_Basis_strsuffix(uw_context ctx, uw_Basis_string s, uw_Basis_int n) { - if (n >= 0 && n < strlen(s)) - return &s[n]; - else - uw_error(ctx, FATAL, "Out-of-bounds strsuffix"); + while (n >= 0) { + if (*s == 0 || n == 0) + return s; + + --n; + ++s; + } + + uw_error(ctx, FATAL, "Negative strsuffix bound"); } uw_Basis_int uw_Basis_strlen(uw_context ctx, uw_Basis_string s) { return strlen(s); } +uw_Basis_bool uw_Basis_strlenGe(uw_context ctx, uw_Basis_string s, uw_Basis_int n) { + while (n > 0) { + if (*s == 0) + return uw_Basis_False; + + --n; + ++s; + } + + return uw_Basis_True; +} + uw_Basis_string uw_Basis_strchr(uw_context ctx, uw_Basis_string s, uw_Basis_char ch) { return strchr(s, ch); }