diff src/c/urweb.c @ 1061:e8a35d710ab9

Context globals; ctype functions
author Adam Chlipala <adamc@hcoop.net>
date Tue, 08 Dec 2009 10:46:50 -0500
parents 03a81e26e5fe
children e3f6620afd51
line wrap: on
line diff
--- a/src/c/urweb.c	Tue Dec 08 09:33:08 2009 -0500
+++ b/src/c/urweb.c	Tue Dec 08 10:46:50 2009 -0500
@@ -341,6 +341,12 @@
   uw_callback commit, rollback, free;
 } transactional;
 
+typedef struct {
+  char *name;
+  void *data;
+  void (*free)(void*);
+} global;
+
 struct uw_context {
   char *(*get_header)(void *, const char *);
   void *get_header_data;
@@ -374,6 +380,9 @@
   transactional *transactionals;
   size_t n_transactionals, used_transactionals;
 
+  global *globals;
+  size_t n_globals;
+
   char error_message[ERROR_BUF_LEN];
 };
 
@@ -424,6 +433,9 @@
   ctx->transactionals = malloc(0);
   ctx->n_transactionals = ctx->used_transactionals = 0;
 
+  ctx->globals = malloc(0);
+  ctx->n_globals = 0;
+
   return ctx;
 }
 
@@ -450,6 +462,9 @@
   for (i = 0; i < ctx->n_deltas; ++i)
     buf_free(&ctx->deltas[i].msgs);
 
+  for (i = 0; i < ctx->n_globals; ++i)
+    ctx->globals[i].free(ctx->globals[i].data);
+
   free(ctx);
 }
 
@@ -3092,3 +3107,89 @@
 uw_Basis_time uw_Basis_now(uw_context ctx) {
   return time(NULL);
 }
+
+void *uw_get_global(uw_context ctx, char *name) {
+  int i;
+
+  for (i = 0; i < ctx->n_globals; ++i)
+    if (!strcmp(name, ctx->globals[i].name))
+      return ctx->globals[i].data;
+
+  return NULL;
+}
+
+void uw_set_global(uw_context ctx, char *name, void *data, void (*free)(void*)) {
+  int i;
+
+  if (data == NULL) uw_error(ctx, FATAL, "NULL data value for global '%s'", name);
+
+  for (i = 0; i < ctx->n_globals; ++i)
+    if (!strcmp(name, ctx->globals[i].name)) {
+      if (ctx->globals[i].data)
+        ctx->globals[i].free(ctx->globals[i].data);
+      ctx->globals[i].data = data;
+      ctx->globals[i].free = free;
+      return;
+    }
+      
+  ++ctx->n_globals;
+  ctx->globals = realloc(ctx->globals, ctx->n_globals * sizeof(global));
+  ctx->globals[ctx->n_globals-1].name = name;
+  ctx->globals[ctx->n_globals-1].data = data;
+  ctx->globals[ctx->n_globals-1].free = free;
+}
+
+uw_Basis_bool uw_Basis_isalnum(uw_context ctx, uw_Basis_char c) {
+  return isalnum(c);
+}
+
+uw_Basis_bool uw_Basis_isalpha(uw_context ctx, uw_Basis_char c) {
+  return isalpha(c);
+}
+
+uw_Basis_bool uw_Basis_isblank(uw_context ctx, uw_Basis_char c) {
+  return isblank(c);
+}
+
+uw_Basis_bool uw_Basis_iscntrl(uw_context ctx, uw_Basis_char c) {
+  return iscntrl(c);
+}
+
+uw_Basis_bool uw_Basis_isdigit(uw_context ctx, uw_Basis_char c) {
+  return isdigit(c);
+}
+
+uw_Basis_bool uw_Basis_isgraph(uw_context ctx, uw_Basis_char c) {
+  return isgraph(c);
+}
+
+uw_Basis_bool uw_Basis_islower(uw_context ctx, uw_Basis_char c) {
+  return islower(c);
+}
+
+uw_Basis_bool uw_Basis_isprint(uw_context ctx, uw_Basis_char c) {
+  return isprint(c);
+}
+
+uw_Basis_bool uw_Basis_ispunct(uw_context ctx, uw_Basis_char c) {
+  return ispunct(c);
+}
+
+uw_Basis_bool uw_Basis_isspace(uw_context ctx, uw_Basis_char c) {
+  return isspace(c);
+}
+uw_Basis_bool uw_Basis_isupper(uw_context ctx, uw_Basis_char c) {
+  return isupper(c);
+}
+
+uw_Basis_bool uw_Basis_isxdigit(uw_context ctx, uw_Basis_char c) {
+  return isxdigit(c);
+}
+
+uw_Basis_char uw_Basis_tolower(uw_context ctx, uw_Basis_char c) {
+  return tolower(c);
+}
+
+uw_Basis_char uw_Basis_toupper(uw_context ctx, uw_Basis_char c) {
+  return toupper(c);
+}