diff --git a/Source/DOH/Doh/hash.c b/Source/DOH/Doh/hash.c index 8fece1b99..3a8cdca62 100644 --- a/Source/DOH/Doh/hash.c +++ b/Source/DOH/Doh/hash.c @@ -251,8 +251,8 @@ Hash_getattr(DOH *ho, DOH *k) { hv = Hashval(k) % h->hashsize; n = h->hashtable[hv]; while (n) { - if (Cmp(n->key, k) == 0) return n->object; - n = n->next; + if (Cmp(n->key, k) == 0) return n->object; + n = n->next; } return 0; } diff --git a/Source/DOH/Doh/list.c b/Source/DOH/Doh/list.c index 46470729a..876fd9120 100644 --- a/Source/DOH/Doh/list.c +++ b/Source/DOH/Doh/list.c @@ -281,6 +281,33 @@ List_sort(DOH *lo, int opt) { } +void List_setfile(DOH *lo, DOH *file) { + DOH *fo; + List *l = (List *) ObjData(lo); + + if (!DohCheck(file)) { + fo = NewString(file); + Decref(fo); + } else fo = file; + Incref(fo); + Delete(l->file); + l->file = fo; +} + +DOH *List_getfile(DOH *lo) { + List *l = (List *) ObjData(lo); + return l->file; +} + +void List_setline(DOH *lo, int line) { + List *l = (List *) ObjData(lo); + l->line = line; +} + +int List_getline(DOH *lo) { + List *l = (List *) ObjData(lo); + return l->line; +} static DohListMethods ListListMethods = { List_get, @@ -303,10 +330,10 @@ static DohObjInfo ListType = { List_len, /* doh_len */ 0, /* doh_hash */ 0, /* doh_cmp */ - 0, /* doh_setfile */ - 0, /* doh_getfile */ - 0, /* doh_setline */ - 0, /* doh_getline */ + List_setfile, /* doh_setfile */ + List_getfile, /* doh_getfile */ + List_setline, /* doh_setline */ + List_getline, /* doh_getline */ 0, /* doh_mapping */ &ListListMethods, /* doh_sequence */ 0, /* doh_file */ diff --git a/Source/DOH/Doh/memory.c b/Source/DOH/Doh/memory.c index 16b1d0d11..2446bca1a 100644 --- a/Source/DOH/Doh/memory.c +++ b/Source/DOH/Doh/memory.c @@ -25,6 +25,7 @@ DOH *DohNone = 0; /* The DOH None object */ typedef struct pool { DohBase *ptr; /* Start of pool */ int len; /* Length of pool */ + int blen; /* Byte length of pool */ int current; /* Current position for next allocation */ struct pool *next; /* Next pool */ } Pool; @@ -44,6 +45,7 @@ CreatePool() { assert((p = (Pool *) DohMalloc(sizeof(Pool)))); assert((p->ptr = (DohBase *) DohMalloc(sizeof(DohBase)*PoolSize))); p->len = PoolSize; + p->blen = PoolSize*sizeof(DohBase); p->current = 0; p->next = Pools; Pools = p; @@ -72,9 +74,15 @@ InitPools() { int DohCheck(const DOH *ptr) { Pool *p = Pools; - char *cptr = (char *) ptr; + register char *cptr = (char *) ptr; + register char *pptr; + int d; while (p) { - if ((cptr >= (char *) p->ptr) && (cptr < ((char *) p->ptr)+(p->current*sizeof(DohBase)))) return 1; + pptr = (char *) p->ptr; + if ((cptr >= pptr) && (cptr < (pptr + p->blen))) return 1; + /* + pptr = (char *) p->ptr; + if ((cptr >= pptr) && (cptr < (pptr+(p->current*sizeof(DohBase))))) return 1; */ p = p->next; } return 0; diff --git a/Source/DOH/Doh/string.c b/Source/DOH/Doh/string.c index e03f72a91..c08647a94 100644 --- a/Source/DOH/Doh/string.c +++ b/Source/DOH/Doh/string.c @@ -177,16 +177,20 @@ add(String *s, const char *newstr) { /* Add a single character to s */ void String_addchar(String *s, char c) { + register char *tc; + register int len = s->len; + register int maxsize = s->maxsize; s->hashkey = -1; - if ((s->len+1) > (s->maxsize-1)) { - s->str = (char *) DohRealloc(s->str,2*s->maxsize); + if (len > (maxsize-2)) { + s->str = (char *) DohRealloc(s->str,2*maxsize); assert(s->str); - s->maxsize *= 2; + s->maxsize = 2*maxsize; } - s->str[s->len] = c; - if (s->sp >= s->len) { - s->sp = s->len+1; - s->str[s->len+1] = 0; + tc = s->str; + tc[len] = c; + if (s->sp >= len) { + s->sp = len+1; + tc[len+1] = 0; if (c == '\n') s->line++; } s->len++; @@ -360,11 +364,17 @@ String_seek(DOH *so, long offset, int whence) { inc = (nsp > s->sp) ? 1 : -1; - while (s->sp != nsp) { - prev = s->sp + inc; - if (prev>=0 && prev<=s->len && s->str[prev] == '\n') - s->line += inc; - s->sp += inc; + { + register int sp = s->sp; + register char *tc = s->str; + register int len = s->len; + while (sp != nsp) { + prev = sp + inc; + if (prev>=0 && prev<=len && tc[prev] == '\n') + s->line += inc; + sp+=inc; + } + s->sp = sp; } assert (s->sp >= 0); return 0; @@ -386,13 +396,12 @@ String_tell(DOH *so) { int String_putc(DOH *so, int ch) { String *s = (String *) ObjData(so); - s->hashkey = -1; if (s->sp >= s->len) { String_addchar(s,(char) ch); } else { - s->str[s->sp] = (char) ch; - s->sp++; - if (ch == '\n') s->line++; + s->hashkey = -1; + s->str[s->sp++] = (char) ch; + if (ch == '\n') s->line++; } return ch; }