X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Flib%2Falist.c;h=7b53dfe8bc0a0c5b206c787ca4f6c2538a2b58c8;hb=2df589363f0c60f94ca9d5e856dfaf7cc5fcb178;hp=b9425c61143b3e3080ee7b5bd88c82912ca659b7;hpb=59ceb7bda26d458975db740607423080a4443b74;p=bacula%2Fbacula diff --git a/bacula/src/lib/alist.c b/bacula/src/lib/alist.c index b9425c6114..7b53dfe8bc 100644 --- a/bacula/src/lib/alist.c +++ b/bacula/src/lib/alist.c @@ -1,44 +1,54 @@ /* - * Bacula array list routines + Bacula® - The Network Backup Solution + + Copyright (C) 2003-2008 Free Software Foundation Europe e.V. + + The main author of Bacula is Kern Sibbald, with contributions from + many others, a complete list can be found in the file AUTHORS. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version two of the GNU General Public + License as published by the Free Software Foundation and included + in the file LICENSE. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + + Bacula® is a registered trademark of Kern Sibbald. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ +/* + * 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. - * Default is to realloc the pointer array for each new member. + * 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 * * Version $Id$ * */ -/* - Copyright (C) 2000-2003 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 - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public - License along with this program; if not, write to the Free - Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. - - */ #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) { - if (num_items == 0) { +void alist::grow_list() +{ + if (items == NULL) { if (num_grow == 0) { - num_grow = 1; /* default if not initialized */ + num_grow = 1; /* default if not initialized */ } items = (void **)malloc(num_grow * sizeof(void *)); max_items = num_grow; @@ -46,9 +56,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) { @@ -63,11 +151,13 @@ void alist::destroy() { if (items) { if (own_items) { - for (int i=0; imylist.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 +196,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