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