From 8e3d23b921d9bbcb7c53017bacff8a3050a34b55 Mon Sep 17 00:00:00 2001 From: KatolaZ Date: Sat, 27 Jul 2019 06:57:12 +0100 Subject: reorganise code --- gramscii.c | 1057 ------------------------------------------------------------ 1 file changed, 1057 deletions(-) delete mode 100644 gramscii.c (limited to 'gramscii.c') diff --git a/gramscii.c b/gramscii.c deleted file mode 100644 index 4342da9..0000000 --- a/gramscii.c +++ /dev/null @@ -1,1057 +0,0 @@ -/* -* -* gramscii: a simple editor for ASCII box-and-arrow charts -* -* Copyright (c) 2019 Vincenzo "KatolaZ" Nicosia -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. Please see the attached file COPYING. -* Otherwise, please visit . -* -*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "config.h" - -#include "arg.h" - -typedef struct{ - int sz; - int lst; - char *s; -} line_t; - - -#define MOVE 0x00 -#define BOX 0x01 -#define ARROW 0x02 -#define TEXT 0x04 -#define DEL 0x08 -#define VIS 0x10 - -#define DIR_N 0x00 -#define DIR_R 0x01 -#define DIR_U 0x02 -#define DIR_D 0x04 -#define DIR_L 0x08 - -#define DIR_HOR (DIR_R | DIR_L) -#define DIR_VER (DIR_D | DIR_U) - - -#define NOFIX 0x0 -#define FIX 0x1 - -#define BG ' ' -#define PTR '+' -#define UND '_' -#define ARR_L '<' -#define ARR_R '>' -#define ARR_U '^' -#define ARR_D 'v' - -#define HOME 0x01 -#define END 0x02 -#define MIDDLE 0x04 - -#define VIDEO_NRM 0 -#define VIDEO_REV 7 - -#define MIN(x,y) (x) < (y) ? (x) : (y) -#define MAX(x,y) (x) > (y) ? (x) : (y) - -#define DEBUG 1 - -line_t *screen; -int num_lines; -int WIDTH, HEIGHT; - -int state; -int dir; -int x; -int y; -int step; -int mult; -int force_new; -char cursor; -char corner; - -int hlines_sz= sizeof(hlines) -1; -int vlines_sz= sizeof(vlines) -1; -int corners_sz = sizeof(corners) -1; -int stmarks_sz = sizeof(st_marks) - 1; -int endmarks_sz = sizeof(st_marks) - 1; - -int cur_hl, cur_vl, cur_corn, cur_start, cur_end; -char line_h; -char line_v; -char mark_st; -char mark_end; - -char modified; -char fname[256]; - -char visual; -char silent; -char autoend; - -char *argv0; - -struct termios t1, t2, t3; - - -void dump_lines(){ - int i; - for (i=0; i'; - } - return '>'; -} - - -void status_bar(){ - - if (silent) - return; - printf("\033[%d;1f\033[7m", HEIGHT+1); - printf("%*s", WIDTH-1, ""); - printf("\033[%d;1f\033[7m", HEIGHT+1); - printf(" x:%3d y:%3d -- MODE:%4s HL:%c VL:%c CN:%c SP:%c EP:%c %10s", - x, y, state_str(), line_h, line_v, corner, mark_st, mark_end, ""); - if (!modified) - printf(" [%s]", fname ); - else - printf(" *%s*", fname ); -#ifdef DEBUG - printf(" '%d' ", screen[y].s[x]); -#endif - printf("\033[0m"); - fflush(stdout); -} - -char get_key(FILE *fc, char *msg){ - - if (silent) - return 0; - printf("\033[%d;1f\033[7m", HEIGHT+1); - printf("%*s", WIDTH, ""); - printf("\033[%d;1f\033[7m", HEIGHT+1); - printf("%s", msg); - fflush(stdout); - printf("\033[0m"); - fflush(stdout); - return fgetc(fc); -} - -void get_string(FILE *fc, char *msg, char *s, int sz){ - - if (!silent){ - printf("\033[%d;1f\033[7m", HEIGHT+1); - printf("%*s", WIDTH, ""); - printf("\033[%d;1f\033[7m", HEIGHT+1); - - /* We must activate echo now */ - t3 = t2; - t3.c_lflag |= (ECHO | ICANON); - tcsetattr(0, TCSANOW, &t3); - printf("%s", msg); - printf("\033[0m"); - } - fgets(s, sz, fc); - s[strlen(s)-1] = '\0'; - tcsetattr(0, TCSANOW, &t2); - if (!silent) - fflush(stdout); -} - -int is_yes(char c){ - return c=='y' ? 1 : c == 'Y'? 1 : 0; -} - -/*** Screen management ***/ - -void show_cursor(){ - if (silent) - return; - printf("\033[%d;%df", y+1, x+1); - fflush(stdout); -} - - -void set_xy(int _x, int _y, char c){ - line_t *tmp; - if (_y >= num_lines){ - tmp = realloc(screen, (_y + LONG_STEP)* sizeof(line_t)); - if (tmp == NULL){ - fprintf(stderr, "Unable to allocate memory for more lines"); - exit(1); - } - else while ( num_lines < _y + LONG_STEP){ - screen[num_lines].sz = WIDTH+1; - screen[num_lines].s = malloc((screen[num_lines].sz) * sizeof(char)); - if (screen[num_lines].s == NULL){ - perror("allocating screen[num_lines].s"); - exit(1); - } - memset(screen[num_lines].s, BG, screen[num_lines].sz); - screen[num_lines].lst = 0; - screen[num_lines].s[screen[num_lines].lst+1]='\0'; - num_lines ++; - } - } - if (screen[_y].sz < _x + 2){ - screen[_y].sz = (_x +2) * 2; - screen[_y].s = realloc(screen[_y].s, screen[_y].sz * sizeof(char)); - } - while (screen[_y].lst<_x){ - screen[_y].lst ++; - screen[_y].s[screen[_y].lst] = BG; - } - screen[_y].s[_x] = c; - if (_x == screen[_y].lst) - screen[_y].s[_x+1] = '\0'; -} - -void set_cur(char c){ - set_xy(x, y, c); -} - -void draw_xy(int x, int y, char c){ - /* FIXME: check if x and y are valid!!!! */ - if (silent) - return; - printf("\033[%d;%df",y+1,x+1); - putchar(c); - fflush(stdout); -} - -void update_current(){ - if (silent) - return; - printf("\033[%d'%df",y+1,x+1); - putchar(screen[y].s[x]); - fflush(stdout); -} - -void erase_line(char *s){ - while(*s){ - *s = BG; - s++; - } -} - -void erase_box(int x1, int y1, char c){ - int x_incr, y_incr, i; - - x_incr = x1 < x? +1: -1; - y_incr = y1 < y? +1: -1; - do{ - i = y1; - do{ - set_xy(x1, i, c); - } while(i != y && (1 | (i += y_incr))); - } while(x1 != x && (1 | (x1 += x_incr))); - -} - -void erase_screen(){ - int i; - for(i=0;i=WIDTH) x = WIDTH-1; - if (y<0) y=0; - else if (y>=HEIGHT) y = HEIGHT -1; -} - -void reset_styles(){ - - cur_corn = 0; - corner = corners[0]; - cur_hl = cur_vl = 0; - cur_start = cur_end = 0; - line_h = hlines[cur_hl]; - line_v = vlines[cur_vl]; - mark_st = st_marks[cur_start]; - mark_end = end_marks[cur_end]; -} - -void redraw(){ - int i; - - if (silent) - return; - printf("\033[2J\033[1;1H"); - for (i=0;i': - toggle_end_mark(); - break; - case '.': - reset_styles(); - break; - default: - return 0; - } - return c; -} - - - - -/***** text, box, arrows *****/ - -void get_text(FILE *fc){ - char c; - int orig_x = x; - - redraw(); - while((c=fgetc(fc))!=EOF && c != 27){ - if(c=='\n'){ - set_cur(BG); - y += 1; - x = orig_x; - } - else { - set_cur(c); - update_current(); - modified = 1; - x += 1; - if (x >= WIDTH) - x = orig_x; - } - check_bound(); - status_bar(); - show_cursor(); - } - state=MOVE; -} - -void draw_box(int x1, int y1, int fix){ - - int xmin, ymin, xmax, ymax; - int i; - void (*f)(int, int, char); - - if (fix == FIX) - f = set_xy; - else - f = draw_xy; - - xmin = MIN(x, x1); - xmax = MAX(x, x1); - ymin = MIN(y, y1); - ymax = MAX(y, y1); - - for(i=xmin+1; i<=xmax; i++){ - f(i, ymin, line_h); - f(i, ymax, line_h); - } - for(i=ymin+1; i<=ymax; i++){ - f(xmin, i, line_v); - f(xmax, i, line_v); - } - f(xmin, ymin, corner); - f(xmin, ymax, corner); - f(xmax, ymin, corner); - f(xmax, ymax, corner); - show_cursor(); -} - -void get_box(FILE *fc){ - char c; - int orig_x=x, orig_y=y; - redraw(); - step = 1; - draw_box(x,y,NOFIX); - while((c=fgetc(fc))!=EOF && c != 27 && c!= 'b' && c != '\n'){ - if (change_style(c)) - goto update_box; - if (!move_around(c, fc)) - continue; - check_bound(); - redraw(); - step = 1; -update_box: - draw_box(orig_x, orig_y, NOFIX); - status_bar(); - show_cursor(); - } - if (c == 'b' || c == '\n'){ - draw_box(orig_x, orig_y, FIX); - modified = 1; - } - redraw(); - state = MOVE; -} - -void draw_arrow(int x, int y, char *a, int a_len, int fix){ - - int i, j, cur_dir; - char line; - void (*f)(int, int, char); - - - if (fix == FIX) - f = set_xy; - else - f = draw_xy; - - f(x,y,mark_st); - if (!a_len){ - show_cursor(); - return; - } - cur_dir=DIR_N; - for (i=0; i0) { - /* If we are switching between horizontal and vertical, put a "corner" */ - if (((cur_dir & DIR_HOR) && (a[i] & DIR_VER)) || - ((cur_dir & DIR_VER) && (a[i] & DIR_HOR))){ - f(x,y,corner); - show_cursor(); - } - } - for(j=0; j=x; i--) set_xy(i,y,BG); - break; - case DIR_U: - for(i=y1; i>=y; i--) set_xy(x,i,BG); - break; - case DIR_D: - for(i=y1; i<=y; i++) set_xy(x,i,BG); - break; - } -} - - -void delete(FILE *fc){ - char c; - int orig_x = x, orig_y = y; - status_bar(); - show_cursor(); - while((c=fgetc(fc))!=EOF && c!=27 && c!= 'x' && c != '\n'){ - if (!move_around(c, fc)) continue; - check_bound(); - do_delete(orig_x, orig_y); - step = 1; - modified = 1; - orig_x = x; - orig_y = y; - redraw(); - status_bar(); - show_cursor(); - } - state = MOVE; -} - -/*** File management ***/ - -void write_file(FILE *fc){ - FILE *fout; - int i; - - if (!fname[0] || force_new){ - get_string(fc, "Write to: ", fname, 255); - if ((fout=fopen(fname, "r"))!=NULL){ - if (!is_yes(get_key(fc,"File exists. Overwrite [y/n]?")) ){ - fclose(fout); - return; - } - fclose(fout); - } - } - if((fout=fopen(fname, "w"))==NULL){ - get_key(fc, "Error opening file."); - return; - } - for (i=0; i