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:
parent
f5c5b13bfa
commit
059cd4513e
1 changed files with 285 additions and 303 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue