diff options
Diffstat (limited to 'buff.c')
-rw-r--r-- | buff.c | 147 |
1 files changed, 128 insertions, 19 deletions
@@ -14,11 +14,13 @@ int read_lines(FILE *fin){ char buff[4096]; line_t *line; - size_t s; + size_t s, tot; + tot = 0; while(feof(fin) == 0){ if (!fgets(buff, 4095, fin)) break; s = strlen(buff) + 1; + tot += s-1; line = malloc(sizeof(line_t)); line->s = s; line->c = malloc(s * sizeof(char)); @@ -38,12 +40,17 @@ int read_lines(FILE *fin){ } cur = b_end; pos = num; + printf("%d\n", tot); } + + + + void print_cur_line(char lineno){ if (!b_start){ - printf("?\n"); + E; return; } @@ -95,10 +102,10 @@ void print_lineno(){ int move_forward(int n){ if (pos + n > num){ - printf("?\n"); + E; return -1; } - while(n-- >0){ + while(n-- > 0){ cur = cur->next; } pos += n; @@ -108,7 +115,7 @@ int move_forward(int n){ int move_backward(int n){ if (pos - n < 1){ - printf("?\n"); + E; return -1; } while(n-- >0){ @@ -118,17 +125,14 @@ int move_backward(int n){ return 0; } - - -/* add lines after pos */ -void append_lines(){ +int __get_lines(line_t **first, line_t **last){ char buff[4096]; int n,s; - line_t *first, *l, *last; + line_t *l; n = 0; - first = last = NULL; + *first = *last = NULL; while(feof(stdin) == 0){ if (!fgets(buff, 4095, stdin)) break; if (buff[0] == '.') @@ -138,29 +142,134 @@ void append_lines(){ l->c = malloc(s * sizeof(char)); memcpy(l->c, buff, s); l->s = s; - if (first == NULL) - first = last = l; + if (*first == NULL) + *first = *last = l; else{ - last -> next = l; - l->prev = last; - last = l; + (*last) -> next = l; + l->prev = *last; + *last = l; } n += 1; } + return n; +} + + +/* add lines after pos */ +void append_lines(){ + + int n; + line_t *first, *last; + + first = last = NULL; + n = __get_lines(&first, &last); + if (addr1 == 0){ + fprintf(stderr, " >>> append (zero): pos: %d n:%d\n", pos, n); last->next = b_start; b_start -> prev = last; b_start = first; + num += n; move_to_line(n,0); } else{ + fprintf(stderr, " >>> append (non-zero): pos: %d n:%d\n", pos, n); last -> next = cur -> next; cur->next = first; first->prev = cur; - move_forward(n); + num += n; + //move_forward(n); + pos += n; + cur = last; + } +} + +void insert_lines(){ + + int n; + line_t *first, *last; + + first = last = NULL; + n = __get_lines(&first, &last); + + if (addr1 == 0){ + fprintf(stderr, " >>> insert (zero): pos: %d n:%d\n", pos, n); + last->next = b_start; + b_start -> prev = last; + b_start = first; + num += n; + move_to_line(n,0); + } + else{ + fprintf(stderr, " >>> insert (non-zero): pos: %d n:%d\n", pos, n); + + cur -> prev -> next = first; + first -> prev = cur -> prev; + last -> next = cur; + num += n; + pos -=1 ; + cur = last; } } -void insert_lines(){} -void delete_lines(){} +void delete_lines(){ + + line_t *handle; + + if (addr1 == -1){ + addr1 = pos; + } + if (addr2 == -1){ + addr2 = addr1; + } + + fprintf(stderr, " >>> delete: addr1: %d addr2: %d\n", addr1, addr2); + + move_to_line(addr2,0); + + if (addr2 <= 1){ /* we are deleting the first line */ + while(pos <= addr1){ + free(cur->c); + cur = cur -> next; + if (cur) + free(cur -> prev); + pos ++; + } + b_start = cur; + if (cur){ + pos = 1; + cur = b_start; + } + else + pos = 0; + } + else{ + handle = cur->prev; + while(pos < addr1){ + free(cur->c); + cur = cur -> next; + free(cur->prev); + pos ++; + } + handle->next = cur -> next; + free(cur->c); + free(cur); + if (handle -> next){ + pos = addr2 ; + cur = handle->next; + } + else{ + pos = addr2 - 1; + cur = handle; + } + } + num -= addr1 - addr2 + 1; +} + + +void change_lines(){ + delete_lines(); + addr2 = addr1 =pos; + append_lines(); +} |