void fix_colors(int row1, int col1, int row2, int col2, int delta1, int delta2) { int r1, c1, r2, c2; struct crange *cr; struct frange *fr; fr = find_frange(currow, curcol); if (color_base) for (cr = color_base; cr; cr = cr->r_next) { r1 = cr->r_left->row; c1 = cr->r_left->col; r2 = cr->r_right->row; c2 = cr->r_right->col; if (!(fr && (c1 < fr->or_left->col || c1 > fr->or_right->col))) { if (r1 != r2 && r1 >= row1 && r1 <= row2) r1 = row2 - delta1; if (c1 != c2 && c1 >= col1 && c1 <= col2) c1 = col2 - delta1; } if (!(fr && (c2 < fr->or_left->col || c2 > fr->or_right->col))) { if (r1 != r2 && r2 >= row1 && r2 <= row2) r2 = row1 + delta2; if (c1 != c2 && c2 >= col1 && c2 <= col2) c2 = col1 + delta2; } if (r1 > r2 || c1 > c2) /* the 0 means delete color range */ add_crange(cr->r_left, cr->r_right, 0); else { cr->r_left = lookat(r1, c1); cr->r_right = lookat(r2, c2); } } }
void getframe (int fd) { struct frange *fr; *line = '\0'; if ((fr = find_frange(currow, curcol))) { sprintf(line, "%s", r_name(fr->or_left->row, fr->or_left->col, fr->or_right->row, fr->or_right->col)); strcat(line, " "); sprintf(line + strlen(line), "%s", r_name(fr->ir_left->row, fr->ir_left->col, fr->ir_right->row, fr->ir_right->col)); } strcat(line, "\n"); write(fd, line, strlen(line)); linelim = -1; }
void fix_frames(int row1, int col1, int row2, int col2, int delta1, int delta2) { int r1, r2, c1, c2; struct frange *fr, *cfr; cfr = find_frange(currow, curcol); if (frame_base) for (fr = frame_base; fr; fr = fr->r_next) { r1 = fr->or_left->row; c1 = fr->or_left->col; r2 = fr->or_right->row; c2 = fr->or_right->col; if (!(cfr && (c1 < cfr->or_left->col || c1 > cfr->or_right->col))) { if (r1 >= row1 && r1 <= row2) r1 = row2 - delta1; if (c1 >= col1 && c1 <= col2) c1 = col2 - delta1; } if (!(cfr && (c2 < cfr->or_left->col || c2 > cfr->or_right->col))) { if (r2 >= row1 && r2 <= row2) r2 = row1 + delta2; if (c2 >= col1 && c2 <= col2) c2 = col1 + delta2; } fr->or_left = lookat(r1, c1); fr->or_right = lookat(r2, c2); r1 = fr->ir_left->row; c1 = fr->ir_left->col; r2 = fr->ir_right->row; c2 = fr->ir_right->col; if (!(cfr && (c1 < cfr->or_left->col || c1 > cfr->or_right->col))) { if (r1 >= row1 && r1 <= row2) r1 = row2 - delta1; if (c1 >= col1 && c1 <= col2) c1 = col2 - delta1; } if (!(cfr && (c2 < cfr->or_left->col || c2 > cfr->or_right->col))) { if (r2 >= row1 && r2 <= row2) r2 = row1 + delta2; if (c2 >= col1 && c2 <= col2) c2 = col1 + delta2; } fr->ir_left = lookat(r1, c1); fr->ir_right = lookat(r2, c2); } }
void fix_ranges(int row1, int col1, int row2, int col2, int delta1, int delta2) { int r1, r2, c1, c2, i, j; struct range *r; struct frange *fr; struct ent *p; fr = find_frange(currow, curcol); /* First we fix all of the named ranges. */ if (rng_base) for (r = rng_base; r; r = r->r_next) { r1 = r->r_left.vp->row; c1 = r->r_left.vp->col; r2 = r->r_right.vp->row; c2 = r->r_right.vp->col; if (!(fr && (c1 < fr->or_left->col || c1 > fr->or_right->col))) { if (r1 >= row1 && r1 <= row2) r1 = row2 - delta1; if (c1 >= col1 && c1 <= col2) c1 = col2 - delta1; } if (!(fr && (c2 < fr->or_left->col || c2 > fr->or_right->col))) { if (r2 >= row1 && r2 <= row2) r2 = row1 + delta2; if (c2 >= col1 && c2 <= col2) c2 = col1 + delta2; } r->r_left.vp = lookat(r1, c1); r->r_right.vp = lookat(r2, c2); } /* Next, we go through all valid cells with expressions and fix any ranges * that need fixing. */ for (i=0; i<=maxrow; i++) for (j=0; j<=maxcol; j++) if ((p = *ATBL(tbl,i,j)) && p->expr) fix_enode(p->expr, row1, col2, row2, col2, delta1, delta2); fix_frames(row1, col1, row2, col2, delta1, delta2); fix_colors(row1, col1, row2, col2, delta1, delta2); }
void fix_enode(struct enode *e, int row1, int col1, int row2, int col2, int delta1, int delta2) { if (e) { if ((e->op & REDUCE)) { int r, c; int r1, c1, r2, c2; struct frange *fr; fr = find_frange(currow, curcol); r1 = e->e.r.left.vp->row; c1 = e->e.r.left.vp->col; r2 = e->e.r.right.vp->row; c2 = e->e.r.right.vp->col; if (r1>r2) r = r2, r2 = r1, r1 = r; if (c1>c2) c = c2, c2 = c1, c1 = c; if (!(fr && (c1 < fr->or_left->col || c1 > fr->or_right->col))) { if (r1 != r2 && r1 >= row1 && r1 <= row2) r1 = row2 - delta1; if (c1 != c2 && c1 >= col1 && c1 <= col2) c1 = col2 - delta1; } if (!(fr && (c2 < fr->or_left->col || c2 > fr->or_right->col))) { if (r1 != r2 && r2 >= row1 && r2 <= row2) r2 = row1 + delta2; if (c1 != c2 && c2 >= col1 && c2 <= col2) c2 = col1 + delta2; } e->e.r.left.vp = lookat(r1, c1); e->e.r.right.vp = lookat(r2, c2); } else if (e->op != O_VAR && e->op !=O_CONST && e->op != O_SCONST) { fix_enode(e->e.o.left, row1, col1, row2, col2, delta1, delta2); fix_enode(e->e.o.right, row1, col1, row2, col2, delta1, delta2); } } }