iscreen.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 iscreen.c (10512B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #define _POSIX_C_SOURCE 200112L Err bitreich.org 70 i 2 Err bitreich.org 70 i 3 #include Err bitreich.org 70 i 4 #include Err bitreich.org 70 i 5 #include Err bitreich.org 70 i 6 #include Err bitreich.org 70 i 7 #include Err bitreich.org 70 i 8 #include Err bitreich.org 70 i 9 Err bitreich.org 70 i 10 #include "gramscii.h" Err bitreich.org 70 i 11 #include "config.h" Err bitreich.org 70 i 12 Err bitreich.org 70 i 13 /** extern declarations **/ Err bitreich.org 70 i 14 Err bitreich.org 70 i 15 extern lineset_t screen; /* what is visualised */ Err bitreich.org 70 i 16 extern lineset_t cutbuf; /* cut/paste buffer */ Err bitreich.org 70 i 17 extern lineset_t *undo; /* undo list */ Err bitreich.org 70 i 18 Err bitreich.org 70 i 19 extern pos_t marks[26]; /* position marks */ Err bitreich.org 70 i 20 extern char mark_map[26]; /* marks map */ Err bitreich.org 70 i 21 Err bitreich.org 70 i 22 extern int undo_sz;/* allocated size of undo list*/ Err bitreich.org 70 i 23 extern int undo_cur;/* undo position */ Err bitreich.org 70 i 24 extern int undo_lst;/* last valid undo position */ Err bitreich.org 70 i 25 Err bitreich.org 70 i 26 extern int WIDTH, HEIGHT; Err bitreich.org 70 i 27 Err bitreich.org 70 i 28 extern int mode;/* mode */ Err bitreich.org 70 i 29 extern int dir;/* line direction */ Err bitreich.org 70 i 30 extern int x; Err bitreich.org 70 i 31 extern int y; Err bitreich.org 70 i 32 extern int step;/* current step */ Err bitreich.org 70 i 33 extern int mult;/* current multiplier */ Err bitreich.org 70 i 34 Err bitreich.org 70 i 35 extern char corner; Err bitreich.org 70 i 36 Err bitreich.org 70 i 37 /* number of available markers for each type */ Err bitreich.org 70 i 38 extern int hlines_sz; Err bitreich.org 70 i 39 extern int vlines_sz; Err bitreich.org 70 i 40 extern int corners_sz; Err bitreich.org 70 i 41 extern int stmarks_sz; Err bitreich.org 70 i 42 extern int endmarks_sz; Err bitreich.org 70 i 43 /**/ Err bitreich.org 70 i 44 Err bitreich.org 70 i 45 /* line and arrow markers */ Err bitreich.org 70 i 46 extern int cur_hl, cur_vl, cur_corn, cur_start, cur_end; Err bitreich.org 70 i 47 extern char line_h; Err bitreich.org 70 i 48 extern char line_v; Err bitreich.org 70 i 49 extern char mark_st; Err bitreich.org 70 i 50 extern char mark_end; Err bitreich.org 70 i 51 /**/ Err bitreich.org 70 i 52 Err bitreich.org 70 i 53 extern char modified; /* set to 1 if screen modified since last save */ Err bitreich.org 70 i 54 extern char fname[256]; Err bitreich.org 70 i 55 Err bitreich.org 70 i 56 Err bitreich.org 70 i 57 extern char script; /* set to 1 in script-mode */ Err bitreich.org 70 i 58 Err bitreich.org 70 i 59 extern struct termios t2, t3; Err bitreich.org 70 i 60 Err bitreich.org 70 i 61 Err bitreich.org 70 i 62 /*** screen management functions ***/ Err bitreich.org 70 i 63 Err bitreich.org 70 i 64 /*** _isblank ***/ Err bitreich.org 70 i 65 Err bitreich.org 70 i 66 int _isblank(int c){ Err bitreich.org 70 i 67 return c==32 || c==9 ? 1 : 0; Err bitreich.org 70 i 68 } Err bitreich.org 70 i 69 Err bitreich.org 70 i 70 Err bitreich.org 70 i 71 /*** Status bar ***/ Err bitreich.org 70 i 72 Err bitreich.org 70 i 73 char* mode_str(){ Err bitreich.org 70 i 74 switch(mode){ Err bitreich.org 70 i 75 case MOVE: Err bitreich.org 70 i 76 return "mov"; Err bitreich.org 70 i 77 case TEXT: Err bitreich.org 70 i 78 return "txt"; Err bitreich.org 70 i 79 case BOX: Err bitreich.org 70 i 80 return "box"; Err bitreich.org 70 i 81 case ARROW: Err bitreich.org 70 i 82 return "arr"; Err bitreich.org 70 i 83 case DEL: Err bitreich.org 70 i 84 return "del"; Err bitreich.org 70 i 85 case VIS: Err bitreich.org 70 i 86 return "vis"; Err bitreich.org 70 i 87 case PAR: Err bitreich.org 70 i 88 return "par"; Err bitreich.org 70 i 89 case REM: Err bitreich.org 70 i 90 return "rem"; Err bitreich.org 70 i 91 case TRP: Err bitreich.org 70 i 92 return "trp"; Err bitreich.org 70 i 93 default: Err bitreich.org 70 i 94 return "ERR"; Err bitreich.org 70 i 95 } Err bitreich.org 70 i 96 return "ERR"; Err bitreich.org 70 i 97 } Err bitreich.org 70 i 98 Err bitreich.org 70 i 99 char get_mark(char dir){ Err bitreich.org 70 i 100 switch(dir){ Err bitreich.org 70 i 101 case DIR_U: Err bitreich.org 70 i 102 return '^'; Err bitreich.org 70 i 103 case DIR_D: Err bitreich.org 70 i 104 return 'v'; Err bitreich.org 70 i 105 case DIR_L: Err bitreich.org 70 i 106 return '<'; Err bitreich.org 70 i 107 case DIR_R: Err bitreich.org 70 i 108 return '>'; Err bitreich.org 70 i 109 } Err bitreich.org 70 i 110 return '>'; Err bitreich.org 70 i 111 } Err bitreich.org 70 i 112 Err bitreich.org 70 i 113 Err bitreich.org 70 i 114 void status_bar(){ Err bitreich.org 70 i 115 Err bitreich.org 70 i 116 if (script) Err bitreich.org 70 i 117 return; Err bitreich.org 70 i 118 printf("\033[%d;1f\033[7m", HEIGHT+1); Err bitreich.org 70 i 119 printf("%*s", WIDTH-1, ""); Err bitreich.org 70 i 120 printf("\033[%d;1f\033[7m", HEIGHT+1); Err bitreich.org 70 i 121 printf(" x:%3d y:%3d -- MODE:%4s HL:%c VL:%c CN:%c SP:%c EP:%c %10s", Err bitreich.org 70 i 122 x, y, mode_str(), line_h, line_v, corner, mark_st, mark_end, ""); Err bitreich.org 70 i 123 if (!modified) Err bitreich.org 70 i 124 printf(" [%s]", fname ); Err bitreich.org 70 i 125 else Err bitreich.org 70 i 126 printf(" *%s*", fname ); Err bitreich.org 70 i 127 #ifdef DEBUG Err bitreich.org 70 i 128 printf(" '%d' ", screen.l[y].s[x]); Err bitreich.org 70 i 129 #endif Err bitreich.org 70 i 130 printf("\033[0m"); Err bitreich.org 70 i 131 fflush(stdout); Err bitreich.org 70 i 132 } Err bitreich.org 70 i 133 Err bitreich.org 70 i 134 char get_key(FILE *fc, char *msg){ Err bitreich.org 70 i 135 Err bitreich.org 70 i 136 if (script) Err bitreich.org 70 i 137 return 0; Err bitreich.org 70 i 138 printf("\033[%d;1f\033[7m", HEIGHT+1); Err bitreich.org 70 i 139 printf("%*s", WIDTH, ""); Err bitreich.org 70 i 140 printf("\033[%d;1f\033[7m", HEIGHT+1); Err bitreich.org 70 i 141 printf("%s", msg); Err bitreich.org 70 i 142 fflush(stdout); Err bitreich.org 70 i 143 printf("\033[0m"); Err bitreich.org 70 i 144 fflush(stdout); Err bitreich.org 70 i 145 return fgetc(fc); Err bitreich.org 70 i 146 } Err bitreich.org 70 i 147 Err bitreich.org 70 i 148 void get_string(FILE *fc, char *msg, char *s, int sz){ Err bitreich.org 70 i 149 Err bitreich.org 70 i 150 if (!script){ Err bitreich.org 70 i 151 printf("\033[%d;1f\033[7m", HEIGHT+1); Err bitreich.org 70 i 152 printf("%*s", WIDTH, ""); Err bitreich.org 70 i 153 printf("\033[%d;1f\033[7m", HEIGHT+1); Err bitreich.org 70 i 154 Err bitreich.org 70 i 155 /* We must activate echo now */ Err bitreich.org 70 i 156 t3 = t2; Err bitreich.org 70 i 157 t3.c_lflag |= (ECHO | ICANON); Err bitreich.org 70 i 158 tcsetattr(0, TCSANOW, &t3); Err bitreich.org 70 i 159 printf("%s", msg); Err bitreich.org 70 i 160 printf("\033[0m"); Err bitreich.org 70 i 161 } Err bitreich.org 70 i 162 fgets(s, sz, fc); Err bitreich.org 70 i 163 s[strlen(s)-1] = '\0'; Err bitreich.org 70 i 164 if (!script){ Err bitreich.org 70 i 165 tcsetattr(0, TCSANOW, &t2); Err bitreich.org 70 i 166 fflush(stdout); Err bitreich.org 70 i 167 } Err bitreich.org 70 i 168 } Err bitreich.org 70 i 169 Err bitreich.org 70 i 170 int is_yes(char c){ Err bitreich.org 70 i 171 return c=='y' ? 1 : c == 'Y'? 1 : 0; Err bitreich.org 70 i 172 } Err bitreich.org 70 i 173 Err bitreich.org 70 i 174 /*** Screen management ***/ Err bitreich.org 70 i 175 Err bitreich.org 70 i 176 Err bitreich.org 70 i 177 void show_cursor(){ Err bitreich.org 70 i 178 if (script) Err bitreich.org 70 i 179 return; Err bitreich.org 70 i 180 printf("\033[%d;%df", y+1, x+1); Err bitreich.org 70 i 181 fflush(stdout); Err bitreich.org 70 i 182 } Err bitreich.org 70 i 183 Err bitreich.org 70 i 184 Err bitreich.org 70 i 185 void set_xy(int _x, int _y, char c){ Err bitreich.org 70 i 186 ensure_num_lines(&screen, _y + 1); Err bitreich.org 70 i 187 ensure_line_length(&(screen.l[_y]), _x + 1); Err bitreich.org 70 i 188 while (screen.l[_y].lst<_x){ Err bitreich.org 70 i 189 screen.l[_y].lst ++; Err bitreich.org 70 i 190 screen.l[_y].s[screen.l[_y].lst] = BG; Err bitreich.org 70 i 191 } Err bitreich.org 70 i 192 screen.l[_y].s[_x] = c; Err bitreich.org 70 i 193 if (_x == screen.l[_y].lst) Err bitreich.org 70 i 194 screen.l[_y].s[_x+1] = '\0'; Err bitreich.org 70 i 195 } Err bitreich.org 70 i 196 Err bitreich.org 70 i 197 void set_cur(char c){ Err bitreich.org 70 i 198 set_xy(x, y, c); Err bitreich.org 70 i 199 } Err bitreich.org 70 i 200 Err bitreich.org 70 i 201 void draw_xy(int x, int y, char c){ Err bitreich.org 70 i 202 /* FIXME: check if x and y are valid!!!! */ Err bitreich.org 70 i 203 if (script) Err bitreich.org 70 i 204 return; Err bitreich.org 70 i 205 printf("\033[%d;%df",y+1,x+1); Err bitreich.org 70 i 206 putchar(c); Err bitreich.org 70 i 207 fflush(stdout); Err bitreich.org 70 i 208 } Err bitreich.org 70 i 209 Err bitreich.org 70 i 210 void update_current(){ Err bitreich.org 70 i 211 if (script) Err bitreich.org 70 i 212 return; Err bitreich.org 70 i 213 printf("\033[%d;%df",y+1,x+1); Err bitreich.org 70 i 214 putchar(screen.l[y].s[x]); Err bitreich.org 70 i 215 fflush(stdout); Err bitreich.org 70 i 216 } Err bitreich.org 70 i 217 Err bitreich.org 70 i 218 void erase_blank_lines(int y1, int y2){ Err bitreich.org 70 i 219 int j; Err bitreich.org 70 i 220 if (y1 > y2){ Err bitreich.org 70 i 221 y1 ^= y2; Err bitreich.org 70 i 222 y2 ^= y1; Err bitreich.org 70 i 223 y1 ^= y2; Err bitreich.org 70 i 224 } Err bitreich.org 70 i 225 Err bitreich.org 70 i 226 for (; y1 <= y2; y1++){ Err bitreich.org 70 i 227 j = screen.l[y1].lst; Err bitreich.org 70 i 228 while (j>=0 && _isblank(screen.l[y1].s[j])) Err bitreich.org 70 i 229 j--; Err bitreich.org 70 i 230 if (j<0){ Err bitreich.org 70 i 231 screen.l[y1].lst = -1; Err bitreich.org 70 i 232 screen.l[y1].s[0] = '\0'; Err bitreich.org 70 i 233 } Err bitreich.org 70 i 234 } Err bitreich.org 70 i 235 } Err bitreich.org 70 i 236 Err bitreich.org 70 i 237 Err bitreich.org 70 i 238 void erase_line(int i){ Err bitreich.org 70 i 239 screen.l[i].lst = -1; Err bitreich.org 70 i 240 screen.l[i].s[0] = '\0'; Err bitreich.org 70 i 241 } Err bitreich.org 70 i 242 Err bitreich.org 70 i 243 void erase_box(int x1, int y1, char c){ Err bitreich.org 70 i 244 int x_incr, y_incr, i; Err bitreich.org 70 i 245 Err bitreich.org 70 i 246 x_incr = x1 < x? +1: -1; Err bitreich.org 70 i 247 y_incr = y1 < y? +1: -1; Err bitreich.org 70 i 248 do{ Err bitreich.org 70 i 249 i = y1; Err bitreich.org 70 i 250 do{ Err bitreich.org 70 i 251 set_xy(x1, i, c); Err bitreich.org 70 i 252 } while(i != y && (1 | (i += y_incr))); Err bitreich.org 70 i 253 } while(x1 != x && (1 | (x1 += x_incr))); Err bitreich.org 70 i 254 Err bitreich.org 70 i 255 } Err bitreich.org 70 i 256 Err bitreich.org 70 i 257 void erase_screen(){ Err bitreich.org 70 i 258 int i; Err bitreich.org 70 i 259 for(i=0;i=WIDTH) *x = WIDTH-1; Err bitreich.org 70 i 266 if (*y<0) *y=0; Err bitreich.org 70 i 267 else if (*y>=HEIGHT) *y = HEIGHT -1; Err bitreich.org 70 i 268 } Err bitreich.org 70 i 269 Err bitreich.org 70 i 270 void reset_styles(){ Err bitreich.org 70 i 271 Err bitreich.org 70 i 272 cur_corn = 0; Err bitreich.org 70 i 273 corner = corners[0]; Err bitreich.org 70 i 274 cur_hl = cur_vl = 0; Err bitreich.org 70 i 275 cur_start = cur_end = 0; Err bitreich.org 70 i 276 line_h = hlines[cur_hl]; Err bitreich.org 70 i 277 line_v = vlines[cur_vl]; Err bitreich.org 70 i 278 mark_st = st_marks[cur_start]; Err bitreich.org 70 i 279 mark_end = end_marks[cur_end]; Err bitreich.org 70 i 280 } Err bitreich.org 70 i 281 Err bitreich.org 70 i 282 void redraw(){ Err bitreich.org 70 i 283 int i; Err bitreich.org 70 i 284 Err bitreich.org 70 i 285 if (script) Err bitreich.org 70 i 286 return; Err bitreich.org 70 i 287 printf("\033[2J\033[1;1H"); Err bitreich.org 70 i 288 for (i=0;i *x2) Err bitreich.org 70 i 549 *x2 = j; Err bitreich.org 70 i 550 } Err bitreich.org 70 i 551 } Err bitreich.org 70 i 552 Err bitreich.org 70 i 553 void crop_to_rect(int x1, int y1, int x2, int y2){ Err bitreich.org 70 i 554 int i; Err bitreich.org 70 i 555 Err bitreich.org 70 i 556 for (i=0; i<= y2-y1; i ++){ Err bitreich.org 70 i 557 ensure_line_length(&(screen.l[i]), screen.l[i+y1].lst+1); Err bitreich.org 70 i 558 sprintf(screen.l[i].s, "%s", screen.l[i+y1].s + x1); Err bitreich.org 70 i 559 screen.l[i].lst = x2 - x1; Err bitreich.org 70 i 560 screen.l[i].s[screen.l[i].lst + 1] = '\0'; Err bitreich.org 70 i 561 } Err bitreich.org 70 i 562 while (i< HEIGHT){ Err bitreich.org 70 i 563 screen.l[i].lst = -1; Err bitreich.org 70 i 564 screen.l[i].s[0]= '\0'; Err bitreich.org 70 i 565 i ++; Err bitreich.org 70 i 566 } Err bitreich.org 70 i 567 } Err bitreich.org 70 i 568 Err bitreich.org 70 i 569 void crop_to_nonblank(){ Err bitreich.org 70 i 570 int x1, x2, y1, y2; Err bitreich.org 70 i 571 find_nonblank_rect(&x1, &y1, &x2, &y2); Err bitreich.org 70 i 572 #ifdef DEBUG Err bitreich.org 70 i 573 fprintf(stderr, "crop rectangle: (%d, %d)-(%d, %d)\n", x1, y1, x2, y2); Err bitreich.org 70 i 574 #endif Err bitreich.org 70 i 575 copy_lines_to_ring(0, y2, PRV_STATE); Err bitreich.org 70 i 576 crop_to_rect(x1, y1, x2, y2); Err bitreich.org 70 i 577 copy_lines_to_ring(0, y2, NEW_STATE); Err bitreich.org 70 i 578 modified=1; Err bitreich.org 70 i 579 redraw(); Err bitreich.org 70 i 580 } Err bitreich.org 70 i 581 Err bitreich.org 70 i 582 /** position marks **/ Err bitreich.org 70 i 583 Err bitreich.org 70 i 584 void mark_pos(FILE *fc){ Err bitreich.org 70 i 585 Err bitreich.org 70 i 586 char c; Err bitreich.org 70 i 587 c = tolower(fgetc(fc)); Err bitreich.org 70 i 588 if (isalpha(c)){ Err bitreich.org 70 i 589 marks[c - 'a'].x = x; Err bitreich.org 70 i 590 marks[c - 'a'].y = y; Err bitreich.org 70 i 591 mark_map[c - 'a'] = 1; Err bitreich.org 70 i 592 #ifdef DEBUG Err bitreich.org 70 i 593 fprintf(stderr, "marking pos (%d, %d) as '%c'\n", x, y, c); Err bitreich.org 70 i 594 #endif Err bitreich.org 70 i 595 } Err bitreich.org 70 i 596 } Err bitreich.org 70 .