diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 186 |
1 files changed, 186 insertions, 0 deletions
@@ -0,0 +1,186 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "buff.h" +#include <ctype.h> + +line_t *b_start = NULL; +line_t *b_end = NULL; +line_t *cur = NULL; +unsigned int num = 0; +unsigned int pos = 0; +/* addr1 is the lasr address, while addr2 is the previous one */ +int addr1, addr2; + + + +const char* skip_blank(const char **c){ + + while (isblank(**c)) (*c)++; + return *c; +} + + +int get_addr(const char **cmd){ + + int addr, n, got; + char sign = 0, comma = 0; + const char *c; + + addr1 = addr2 = -1; + c = *cmd; + while(*c){ + c = skip_blank(&c); + n = 0; + got = 0; + if (isdigit(*c)){ + while (isdigit(*c)){ + got = 1; + n = n * 10 + *c - '0', c++; + } + if (got){ + if (addr1 > -1 ) + addr2 = addr1; + addr1 = n; + } + } + else { + switch(*c){ + case '.': + if (addr1 > -1) + addr2 = addr1; + addr1 = pos; + break; + case '$': + if (addr1 > -1) + addr2 = addr1; + addr1 = num; + break; + case ',': + comma = 1; + if (addr1 < addr2){ + *cmd = c; + return -1; + } + break; + default: + goto check; + } + c++; + } + } + check: + *cmd = c; + + if (addr1 == -1){ + if (comma){ + addr1 = num; + addr2 = 1; + return 2; + } + addr1 = addr2 = pos; + return 0; + } + if (addr2 == -1){ + addr2 = pos; + return 1; + } + return 2; +} + + +void main_loop(){ + + char *cmd; + int ret; + char p; + + cmd = malloc(256 * sizeof(char)); + + while(1){ + p = 0; + fgets(cmd, 255, stdin); + + ret = get_addr((const char **) &cmd); + + printf(">>> *** pos: %d address: %d ***\n", pos, ret); + if (ret) { + printf(">>> *** addr1: %d, addr2= %d***\n", addr1, addr2); + } + + switch(cmd[0]){ + case 'i': + if (addr1 > -1) + move_to_line(addr1, 0); + insert_lines(); + break; + case 'a': + if (addr1 > -1) + move_to_line(addr1, 0); + append_lines(); + break; + case 'd': + delete_lines(); + break; + case 'n': p = 1; + case 'p': + if (ret == 2) + if (addr1 < addr2){ + printf("?\n"); + break; + } + else + print_lines(p); + else if (ret == 1) + move_to_line(addr2, 1); + else if (ret == 0) + print_cur_line(p); + else if (ret == -1){ + addr1 = num; + addr2 = 1; + move_to_line(addr2,0); + print_lines(p); + } + break; + case '\n': + if (addr1 > -1) + move_to_line(addr1, 1); + else + print_cur_line(p); + break; + case 'q': + exit(0); + break; + case '=': + if (addr1 == -1) + addr1 = num; + print_lineno(); + break; + default: + printf(">>> **** unknown command: '%c'****\n", cmd[0]) + ; + } + } +} + + + +int main(int argc, char *argv[]){ + + FILE *fin; + + if (argc < 2){ + printf("Usage: %s <filein>\n", argv[0]); + exit(1); + } + + if ((fin = fopen(argv[1], "r+"))){ + read_lines(fin); + } + else{ + printf("Error opening file %s\n", argv[1]); + } + + main_loop(); +} + |