diff --git a/Source/DOH/doh.h b/Source/DOH/doh.h index 8a8c918f1..513c98b4e 100644 --- a/Source/DOH/doh.h +++ b/Source/DOH/doh.h @@ -263,6 +263,7 @@ extern void DohString_append(DOH *so, DOH *str); extern int DohString_len(DOH *s1); extern char *DohString_char(DOH *s1); extern int DohString_equal(DOH *s1, DOH *s2); +extern int DohString_delslice(DOH *so, int sindex, int eindex); #define DohStringPutc(ch,so) DohString_putc(so, ch) #define DohStringGetc(so) DohString_getc(so) diff --git a/Source/DOH/string.c b/Source/DOH/string.c index a2d65665c..c75aec750 100644 --- a/Source/DOH/string.c +++ b/Source/DOH/string.c @@ -347,23 +347,28 @@ static int String_delslice(DOH *so, int sindex, int eindex) { String *s = (String *) ObjData(so); int size; + if (s->len == 0) return 0; s->hashkey = -1; if (eindex == DOH_END) eindex = s->len; if (sindex == DOH_BEGIN) sindex = 0; - if (s->len == 0) return 0; - + size = eindex - sindex; - if (s->sp > eindex) { + if (s->sp > sindex) { /* Adjust the file pointer and line count */ - char *c = s->str + sindex; - int i; - for (i = 0; i < size; i++) { - if (*c == '\n') s->line--; + int i, end; + if (s->sp > eindex) { + end = eindex; + s->sp -= size; + } else { + end = s->sp; + s->sp = sindex; + } + for (i = sindex; i < end; i++) { + if (s->str[i] == '\n') s->line--; } - s->sp -= size; assert(s->sp >= 0); } - memmove(s->str+sindex,s->str+eindex, ((s->len-size) - sindex)); + memmove(s->str+sindex, s->str+eindex, s->len-eindex); s->len -= size; s->str[s->len] = 0; return 0;