CHANGES.current

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6269 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Marcelo Matus 2004-09-26 01:14:49 +00:00
commit 15a5e3976f
15 changed files with 113 additions and 35 deletions

View file

@ -142,7 +142,9 @@ int
DohHashval(const DOH *obj) {
DohBase *b = (DohBase *) obj;
DohObjInfo *objinfo;
if (DohCheck(b)) {
/* obj is already checked and/or converted into DohBase* */
/* if (DohCheck(b)) */
{
objinfo = b->type;
if (objinfo->doh_hashval) {
return (objinfo->doh_hashval)(b);
@ -173,17 +175,33 @@ DohData(const DOH *obj) {
* DohCmp()
* ----------------------------------------------------------------------------- */
#define RawData(b) ((b->type->doh_data) ? (b->type->doh_data)(b) : 0)
/*
static void *
RawData(DohBase *b) {
DohObjInfo *objinfo = b->type;
return (objinfo->doh_data) ? (objinfo->doh_data)(b) : 0;
}
*/
int
DohCmp(const DOH *obj1, const DOH *obj2) {
DohBase *b1, *b2;
DohObjInfo *b1info, *b2info;
int c1, c2;
b1 = (DohBase *) obj1;
b2 = (DohBase *) obj2;
if ((!DohCheck(b1)) || (!DohCheck(b2))) {
c1 = DohCheck(b1);
c2 = DohCheck(b2);
/* most of the times, obj2 is a plain c string */
if (!c1 || !c2) {
if ((b1 == 0) && (b2 == 0)) return 0;
if (b1 && !b2) return 1;
if (!b1 && b2) return -1;
return strcmp((char *) DohData(b1),(char *) DohData(b2));
return strcmp((char *) (c1 ? RawData(b1) : (void*) obj1),
(char *) (c2 ? RawData(b2) : (void*) obj2));
}
b1info = b1->type;
b2info = b2->type;

View file

@ -249,13 +249,18 @@ static DOH *
Hash_getattr(DOH *ho, DOH *k) {
int hv;
HashNode *n;
DohObjInfo *k_type;
DohBase *nk;
Hash *h = (Hash *) ObjData(ho);
if (!DohCheck(k)) k = find_key(k);
hv = Hashval(k) % h->hashsize;
n = h->hashtable[hv];
k_type = ((DohBase*)k)->type;
while (n) {
if (Cmp(n->key, k) == 0) return n->object;
nk = n->key;
if ((k_type == nk->type) && ((k_type->doh_cmp)(k, nk) == 0)) return n->object;
n = n->next;
}
return 0;

View file

@ -27,6 +27,8 @@ typedef struct pool {
int len; /* Length of pool */
int blen; /* Byte length of pool */
int current; /* Current position for next allocation */
char* pbeg; /* Beg of pool */
char* pend; /* End of pool */
struct pool *next; /* Next pool */
} Pool;
@ -49,6 +51,8 @@ CreatePool() {
p->len = PoolSize;
p->blen = PoolSize*sizeof(DohBase);
p->current = 0;
p->pbeg = ((char *)p->ptr);
p->pend = p->pbeg + p->blen;
p->next = Pools;
Pools = p;
}
@ -74,12 +78,10 @@ InitPools() {
int
DohCheck(const DOH *ptr) {
Pool *p = Pools;
register Pool *p = Pools;
register char *cptr = (char *) ptr;
register char *pptr;
while (p) {
pptr = (char *) p->ptr;
if ((cptr >= pptr) && (cptr < (pptr + p->blen))) return 1;
if ((cptr >= p->pbeg) && (cptr < p->pend)) return 1;
/*
pptr = (char *) p->ptr;
if ((cptr >= pptr) && (cptr < (pptr+(p->current*sizeof(DohBase))))) return 1; */

View file

@ -111,25 +111,25 @@ String_len(DOH *so) {
static int
String_cmp(DOH *so1, DOH *so2)
{
String *s1, *s2;
char *c1, *c2;
int maxlen,i;
s1 = (String *) ObjData(so1);
s2 = (String *) ObjData(so2);
maxlen = s1->len;
if (s2->len < maxlen) maxlen = s2->len;
String * s1 = (String *) ObjData(so1);
String * s2 = (String *) ObjData(so2);
register char *c1;
register char *c2;
register int len = s1->len;
if (len != s2->len) return (len < s2->len ) ? -1 : 1;
c1 = s1->str;
c2 = s2->str;
for (i = 0; i < maxlen; i++,c1++,c2++) {
if (*c1 != *c2) break;
#if 1
/* this is better, but it could be not present in all the
systems ? */
return memcmp(c1, c2, len);
#else
/* faster loop with nonzero predicates */
for (; len ; --len,++c1,++c2) {
if (*c1 != *c2) return ((*c1 < *c2) ? -1 : 1);
}
if (i < maxlen) {
if (*c1 < *c2) return -1;
else return 1;
}
if (s1->len == s2->len) return 0;
if (s1->len > s2->len) return 1;
return -1;
return 0;
#endif
}
/* -----------------------------------------------------------------------------