Got Super_move working; Super_replace does SOME sutff right :)

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@137 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dustin Mitchell 2000-01-21 06:20:12 +00:00
commit 5f3292da44

View file

@ -638,7 +638,10 @@ Super_putc(DOH *so, int ch)
s->str = (char *) DohRealloc(s->str, s->maxsize); s->str = (char *) DohRealloc(s->str, s->maxsize);
assert(s->str); assert(s->str);
} }
printf("Append %c\n", ch);
s->str[s->len++] = ch; s->str[s->len++] = ch;
s->tags[s->numtags-1].length++;
s->str[s->len] = 0; s->str[s->len] = 0;
} }
else else
@ -703,6 +706,20 @@ Super_ungetc(DOH *so, int ch)
static int static int
Super_replace(DOH *stro, DOH *token, DOH *rep, int flags) Super_replace(DOH *stro, DOH *token, DOH *rep, int flags)
{ {
if (SuperString_check(rep))
Super_raw_replace((Super *)stro, Char(token), flags,
Super_super_insert2, (DOH *)rep, 0, 0, 0);
else if (String_check(rep))
{
Seek(rep, 0, SEEK_SET);
Super_raw_replace((Super *)stro, Char(token), flags,
Super_string_insert, (DOH *)rep, Len(rep),
Getfile(rep), Getline(rep));
}
else
Super_raw_replace((Super *)stro, Char(token), flags,
Super_string_insert, (DOH *)Char(rep), Len(rep),
0, 0);
} }
/* ------------------------------------------------------------------------- /* -------------------------------------------------------------------------
@ -801,11 +818,27 @@ 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)
{ {
s->curtag++;
/* usually, if we're at the end of a tag, we want to be at
the beginning of the next one. But if we're at the end
of the string, we want to be at the end of the last
tag, as a special case. */
if (s->curtag == s->numtags)
{
--s->curtag;
curtag_offset = s->tags[s->curtag].length;
line = s->tags[s->curtag].line +
Super_count_newlines(s->str + s->sp, remaining);
s->sp += remaining;
break;
}
delta -= remaining; delta -= remaining;
s->sp += remaining; s->sp += remaining;
s->curtag++;
line = s->tags[s->curtag].line; line = s->tags[s->curtag].line;
curtag_offset = 0; curtag_offset = 0;
} }
@ -980,8 +1013,8 @@ Super_string_insert(Super *s, int pos, char *str, int len,
if (len == 0) len = strlen(str); if (len == 0) len = strlen(str);
if (len == 0) return; if (len == 0) return;
if (pos < 0) pos = 0; if (pos == DOH_END || pos > s->len) pos = s->len;
else if (pos > s->len) pos = s->len; else if (pos < 0) pos = 0;
tag = Super_get_tag(s, pos, &offset); tag = Super_get_tag(s, pos, &offset);
@ -1072,8 +1105,8 @@ Super_super_insert(Super *s, int pos, Super *str)
s->hashkey = -1; s->hashkey = -1;
/* normalize the inputs */ /* normalize the inputs */
if (pos < 0) pos = 0; if (pos == DOH_END || pos > s->len) pos = s->len;
else if (pos > s->len) pos = s->len; else if (pos < 0) pos = 0;
len = str->len; len = str->len;
if (len == 0) return; if (len == 0) return;
@ -1207,6 +1240,10 @@ Super_rr_append_chunk(int start, int len)
} }
else /* avoid zero-length final tag */ else /* avoid zero-length final tag */
{ {
/* note: if this makes final_tag == initial_tag, that's OK -- we
swap final_tag before initial_tag, and we don't try to change
final here, so we'll just end up doing a bit of extra
swapping. If that didn't make sense, don't worry about it. */
final_tag--; final_tag--;
final = rr_original->tags[final_tag]; final = rr_original->tags[final_tag];
new_final = final; new_final = final;
@ -1218,8 +1255,8 @@ Super_rr_append_chunk(int start, int len)
/* OK, now we swap in our new tags, offset the tags and str fields /* OK, now we swap in our new tags, offset the tags and str fields
appropriately, set the lengths correctly, and call insert. */ appropriately, set the lengths correctly, and call insert. */
rr_original->tags[initial_tag] = new_initial;
rr_original->tags[final_tag] = new_final; rr_original->tags[final_tag] = new_final;
rr_original->tags[initial_tag] = new_initial;
rr_original->numtags = final_tag - initial_tag + 1; rr_original->numtags = final_tag - initial_tag + 1;
rr_original->tags += initial_tag; rr_original->tags += initial_tag;
rr_original->len = len; rr_original->len = len;
@ -1227,12 +1264,13 @@ Super_rr_append_chunk(int start, int len)
Super_super_insert(rr_dest, DOH_END, rr_original); /* easy!? */ Super_super_insert(rr_dest, DOH_END, rr_original); /* easy!? */
/* and swap things back in the opposite order. */
rr_original->str -= start; rr_original->str -= start;
rr_original->len = old_len; rr_original->len = old_len;
rr_original->tags -= initial_tag; rr_original->tags -= initial_tag;
rr_original->numtags = old_numtags; rr_original->numtags = old_numtags;
rr_original->tags[final_tag] = final;
rr_original->tags[initial_tag] = initial; rr_original->tags[initial_tag] = initial;
rr_original->tags[final_tag] = final;
} }
static int static int
@ -1270,6 +1308,7 @@ Super_raw_replace(Super *str, char *token, int flags,
Super_rr_append_chunk(lastmatch_end - rr_original->str, Super_rr_append_chunk(lastmatch_end - rr_original->str,
match - lastmatch_end); match - lastmatch_end);
printf("(*insert): '%*s'\n", Len(rep), Char(rep));
/* and now insert the replacement */ /* and now insert the replacement */
(*insert)(rr_dest, DOH_END, (char *)rep, (*insert)(rr_dest, DOH_END, (char *)rep,
rep_len, rep_fn, rep_line); rep_len, rep_fn, rep_line);
@ -1392,11 +1431,26 @@ 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 pos) static void dump_tags(DOH *so)
{
Super *s = (Super *)so;
int tag = 0;
int pos = 0;
while (tag < s->numtags)
{
Printf(stdout, "TAG %d: %d to %d (%d bytes), starting at '%s':%d\n",
tag, pos, pos + s->tags[tag].length - 1, s->tags[tag].length,
s->tags[tag].filename, s->tags[tag].line);
pos += s->tags[tag].length;
tag++;
}
}
static void annotate(DOH *hyd)
{ {
int len, i; int len, i;
len = Len(hyd); len = Len(hyd);
for (i = pos; i < len; i++) for (i = 0; i < len; i++)
{ {
DOH *file; DOH *file;
int line; int line;
@ -1427,14 +1481,12 @@ static void annotate(DOH *hyd, int pos)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
DOH *abcd = NewSuper("AB\nCD", "abcd", 20); DOH *abcd = NewSuper("pot", "pot", 20);
DOH *ijkl = NewSuper("IJ\nKL\nMN", "ijkl", 30); DOH *ijkl = NewSuper("foohashbar", "ijkl", 30);
char buffer[] = "XXXX";
Insert(ijkl, 6, abcd); Replace(ijkl, "hash", abcd, 0);
Seek(ijkl, atoi(argv[1]), SEEK_SET); dump_tags(ijkl);
/* Write(ijkl, buffer, 3); */ annotate(ijkl);
annotate(ijkl, atoi(argv[2]));
return 0; return 0;
} }