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;