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:
Dave Beazley 2000-06-16 12:44:44 +00:00
commit 33d2e194e5

View file

@ -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++;
} }