diff anagram/agcore/arrays.cpp @ 0:13d2b8934445

Import AnaGram (near-)release tree into Mercurial.
author David A. Holland
date Sat, 22 Dec 2007 17:52:45 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/anagram/agcore/arrays.cpp	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,258 @@
+/*
+ * AnaGram, A System for Syntax Directed Programming
+ * Copyright 1993-1999 Parsifal Software. All Rights Reserved.
+ * See the file COPYING for license and usage terms.
+ *
+ * arrays.cpp - old array control module
+ */
+
+#include <string.h>
+#include "port.h"
+
+#include "arrays.h"
+#include "assert.h"
+#include "myalloc.h"
+#include "stacks.h"
+#include "tsd.h"
+
+//#define INCLUDE_LOGGING
+#include "log.h"
+
+
+#define mkstrg(n,size) \
+    (array_control_block *) \
+	(ALLOCATE(n*size + sizeof(array_control_block), char))
+
+#define remkstrg(p,n) \
+    (array_control_block *) \
+	(reallocate(p,n + sizeof(array_control_block), char))
+
+typedef struct {
+  unsigned elements_allocated;
+  unsigned element_size;
+} array_control_block;
+
+
+void *init_array(unsigned n, unsigned size) {
+  LOGSECTION("init_array");
+  LOGV(n) LCV(size);
+
+  array_control_block *p;
+  p = mkstrg(n,size);
+  p->elements_allocated = n;
+  p->element_size = size;
+  memset(++p,0,n*size);
+  return p;
+}
+
+void *reset_array_size(void *ptr, unsigned n, unsigned size) {
+  LOGSECTION("reset_array_size");
+  LOGV((int) ptr) LCV(n) LCV(size);
+  array_control_block *p;
+  if (ptr) {
+    delete_array(ptr);
+  }
+  p = mkstrg(n, size);
+  p->elements_allocated = n;
+  p->element_size = size;
+  memset(++p, 0, n*size);
+  LOGV((int) p) LCV(n) LCV(size);
+  return p;
+}
+
+void *reset_array(void *a) {
+  array_control_block *p;
+  unsigned n, size;
+  unsigned k;
+
+  p = (array_control_block *) a;
+  p--;
+  ok_ptr(p);
+  n = p->elements_allocated;
+  size = p->element_size;
+  k = n*size;
+  size_ok(p, k+sizeof(array_control_block), __FILE__, __LINE__);
+  memset(++p,0,k);
+  return p;
+}
+
+void *delete_array(void *a) {
+  array_control_block *p;
+
+  p = (array_control_block *) a;
+  p--;
+  DEALLOCATE(p);
+  return NULL;
+}
+
+static int array_ok(void *ptr) {
+  array_control_block *p;
+
+  p = (array_control_block *) ptr;
+  p--;
+  return ptr_ok(p);
+}
+
+#if 0 /* unused */
+void *slide_array(void *ptr) {
+  array_control_block *p = (array_control_block *) ptr, *q;
+  unsigned size;
+
+  p--;
+  ok_ptr(p);
+  size = p->elements_allocated * p->element_size + sizeof(array_control_block);
+  q = (array_control_block *) reallocate(p,size, char);
+  q++;
+  return (void *) q;
+}
+#endif
+
+int ok_index(void *ptr, unsigned x) {
+  LOGSECTION("ok_index");
+  array_control_block *p = (array_control_block *) ptr;
+  p--;
+  ok_ptr(p);
+  LOGV(x) LCV(p->elements_allocated);
+  return x < p->elements_allocated;
+}
+
+void *check_array_size(void *ptr, unsigned n1, unsigned n) {
+  LOGSECTION("check_array_size");
+  LOGV((int) ptr) LCV(n1) LCV(n);
+  array_control_block *p = (array_control_block *) ptr;
+  unsigned kp,kn;
+//  unsigned long lim;
+//  unsigned min;
+
+  p--;
+  ok_ptr(p);
+  LOGV(p->elements_allocated);
+  if (n1 + 1 < (kp = p->elements_allocated)) {
+    return ptr;
+  }
+  n1 += 2;
+  if (n < n1) {
+    n = n1;
+  }
+  kn = p->element_size;
+  //min = n1*kn;
+  kp *= kn;
+
+  //lim = (MAX_BYTES - sizeof(array_control_block))/kn;
+  //if (lim < n1) {
+  //  no_mem(kp);
+  //}
+
+  LOGV(n) LCV(n1) LCV(p->element_size);  // LCV(lim);
+
+  //if (n > lim) {
+  //  n = (unsigned) lim;
+  //}
+
+  assert(n >= n1);
+  kn *= n;
+/*
+  p = (array_control_block *) vrealloc(p,
+               min + sizeof(array_control_block),
+               kn + sizeof(array_control_block), &n);
+*/
+  p = remkstrg(p, kn);
+  LOGV(kn) LCV(p->element_size);
+  //n -= sizeof(array_control_block);
+  p->elements_allocated = kn/p->element_size;
+  LOGV(p->elements_allocated);
+  assert(p->elements_allocated >= n1);
+  p++;
+  if (kn > kp) {
+    memset((char *)p + kp, 0, kn - kp);
+  }
+  LOGV(kn) LCV(kp);
+  LOGV((int) ((char *)p + kp)) LCV(kn-kp);
+  return p;
+}
+
+void *set_array_size(void *ptr, unsigned n) {
+  array_control_block *p = (array_control_block *) ptr;
+  unsigned kp,kn;
+
+  p--;
+  ok_ptr(p);
+  kp = p->elements_allocated;
+  if (kp == n) {
+    return ptr;
+  }
+  kn = p->element_size;
+  kp *= kn;
+  kn *= n;
+  p = remkstrg(p, kn);
+  p->elements_allocated = n;
+  p++;
+  if (kn > kp) {
+    memset((char *)p + kp, 0, kn - kp);
+  }
+  return p;
+}
+
+static unsigned *init_list(int n) {
+  LOGSECTION("init_list");
+  LOGV(n);
+  unsigned *list = (unsigned *) init_array(n+1, sizeof(*list));
+  list[0] = 1;
+  return list;
+}
+
+unsigned *reset_list(unsigned *list, unsigned n) {
+  LOGSECTION("reset_list");
+  LOGV(list ? list[0] : 0) LCV(n);
+  unsigned *new_array = init_list(n);
+  new_array[0] = 1;
+  if (list) {
+    delete_array(list);
+  }
+  return new_array;
+}
+
+void *check_list_size(unsigned *list, unsigned n) {
+  LOGSECTION("check_list_size");
+  LOGV(list[0]) LCV(n);
+  n += list[0];
+  return check_array_size(list,n,n+n/2);
+}
+
+static unsigned add_data_list(unsigned *list, unsigned *data, unsigned n) {
+  unsigned k = list[0];
+  memmove(list+k, data, n*sizeof(*list));
+  list[0] += n;
+  array_ok(list);
+  return k;
+}
+
+int store_list_data(unsigned *list) {
+  LOGSECTION("store_list_data");
+  unsigned n = tis();
+  LOGV(list[0]) LCV(n);
+  if (n == 0) {
+    return 0;
+  }
+  return add_data_list(list, (unsigned *) list_base, n);
+}
+
+int store_tuple_data(tsd *t, unsigned *list) {
+  unsigned n = t->nt * t->tw;
+  if (n == 0) {
+    return 0;
+  }
+  return add_data_list(list, (unsigned *)t->sb, n);
+}
+/*
+void *shrink_fit(unsigned *list) {
+  return set_array_size(list, list[0]);
+}
+*/
+
+void *check_local_array(void *p) {
+  assert(p != NULL);
+  return p;
+}
+
+/* End ARRAYS.C */