src/grid/array.h

    // Arrays
    
    typedef struct {
      void * p;
      long max, len;
    } Array;
    
    Array * array_new()
    {
      Array * a = qmalloc (1, Array);
      a->p = NULL;
      a->max = a->len = 0;
      return a;
    }
    
    void array_free (Array * a)
    {
      free (a->p);
      free (a);
    }
    
    void * array_append (Array * a, void * elem, size_t size)
    {
      if (a->len + size >= a->max) {
        a->max += max (size, 4096);
        a->p = realloc (a->p, a->max);
      }
      memcpy (((char *)a->p) + a->len, elem, size);
      a->len += size;
      return (void *)(((char *)a->p) + a->len - size);
    }
    
    void * array_shrink (Array * a)
    {
      void * p = realloc (a->p, a->len);
      free (a);
      return p;
    }