diff options
-rw-r--r-- | src/c/urweb.c | 98 | ||||
-rw-r--r-- | src/mono_opt.sml | 72 |
2 files changed, 13 insertions, 157 deletions
diff --git a/src/c/urweb.c b/src/c/urweb.c index 7435d76f..007c4125 100644 --- a/src/c/urweb.c +++ b/src/c/urweb.c @@ -1431,25 +1431,8 @@ char *uw_Basis_attrifyString(uw_context ctx, uw_Basis_string s) { strcpy(p, "&"); p += 5; } - else if (isprint(c)) + else *p++ = c; - else if (c / 32 == 6 && isCont(s[1])) { - memcpy(p, s, 2); - p += 2; - ++s; - } else if (c / 16 == 14 && isCont(s[1]) && isCont(s[2])) { - memcpy(p, s, 3); - p += 3; - s += 2; - } else if (c / 8 == 30 && isCont(s[1]) && isCont(s[2]) && isCont(s[3])) { - memcpy(p, s, 4); - p += 4; - s += 3; - } else { - int len2; - sprintf(p, "&#%d;%n", c, &len2); - p += len2; - } } *p++ = 0; @@ -1470,13 +1453,8 @@ char *uw_Basis_attrifyChar(uw_context ctx, uw_Basis_char c) { strcpy(p, "&"); p += 5; } - else if (isprint(c)) + else *p++ = c; - else { - int len2; - sprintf(p, "&#%d;%n", c, &len2); - p += len2; - } *p++ = 0; ctx->heap.front = p; @@ -1521,28 +1499,8 @@ uw_unit uw_Basis_attrifyString_w(uw_context ctx, uw_Basis_string s) { uw_write_unsafe(ctx, """); else if (c == '&') uw_write_unsafe(ctx, "&"); - else if (isprint(c)) - uw_writec_unsafe(ctx, c); - else if (c / 32 == 6 && isCont(s[1])) { - uw_writec_unsafe(ctx, c); - uw_writec_unsafe(ctx, s[1]); - ++s; - } else if (c / 16 == 14 && isCont(s[1]) && isCont(s[2])) { - uw_writec_unsafe(ctx, c); - uw_writec_unsafe(ctx, s[1]); - uw_writec_unsafe(ctx, s[2]); - s += 2; - } else if (c / 8 == 30 && isCont(s[1]) && isCont(s[2]) && isCont(s[3])) { + else uw_writec_unsafe(ctx, c); - uw_writec_unsafe(ctx, s[1]); - uw_writec_unsafe(ctx, s[2]); - uw_writec_unsafe(ctx, s[3]); - s += 3; - } else { - uw_write_unsafe(ctx, "&#"); - uw_Basis_attrifyInt_w_unsafe(ctx, c); - uw_writec_unsafe(ctx, ';'); - } } return uw_unit_v; @@ -1555,13 +1513,8 @@ uw_unit uw_Basis_attrifyChar_w(uw_context ctx, uw_Basis_char c) { uw_write_unsafe(ctx, """); else if (c == '&') uw_write_unsafe(ctx, "&"); - else if (isprint(c)) + else uw_writec_unsafe(ctx, c); - else { - uw_write_unsafe(ctx, "&#"); - uw_Basis_attrifyInt_w_unsafe(ctx, c); - uw_writec_unsafe(ctx, ';'); - } return uw_unit_v; } @@ -1890,25 +1843,7 @@ char *uw_Basis_htmlifyString(uw_context ctx, uw_Basis_string s) { s2 += 5; break; default: - if (isprint(c) || isspace(c)) - *s2++ = c; - else if (c / 32 == 6 && isCont(s[1])) { - memcpy(s2, s, 2); - s2 += 2; - ++s; - } else if (c / 16 == 14 && isCont(s[1]) && isCont(s[2])) { - memcpy(s2, s, 3); - s2 += 3; - s += 2; - } else if (c / 8 == 30 && isCont(s[1]) && isCont(s[2]) && isCont(s[3])) { - memcpy(s2, s, 4); - s2 += 4; - s += 3; - } else { - int len2; - sprintf(s2, "&#%d;%n", c, &len2); - s2 += len2; - } + *s2++ = c; } } @@ -1931,28 +1866,7 @@ uw_unit uw_Basis_htmlifyString_w(uw_context ctx, uw_Basis_string s) { uw_write_unsafe(ctx, "&"); break; default: - if (isprint(c) || isspace(c)) - uw_writec_unsafe(ctx, c); - else if (c / 32 == 6 && isCont(s[1])) { - uw_writec_unsafe(ctx, c); - uw_writec_unsafe(ctx, s[1]); - ++s; - } else if (c / 16 == 14 && isCont(s[1]) && isCont(s[2])) { - uw_writec_unsafe(ctx, c); - uw_writec_unsafe(ctx, s[1]); - uw_writec_unsafe(ctx, s[2]); - s += 2; - } else if (c / 8 == 30 && isCont(s[1]) && isCont(s[2]) && isCont(s[3])) { - uw_writec_unsafe(ctx, c); - uw_writec_unsafe(ctx, s[1]); - uw_writec_unsafe(ctx, s[2]); - uw_writec_unsafe(ctx, s[3]); - s += 3; - } else { - uw_write_unsafe(ctx, "&#"); - uw_Basis_attrifyInt_w_unsafe(ctx, c); - uw_writec_unsafe(ctx, ';'); - } + uw_writec_unsafe(ctx, c); } } diff --git a/src/mono_opt.sml b/src/mono_opt.sml index bda4d93a..eb4f5811 100644 --- a/src/mono_opt.sml +++ b/src/mono_opt.sml @@ -45,45 +45,14 @@ fun attrifyFloat n = else Real.toString n -fun attrifyString s = - let - fun hs (pos, acc) = - if pos >= size s then - String.concat (rev acc) - else - case String.sub (s, pos) of - #"\"" => hs (pos+1, """ :: acc) - | #"&" => hs (pos+1, "&" :: acc) - | ch => - let - val n = ord ch - fun isCont k = pos + k < size s - andalso ord (String.sub (s, pos + k)) div 64 = 2 - fun unicode k = hs (pos+k+1, String.substring (s, pos, k+1) :: acc) - in - if Char.isPrint ch orelse Char.isSpace ch then - hs (pos+1, str ch :: acc) - else if n div 32 = 6 andalso isCont 1 then - unicode 1 - else if n div 16 = 14 andalso isCont 1 andalso isCont 2 then - unicode 2 - else if n div 8 = 30 andalso isCont 1 andalso isCont 2 andalso isCont 3 then - unicode 3 - else - hs (pos+1, "&#" ^ Int.toString (ord ch) ^ ";" :: acc) - end - in - hs (0, []) - end - fun attrifyChar ch = case ch of #"\"" => """ | #"&" => "&" - | ch => if Char.isPrint ch then - str ch - else - "&#" ^ Int.toString (ord ch) ^ ";" + | ch => str ch + +val attrifyString = String.translate attrifyChar + val urlifyInt = attrifyInt val urlifyFloat = attrifyFloat @@ -91,36 +60,9 @@ val urlifyFloat = attrifyFloat val htmlifyInt = attrifyInt val htmlifyFloat = attrifyFloat -fun htmlifyString s = - let - fun hs (pos, acc) = - if pos >= size s then - String.concat (rev acc) - else - case String.sub (s, pos) of - #"<" => hs (pos+1, "<" :: acc) - | #"&" => hs (pos+1, "&" :: acc) - | ch => - let - val n = ord ch - fun isCont k = pos + k < size s - andalso ord (String.sub (s, pos + k)) div 64 = 2 - fun unicode k = hs (pos+k+1, String.substring (s, pos, k+1) :: acc) - in - if Char.isPrint ch then - hs (pos+1, str ch :: acc) - else if n div 32 = 6 andalso isCont 1 then - unicode 1 - else if n div 16 = 14 andalso isCont 1 andalso isCont 2 then - unicode 2 - else if n div 8 = 30 andalso isCont 1 andalso isCont 2 andalso isCont 3 then - unicode 3 - else - hs (pos+1, "&#" ^ Int.toString (ord ch) ^ ";" :: acc) - end - in - hs (0, []) - end +val htmlifyString = String.translate (fn #"<" => "<" + | #"&" => "&" + | ch => str ch) fun hexIt ch = let |