]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/alist.c
- Fix mode change open in btape.c
[bacula/bacula] / bacula / src / lib / alist.c
index b9425c61143b3e3080ee7b5bd88c82912ca659b7..53275832b164a0c15dc5f54505d9050bebeff7a2 100644 (file)
@@ -1,8 +1,8 @@
 /*
- *  Bacula array list routines    
+ *  Bacula array list routines
  *
  *    alist is a simple malloc'ed array of pointers.  For the moment,
- *      it simply malloc's a bigger array controlled by num_grow.         
+ *      it simply malloc's a bigger array controlled by num_grow.
  *     Default is to realloc the pointer array for each new member.
  *
  *   Kern Sibbald, June MMIII
@@ -11,7 +11,7 @@
  *
  */
 /*
-   Copyright (C) 2000-2003 Kern Sibbald and John Walker
+   Copyright (C) 2000-2004 Kern Sibbald and John Walker
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
 #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 -- i.e. add to beginning
+ */
+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)
 {
@@ -65,9 +145,11 @@ void alist::destroy()
       if (own_items) {
         for (int i=0; i<num_items; i++) {
            free(items[i]);
+           items[i] = NULL;
         }
       }
       free(items);
+      items = NULL;
    }
 }
 
@@ -89,13 +171,13 @@ int main()
    fileset->mylist.init();
 
    printf("Manual allocation/destruction of list:\n");
-   
+
    for (int i=0; i<20; i++) {
       sprintf(buf, "This is item %d", i);
       fileset->mylist.append(bstrdup(buf));
-   } 
+   }
    for (int i=0; i< fileset->mylist.size(); i++) {
-      printf("Item %d = %s\n", i, (char *)fileset->mylist[i]);  
+      printf("Item %d = %s\n", i, (char *)fileset->mylist[i]);
    }
    fileset->mylist.destroy();
    free(fileset);
@@ -106,15 +188,15 @@ int main()
    for (int i=0; i<20; i++) {
       sprintf(buf, "This is item %d", i);
       mlist->append(bstrdup(buf));
-   } 
+   }
    for (int i=0; i< mlist->size(); i++) {
-      printf("Item %d = %s\n", i, (char *)mlist->get(i));  
+      printf("Item %d = %s\n", i, (char *)mlist->get(i));
    }
 
    delete mlist;
 
 
-   sm_dump(False);
+   sm_dump(false);
 
 }
 #endif