Rearranged to allow static declarations.

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@117 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dave Beazley 2000-01-19 06:53:48 +00:00
commit 059cd4513e

View file

@ -13,9 +13,9 @@
* can be used and distributed.
****************************************************************************/
static char cvsroot[] = "$Header";
/*******************************************************************************
* $Header$
*
* File : list.c
*
* General purpose structure for keeping a list of reference counted Swig objects.
@ -31,21 +31,290 @@ typedef struct List {
DOH **items;
} List;
/* Forward references */
int List_check(DOH *);
DOH *CopyList(DOH *);
void DelList(DOH *);
void List_clear(DOH *);
void List_scope(DOH *, int s);
DOH *List_get(DOH *, int pos);
int List_set(DOH *, int pos, DOH *obj);
int List_insert(DOH *, int pos, DOH *item);
int List_remove(DOH *, int pos);
int List_len(DOH *);
DOH *List_first(DOH *);
DOH *List_next(DOH *);
DOH *List_str(DOH *);
int List_dump(DOH *, DOH *);
/* Internal function. Doubles amount of memory in a list */
static
void more(List *l) {
int i;
void **newitems;
newitems = (void **) DohMalloc(l->maxitems*2*sizeof(void *));
for (i = 0; i < l->maxitems; i++) {
newitems[i] = l->items[i];
}
for (i = l->maxitems; i < 2*l->maxitems; i++) {
newitems[i] = (void *) 0;
}
l->maxitems *= 2;
DohFree(l->items);
l->items = newitems;
}
/* -----------------------------------------------------------------------------
* DOH *CopyList(DOH *l) - Copy a list
* ----------------------------------------------------------------------------- */
static DOH *
CopyList(DOH *lo) {
List *l,*nl;
int i;
l = (List *) lo;
nl = (List *) DohObjMalloc(sizeof(List));
DohXInit(nl);
nl->objinfo = l->objinfo;
nl->nitems = l->nitems;
nl->maxitems = l->maxitems;
nl->items = (void **) DohMalloc(l->maxitems*sizeof(void *));
nl->iter = 0;
for (i = 0; i < l->maxitems; i++) {
nl->items[i] = l->items[i];
if (nl->items[i]) {
Incref(nl->items[i]);
}
}
nl->file = l->file;
if (nl->file) Incref(nl->file);
nl->line = l->line;
return (DOH *) nl;
}
/* -----------------------------------------------------------------------------
* void DelList(DOH *l) - Delete a list
* ----------------------------------------------------------------------------- */
static void
DelList(DOH *lo) {
List *l;
int i;
l = (List *) lo;
assert(l->refcount <= 0);
for (i = 0; i < l->nitems; i++) {
Delete(l->items[i]);
}
DohFree(l->items);
l->items = 0;
Delete(l->file);
DohObjFree(l);
}
/* -----------------------------------------------------------------------------
* void List_clear(DOH *l) - Clear all elements in the list
* ----------------------------------------------------------------------------- */
static void
List_clear(DOH *lo) {
List *l;
int i;
l = (List *) lo;
for (i = 0; i < l->nitems; i++) {
Delete(l->items[i]);
l->items[i] = 0;
}
l->nitems = 0;
}
/* -----------------------------------------------------------------------------
* void List_scope(DOH *lo, int s)
* ----------------------------------------------------------------------------- */
static void
List_scope(DOH *lo, int s) {
List *l;
int i;
l = (List *) lo;
if (l->flags & DOH_FLAG_SETSCOPE) return;
l->flags = l->flags | DOH_FLAG_SETSCOPE;
if (s < l->scope) l->scope = (unsigned char) s;
for (i = 0; i < l->nitems; i++) {
Setscope(l->items[i],s);
}
l->flags = l->flags & ~DOH_FLAG_SETSCOPE;
}
/* -----------------------------------------------------------------------------
* void List_insert(DOH *lo, int pos, DOH *item) - Insert an element
* ----------------------------------------------------------------------------- */
static int
List_insert(DOH *lo, int pos, DOH *item)
{
List *l;
DohBase *b;
int i;
if (!item) return -1;
b = (DohBase *) item;
l = (List *) lo;
if (pos == DOH_END) pos = l->nitems;
if (pos < 0) pos = 0;
if (pos > l->nitems) pos = l->nitems;
if (l->nitems == l->maxitems) more(l);
for (i = l->nitems; i > pos; i--) {
l->items[i] = l->items[i-1];
}
l->items[pos] = item;
b->refcount++;
Setscope(b,l->scope);
l->nitems++;
return 0;
}
/* -----------------------------------------------------------------------------
* void List_remove(DOH *lo, int pos) - Remove an element
* ----------------------------------------------------------------------------- */
static int
List_remove(DOH *lo, int pos)
{
List *l;
DOH *item;
int i;
l = (List *) lo;
if (pos == DOH_END) pos = l->nitems-1;
if (pos == DOH_BEGIN) pos = 0;
if ((pos < 0) || (pos >= l->nitems)) return -1;
item = l->items[pos];
for (i = pos; i < l->nitems-1; i++) {
l->items[i] = l->items[i+1];
}
l->nitems--;
Delete(item);
return 0;
}
/* -----------------------------------------------------------------------------
* int List_len(DOH *l) - List length
* ----------------------------------------------------------------------------- */
static int
List_len(DOH *lo)
{
return ((List *) lo)->nitems;
}
/* -----------------------------------------------------------------------------
* DOH *List_get(DOH *lo, int n) - Get an item
* ----------------------------------------------------------------------------- */
static DOH *
List_get(DOH *lo, int n)
{
List *l;
l = (List *) lo;
if (n == DOH_END) n = l->nitems-1;
if (n == DOH_BEGIN) n = 0;
if ((n < 0) || (n >= l->nitems)) {
printf("List_get : Invalid list index %d\n", n);
}
return l->items[n];
}
/* -----------------------------------------------------------------------------
* int List_set(DOH *lo, int n, DOH *val) - Set an item
* ----------------------------------------------------------------------------- */
static int
List_set(DOH *lo, int n, DOH *val)
{
List *l;
l = (List *) lo;
if ((n < 0) || (n >= l->nitems)) {
printf("List_set : Invalid list index %d\n", n);
}
Delete(l->items[n]);
l->items[n] = val;
Incref(val);
Setscope(val,l->scope);
return 0;
}
/* -----------------------------------------------------------------------------
* Iterators
* ----------------------------------------------------------------------------- */
static DOH *
List_first(DOH *lo)
{
List *l;
l = (List *) lo;
l->iter = 0;
if (l->iter >= l->nitems) return 0;
return l->items[l->iter];
}
static DOH *
List_next(DOH *lo)
{
List *l;
l = (List *) lo;
l->iter++;
if (l->iter >= l->nitems) return 0;
return l->items[l->iter];
}
/* -----------------------------------------------------------------------------
* String *List_str() - Create a string representation
* ----------------------------------------------------------------------------- */
static DOH *
List_str(DOH *lo)
{
DOH *s;
int i;
List *l = (List *) lo;
s = NewString("");
if (l->flags & DOH_FLAG_PRINT) {
Printf(s,"List(0x%x)",l);
return s;
}
l->flags = l->flags | DOH_FLAG_PRINT;
Printf(s,"List[ ");
for (i = 0; i < l->nitems; i++) {
Printf(s, "%s", l->items[i]);
if ((i+1) < l->nitems)
Printf(s,", ");
}
Printf(s," ]\n");
l->flags = l->flags & ~DOH_FLAG_PRINT;
return s;
}
static int
List_dump(DOH *lo, DOH *out) {
int nsent = 0;
int i,ret;
List *l = (List *) lo;
for (i = 0; i < l->nitems; i++) {
ret = Dump(l->items[i],out);
if (ret < 0) return -1;
nsent += ret;
}
return nsent;
}
/* -----------------------------------------------------------------------------
* void List_sort(DOH *DOH)
*
* Sorts a list
* ----------------------------------------------------------------------------- */
static int objcmp(const void *s1, const void *s2) {
DOH **so1, **so2;
so1 = (DOH **) s1;
so2 = (DOH **) s2;
return Cmp(*so1,*so2);
}
void List_sort(DOH *so) {
List *l;
if (!List_check(so)) return;
l = (List *) so;
qsort(l->items,l->nitems,sizeof(DOH *), objcmp);
}
#define MAXLISTITEMS 8
@ -87,28 +356,6 @@ static DohObjInfo ListType = {
&ListPositionalMethods, /* doh_position */
};
DohObjInfo *List_type() {
return &ListType;
}
/* Internal function. Doubles amount of memory in a list */
static
void more(List *l) {
int i;
void **newitems;
newitems = (void **) DohMalloc(l->maxitems*2*sizeof(void *));
for (i = 0; i < l->maxitems; i++) {
newitems[i] = l->items[i];
}
for (i = l->maxitems; i < 2*l->maxitems; i++) {
newitems[i] = (void *) 0;
}
l->maxitems *= 2;
DohFree(l->items);
l->items = newitems;
}
/* -----------------------------------------------------------------------------
* List_check(DOH *lo) - Check to see if an object is a list
* ----------------------------------------------------------------------------- */
@ -142,268 +389,3 @@ NewList() {
l->iter = 0;
return (DOH *) l;
}
/* -----------------------------------------------------------------------------
* DOH *CopyList(DOH *l) - Copy a list
* ----------------------------------------------------------------------------- */
DOH *
CopyList(DOH *lo) {
List *l,*nl;
int i;
l = (List *) lo;
nl = (List *) DohObjMalloc(sizeof(List));
DohXInit(nl);
nl->objinfo = l->objinfo;
nl->nitems = l->nitems;
nl->maxitems = l->maxitems;
nl->items = (void **) DohMalloc(l->maxitems*sizeof(void *));
nl->iter = 0;
for (i = 0; i < l->maxitems; i++) {
nl->items[i] = l->items[i];
if (nl->items[i]) {
Incref(nl->items[i]);
}
}
nl->file = l->file;
if (nl->file) Incref(nl->file);
nl->line = l->line;
return (DOH *) nl;
}
/* -----------------------------------------------------------------------------
* void DelList(DOH *l) - Delete a list
* ----------------------------------------------------------------------------- */
void
DelList(DOH *lo) {
List *l;
int i;
l = (List *) lo;
assert(l->refcount <= 0);
for (i = 0; i < l->nitems; i++) {
Delete(l->items[i]);
}
DohFree(l->items);
l->items = 0;
Delete(l->file);
DohObjFree(l);
}
/* -----------------------------------------------------------------------------
* void List_clear(DOH *l) - Clear all elements in the list
* ----------------------------------------------------------------------------- */
void
List_clear(DOH *lo) {
List *l;
int i;
l = (List *) lo;
for (i = 0; i < l->nitems; i++) {
Delete(l->items[i]);
l->items[i] = 0;
}
l->nitems = 0;
}
/* -----------------------------------------------------------------------------
* void List_scope(DOH *lo, int s)
* ----------------------------------------------------------------------------- */
void
List_scope(DOH *lo, int s) {
List *l;
int i;
l = (List *) lo;
if (l->flags & DOH_FLAG_SETSCOPE) return;
l->flags = l->flags | DOH_FLAG_SETSCOPE;
if (s < l->scope) l->scope = (unsigned char) s;
for (i = 0; i < l->nitems; i++) {
Setscope(l->items[i],s);
}
l->flags = l->flags & ~DOH_FLAG_SETSCOPE;
}
/* -----------------------------------------------------------------------------
* void List_insert(DOH *lo, int pos, DOH *item) - Insert an element
* ----------------------------------------------------------------------------- */
int
List_insert(DOH *lo, int pos, DOH *item)
{
List *l;
DohBase *b;
int i;
if (!item) return -1;
b = (DohBase *) item;
l = (List *) lo;
if (pos == DOH_END) pos = l->nitems;
if (pos < 0) pos = 0;
if (pos > l->nitems) pos = l->nitems;
if (l->nitems == l->maxitems) more(l);
for (i = l->nitems; i > pos; i--) {
l->items[i] = l->items[i-1];
}
l->items[pos] = item;
b->refcount++;
Setscope(b,l->scope);
l->nitems++;
return 0;
}
/* -----------------------------------------------------------------------------
* void List_remove(DOH *lo, int pos) - Remove an element
* ----------------------------------------------------------------------------- */
int
List_remove(DOH *lo, int pos)
{
List *l;
DOH *item;
int i;
l = (List *) lo;
if (pos == DOH_END) pos = l->nitems-1;
if (pos == DOH_BEGIN) pos = 0;
if ((pos < 0) || (pos >= l->nitems)) return -1;
item = l->items[pos];
for (i = pos; i < l->nitems-1; i++) {
l->items[i] = l->items[i+1];
}
l->nitems--;
Delete(item);
return 0;
}
/* -----------------------------------------------------------------------------
* int List_len(DOH *l) - List length
* ----------------------------------------------------------------------------- */
int
List_len(DOH *lo)
{
return ((List *) lo)->nitems;
}
/* -----------------------------------------------------------------------------
* DOH *List_get(DOH *lo, int n) - Get an item
* ----------------------------------------------------------------------------- */
DOH *
List_get(DOH *lo, int n)
{
List *l;
l = (List *) lo;
if (n == DOH_END) n = l->nitems-1;
if (n == DOH_BEGIN) n = 0;
if ((n < 0) || (n >= l->nitems)) {
printf("List_get : Invalid list index %d\n", n);
}
return l->items[n];
}
/* -----------------------------------------------------------------------------
* int List_set(DOH *lo, int n, DOH *val) - Set an item
* ----------------------------------------------------------------------------- */
int
List_set(DOH *lo, int n, DOH *val)
{
List *l;
l = (List *) lo;
if ((n < 0) || (n >= l->nitems)) {
printf("List_set : Invalid list index %d\n", n);
}
Delete(l->items[n]);
l->items[n] = val;
Incref(val);
Setscope(val,l->scope);
return 0;
}
/* -----------------------------------------------------------------------------
* Iterators
* ----------------------------------------------------------------------------- */
DOH *
List_first(DOH *lo)
{
List *l;
l = (List *) lo;
l->iter = 0;
if (l->iter >= l->nitems) return 0;
return l->items[l->iter];
}
DOH *
List_next(DOH *lo)
{
List *l;
l = (List *) lo;
l->iter++;
if (l->iter >= l->nitems) return 0;
return l->items[l->iter];
}
/* -----------------------------------------------------------------------------
* String *List_str() - Create a string representation
* ----------------------------------------------------------------------------- */
DOH *
List_str(DOH *lo)
{
DOH *s;
int i;
List *l = (List *) lo;
s = NewString("");
if (l->flags & DOH_FLAG_PRINT) {
Printf(s,"List(0x%x)",l);
return s;
}
l->flags = l->flags | DOH_FLAG_PRINT;
Printf(s,"List[ ");
for (i = 0; i < l->nitems; i++) {
Printf(s, "%s", l->items[i]);
if ((i+1) < l->nitems)
Printf(s,", ");
}
Printf(s," ]\n");
l->flags = l->flags & ~DOH_FLAG_PRINT;
return s;
}
int
List_dump(DOH *lo, DOH *out) {
int nsent = 0;
int i,ret;
List *l = (List *) lo;
for (i = 0; i < l->nitems; i++) {
ret = Dump(l->items[i],out);
if (ret < 0) return -1;
nsent += ret;
}
return nsent;
}
/* -----------------------------------------------------------------------------
* void List_sort(DOH *DOH)
*
* Sorts a list
* ----------------------------------------------------------------------------- */
int objcmp(const void *s1, const void *s2) {
DOH **so1, **so2;
so1 = (DOH **) s1;
so2 = (DOH **) s2;
return Cmp(*so1,*so2);
}
void List_sort(DOH *so) {
List *l;
if (!List_check(so)) return;
l = (List *) so;
qsort(l->items,l->nitems,sizeof(DOH *), objcmp);
}