Index: trunk/Ohana/src/opihi/lib.data/queues.c
===================================================================
--- trunk/Ohana/src/opihi/lib.data/queues.c	(revision 4697)
+++ trunk/Ohana/src/opihi/lib.data/queues.c	(revision 4704)
@@ -1,15 +1,12 @@
 # include "data.h"
 
-/* These functions are somewhat fragile: we cannot do multiple CreateQueue
-   invalidates the pointer from FindQueue.  Do we need a 'delete queue'
-   function?
-*/
-
-Queue *queues;   /* queue to store the list of all queues */
-int   Nqueues;   /* number of currently available queues */
+Queue **queues;   /* queue to store the list of all queues */
+int    Nqueues;   /* number of currently defined queues */
+int    NQUEUES;   /* number of currently allocated queues */
 
 void InitQueues () {
   Nqueues = 0;
-  ALLOCATE (queues, Queue, 1); 
+  NQUEUES = 16;
+  ALLOCATE (queues, Queue *, NQUEUES); 
 }
 
@@ -20,5 +17,5 @@
 
   for (i = 0; i < Nqueues; i++) {
-    fprintf (stderr, "%-15s %3d\n", queues[i].name, queues[i].Nlines);
+    fprintf (stderr, "%-15s %3d\n", queues[i][0].name, queues[i][0].Nlines);
   }
   return;
@@ -31,9 +28,23 @@
 
   for (i = 0; i < Nqueues; i++) {
-    if (!strcmp (queues[i].name, name)) {
-      return (&queues[i]);
+    if (!strcmp (queues[i][0].name, name)) {
+      return (&queues[i][0]);
     }
   }
   return (NULL);
+}
+
+/* make a new named queue */
+int InitQueue (Queue *queue) {
+
+  int i;
+
+  for (i = 0; i < queue[0].Nlines; i++) {
+    free (queue[0].lines[i]);
+  }
+  queue[0].Nlines = 0;
+  queue[0].NLINES = 16;
+  REALLOCATE (queue[0].lines, char *, queue[0].NLINES);
+  return (TRUE);
 }
 
@@ -41,4 +52,5 @@
 Queue *CreateQueue (char *name) {
 
+  int N;
   Queue *queue;
 
@@ -46,12 +58,48 @@
   if (queue != NULL) return (queue);
 
+  N = Nqueues;
   Nqueues ++;
-  REALLOCATE (queues, Queue, Nqueues);
-  queue = &queues[Nqueues - 1];
+  CHECK_REALLOCATE (queues, Queue *, NQUEUES, Nqueues, 16);
+  ALLOCATE (queue, Queue, 1);
   queue[0].Nlines = 0;
-  queue[0].NLINES = 10;
+  queue[0].NLINES = 16;
   queue[0].name = strcreate (name);
   ALLOCATE (queue[0].lines, char *, queue[0].NLINES);
+  queues[N] = queue;
   return (queue);
+}
+
+/* delete a queue */
+int DeleteQueue (Queue *queue) {
+
+  int i, N, NQUEUES_2;
+
+  /* find queue in queue list */
+  N = -1;
+  for (i = 0; i < Nqueues; i++) {
+    if (queues[i] == queue) {
+      N = i;
+      break;
+    }
+  }
+  if (N == -1) return (FALSE);
+
+  for (i = N; i < Nqueues - 1; i++) {
+    queues[i] = queues[i + 1];
+  }
+  Nqueues --;
+  NQUEUES_2 = MAX (16, NQUEUES / 2);
+  if (Nqueues < NQUEUES_2) {
+    NQUEUES = NQUEUES_2;
+    REALLOCATE (queues, Queue *, NQUEUES);
+  }
+
+  free (queue[0].name);
+  for (i = 0; i < queue[0].Nlines; i++) {
+    free (queue[0].lines[i]);
+  }
+  free (queue[0].lines);
+  free (queue);
+  return (TRUE);
 }
 
@@ -222,5 +270,5 @@
 char *PopQueue (Queue *queue) {
 
-  int i;
+  int i, NLINES_2;
   char *line;
 
@@ -228,12 +276,12 @@
   line = queue[0].lines[0];
 
-  for (i = 1; i < queue[0].Nlines; i++) {
-    queue[0].lines[i-1] = queue[0].lines[i];
+  for (i = 0; i < queue[0].Nlines - 1; i++) {
+    queue[0].lines[i] = queue[0].lines[i+1];
   }
   queue[0].Nlines --;
 
-  if (queue[0].Nlines < queue[0].NLINES - 20) {
-    queue[0].NLINES -= 20;
-    queue[0].NLINES = MAX (queue[0].NLINES, 10);
+  NLINES_2 = MAX (16, queue[0].NLINES / 2);
+  if (queue[0].Nlines < NLINES_2) {
+    queue[0].NLINES = NLINES_2;
     REALLOCATE (queue[0].lines, char *, queue[0].NLINES);
   }    
@@ -241,2 +289,14 @@
 }
 
+int PrintQueue (FILE *f, Queue *queue) {
+
+  int i;
+
+  if (queue[0].Nlines == 0) return (TRUE);
+
+  for (i = 0; i < queue[0].Nlines; i++) {
+    fprintf (f, "%s\n", queue[0].lines[i]);
+  }
+  return (TRUE);
+}
+
