igramscii.c - gramscii - A simple editor for ASCII box-and-arrow charts Err bitreich.org 70 1Log /scm/gramscii/log.gph bitreich.org 70 1Files /scm/gramscii/files.gph bitreich.org 70 1Refs /scm/gramscii/refs.gph bitreich.org 70 1Tags /scm/gramscii/tag bitreich.org 70 1README /scm/gramscii/file/README.md.gph bitreich.org 70 1LICENSE /scm/gramscii/file/COPYING.gph bitreich.org 70 i--- Err bitreich.org 70 igramscii.c (4678B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 /* Err bitreich.org 70 i 2 * Err bitreich.org 70 i 3 * gramscii: a simple editor for ASCII box-and-arrow charts Err bitreich.org 70 i 4 * Err bitreich.org 70 i 5 * Copyright (c) 2019 Vincenzo "KatolaZ" Nicosia Err bitreich.org 70 i 6 * Err bitreich.org 70 i 7 * This program is free software: you can redistribute it and/or modify Err bitreich.org 70 i 8 * it under the terms of the GNU General Public License as published by Err bitreich.org 70 i 9 * the Free Software Foundation, either version 3 of the License, or Err bitreich.org 70 i 10 * (at your option) any later version. Err bitreich.org 70 i 11 * Err bitreich.org 70 i 12 * This program is distributed in the hope that it will be useful, Err bitreich.org 70 i 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of Err bitreich.org 70 i 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Err bitreich.org 70 i 15 * GNU General Public License for more details. Err bitreich.org 70 i 16 * Err bitreich.org 70 i 17 * You should have received a copy of the GNU General Public License Err bitreich.org 70 i 18 * along with this program. Please see the attached file COPYING. Err bitreich.org 70 i 19 * Otherwise, please visit . Err bitreich.org 70 i 20 * Err bitreich.org 70 i 21 */ Err bitreich.org 70 i 22 Err bitreich.org 70 i 23 #define _POSIX_C_SOURCE 200112L Err bitreich.org 70 i 24 Err bitreich.org 70 i 25 #include Err bitreich.org 70 i 26 #include Err bitreich.org 70 i 27 #include Err bitreich.org 70 i 28 Err bitreich.org 70 i 29 #include "arg.h" Err bitreich.org 70 i 30 #include "gramscii.h" Err bitreich.org 70 i 31 Err bitreich.org 70 i 32 /** global variables **/ Err bitreich.org 70 i 33 Err bitreich.org 70 i 34 lineset_t screen; /* what is visualised */ Err bitreich.org 70 i 35 lineset_t cutbuf; /* cut/paste buffer */ Err bitreich.org 70 i 36 lineset_t *undo; /* undo list */ Err bitreich.org 70 i 37 Err bitreich.org 70 i 38 pos_t marks[26]; /* position marks */ Err bitreich.org 70 i 39 char mark_map[26]; /* marks map */ Err bitreich.org 70 i 40 Err bitreich.org 70 i 41 int undo_sz;/* allocated size of undo list*/ Err bitreich.org 70 i 42 int undo_cur;/* undo position */ Err bitreich.org 70 i 43 int undo_lst;/* last valid undo position */ Err bitreich.org 70 i 44 Err bitreich.org 70 i 45 int WIDTH, HEIGHT; Err bitreich.org 70 i 46 Err bitreich.org 70 i 47 int mode;/* mode */ Err bitreich.org 70 i 48 int dir;/* line direction */ Err bitreich.org 70 i 49 int x; Err bitreich.org 70 i 50 int y; Err bitreich.org 70 i 51 int step;/* current step */ Err bitreich.org 70 i 52 int mult;/* current multiplier */ Err bitreich.org 70 i 53 int force_new; Err bitreich.org 70 i 54 char corner; Err bitreich.org 70 i 55 Err bitreich.org 70 i 56 /* number of available markers for each type */ Err bitreich.org 70 i 57 int hlines_sz; Err bitreich.org 70 i 58 int vlines_sz; Err bitreich.org 70 i 59 int corners_sz; Err bitreich.org 70 i 60 int stmarks_sz; Err bitreich.org 70 i 61 int endmarks_sz; Err bitreich.org 70 i 62 /**/ Err bitreich.org 70 i 63 Err bitreich.org 70 i 64 /* line and arrow markers */ Err bitreich.org 70 i 65 int cur_hl, cur_vl, cur_corn, cur_start, cur_end; Err bitreich.org 70 i 66 char line_h; Err bitreich.org 70 i 67 char line_v; Err bitreich.org 70 i 68 char mark_st; Err bitreich.org 70 i 69 char mark_end; Err bitreich.org 70 i 70 /**/ Err bitreich.org 70 i 71 Err bitreich.org 70 i 72 char modified; /* set to 1 if screen modified since last save */ Err bitreich.org 70 i 73 char fname[256]; Err bitreich.org 70 i 74 Err bitreich.org 70 i 75 Err bitreich.org 70 i 76 char script; /* set to 1 in script-mode */ Err bitreich.org 70 i 77 char autoend; /* set to 1 in auto-arrow mode */ Err bitreich.org 70 i 78 Err bitreich.org 70 i 79 /* Used by draw_arrow to identify the bounding box */ Err bitreich.org 70 i 80 int a_miny; Err bitreich.org 70 i 81 int a_maxy; Err bitreich.org 70 i 82 /**/ Err bitreich.org 70 i 83 Err bitreich.org 70 i 84 struct termios t1, t2, t3; Err bitreich.org 70 i 85 Err bitreich.org 70 i 86 /** End of global variables **/ Err bitreich.org 70 i 87 Err bitreich.org 70 i 88 char *argv0; Err bitreich.org 70 i 89 Err bitreich.org 70 i 90 Err bitreich.org 70 i 91 void cleanup(int s){ Err bitreich.org 70 i 92 Err bitreich.org 70 i 93 if (!script){ Err bitreich.org 70 i 94 printf("\033[;H\033[2J"); Err bitreich.org 70 i 95 tcsetattr(0, TCSANOW, &t1); Err bitreich.org 70 i 96 } Err bitreich.org 70 i 97 else Err bitreich.org 70 i 98 dump_lines(screen, stdout); Err bitreich.org 70 i 99 fflush(stdout); Err bitreich.org 70 i 100 exit(s); Err bitreich.org 70 i 101 } Err bitreich.org 70 i 102 Err bitreich.org 70 i 103 /*** Initialisation ***/ Err bitreich.org 70 i 104 Err bitreich.org 70 i 105 void init(){ Err bitreich.org 70 i 106 Err bitreich.org 70 i 107 signal(SIGHUP, cleanup); Err bitreich.org 70 i 108 signal(SIGINT, cleanup); Err bitreich.org 70 i 109 signal(SIGTERM, cleanup); Err bitreich.org 70 i 110 signal(SIGQUIT, cleanup); Err bitreich.org 70 i 111 Err bitreich.org 70 i 112 if (!script){ Err bitreich.org 70 i 113 tcgetattr(0, &t1); Err bitreich.org 70 i 114 t2 = t1; Err bitreich.org 70 i 115 t2.c_lflag &= ~(ICANON | ECHO); Err bitreich.org 70 i 116 tcsetattr(0, TCSANOW, &t2); Err bitreich.org 70 i 117 } Err bitreich.org 70 i 118 init_screen(); Err bitreich.org 70 i 119 x = 0; Err bitreich.org 70 i 120 y = 0; Err bitreich.org 70 i 121 step = 1; Err bitreich.org 70 i 122 modified = 0; Err bitreich.org 70 i 123 fname[0] = '\0'; Err bitreich.org 70 i 124 redraw(); Err bitreich.org 70 i 125 } Err bitreich.org 70 i 126 Err bitreich.org 70 i 127 Err bitreich.org 70 i 128 /*** Commands ***/ Err bitreich.org 70 i 129 Err bitreich.org 70 i 130 void commands(FILE *fc){ Err bitreich.org 70 i 131 Err bitreich.org 70 i 132 int c; Err bitreich.org 70 i 133 while((c=fgetc(fc))!=EOF){ Err bitreich.org 70 i 134 if (!change_style(c) && !move_around(c, fc, 1)){ Err bitreich.org 70 i 135 #ifdef DEBUG Err bitreich.org 70 i 136 fprintf(stderr, "got command: %c\n", c); Err bitreich.org 70 i 137 #endif Err bitreich.org 70 i 138 switch(c){ Err bitreich.org 70 i 139 case 'i': Err bitreich.org 70 i 140 mode = TEXT; Err bitreich.org 70 i 141 get_text(fc); Err bitreich.org 70 i 142 break; Err bitreich.org 70 i 143 case 'R': Err bitreich.org 70 i 144 redraw(); Err bitreich.org 70 i 145 break; Err bitreich.org 70 i 146 case 'b': Err bitreich.org 70 i 147 mode = BOX; Err bitreich.org 70 i 148 get_box(fc, BOX_RECT); Err bitreich.org 70 i 149 break; Err bitreich.org 70 i 150 case 'A': autoend=1; Err bitreich.org 70 i 151 case 'a': Err bitreich.org 70 i 152 mode = ARROW; Err bitreich.org 70 i 153 get_arrow(fc); Err bitreich.org 70 i 154 autoend = 0; Err bitreich.org 70 i 155 break; Err bitreich.org 70 i 156 case 'W': Err bitreich.org 70 i 157 force_new = 1;/** FALLTHROUGH **/ Err bitreich.org 70 i 158 case 'w': Err bitreich.org 70 i 159 write_file(fc); Err bitreich.org 70 i 160 break; Err bitreich.org 70 i 161 case 'e': Err bitreich.org 70 i 162 check_modified(fc);/** FALLTHROUGH **/ Err bitreich.org 70 i 163 case 'E': Err bitreich.org 70 i 164 load_file(fc); Err bitreich.org 70 i 165 break; Err bitreich.org 70 i 166 case 'N': Err bitreich.org 70 i 167 new_file(fc); Err bitreich.org 70 i 168 break; Err bitreich.org 70 i 169 case 'x': Err bitreich.org 70 i 170 mode = DEL; Err bitreich.org 70 i 171 erase(fc); Err bitreich.org 70 i 172 break; Err bitreich.org 70 i 173 case 'v': Err bitreich.org 70 i 174 mode = VIS; Err bitreich.org 70 i 175 visual_box(fc); Err bitreich.org 70 i 176 break; Err bitreich.org 70 i 177 case 'C': Err bitreich.org 70 i 178 crop_to_nonblank(); Err bitreich.org 70 i 179 break; Err bitreich.org 70 i 180 case 'p': Err bitreich.org 70 i 181 paste(); Err bitreich.org 70 i 182 break; Err bitreich.org 70 i 183 case 'u': Err bitreich.org 70 i 184 undo_change(); Err bitreich.org 70 i 185 break; Err bitreich.org 70 i 186 case 'U': Err bitreich.org 70 i 187 redo_change(); Err bitreich.org 70 i 188 break; Err bitreich.org 70 i 189 case 'r': Err bitreich.org 70 i 190 read_file_at(fc, x, y); Err bitreich.org 70 i 191 break; Err bitreich.org 70 i 192 case 't': Err bitreich.org 70 i 193 mode = TRP; Err bitreich.org 70 i 194 get_box(fc, BOX_TRAP_UC); Err bitreich.org 70 i 195 break; Err bitreich.org 70 i 196 case 'z': Err bitreich.org 70 i 197 mode = PAR; Err bitreich.org 70 i 198 get_box(fc, BOX_PARR); Err bitreich.org 70 i 199 break; Err bitreich.org 70 i 200 case '#': Err bitreich.org 70 i 201 mode = REM; Err bitreich.org 70 i 202 get_comment(fc); Err bitreich.org 70 i 203 break; Err bitreich.org 70 i 204 case 'M': Err bitreich.org 70 i 205 mark_pos(fc); Err bitreich.org 70 i 206 break; Err bitreich.org 70 i 207 case 'q': Err bitreich.org 70 i 208 check_modified(fc);/** FALLTHROUGH **/ Err bitreich.org 70 i 209 case 'Q': Err bitreich.org 70 i 210 cleanup(0); Err bitreich.org 70 i 211 break; Err bitreich.org 70 i 212 } Err bitreich.org 70 i 213 } Err bitreich.org 70 i 214 check_bound(&x, &y); Err bitreich.org 70 i 215 status_bar(); Err bitreich.org 70 i 216 show_cursor(); Err bitreich.org 70 i 217 step = 1; Err bitreich.org 70 i 218 force_new = 0; Err bitreich.org 70 i 219 } Err bitreich.org 70 i 220 Err bitreich.org 70 i 221 } Err bitreich.org 70 i 222 Err bitreich.org 70 i 223 void usage(){ Err bitreich.org 70 i 224 fprintf(stderr, "Usage: %s [-s] [-h] [file ...]\n", argv0); Err bitreich.org 70 i 225 exit(1); Err bitreich.org 70 i 226 } Err bitreich.org 70 i 227 Err bitreich.org 70 i 228 Err bitreich.org 70 i 229 int main(int argc, char *argv[]){ Err bitreich.org 70 i 230 FILE *fc; Err bitreich.org 70 i 231 Err bitreich.org 70 i 232 ARGBEGIN { Err bitreich.org 70 i 233 case 's': Err bitreich.org 70 i 234 script = 1; Err bitreich.org 70 i 235 break; Err bitreich.org 70 i 236 case 'h': /* FALLTHROUGH */ Err bitreich.org 70 i 237 default: Err bitreich.org 70 i 238 usage(); Err bitreich.org 70 i 239 } ARGEND; Err bitreich.org 70 i 240 Err bitreich.org 70 i 241 init(); Err bitreich.org 70 i 242 while (argc){ Err bitreich.org 70 i 243 fc = fopen(argv[0], "r"); Err bitreich.org 70 i 244 if (fc == NULL){ Err bitreich.org 70 i 245 fprintf(stderr, "Error opening file %s\n", argv[0]); Err bitreich.org 70 i 246 } Err bitreich.org 70 i 247 else { Err bitreich.org 70 i 248 commands(fc); Err bitreich.org 70 i 249 fflush(fc); Err bitreich.org 70 i 250 fclose(fc); Err bitreich.org 70 i 251 redraw(); Err bitreich.org 70 i 252 } Err bitreich.org 70 i 253 argv++; Err bitreich.org 70 i 254 argc--; Err bitreich.org 70 i 255 } Err bitreich.org 70 i 256 commands(stdin); Err bitreich.org 70 i 257 cleanup(0); Err bitreich.org 70 i 258 } Err bitreich.org 70 .