Fixed a bunch more errors; Seek doesn't work

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@114 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dustin Mitchell 2000-01-19 05:43:21 +00:00
commit fa1ab5af61

View file

@ -73,18 +73,18 @@ static int Super_insert(DOH *s, int pos, DOH *DOH);
static int Super_delitem(DOH *s, int where); static int Super_delitem(DOH *s, int where);
static DOH *Super_str(DOH *s); static DOH *Super_str(DOH *s);
static int Super_read(DOH *s, void *buffer, int length); static int Super_read(DOH *s, void *buffer, int length);
static int Super_write(DOH *s, void *buffer, int length); static int Super_write(DOH *s, void *buffer, int length);
static int Super_seek(DOH *s, long offset, int whence); static int Super_seek(DOH *s, long offset, int whence);
static long Super_tell(DOH *s); static long Super_tell(DOH *s);
static int Super_putc(DOH *s, int ch); static int Super_putc(DOH *s, int ch);
static int Super_getc(DOH *s); static int Super_getc(DOH *s);
static int Super_ungetc(DOH *s, int ch); static int Super_ungetc(DOH *s, int ch);
static int Super_replace(DOH *str, DOH *token, DOH *rep, int flags); static int Super_replace(DOH *str, DOH *token, DOH *rep, int flags);
static void Super_setfile(DOH *s, DOH *f); static void Super_setfile(DOH *s, DOH *f);
static void Super_setline(DOH *s, int); static void Super_setline(DOH *s, int);
static DOH * Super_getfile(DOH *s); static DOH * Super_getfile(DOH *s);
static int Super_getline(DOH *s); static int Super_getline(DOH *s);
static void Super_chop(DOH *str); static void Super_chop(DOH *str);
/* internal functions */ /* internal functions */
@ -203,10 +203,6 @@ NewSuper(char *s, DOH *filename, int firstline)
else else
str->str[0] = 0; str->str[0] = 0;
str->line = firstline;
str->file = filename; /* don't incref: it's 'owned' by the
tag it comes from. */
str->maxtags = INIT_MAXTAGS; str->maxtags = INIT_MAXTAGS;
str->numtags = 1; str->numtags = 1;
str->curtag = 0; str->curtag = 0;
@ -214,14 +210,17 @@ NewSuper(char *s, DOH *filename, int firstline)
str->tags = (SSTag *) DohMalloc(max * sizeof(SSTag)); str->tags = (SSTag *) DohMalloc(max * sizeof(SSTag));
assert(str->tags); assert(str->tags);
str->tags[0].length = 0; str->tags[0].length = strlen(str->str);
str->tags[0].line = firstline; str->tags[0].line = firstline;
if (!String_check(filename) && !SuperString_check(filename)) if (!DohCheck(filename) || (!String_check(filename) && !SuperString_check(filename)))
filename = NewString(filename); filename = NewString(filename);
else else
Incref(filename); Incref(filename);
str->tags[0].filename = filename; str->tags[0].filename = filename;
str->line = firstline;
str->file = filename; /* don't incref: it's 'owned' by the
tag it comes from. */
str->len = l; str->len = l;
return (DOH *) str; return (DOH *) str;
} }
@ -506,7 +505,7 @@ Super_str(DOH *so)
{ {
DOH *nstr; DOH *nstr;
Super *s = (Super *) so; Super *s = (Super *) so;
nstr = CopySuper(s); nstr = NewString(s->str);
return nstr; return nstr;
} }
@ -637,9 +636,9 @@ Super_putc(DOH *so, int ch)
if (s->sp >= s->len) if (s->sp >= s->len)
{ {
if (s->len + 1 >= s->maxsize) { if (s->len + 1 >= s->maxsize) {
s->str = (char *) DohRealloc(s->str ,2 * s->maxsize);
assert(s->str);
s->maxsize *= 2; s->maxsize *= 2;
s->str = (char *) DohRealloc(s->str, s->maxsize);
assert(s->str);
} }
s->str[s->len++] = ch; s->str[s->len++] = ch;
s->str[s->len] = 0; s->str[s->len] = 0;
@ -735,7 +734,7 @@ Super_setline(DOH *obj, int l)
static DOH * static DOH *
Super_getfile(DOH *obj) Super_getfile(DOH *obj)
{ {
assert(0); /* illegal operation */ return ((Super *)obj)->file;
} }
/* ------------------------------------------------------------------------- /* -------------------------------------------------------------------------
@ -745,7 +744,7 @@ Super_getfile(DOH *obj)
static int static int
Super_getline(DOH *obj) Super_getline(DOH *obj)
{ {
assert(0); /* illegal operation */ return ((Super *)obj)->line;
} }
/* ------------------------------------------------------------------------- /* -------------------------------------------------------------------------
@ -795,7 +794,7 @@ Super_move(Super *s, int delta)
{ {
int changed_tag = 0; int changed_tag = 0;
int curtag_offset = s->curtag_offset; int curtag_offset = s->curtag_offset;
int line_offset; int line = s->line;
if (delta > s->len - s->sp) if (delta > s->len - s->sp)
delta = s->len - s->sp; delta = s->len - s->sp;
@ -804,16 +803,17 @@ Super_move(Super *s, int delta)
{ {
int remaining = s->tags[s->curtag].length - curtag_offset; int remaining = s->tags[s->curtag].length - curtag_offset;
if (delta > remaining) if (delta >= remaining)
{ {
delta -= remaining; delta -= remaining;
s->sp += remaining; s->sp += remaining;
s->curtag++; s->curtag++;
line = s->tags[s->curtag].line;
curtag_offset = 0; curtag_offset = 0;
} }
else else
{ {
line_offset = Super_count_newlines(s->str + s->sp, delta); line += Super_count_newlines(s->str + s->sp, delta);
curtag_offset += delta; curtag_offset += delta;
s->sp += delta; s->sp += delta;
@ -823,7 +823,7 @@ Super_move(Super *s, int delta)
s->curtag_offset = curtag_offset; s->curtag_offset = curtag_offset;
s->file = s->tags[s->curtag].filename; s->file = s->tags[s->curtag].filename;
s->line = s->tags[s->curtag].line + line_offset; s->line = line;
} }
/* ------------------------------------------------------------------------- /* -------------------------------------------------------------------------
@ -836,11 +836,10 @@ Super_get_tag(Super *s, int pos, int *offset)
int tag = 0; int tag = 0;
SSTag *tags = s->tags; SSTag *tags = s->tags;
while (pos > tags->length) while (pos >= tags->length)
{ {
pos -= tags->length; pos -= tags->length;
tags++; tags++, tag++;
tag++;
} }
if (offset) *offset = pos; if (offset) *offset = pos;
@ -910,10 +909,9 @@ Super_add_space(Super *s, int more_bytes)
{ {
if (s->len + more_bytes >= s->maxsize) if (s->len + more_bytes >= s->maxsize)
{ {
int newsize = (s->len + more_bytes) * 2; s->maxsize = (s->len + more_bytes) * 2;
s->str = (char *)DohRealloc(s->str, newsize); s->str = (char *)DohRealloc(s->str, s->maxsize);
assert(s->str); assert(s->str);
s->maxsize = newsize;
} }
} }
@ -1034,7 +1032,7 @@ Super_super_insert(Super *s, int pos, Super *str)
Super_add_space(s, len); Super_add_space(s, len);
if (pos < s->len) if (pos < s->len)
memmove(s->str+pos+len, s->str+pos, (s->len - pos)); memmove(s->str+pos+len, s->str+pos, (s->len - pos));
memmove(s->str+pos,str,len); memmove(s->str+pos,str->str,len);
s->len += len; s->len += len;
s->str[s->len] = 0; s->str[s->len] = 0;
@ -1068,10 +1066,9 @@ Super_super_insert(Super *s, int pos, Super *str)
/* allocate enough space for all those tags */ /* allocate enough space for all those tags */
if (s->numtags + new_tags >= s->maxtags) if (s->numtags + new_tags >= s->maxtags)
{ {
int newsize = (s->numtags + new_tags) * 2; s->maxtags = (s->numtags + new_tags) * 2;
s->tags = (SSTag *)DohRealloc(s->tags, newsize * sizeof(SSTag)); s->tags = (SSTag *)DohRealloc(s->tags, s->maxtags * sizeof(SSTag));
assert(s->tags); assert(s->tags);
s->maxsize = newsize;
} }
/* and start writing in the data */ /* and start writing in the data */
@ -1341,11 +1338,49 @@ Super_raw_replace(Super *str, char *token, int flags,
#ifdef SUPER_TEST #ifdef SUPER_TEST
#include <stdio.h> #include <stdio.h>
static void annotate(DOH *hyd)
{
int len, i;
len = Len(hyd);
Seek(hyd, SEEK_SET, 0);
for (i = 0; i < len; i++)
{
DOH *file;
int line;
char c[3];
char d;
int pos;
file = Getfile(hyd);
line = Getline(hyd);
pos = Tell(hyd);
c[0] = Getc(hyd);
d = Getc(hyd);
Ungetc(d, hyd);
if (c[0] < ' ')
{
c[2] = 0;
c[1] = c[0] + 'a' - 1;
c[0] = '\\';
}
else
c[1] = 0;
Printf(stdout, "%5d -- %5s:%3d -- %s\n", pos, file, line, c);
}
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
DOH *g = NewSuper("Hello, cruel world", "greeting", 100); DOH *g = NewSuper("Hello\ncruel\nworld\nas", "hey", 100);
DOH *b = NewSuper("Goodbye!!!", "bye", 20); DOH *b = NewSuper("namaste\nadios\nseeya!\nas", "bye", 20);
DOH *hyd = NewSuper("so,\nhow\nare\nyou\ndoing?\nad", "hyd", 200);
Printf(stdout, "%s\n%s\n", g, b); DOH *str = NewString("####\n####");
Setfile(str, "str");
Setline(str, 10000);
Insert(hyd, 23, b);
annotate(hyd);
return Len(hyd);
} }
#endif #endif