]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/alist.c
This commit was manufactured by cvs2svn to create tag
[bacula/bacula] / bacula / src / lib / alist.c
index 72613242ac9b436af605ebc8e9a73a6ffeaab89d..ea60835b0d771411ef0217d03a8a1b3ed424dcb4 100644 (file)
 #include "bacula.h"
 
 /*
- * Append an item to the list
+ * Private grow list function. Used to insure that 
+ *   at least one more "slot" is available.
  */
-void alist::append(void *item) {
+void alist::grow_list()
+{
    if (num_items == 0) {
       if (num_grow == 0) {
         num_grow = 1;                /* default if not initialized */
@@ -46,9 +48,87 @@ void alist::append(void *item) {
       max_items += num_grow;
       items = (void **)realloc(items, max_items * sizeof(void *));
    }
+}
+
+void *alist::first()
+{
+   cur_item = 1;
+   if (num_items == 0) {
+      return NULL;
+   } else {
+      return items[0];
+   }
+}
+
+void *alist::last()
+{
+   if (num_items == 0) {
+      return NULL;
+   } else {
+      cur_item = num_items;    
+      return items[num_items-1];
+   }
+}
+
+void *alist::next()
+{
+   if (cur_item >= num_items) {
+      return NULL;
+   } else {
+      return items[cur_item++];
+   }
+}
+
+void *alist::prev()
+{
+   if (cur_item <= 1) {
+      return NULL;
+   } else {
+      return items[--cur_item];
+   }
+}
+
+/*
+ * prepend an item to the list
+ */
+void alist::prepend(void *item) {
+   grow_list();
+   if (num_items == 0) {
+      items[num_items++] = item;
+      return;
+   }
+   for (int i=num_items; i > 0; i--) {
+      items[i] = items[i-1];
+   }
+   items[0] = item;
+   num_items++;
+}
+
+
+/*
+ * Append an item to the list
+ */
+void alist::append(void *item) {
+   grow_list();
    items[num_items++] = item;
 }
 
+/* Remove an item from the list */
+void * alist::remove(int index)
+{
+   void *item;
+   if (index < 0 || index >= num_items) {
+      return NULL;
+   }
+   item = items[index];
+   num_items--;
+   for (int i=index; i < num_items; i++) {
+      items[i] = items[i+1];
+   }
+   return item;
+}
+
+
 /* Get the index item -- we should probably allow real indexing here */
 void * alist::get(int index)
 {
@@ -94,7 +174,7 @@ int main()
       sprintf(buf, "This is item %d", i);
       fileset->mylist.append(bstrdup(buf));
    } 
-   for (int i=0; i<fileset->mylist.size(); i++) {
+   for (int i=0; i< fileset->mylist.size(); i++) {
       printf("Item %d = %s\n", i, (char *)fileset->mylist[i]);  
    }
    fileset->mylist.destroy();
@@ -107,7 +187,7 @@ int main()
       sprintf(buf, "This is item %d", i);
       mlist->append(bstrdup(buf));
    } 
-   for (int i=0; i<mlist->size(); i++) {
+   for (int i=0; i< mlist->size(); i++) {
       printf("Item %d = %s\n", i, (char *)mlist->get(i));  
    }