X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=visor;a=blobdiff_plain;f=libvisor%2Fsrc%2Fvisor.c;fp=libvisor%2Fsrc%2Fvisor.c;h=08c88a7fbe76193cd3c501250782fb6f09d10318;hp=b4ef116dcc4cf636314131c2798341fbbc95ab58;hb=2e3cec9f53a10e7c71da4a0d999a00bddae2935c;hpb=b169b4382bad149e44ac3157e84cda48550e2b42 diff --git a/libvisor/src/visor.c b/libvisor/src/visor.c index b4ef116..08c88a7 100644 --- a/libvisor/src/visor.c +++ b/libvisor/src/visor.c @@ -179,12 +179,32 @@ struct vi_buffer *vi_prev_buf(struct visor *vi) return vi->buflist ? vi->buflist->prev : 0; } -static int add_span(struct vi_buffer *vb, int src, vi_addr start, unsigned long size) +/* split_span splits the span sp. if size > 0 it moves the second part to sp+2, + * leaving an empty place at sp+1 for the new span. The start point of the + * second part is adjusted by size. + * + * It can't fail, because it's always called with the span array having at + * least two empty slots (see: add_span). + */ +void split_span(struct vi_buffer *vb, struct vi_span *sp, vi_addr at, unsigned long size) { + struct vi_span *tail = sp + (size ? 2 : 1); + int num_move = vb->num_spans - sp - 1; + + memmove(tail + 1, sp + 1, num_move); + vb->num_span += tail - sp; + + sp->size ... CONTINUE HERE. +} + +static int add_span(struct vi_buffer *vb, vi_addr at, int src, vi_addr start, unsigned long size) +{ + int i; struct visor *vi = vb->vi; struct vi_span *sp; - if(vb->num_spans >= vb->max_spans) { + /* make sure we have space for at least two new spans (split + add) */ + if(vb->num_spans + 1 >= vb->max_spans) { int newmax = vb->max_spans > 0 ? (vb->max_spans << 1) : 16; struct vi_span *tmp = vi_realloc(vb->spans, newmax * sizeof *tmp); if(!tmp) return -1; @@ -192,9 +212,16 @@ static int add_span(struct vi_buffer *vb, int src, vi_addr start, unsigned long vb->max_spans = newmax; } - sp = vb->spans + vb->num_spans++; - sp->beg = start; + if((sp = vi_buf_find_span(vb, at))) { + split_span(vb, sp++, at, size); + } else { + sp = vb->spans + vb->num_spans; + } + + sp->src = src; + sp->addr = start; sp->size = size; + vb->num_spans++; return 0; } @@ -262,3 +289,7 @@ int vi_buf_read(struct vi_buffer *vb, const char *path) vb->orig_size = fsz; return 0; } + +int vi_buf_write(struct vi_buffer *vb, const char *path) +{ +}