Variety of improvements
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@478 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
d8dc41c0e7
commit
b7d148f636
4 changed files with 68 additions and 24 deletions
|
|
@ -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 = {
|
static DohListMethods ListListMethods = {
|
||||||
List_get,
|
List_get,
|
||||||
|
|
@ -303,10 +330,10 @@ static DohObjInfo ListType = {
|
||||||
List_len, /* doh_len */
|
List_len, /* doh_len */
|
||||||
0, /* doh_hash */
|
0, /* doh_hash */
|
||||||
0, /* doh_cmp */
|
0, /* doh_cmp */
|
||||||
0, /* doh_setfile */
|
List_setfile, /* doh_setfile */
|
||||||
0, /* doh_getfile */
|
List_getfile, /* doh_getfile */
|
||||||
0, /* doh_setline */
|
List_setline, /* doh_setline */
|
||||||
0, /* doh_getline */
|
List_getline, /* doh_getline */
|
||||||
0, /* doh_mapping */
|
0, /* doh_mapping */
|
||||||
&ListListMethods, /* doh_sequence */
|
&ListListMethods, /* doh_sequence */
|
||||||
0, /* doh_file */
|
0, /* doh_file */
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ DOH *DohNone = 0; /* The DOH None object */
|
||||||
typedef struct pool {
|
typedef struct pool {
|
||||||
DohBase *ptr; /* Start of pool */
|
DohBase *ptr; /* Start of pool */
|
||||||
int len; /* Length of pool */
|
int len; /* Length of pool */
|
||||||
|
int blen; /* Byte length of pool */
|
||||||
int current; /* Current position for next allocation */
|
int current; /* Current position for next allocation */
|
||||||
struct pool *next; /* Next pool */
|
struct pool *next; /* Next pool */
|
||||||
} Pool;
|
} Pool;
|
||||||
|
|
@ -44,6 +45,7 @@ CreatePool() {
|
||||||
assert((p = (Pool *) DohMalloc(sizeof(Pool))));
|
assert((p = (Pool *) DohMalloc(sizeof(Pool))));
|
||||||
assert((p->ptr = (DohBase *) DohMalloc(sizeof(DohBase)*PoolSize)));
|
assert((p->ptr = (DohBase *) DohMalloc(sizeof(DohBase)*PoolSize)));
|
||||||
p->len = PoolSize;
|
p->len = PoolSize;
|
||||||
|
p->blen = PoolSize*sizeof(DohBase);
|
||||||
p->current = 0;
|
p->current = 0;
|
||||||
p->next = Pools;
|
p->next = Pools;
|
||||||
Pools = p;
|
Pools = p;
|
||||||
|
|
@ -72,9 +74,15 @@ InitPools() {
|
||||||
int
|
int
|
||||||
DohCheck(const DOH *ptr) {
|
DohCheck(const DOH *ptr) {
|
||||||
Pool *p = Pools;
|
Pool *p = Pools;
|
||||||
char *cptr = (char *) ptr;
|
register char *cptr = (char *) ptr;
|
||||||
|
register char *pptr;
|
||||||
|
int d;
|
||||||
while (p) {
|
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;
|
p = p->next;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -177,16 +177,20 @@ add(String *s, const char *newstr) {
|
||||||
/* Add a single character to s */
|
/* Add a single character to s */
|
||||||
void
|
void
|
||||||
String_addchar(String *s, char c) {
|
String_addchar(String *s, char c) {
|
||||||
|
register char *tc;
|
||||||
|
register int len = s->len;
|
||||||
|
register int maxsize = s->maxsize;
|
||||||
s->hashkey = -1;
|
s->hashkey = -1;
|
||||||
if ((s->len+1) > (s->maxsize-1)) {
|
if (len > (maxsize-2)) {
|
||||||
s->str = (char *) DohRealloc(s->str,2*s->maxsize);
|
s->str = (char *) DohRealloc(s->str,2*maxsize);
|
||||||
assert(s->str);
|
assert(s->str);
|
||||||
s->maxsize *= 2;
|
s->maxsize = 2*maxsize;
|
||||||
}
|
}
|
||||||
s->str[s->len] = c;
|
tc = s->str;
|
||||||
if (s->sp >= s->len) {
|
tc[len] = c;
|
||||||
s->sp = s->len+1;
|
if (s->sp >= len) {
|
||||||
s->str[s->len+1] = 0;
|
s->sp = len+1;
|
||||||
|
tc[len+1] = 0;
|
||||||
if (c == '\n') s->line++;
|
if (c == '\n') s->line++;
|
||||||
}
|
}
|
||||||
s->len++;
|
s->len++;
|
||||||
|
|
@ -360,11 +364,17 @@ String_seek(DOH *so, long offset, int whence) {
|
||||||
|
|
||||||
inc = (nsp > s->sp) ? 1 : -1;
|
inc = (nsp > s->sp) ? 1 : -1;
|
||||||
|
|
||||||
while (s->sp != nsp) {
|
{
|
||||||
prev = s->sp + inc;
|
register int sp = s->sp;
|
||||||
if (prev>=0 && prev<=s->len && s->str[prev] == '\n')
|
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;
|
s->line += inc;
|
||||||
s->sp += inc;
|
sp+=inc;
|
||||||
|
}
|
||||||
|
s->sp = sp;
|
||||||
}
|
}
|
||||||
assert (s->sp >= 0);
|
assert (s->sp >= 0);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -386,12 +396,11 @@ String_tell(DOH *so) {
|
||||||
int
|
int
|
||||||
String_putc(DOH *so, int ch) {
|
String_putc(DOH *so, int ch) {
|
||||||
String *s = (String *) ObjData(so);
|
String *s = (String *) ObjData(so);
|
||||||
s->hashkey = -1;
|
|
||||||
if (s->sp >= s->len) {
|
if (s->sp >= s->len) {
|
||||||
String_addchar(s,(char) ch);
|
String_addchar(s,(char) ch);
|
||||||
} else {
|
} else {
|
||||||
s->str[s->sp] = (char) ch;
|
s->hashkey = -1;
|
||||||
s->sp++;
|
s->str[s->sp++] = (char) ch;
|
||||||
if (ch == '\n') s->line++;
|
if (ch == '\n') s->line++;
|
||||||
}
|
}
|
||||||
return ch;
|
return ch;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue