add the Equal method to the DOH objects and other speed ups
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7883 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
9a7397ce42
commit
bc6339d844
8 changed files with 140 additions and 29 deletions
|
|
@ -210,6 +210,43 @@ DohCmp(const DOH *obj1, const DOH *obj2) {
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* DohEqual()
|
||||
* ----------------------------------------------------------------------------- */
|
||||
|
||||
int
|
||||
DohEqual(const DOH *obj1, const DOH *obj2) {
|
||||
DohBase *b1 = (DohBase *) obj1;
|
||||
DohBase *b2 = (DohBase *) obj2;
|
||||
if (!b1) {
|
||||
return !b2;
|
||||
} else if (!b2) {
|
||||
return 0;
|
||||
} else {
|
||||
DohObjInfo *b1info = 0;
|
||||
DohObjInfo *b2info = 0;
|
||||
if (DohCheck(b1)) {
|
||||
b1info = b1->type;
|
||||
if (DohCheck(b2)) {
|
||||
b2info = b2->type;
|
||||
} else {
|
||||
return strncmp((b1info->doh_data)(b1), (void*) obj2, (b1info->doh_len)(b1)) == 0;
|
||||
}
|
||||
} else if (DohCheck(b2)) {
|
||||
b2info = b2->type;
|
||||
return strncmp((b2info->doh_data)(b2), (void*) obj1, (b2info->doh_len)(b2)) == 0;
|
||||
}
|
||||
if (!b1info) {
|
||||
return obj1 == obj2;
|
||||
} else if ((b1info == b2info)) {
|
||||
return b1info->doh_equal ? (b1info->doh_equal)(b1,b2) :
|
||||
(b1info->doh_cmp ? (b1info->doh_cmp)(b1,b2) == 0 : (b1 == b2));
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* DohFirst()
|
||||
* ----------------------------------------------------------------------------- */
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@
|
|||
#define DohLen DOH_NAMESPACE(Len)
|
||||
#define DohHashval DOH_NAMESPACE(Hashval)
|
||||
#define DohCmp DOH_NAMESPACE(Cmp)
|
||||
#define DohEqual DOH_NAMESPACE(Equal)
|
||||
#define DohIncref DOH_NAMESPACE(Incref)
|
||||
#define DohGetattr DOH_NAMESPACE(Getattr)
|
||||
#define DohSetattr DOH_NAMESPACE(Setattr)
|
||||
|
|
@ -66,10 +67,11 @@
|
|||
#define DohPutc DOH_NAMESPACE(Putc)
|
||||
#define DohUngetc DOH_NAMESPACE(Ungetc)
|
||||
|
||||
#define DohStringGetc DOH_NAMESPACE(StringGetc)
|
||||
#define DohStringPutc DOH_NAMESPACE(StringPutc)
|
||||
#define DohStringUngetc DOH_NAMESPACE(StringUngetc)
|
||||
#define DohStringAppend DOH_NAMESPACE(StringAppend)
|
||||
#define DohStringPutc DOH_NAMESPACE(StringPutc)
|
||||
#define DohStringGetc DOH_NAMESPACE(StringGetc)
|
||||
#define DohStringUngetc DOH_NAMESPACE(StringUngetc)
|
||||
#define DohStringAppend DOH_NAMESPACE(StringAppend)
|
||||
#define DohStringEqual DOH_NAMESPACE(StringEqual)
|
||||
|
||||
|
||||
|
||||
|
|
@ -187,6 +189,7 @@ extern int DohDump(const DOH *obj, DOHFile *out);
|
|||
extern int DohLen(const DOH *obj);
|
||||
extern int DohHashval(const DOH *obj);
|
||||
extern int DohCmp(const DOH *obj1, const DOH *obj2);
|
||||
extern int DohEqual(const DOH *obj1, const DOH *obj2);
|
||||
extern void DohIncref(DOH *obj);
|
||||
|
||||
/* Mapping methods */
|
||||
|
|
@ -248,11 +251,13 @@ extern int DohString_putc(DOH *so, int ch);
|
|||
extern int DohString_getc(DOH *so);
|
||||
extern int DohString_ungetc(DOH *so, int ch);
|
||||
extern void DohString_append(DOH *so, DOH *str);
|
||||
extern int DohString_equal(DOH *s1, DOH *s2);
|
||||
|
||||
#define DohStringPutc(ch,so) DohString_putc(so, ch)
|
||||
#define DohStringGetc(so) DohString_getc(so)
|
||||
#define DohStringUngetc(ch,so) DohString_ungetc(so, ch)
|
||||
#define DohStringAppend(so,str) DohString_append(so, str)
|
||||
#define DohStringEqual(s1,s2) DohString_equal(s1,s2)
|
||||
|
||||
/* Meta-variables */
|
||||
extern DOH *DohGetmeta(DOH *, const DOH *);
|
||||
|
|
@ -362,6 +367,7 @@ extern void DohMemoryDebug(void);
|
|||
#define Data DohData
|
||||
#define Char (char *) Data
|
||||
#define Cmp DohCmp
|
||||
#define Equal DohEqual
|
||||
#define Setline DohSetline
|
||||
#define Getline DohGetline
|
||||
#define Setfile DohSetfile
|
||||
|
|
@ -376,10 +382,11 @@ extern void DohMemoryDebug(void);
|
|||
#define Putc DohPutc
|
||||
#define Ungetc DohUngetc
|
||||
|
||||
#define StringGetc DohStringGetc
|
||||
#define StringPutc DohStringPutc
|
||||
#define StringGetc DohStringGetc
|
||||
#define StringUngetc DohStringUngetc
|
||||
#define StringAppend DohStringAppend
|
||||
#define StringEqual DohStringEqual
|
||||
|
||||
#define Close DohClose
|
||||
#define vPrintf DohvPrintf
|
||||
|
|
|
|||
|
|
@ -83,6 +83,9 @@ typedef struct DohObjInfo {
|
|||
/* Compare */
|
||||
int (*doh_cmp)(DOH *obj1, DOH *obj2);
|
||||
|
||||
/* Equal */
|
||||
int (*doh_equal)(DOH *obj1, DOH *obj2);
|
||||
|
||||
/* Iterators */
|
||||
DohIterator (*doh_first)(DOH *obj);
|
||||
DohIterator (*doh_next)(DohIterator );
|
||||
|
|
|
|||
|
|
@ -215,6 +215,7 @@ static DohObjInfo DohFileType = {
|
|||
0, /* doh_len */
|
||||
0, /* doh_hash */
|
||||
0, /* doh_cmp */
|
||||
0, /* doh_equal */
|
||||
0, /* doh_first */
|
||||
0, /* doh_next */
|
||||
0, /* doh_setfile */
|
||||
|
|
|
|||
|
|
@ -260,7 +260,7 @@ Hash_getattr(DOH *ho, DOH *k) {
|
|||
k_type = ((DohBase*)k)->type;
|
||||
while (n) {
|
||||
nk = (DohBase *)n->key;
|
||||
if ((k_type == nk->type) && ((k_type->doh_cmp)(k, nk) == 0)) return n->object;
|
||||
if ((k_type == nk->type) && ((k_type->doh_equal)(k, nk))) return n->object;
|
||||
n = n->next;
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -510,6 +510,7 @@ DohObjInfo DohHashType = {
|
|||
Hash_len, /* doh_len */
|
||||
0, /* doh_hash */
|
||||
0, /* doh_cmp */
|
||||
0, /* doh_equal */
|
||||
Hash_firstiter, /* doh_first */
|
||||
Hash_nextiter, /* doh_next */
|
||||
Hash_setfile, /* doh_setfile */
|
||||
|
|
|
|||
|
|
@ -324,6 +324,7 @@ DohObjInfo DohListType = {
|
|||
List_len, /* doh_len */
|
||||
0, /* doh_hash */
|
||||
0, /* doh_cmp */
|
||||
0, /* doh_equal */
|
||||
List_first, /* doh_first */
|
||||
List_next, /* doh_next */
|
||||
List_setfile, /* doh_setfile */
|
||||
|
|
|
|||
|
|
@ -132,6 +132,36 @@ String_cmp(DOH *so1, DOH *so2)
|
|||
return -1;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* int String_equal() - Say if two string are equal
|
||||
* ----------------------------------------------------------------------------- */
|
||||
|
||||
int
|
||||
DohString_equal(DOH *so1, DOH *so2)
|
||||
{
|
||||
String *s1 = (String *) ObjData(so1);
|
||||
String *s2 = (String *) ObjData(so2);
|
||||
register int len = s1->len;
|
||||
if (len != s2->len) {
|
||||
return 0;
|
||||
} else {
|
||||
register char *c1 = s1->str;
|
||||
register char *c2 = s2->str;
|
||||
register int mlen = len >> 2;
|
||||
register int i = mlen;
|
||||
for (; i; --i) {
|
||||
if (*(c1++) != *(c2++)) return 0;
|
||||
if (*(c1++) != *(c2++)) return 0;
|
||||
if (*(c1++) != *(c2++)) return 0;
|
||||
if (*(c1++) != *(c2++)) return 0;
|
||||
}
|
||||
for (i = len - (mlen << 2); i; --i) {
|
||||
if (*(c1++) != *(c2++)) return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* int String_hash() - Compute string hash value
|
||||
* ----------------------------------------------------------------------------- */
|
||||
|
|
@ -139,18 +169,27 @@ String_cmp(DOH *so1, DOH *so2)
|
|||
static int
|
||||
String_hash(DOH *so) {
|
||||
String *s = (String *) ObjData(so);
|
||||
char *c;
|
||||
int i, h = 0, len;
|
||||
|
||||
if (s->hashkey >= 0) return s->hashkey;
|
||||
c = s->str;
|
||||
len = s->len > 50 ? 50 : s->len;
|
||||
for (i = 0; i < len; i++) {
|
||||
h = (((h << 5) + *(c++)));
|
||||
if (s->hashkey >= 0) {
|
||||
return s->hashkey;
|
||||
} else {
|
||||
register char *c = s->str;
|
||||
register int len = s->len > 50 ? 50 : s->len;
|
||||
register int h = 0;
|
||||
register int mlen = len >> 2;
|
||||
register int i = mlen;
|
||||
for (; i; --i) {
|
||||
h = (h << 5) + *(c++);
|
||||
h = (h << 5) + *(c++);
|
||||
h = (h << 5) + *(c++);
|
||||
h = (h << 5) + *(c++);
|
||||
}
|
||||
for (i = len - (mlen << 2); i; --i) {
|
||||
h = (h << 5) + *(c++);
|
||||
}
|
||||
h &= 0x7fffffff;
|
||||
s->hashkey = h;
|
||||
return h;
|
||||
}
|
||||
h = h & 0x7fffffff;
|
||||
s->hashkey = h;
|
||||
return h;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
|
|
@ -159,14 +198,22 @@ String_hash(DOH *so) {
|
|||
|
||||
void
|
||||
DohString_append(DOH *so, DOH *str) {
|
||||
int oldlen, newlen, newmaxsize, l, i, sp;
|
||||
int oldlen, newlen, newmaxsize, l, sp;
|
||||
char *tc;
|
||||
String *s = (String *) ObjData(so);
|
||||
char *newstr = (char *) DohData(str);
|
||||
char *newstr = 0;
|
||||
|
||||
if (DohCheck(str)) {
|
||||
String *ss = (String *) ObjData(str);
|
||||
newstr = String_data(str);
|
||||
l = ss->len;
|
||||
} else {
|
||||
newstr = (char *) (str);
|
||||
l = (int) strlen(newstr);
|
||||
}
|
||||
if (!newstr) return;
|
||||
s->hashkey = -1;
|
||||
l = (int) strlen(newstr);
|
||||
|
||||
oldlen = s->len;
|
||||
newlen = oldlen+l + 1;
|
||||
if (newlen >= s->maxsize-1) {
|
||||
|
|
@ -177,12 +224,13 @@ DohString_append(DOH *so, DOH *str) {
|
|||
s->maxsize = newmaxsize;
|
||||
}
|
||||
tc = s->str;
|
||||
strcpy(tc+oldlen,newstr);
|
||||
memcpy(tc+oldlen,newstr,l+1);
|
||||
sp = s->sp;
|
||||
if (sp >= oldlen) {
|
||||
int i = oldlen + l - sp;
|
||||
tc += sp;
|
||||
for (i = sp; i < oldlen+l; i++,tc++) {
|
||||
if (*tc == '\n') s->line++;
|
||||
for (; i ; --i) {
|
||||
if (*(tc++) == '\n') s->line++;
|
||||
}
|
||||
s->sp = oldlen+l;
|
||||
}
|
||||
|
|
@ -910,6 +958,7 @@ DohObjInfo DohStringType = {
|
|||
String_len, /* doh_len */
|
||||
String_hash, /* doh_hash */
|
||||
String_cmp, /* doh_cmp */
|
||||
DohString_equal, /* doh_equal */
|
||||
0, /* doh_first */
|
||||
0, /* doh_next */
|
||||
String_setfile, /* doh_setfile */
|
||||
|
|
@ -921,7 +970,7 @@ DohObjInfo DohStringType = {
|
|||
&StringFileMethods, /* doh_file */
|
||||
&StringStringMethods, /* doh_string */
|
||||
0, /* doh_position */
|
||||
0,
|
||||
0
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -937,8 +986,15 @@ DohNewString(const DOH *so)
|
|||
int l = 0, max;
|
||||
String *str;
|
||||
char *s;
|
||||
if (DohCheck(so)) s = Char(so);
|
||||
else s = (char *) so;
|
||||
if (DohCheck(so)) {
|
||||
str = (String *) ObjData(so);
|
||||
s = String_data(so);
|
||||
l = s ? str->len : 0;
|
||||
} else {
|
||||
s = (char *) so;
|
||||
l = s ? (int) strlen(s) : 0;
|
||||
}
|
||||
|
||||
str = (String *) DohMalloc(sizeof(String));
|
||||
str->hashkey = -1;
|
||||
str->sp = 0;
|
||||
|
|
@ -946,7 +1002,6 @@ DohNewString(const DOH *so)
|
|||
str->file = 0;
|
||||
max = INIT_MAXSIZE;
|
||||
if (s) {
|
||||
l = (int) strlen(s);
|
||||
if ((l+1) > max) max = l+1;
|
||||
}
|
||||
str->str = (char *) DohMalloc(max);
|
||||
|
|
@ -973,8 +1028,13 @@ DohNewStringWithSize(const DOH *so, int len)
|
|||
int l = 0, max;
|
||||
String *str;
|
||||
char *s;
|
||||
if (DohCheck(so)) s = Char(so);
|
||||
else s = (char *) so;
|
||||
if (DohCheck(so)) {
|
||||
s = String_data(so);
|
||||
}
|
||||
else {
|
||||
s = (char *) so;
|
||||
}
|
||||
|
||||
str = (String *) DohMalloc(sizeof(String));
|
||||
str->hashkey = -1;
|
||||
str->sp = 0;
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ static DohObjInfo DohVoidType = {
|
|||
0, /* doh_len */
|
||||
0, /* doh_hash */
|
||||
0, /* doh_cmp */
|
||||
0, /* doh_equal */
|
||||
0, /* doh_first */
|
||||
0, /* doh_next */
|
||||
0, /* doh_setfile */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue