Mercurial > urweb
diff src/c/urweb.c @ 742:43553c93dd8c
Reading blobs from the database
author | Adam Chlipala <adamc@hcoop.net> |
---|---|
date | Sun, 26 Apr 2009 10:45:59 -0400 |
parents | f7e2026dd5ae |
children | ee2feab275db |
line wrap: on
line diff
--- a/src/c/urweb.c Sun Apr 26 09:02:17 2009 -0400 +++ b/src/c/urweb.c Sun Apr 26 10:45:59 2009 -0400 @@ -443,6 +443,11 @@ ctx->headers_end = s; } +void uw_headers_moved(uw_context ctx, char *headers) { + ctx->headers_end = headers + (ctx->headers_end - ctx->headers); + ctx->headers = headers; +} + int uw_db_begin(uw_context); __attribute__((noreturn)) void uw_error(uw_context ctx, failure_kind fk, const char *fmt, ...) { @@ -1481,6 +1486,11 @@ return NULL; } +char *uw_memdup(uw_context ctx, const char *p, size_t len) { + char *r = uw_malloc(ctx, len); + memcpy(r, p, len); + return r; +} char *uw_Basis_sqlifyInt(uw_context ctx, uw_Basis_int n) { int len; @@ -1896,6 +1906,36 @@ } } +uw_Basis_blob uw_Basis_stringToBlob_error(uw_context ctx, uw_Basis_string s, size_t len) { + char *r = ctx->heap.front; + uw_Basis_blob b = {len, r}; + + uw_check_heap(ctx, len); + + while (*s) { + if (s[0] == '\\') { + if (s[1] == '\\') { + *r++ = '\\'; + s += 2; + } else if (isdigit(s[1]) && isdigit(s[2]) && isdigit(s[3])) { + *r++ = (s[1] - '0') * 8 * 8 + ((s[2] - '0') * 8) + (s[3] - '0'); + s += 4; + } + else { + *r++ = '\\'; + ++s; + } + } else { + *r++ = s[0]; + ++s; + } + } + + b.size = r - ctx->heap.front; + ctx->heap.front = r; + return b; +} + uw_Basis_string uw_Basis_get_cookie(uw_context ctx, uw_Basis_string c) { int len = strlen(c); char *s = ctx->headers, *p = ctx->outHeaders.start;