summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adam@chlipala.net>2011-05-30 09:31:50 -0400
committerGravatar Adam Chlipala <adam@chlipala.net>2011-05-30 09:31:50 -0400
commit7281024b45db2ddcc54cf6257fe5559b9b07aa93 (patch)
treefbcc9d6f1fc4ec715af7af96f489195487cc4fc0 /src
parent62abdfd0a23e35cbb1415ff48a0af3da9d702880 (diff)
Fix bug with string literals in unAs
Diffstat (limited to 'src')
-rw-r--r--src/c/urweb.c22
-rw-r--r--src/mono_opt.sml2
2 files changed, 9 insertions, 15 deletions
diff --git a/src/c/urweb.c b/src/c/urweb.c
index 1edf47e0..865ce024 100644
--- a/src/c/urweb.c
+++ b/src/c/urweb.c
@@ -3562,7 +3562,7 @@ __attribute__((noreturn)) void uw_redirect(uw_context ctx, uw_Basis_string url)
}
uw_Basis_string uw_Basis_unAs(uw_context ctx, uw_Basis_string s) {
- uw_Basis_string r = uw_malloc(ctx, strlen(s) + 1);
+ uw_Basis_string ret = uw_malloc(ctx, strlen(s) + 1), r = ret;
for (; *s; ++s) {
if (s[0] == '\'') {
@@ -3572,27 +3572,21 @@ uw_Basis_string uw_Basis_unAs(uw_context ctx, uw_Basis_string s) {
*r++ = '\'';
break;
} else if (s[0] == '\\') {
- if (s[1] == '\\') {
- *r++ = '\\';
- *r++ = '\\';
- ++s;
- } else if (s[1] == '\'') {
- *r++ = '\\';
- *r++ = '\'';
- ++s;
- } else
- *r++ = '\'';
+ *r++ = '\\';
+ *r++ = s[1];
+ ++s;
} else
*r++ = s[0];
}
if (*s == 0) break;
- } else if (s[0] == 'T' && s[1] == '.')
- ++s;
+ } else if (s[0] == 'T' && s[1] == '_' && s[2] == 'T' && s[3] == '.')
+ s += 3;
else
*r++ = s[0];
}
- return r;
+ *r = 0;
+ return ret;
}
uw_Basis_string uw_Basis_mstrcat(uw_context ctx, ...) {
diff --git a/src/mono_opt.sml b/src/mono_opt.sml
index ffadeec4..5abbf900 100644
--- a/src/mono_opt.sml
+++ b/src/mono_opt.sml
@@ -102,7 +102,7 @@ fun unAs s =
fun doChars (cs, acc) =
case cs of
#"T" :: #"_" :: #"T" :: #"." :: cs => doChars (cs, acc)
- | #"'" :: cs => doString (cs, acc)
+ | #"'" :: cs => doString (cs, #"'" :: acc)
| ch :: cs => doChars (cs, ch :: acc)
| [] => String.implode (rev acc)