idraw.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 idraw.c (14191B) 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 Err bitreich.org 70 i 6 #include "gramscii.h" Err bitreich.org 70 i 7 #include "config.h" Err bitreich.org 70 i 8 Err bitreich.org 70 i 9 /** Extern declarations **/ Err bitreich.org 70 i 10 Err bitreich.org 70 i 11 extern int WIDTH, HEIGHT; Err bitreich.org 70 i 12 extern lineset_t screen; /* what is visualised */ Err bitreich.org 70 i 13 extern lineset_t cutbuf; /* cut/paste buffer */ Err bitreich.org 70 i 14 extern lineset_t *undo; /* undo list */ Err bitreich.org 70 i 15 Err bitreich.org 70 i 16 extern int undo_cur;/* undo position */ Err bitreich.org 70 i 17 extern int undo_lst;/* last valid undo position */ Err bitreich.org 70 i 18 Err bitreich.org 70 i 19 Err bitreich.org 70 i 20 extern int mode;/* mode */ Err bitreich.org 70 i 21 extern int dir;/* line direction */ Err bitreich.org 70 i 22 extern int step;/* current step */ Err bitreich.org 70 i 23 extern int x; Err bitreich.org 70 i 24 extern int y; Err bitreich.org 70 i 25 extern char corner; Err bitreich.org 70 i 26 extern char modified; /* set to 1 if screen modified since last save */ Err bitreich.org 70 i 27 Err bitreich.org 70 i 28 /* line and arrow markers */ Err bitreich.org 70 i 29 extern int cur_hl, cur_vl, cur_corn, cur_start, cur_end; Err bitreich.org 70 i 30 extern char line_h; Err bitreich.org 70 i 31 extern char line_v; Err bitreich.org 70 i 32 extern char mark_st; Err bitreich.org 70 i 33 extern char mark_end; Err bitreich.org 70 i 34 Err bitreich.org 70 i 35 /* number of available markers for each type */ Err bitreich.org 70 i 36 extern int hlines_sz; Err bitreich.org 70 i 37 extern int vlines_sz; Err bitreich.org 70 i 38 extern int corners_sz; Err bitreich.org 70 i 39 extern int stmarks_sz; Err bitreich.org 70 i 40 extern int endmarks_sz; Err bitreich.org 70 i 41 Err bitreich.org 70 i 42 Err bitreich.org 70 i 43 extern char autoend; /* set to 1 in auto-arrow mode */ Err bitreich.org 70 i 44 Err bitreich.org 70 i 45 /* Used by draw_arrow to identify the bounding box */ Err bitreich.org 70 i 46 extern int a_miny; Err bitreich.org 70 i 47 extern int a_maxy; Err bitreich.org 70 i 48 Err bitreich.org 70 i 49 /*** drawing-related functions ***/ Err bitreich.org 70 i 50 Err bitreich.org 70 i 51 /*** Lines and markers ***/ Err bitreich.org 70 i 52 Err bitreich.org 70 i 53 void toggle_hline(){ Err bitreich.org 70 i 54 Err bitreich.org 70 i 55 cur_hl = (cur_hl + 1) % hlines_sz; Err bitreich.org 70 i 56 line_h = hlines[cur_hl]; Err bitreich.org 70 i 57 Err bitreich.org 70 i 58 } Err bitreich.org 70 i 59 Err bitreich.org 70 i 60 void toggle_corner(){ Err bitreich.org 70 i 61 Err bitreich.org 70 i 62 cur_corn = (cur_corn + 1 ) % corners_sz; Err bitreich.org 70 i 63 corner = corners[cur_corn]; Err bitreich.org 70 i 64 Err bitreich.org 70 i 65 } Err bitreich.org 70 i 66 Err bitreich.org 70 i 67 void toggle_vline(){ Err bitreich.org 70 i 68 Err bitreich.org 70 i 69 cur_vl = (cur_vl + 1) % vlines_sz; Err bitreich.org 70 i 70 line_v = vlines[cur_vl]; Err bitreich.org 70 i 71 Err bitreich.org 70 i 72 } Err bitreich.org 70 i 73 Err bitreich.org 70 i 74 void toggle_st_mark(){ Err bitreich.org 70 i 75 Err bitreich.org 70 i 76 cur_start = (cur_start + 1 ) % stmarks_sz; Err bitreich.org 70 i 77 mark_st = st_marks[cur_start]; Err bitreich.org 70 i 78 } Err bitreich.org 70 i 79 Err bitreich.org 70 i 80 void toggle_end_mark(){ Err bitreich.org 70 i 81 Err bitreich.org 70 i 82 cur_end = (cur_end+ 1 ) % endmarks_sz; Err bitreich.org 70 i 83 mark_end = end_marks[cur_end]; Err bitreich.org 70 i 84 } Err bitreich.org 70 i 85 Err bitreich.org 70 i 86 int change_style(char c){ Err bitreich.org 70 i 87 switch(c){ Err bitreich.org 70 i 88 case '-': Err bitreich.org 70 i 89 toggle_hline(); Err bitreich.org 70 i 90 break; Err bitreich.org 70 i 91 case '|': Err bitreich.org 70 i 92 toggle_vline(); Err bitreich.org 70 i 93 break; Err bitreich.org 70 i 94 case '+': Err bitreich.org 70 i 95 toggle_corner(); Err bitreich.org 70 i 96 break; Err bitreich.org 70 i 97 case '<': Err bitreich.org 70 i 98 toggle_st_mark(); Err bitreich.org 70 i 99 break; Err bitreich.org 70 i 100 case '>': Err bitreich.org 70 i 101 toggle_end_mark(); Err bitreich.org 70 i 102 break; Err bitreich.org 70 i 103 case '.': Err bitreich.org 70 i 104 reset_styles(); Err bitreich.org 70 i 105 break; Err bitreich.org 70 i 106 default: Err bitreich.org 70 i 107 return 0; Err bitreich.org 70 i 108 } Err bitreich.org 70 i 109 return c; Err bitreich.org 70 i 110 } Err bitreich.org 70 i 111 Err bitreich.org 70 i 112 Err bitreich.org 70 i 113 Err bitreich.org 70 i 114 Err bitreich.org 70 i 115 /***** text, box, arrows *****/ Err bitreich.org 70 i 116 Err bitreich.org 70 i 117 void get_text(FILE *fc){ Err bitreich.org 70 i 118 char c; Err bitreich.org 70 i 119 int orig_x = x; Err bitreich.org 70 i 120 Err bitreich.org 70 i 121 redraw(); Err bitreich.org 70 i 122 copy_lines_to_ring(y, y, PRV_STATE); Err bitreich.org 70 i 123 while((c=fgetc(fc))!=EOF && c != 27){ Err bitreich.org 70 i 124 if(c=='\n'){ Err bitreich.org 70 i 125 set_cur(BG); Err bitreich.org 70 i 126 copy_lines_to_ring(y,y, NEW_STATE); Err bitreich.org 70 i 127 y += 1; Err bitreich.org 70 i 128 copy_lines_to_ring(y, y, PRV_STATE); Err bitreich.org 70 i 129 x = orig_x; Err bitreich.org 70 i 130 } Err bitreich.org 70 i 131 else { Err bitreich.org 70 i 132 set_cur(c); Err bitreich.org 70 i 133 update_current(); Err bitreich.org 70 i 134 modified = 1; Err bitreich.org 70 i 135 x += 1; Err bitreich.org 70 i 136 if (x >= WIDTH) Err bitreich.org 70 i 137 x = orig_x; Err bitreich.org 70 i 138 } Err bitreich.org 70 i 139 check_bound(&x, &y); Err bitreich.org 70 i 140 status_bar(); Err bitreich.org 70 i 141 show_cursor(); Err bitreich.org 70 i 142 } Err bitreich.org 70 i 143 if (modified) Err bitreich.org 70 i 144 copy_lines_to_ring(y, y, NEW_STATE); Err bitreich.org 70 i 145 mode=MOVE; Err bitreich.org 70 i 146 } Err bitreich.org 70 i 147 Err bitreich.org 70 i 148 void draw_box(int x1, int y1, int fix){ Err bitreich.org 70 i 149 Err bitreich.org 70 i 150 int xmin, ymin, xmax, ymax; Err bitreich.org 70 i 151 int i; Err bitreich.org 70 i 152 void (*f)(int, int, char); Err bitreich.org 70 i 153 Err bitreich.org 70 i 154 Err bitreich.org 70 i 155 xmin = MIN(x, x1); Err bitreich.org 70 i 156 xmax = MAX(x, x1); Err bitreich.org 70 i 157 ymin = MIN(y, y1); Err bitreich.org 70 i 158 ymax = MAX(y, y1); Err bitreich.org 70 i 159 Err bitreich.org 70 i 160 if (fix == FIX){ Err bitreich.org 70 i 161 f = set_xy; Err bitreich.org 70 i 162 copy_lines_to_ring(ymin, ymax, PRV_STATE); Err bitreich.org 70 i 163 } Err bitreich.org 70 i 164 else Err bitreich.org 70 i 165 f = draw_xy; Err bitreich.org 70 i 166 Err bitreich.org 70 i 167 for(i=xmin+1; i<=xmax; i++){ Err bitreich.org 70 i 168 f(i, ymin, line_h); Err bitreich.org 70 i 169 f(i, ymax, line_h); Err bitreich.org 70 i 170 } Err bitreich.org 70 i 171 for(i=ymin+1; i<=ymax; i++){ Err bitreich.org 70 i 172 f(xmin, i, line_v); Err bitreich.org 70 i 173 f(xmax, i, line_v); Err bitreich.org 70 i 174 } Err bitreich.org 70 i 175 f(xmin, ymin, corner); Err bitreich.org 70 i 176 f(xmin, ymax, corner); Err bitreich.org 70 i 177 f(xmax, ymin, corner); Err bitreich.org 70 i 178 f(xmax, ymax, corner); Err bitreich.org 70 i 179 if (fix == FIX) Err bitreich.org 70 i 180 copy_lines_to_ring(ymin, ymax, NEW_STATE); Err bitreich.org 70 i 181 show_cursor(); Err bitreich.org 70 i 182 } Err bitreich.org 70 i 183 Err bitreich.org 70 i 184 void draw_parallelogram(int x1, int y1, char st, char fix){ Err bitreich.org 70 i 185 int xmin, ymin, xmax, ymax; Err bitreich.org 70 i 186 int dy, minoff, maxoff, xoff, xincr; Err bitreich.org 70 i 187 int i; Err bitreich.org 70 i 188 char lean; Err bitreich.org 70 i 189 void (*f)(int, int, char); Err bitreich.org 70 i 190 Err bitreich.org 70 i 191 Err bitreich.org 70 i 192 xmin = MIN(x, x1); Err bitreich.org 70 i 193 xmax = MAX(x, x1); Err bitreich.org 70 i 194 ymin = MIN(y, y1); Err bitreich.org 70 i 195 ymax = MAX(y, y1); Err bitreich.org 70 i 196 dy = ymax - ymin; Err bitreich.org 70 i 197 Err bitreich.org 70 i 198 if (fix == FIX){ Err bitreich.org 70 i 199 f = set_xy; Err bitreich.org 70 i 200 copy_lines_to_ring(ymin, ymax, PRV_STATE); Err bitreich.org 70 i 201 } Err bitreich.org 70 i 202 else Err bitreich.org 70 i 203 f = draw_xy; Err bitreich.org 70 i 204 if (st == BOX_PARR){ Err bitreich.org 70 i 205 minoff = dy; Err bitreich.org 70 i 206 maxoff = 0; Err bitreich.org 70 i 207 lean = '/'; Err bitreich.org 70 i 208 xincr = -1; Err bitreich.org 70 i 209 } Err bitreich.org 70 i 210 else { Err bitreich.org 70 i 211 minoff = 0; Err bitreich.org 70 i 212 maxoff = dy; Err bitreich.org 70 i 213 lean = '\\'; Err bitreich.org 70 i 214 xincr = +1; Err bitreich.org 70 i 215 } Err bitreich.org 70 i 216 for(i=xmin+1; i<=xmax-dy; i++){ Err bitreich.org 70 i 217 f(i+minoff, ymin, line_h); Err bitreich.org 70 i 218 f(i+maxoff, ymax, line_h); Err bitreich.org 70 i 219 } Err bitreich.org 70 i 220 Err bitreich.org 70 i 221 for(i=ymin+1, xoff=minoff; i<=ymax; i++, xoff += xincr){ Err bitreich.org 70 i 222 f(xmin+(xoff+xincr), i, lean); Err bitreich.org 70 i 223 if (minoff) Err bitreich.org 70 i 224 f(xmax - (minoff - xoff - xincr), i, lean); Err bitreich.org 70 i 225 else Err bitreich.org 70 i 226 f(xmax - (maxoff - xoff - xincr), i, lean); Err bitreich.org 70 i 227 } Err bitreich.org 70 i 228 f(xmin+minoff, ymin, corner); Err bitreich.org 70 i 229 f(xmin+maxoff, ymax, corner); Err bitreich.org 70 i 230 f(xmax-maxoff, ymin, corner); Err bitreich.org 70 i 231 f(xmax-minoff, ymax, corner); Err bitreich.org 70 i 232 if (fix == FIX) Err bitreich.org 70 i 233 copy_lines_to_ring(ymin, ymax, NEW_STATE); Err bitreich.org 70 i 234 show_cursor(); Err bitreich.org 70 i 235 Err bitreich.org 70 i 236 } Err bitreich.org 70 i 237 Err bitreich.org 70 i 238 char flip_par_lean(char st){ Err bitreich.org 70 i 239 if (st == BOX_PARR) Err bitreich.org 70 i 240 return BOX_PARL; Err bitreich.org 70 i 241 else if (st == BOX_PARL) Err bitreich.org 70 i 242 return BOX_PARR; Err bitreich.org 70 i 243 return st; Err bitreich.org 70 i 244 } Err bitreich.org 70 i 245 Err bitreich.org 70 i 246 void draw_trapezium(int x1, int y1, char st, char fix){ Err bitreich.org 70 i 247 int xmin, ymin, xmax, ymax; Err bitreich.org 70 i 248 int dx, dy, ylong, yshort, xoff; Err bitreich.org 70 i 249 int xincr; Err bitreich.org 70 i 250 int i; Err bitreich.org 70 i 251 void (*f)(int, int, char); Err bitreich.org 70 i 252 char left_c, right_c; Err bitreich.org 70 i 253 Err bitreich.org 70 i 254 xmin = MIN(x, x1); Err bitreich.org 70 i 255 xmax = MAX(x, x1); Err bitreich.org 70 i 256 ymin = MIN(y, y1); Err bitreich.org 70 i 257 ymax = MAX(y, y1); Err bitreich.org 70 i 258 dx = (xmax - xmin); Err bitreich.org 70 i 259 dy = ymax - ymin; Err bitreich.org 70 i 260 /* dy = MAX(dx2, dy); */ Err bitreich.org 70 i 261 #ifdef DEBUG Err bitreich.org 70 i 262 fprintf(stderr, "dy: %d dx: %d\n", dy, dx); Err bitreich.org 70 i 263 #endif Err bitreich.org 70 i 264 if (fix == FIX){ Err bitreich.org 70 i 265 f = set_xy; Err bitreich.org 70 i 266 copy_lines_to_ring(ymin, ymax, PRV_STATE); Err bitreich.org 70 i 267 } Err bitreich.org 70 i 268 else Err bitreich.org 70 i 269 f = draw_xy; Err bitreich.org 70 i 270 Err bitreich.org 70 i 271 /* This is valid only for "upper" trapezoids */ Err bitreich.org 70 i 272 if (STYLE_IS(st, BOX_TRAP_U)){ Err bitreich.org 70 i 273 #ifdef DEBUG Err bitreich.org 70 i 274 fprintf(stderr, "This is an 'upward' trapezium\n"); Err bitreich.org 70 i 275 #endif Err bitreich.org 70 i 276 ylong = ymax; Err bitreich.org 70 i 277 yshort = ymin; Err bitreich.org 70 i 278 xoff = dy; Err bitreich.org 70 i 279 xincr = -1; Err bitreich.org 70 i 280 left_c = '/'; Err bitreich.org 70 i 281 right_c = '\\'; Err bitreich.org 70 i 282 } Err bitreich.org 70 i 283 else if (STYLE_IS(st, BOX_TRAP_D)){ Err bitreich.org 70 i 284 #ifdef DEBUG Err bitreich.org 70 i 285 fprintf(stderr, "This is a 'downward' trapezium\n"); Err bitreich.org 70 i 286 #endif Err bitreich.org 70 i 287 ylong = ymin; Err bitreich.org 70 i 288 yshort = ymax; Err bitreich.org 70 i 289 xoff = dy; Err bitreich.org 70 i 290 xincr = +1; Err bitreich.org 70 i 291 right_c = '/'; Err bitreich.org 70 i 292 left_c = '\\'; Err bitreich.org 70 i 293 } Err bitreich.org 70 i 294 /* Long side */ Err bitreich.org 70 i 295 for(i=xmin+1; i<=xmax; i++){ Err bitreich.org 70 i 296 f(i, ylong, line_h); Err bitreich.org 70 i 297 } Err bitreich.org 70 i 298 Err bitreich.org 70 i 299 if (STYLE_IS(st, BOX_TRAP_L)){ Err bitreich.org 70 i 300 /* short side */ Err bitreich.org 70 i 301 left_c = '/'; Err bitreich.org 70 i 302 right_c = line_v; Err bitreich.org 70 i 303 for(i=xmin+xoff;i0) { Err bitreich.org 70 i 471 /* If we are switching between horizontal and vertical, put a "corner" */ Err bitreich.org 70 i 472 if (((cur_dir & DIR_HOR) && (a[i] & DIR_VER)) || Err bitreich.org 70 i 473 ((cur_dir & DIR_VER) && (a[i] & DIR_HOR))){ Err bitreich.org 70 i 474 f(xl, yl, corner); Err bitreich.org 70 i 475 show_cursor(); Err bitreich.org 70 i 476 } Err bitreich.org 70 i 477 } Err bitreich.org 70 i 478 for(j=0; j a_maxy) a_maxy = yl; Err bitreich.org 70 i 485 f(xl, yl, line); Err bitreich.org 70 i 486 } Err bitreich.org 70 i 487 /* f(x,y,mark_end);*/ Err bitreich.org 70 i 488 cur_dir = a[i]; Err bitreich.org 70 i 489 } Err bitreich.org 70 i 490 if (autoend){ Err bitreich.org 70 i 491 if (cur_dir != DIR_N) Err bitreich.org 70 i 492 f(xl,yl, get_mark(cur_dir)); Err bitreich.org 70 i 493 } Err bitreich.org 70 i 494 else Err bitreich.org 70 i 495 f(xl,yl,mark_end); Err bitreich.org 70 i 496 show_cursor(); Err bitreich.org 70 i 497 } Err bitreich.org 70 i 498 Err bitreich.org 70 i 499 void get_arrow(FILE *fc){ Err bitreich.org 70 i 500 Err bitreich.org 70 i 501 char c; Err bitreich.org 70 i 502 int orig_x=x, orig_y=y, arrow_len; Err bitreich.org 70 i 503 static short *arrow = NULL; Err bitreich.org 70 i 504 short *tmp = NULL; Err bitreich.org 70 i 505 static int arrow_sz; Err bitreich.org 70 i 506 Err bitreich.org 70 i 507 if (!arrow){ Err bitreich.org 70 i 508 arrow_sz = 100; Err bitreich.org 70 i 509 arrow = malloc(arrow_sz * sizeof(short)); Err bitreich.org 70 i 510 if (arrow == NULL){ Err bitreich.org 70 i 511 fprintf(stderr, "Unable to allocate arrow"); Err bitreich.org 70 i 512 cleanup(1); Err bitreich.org 70 i 513 } Err bitreich.org 70 i 514 } Err bitreich.org 70 i 515 arrow_len = 0; Err bitreich.org 70 i 516 dir = DIR_N; Err bitreich.org 70 i 517 Err bitreich.org 70 i 518 redraw(); Err bitreich.org 70 i 519 step = 1; Err bitreich.org 70 i 520 draw_arrow(x,y, arrow, 0, NOFIX); Err bitreich.org 70 i 521 while((c=fgetc(fc))!=EOF && c != 27 && c!= 'a' && c != '\n'){ Err bitreich.org 70 i 522 if (change_style(c)) Err bitreich.org 70 i 523 goto update_arrow; Err bitreich.org 70 i 524 if (!move_around(c, fc, 0)) Err bitreich.org 70 i 525 continue; Err bitreich.org 70 i 526 check_bound(&x, &y); Err bitreich.org 70 i 527 /* FIXME: if we are out of bound, do nothing? */ Err bitreich.org 70 i 528 if (arrow_len == arrow_sz){ Err bitreich.org 70 i 529 arrow_sz *=2; Err bitreich.org 70 i 530 tmp = realloc(arrow, arrow_sz * sizeof(short)); Err bitreich.org 70 i 531 if (tmp == NULL){ Err bitreich.org 70 i 532 fprintf(stderr, "Unable to reallocate arrow"); Err bitreich.org 70 i 533 cleanup(1); Err bitreich.org 70 i 534 } Err bitreich.org 70 i 535 arrow = tmp; Err bitreich.org 70 i 536 } Err bitreich.org 70 i 537 if (dir != DIR_N){ Err bitreich.org 70 i 538 arrow[arrow_len++] = dir; Err bitreich.org 70 i 539 arrow[arrow_len++] = step; Err bitreich.org 70 i 540 } Err bitreich.org 70 i 541 redraw(); Err bitreich.org 70 i 542 step = 1; Err bitreich.org 70 i 543 update_arrow: Err bitreich.org 70 i 544 draw_arrow(orig_x, orig_y, arrow, arrow_len, NOFIX); Err bitreich.org 70 i 545 status_bar(); Err bitreich.org 70 i 546 show_cursor(); Err bitreich.org 70 i 547 } Err bitreich.org 70 i 548 if (c == 'a' || c == '\n'){ Err bitreich.org 70 i 549 copy_lines_to_ring(a_miny, a_maxy, PRV_STATE); Err bitreich.org 70 i 550 draw_arrow(orig_x, orig_y, arrow, arrow_len, FIX); Err bitreich.org 70 i 551 copy_lines_to_ring(a_miny, a_maxy, NEW_STATE); Err bitreich.org 70 i 552 modified = 1; Err bitreich.org 70 i 553 } Err bitreich.org 70 i 554 redraw(); Err bitreich.org 70 i 555 mode = MOVE; Err bitreich.org 70 i 556 } Err bitreich.org 70 i 557 Err bitreich.org 70 i 558 Err bitreich.org 70 i 559 void do_erase(int x1, int y1){ Err bitreich.org 70 i 560 int i; Err bitreich.org 70 i 561 switch(dir){ Err bitreich.org 70 i 562 case DIR_R: Err bitreich.org 70 i 563 for(i=x1; i<=x; i++) set_xy(i,y,BG); Err bitreich.org 70 i 564 break; Err bitreich.org 70 i 565 case DIR_L: Err bitreich.org 70 i 566 for(i=x1; i>=x; i--) set_xy(i,y,BG); Err bitreich.org 70 i 567 break; Err bitreich.org 70 i 568 case DIR_U: Err bitreich.org 70 i 569 for(i=y1; i>=y; i--) set_xy(x,i,BG); Err bitreich.org 70 i 570 break; Err bitreich.org 70 i 571 case DIR_D: Err bitreich.org 70 i 572 for(i=y1; i<=y; i++) set_xy(x,i,BG); Err bitreich.org 70 i 573 break; Err bitreich.org 70 i 574 } Err bitreich.org 70 i 575 } Err bitreich.org 70 i 576 Err bitreich.org 70 i 577 Err bitreich.org 70 i 578 void erase(FILE *fc){ Err bitreich.org 70 i 579 /*FIXME: add affected lines to undo */ Err bitreich.org 70 i 580 char c; Err bitreich.org 70 i 581 int orig_x = x, orig_y = y; Err bitreich.org 70 i 582 char first = 1, opened = 0; Err bitreich.org 70 i 583 status_bar(); Err bitreich.org 70 i 584 show_cursor(); Err bitreich.org 70 i 585 while((c=fgetc(fc))!=EOF && c!=27 && c!= 'x' && c != '\n'){ Err bitreich.org 70 i 586 if (!move_around(c, fc, 0)) continue; Err bitreich.org 70 i 587 check_bound(&x, &y); Err bitreich.org 70 i 588 if (first || Err bitreich.org 70 i 589 (y != orig_y && ! opened) || Err bitreich.org 70 i 590 (y == orig_y && x != orig_x && !opened) ){ Err bitreich.org 70 i 591 copy_lines_to_ring(MIN(y, orig_y), MAX(y, orig_y), PRV_STATE); Err bitreich.org 70 i 592 first = 0; Err bitreich.org 70 i 593 opened = 1; Err bitreich.org 70 i 594 } Err bitreich.org 70 i 595 do_erase(orig_x, orig_y); Err bitreich.org 70 i 596 if (y != orig_y && opened){ Err bitreich.org 70 i 597 copy_lines_to_ring(MIN(y, orig_y), MAX(y, orig_y), NEW_STATE); Err bitreich.org 70 i 598 opened = 0; Err bitreich.org 70 i 599 } Err bitreich.org 70 i 600 step = 1; Err bitreich.org 70 i 601 modified = 1; Err bitreich.org 70 i 602 orig_x = x; Err bitreich.org 70 i 603 orig_y = y; Err bitreich.org 70 i 604 redraw(); Err bitreich.org 70 i 605 status_bar(); Err bitreich.org 70 i 606 show_cursor(); Err bitreich.org 70 i 607 } Err bitreich.org 70 i 608 if (opened) Err bitreich.org 70 i 609 copy_lines_to_ring(y, y, NEW_STATE); Err bitreich.org 70 i 610 mode = MOVE; Err bitreich.org 70 i 611 } Err bitreich.org 70 i 612 Err bitreich.org 70 i 613 Err bitreich.org 70 i 614 Err bitreich.org 70 i 615 Err bitreich.org 70 i 616 Err bitreich.org 70 i 617 /*** Visual ***/ Err bitreich.org 70 i 618 Err bitreich.org 70 i 619 Err bitreich.org 70 i 620 void visual_box(FILE *fc){ Err bitreich.org 70 i 621 int orig_x =x, orig_y = y; Err bitreich.org 70 i 622 char c, f = BG; Err bitreich.org 70 i 623 Err bitreich.org 70 i 624 redraw(); Err bitreich.org 70 i 625 step = 1; Err bitreich.org 70 i 626 set_video(VIDEO_REV); Err bitreich.org 70 i 627 draw_box(x,y,NOFIX); Err bitreich.org 70 i 628 while((c=fgetc(fc))!=EOF && c != 27 && c!= 'v' && c != '\n'){ Err bitreich.org 70 i 629 if (!move_around(c, fc, 1)) switch(c){ Err bitreich.org 70 i 630 case 'y': /* yank (copy) */ Err bitreich.org 70 i 631 yank_region(MIN(orig_x,x), MIN(orig_y,y), MAX(orig_x, x), MAX(orig_y, y)); Err bitreich.org 70 i 632 goto vis_exit; Err bitreich.org 70 i 633 break; Err bitreich.org 70 i 634 case 'f':/* fill */ Err bitreich.org 70 i 635 f = get_key(fc, "fill char: "); /** FALLTHROUGH **/ Err bitreich.org 70 i 636 case 'x':/* erase */ Err bitreich.org 70 i 637 if (c == 'x') Err bitreich.org 70 i 638 yank_region(MIN(orig_x,x), MIN(orig_y,y), MAX(orig_x, x), MAX(orig_y, y)); Err bitreich.org 70 i 639 copy_lines_to_ring(MIN(orig_y, y), MAX(orig_y, y), PRV_STATE); Err bitreich.org 70 i 640 erase_box(orig_x, orig_y, f); Err bitreich.org 70 i 641 erase_blank_lines(MIN(y,orig_y), MAX(y, orig_y)); Err bitreich.org 70 i 642 copy_lines_to_ring(MIN(orig_y, y), MAX(orig_y, y), NEW_STATE); Err bitreich.org 70 i 643 Err bitreich.org 70 i 644 modified = 1; Err bitreich.org 70 i 645 goto vis_exit; Err bitreich.org 70 i 646 break; Err bitreich.org 70 i 647 case 'C':/* crop-to-region */ Err bitreich.org 70 i 648 copy_lines_to_ring(0, HEIGHT-1, PRV_STATE); Err bitreich.org 70 i 649 crop_to_rect(MIN(x, orig_x), MIN(y, orig_y), MAX(x, orig_x), MAX(y, orig_y)); Err bitreich.org 70 i 650 copy_lines_to_ring(0, HEIGHT-1, NEW_STATE); Err bitreich.org 70 i 651 modified = 1; Err bitreich.org 70 i 652 goto vis_exit; Err bitreich.org 70 i 653 break; Err bitreich.org 70 i 654 } Err bitreich.org 70 i 655 check_bound(&x, &y); Err bitreich.org 70 i 656 set_video(VIDEO_NRM); Err bitreich.org 70 i 657 redraw(); Err bitreich.org 70 i 658 step = 1; Err bitreich.org 70 i 659 f = BG; Err bitreich.org 70 i 660 set_video(VIDEO_REV); Err bitreich.org 70 i 661 draw_box(orig_x, orig_y, NOFIX); Err bitreich.org 70 i 662 status_bar(); Err bitreich.org 70 i 663 show_cursor(); Err bitreich.org 70 i 664 } Err bitreich.org 70 i 665 vis_exit: Err bitreich.org 70 i 666 set_video(VIDEO_NRM); Err bitreich.org 70 i 667 redraw(); Err bitreich.org 70 i 668 mode = MOVE; Err bitreich.org 70 i 669 } Err bitreich.org 70 i 670 Err bitreich.org 70 i 671 /*** yank/paste/undo ***/ Err bitreich.org 70 i 672 Err bitreich.org 70 i 673 void paste(){ Err bitreich.org 70 i 674 int y2; Err bitreich.org 70 i 675 Err bitreich.org 70 i 676 y2 = y + cutbuf.num - 1; Err bitreich.org 70 i 677 copy_lines_to_ring(y, y2, PRV_STATE); Err bitreich.org 70 i 678 paste_region(x, y); Err bitreich.org 70 i 679 copy_lines_to_ring(y, y2, NEW_STATE); Err bitreich.org 70 i 680 redraw(); Err bitreich.org 70 i 681 } Err bitreich.org 70 i 682 Err bitreich.org 70 i 683 void put_lines(lineset_t *u){ Err bitreich.org 70 i 684 int i, n; Err bitreich.org 70 i 685 Err bitreich.org 70 i 686 for (i=0; i< u->num; i++){ Err bitreich.org 70 i 687 n = u->l[i].n; Err bitreich.org 70 i 688 ensure_line_length(&(screen.l[i]), strlen(u->l[i].s)); Err bitreich.org 70 i 689 strcpy(screen.l[n].s, u->l[i].s); Err bitreich.org 70 i 690 screen.l[n].lst = strlen(u->l[i].s)-1; Err bitreich.org 70 i 691 } Err bitreich.org 70 i 692 } Err bitreich.org 70 i 693 Err bitreich.org 70 i 694 Err bitreich.org 70 i 695 void undo_change(){ Err bitreich.org 70 i 696 if (undo_cur >= 0){ Err bitreich.org 70 i 697 if (undo_cur > undo_lst) Err bitreich.org 70 i 698 undo_cur = undo_lst; Err bitreich.org 70 i 699 put_lines(& (undo[undo_cur])); Err bitreich.org 70 i 700 undo_cur -= 2; Err bitreich.org 70 i 701 modified = 1; Err bitreich.org 70 i 702 } Err bitreich.org 70 i 703 redraw(); Err bitreich.org 70 i 704 } Err bitreich.org 70 i 705 Err bitreich.org 70 i 706 void redo_change(){ Err bitreich.org 70 i 707 if (undo_cur <= undo_lst-2){ Err bitreich.org 70 i 708 if (undo_cur > 0) Err bitreich.org 70 i 709 put_lines(& (undo[undo_cur+1])); Err bitreich.org 70 i 710 undo_cur +=2; Err bitreich.org 70 i 711 put_lines(& (undo[undo_cur+1])); Err bitreich.org 70 i 712 modified = 1; Err bitreich.org 70 i 713 } Err bitreich.org 70 i 714 redraw(); Err bitreich.org 70 i 715 } Err bitreich.org 70 i 716 Err bitreich.org 70 i 717 Err bitreich.org 70 i 718 /** Comments **/ Err bitreich.org 70 i 719 Err bitreich.org 70 i 720 void get_comment(FILE *fc){ Err bitreich.org 70 i 721 char c; Err bitreich.org 70 i 722 redraw(); Err bitreich.org 70 i 723 while((c = fgetc(fc)) != EOF && c != '\n'); Err bitreich.org 70 i 724 mode = MOVE; Err bitreich.org 70 i 725 } Err bitreich.org 70 i 726 Err bitreich.org 70 .