Some performance improvements.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@479 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
53898d9918
commit
33d2e194e5
1 changed files with 32 additions and 10 deletions
|
|
@ -152,11 +152,13 @@ int String_hash(DOH *so) {
|
||||||
|
|
||||||
static void
|
static void
|
||||||
add(String *s, const char *newstr) {
|
add(String *s, const char *newstr) {
|
||||||
int newlen, newmaxsize, l, i;
|
int oldlen, newlen, newmaxsize, l, i, sp;
|
||||||
|
char *tc;
|
||||||
if (!newstr) return;
|
if (!newstr) return;
|
||||||
s->hashkey = -1;
|
s->hashkey = -1;
|
||||||
l = (int) strlen(newstr);
|
l = (int) strlen(newstr);
|
||||||
newlen = s->len+l + 1;
|
oldlen = s->len;
|
||||||
|
newlen = oldlen+l + 1;
|
||||||
if (newlen >= s->maxsize-1) {
|
if (newlen >= s->maxsize-1) {
|
||||||
newmaxsize = 2*s->maxsize;
|
newmaxsize = 2*s->maxsize;
|
||||||
if (newlen >= newmaxsize -1) newmaxsize = newlen + 1;
|
if (newlen >= newmaxsize -1) newmaxsize = newlen + 1;
|
||||||
|
|
@ -164,12 +166,15 @@ add(String *s, const char *newstr) {
|
||||||
assert(s->str);
|
assert(s->str);
|
||||||
s->maxsize = newmaxsize;
|
s->maxsize = newmaxsize;
|
||||||
}
|
}
|
||||||
strcpy(s->str+s->len,newstr);
|
tc = s->str;
|
||||||
if (s->sp >= s->len) {
|
strcpy(tc+oldlen,newstr);
|
||||||
for (i = s->sp; i < s->len+l; i++) {
|
sp = s->sp;
|
||||||
if (s->str[i] == '\n') s->line++;
|
if (sp >= oldlen) {
|
||||||
|
tc += sp;
|
||||||
|
for (i = sp; i < oldlen+l; i++,tc++) {
|
||||||
|
if (*tc == '\n') s->line++;
|
||||||
}
|
}
|
||||||
s->sp = s->len+l;
|
s->sp = oldlen+l;
|
||||||
}
|
}
|
||||||
s->len += l;
|
s->len += l;
|
||||||
}
|
}
|
||||||
|
|
@ -395,11 +400,28 @@ String_tell(DOH *so) {
|
||||||
|
|
||||||
int
|
int
|
||||||
String_putc(DOH *so, int ch) {
|
String_putc(DOH *so, int ch) {
|
||||||
|
register int len, maxsize, sp;
|
||||||
String *s = (String *) ObjData(so);
|
String *s = (String *) ObjData(so);
|
||||||
if (s->sp >= s->len) {
|
s->hashkey = -1;
|
||||||
String_addchar(s,(char) ch);
|
len = s->len;
|
||||||
|
sp = s->sp;
|
||||||
|
if (sp >= len) {
|
||||||
|
register char *tc;
|
||||||
|
maxsize = s->maxsize;
|
||||||
|
if (len > (maxsize-2)) {
|
||||||
|
s->str = (char *) DohRealloc(s->str,2*maxsize);
|
||||||
|
assert(s->str);
|
||||||
|
s->maxsize = 2*maxsize;
|
||||||
|
}
|
||||||
|
tc = s->str + len;
|
||||||
|
*(tc++) = ch;
|
||||||
|
if (sp >= len) {
|
||||||
|
s->sp = len+1;
|
||||||
|
*tc = 0;
|
||||||
|
if (ch == '\n') s->line++;
|
||||||
|
}
|
||||||
|
s->len = len+1;
|
||||||
} else {
|
} else {
|
||||||
s->hashkey = -1;
|
|
||||||
s->str[s->sp++] = (char) ch;
|
s->str[s->sp++] = (char) ch;
|
||||||
if (ch == '\n') s->line++;
|
if (ch == '\n') s->line++;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue