diff options
Diffstat (limited to 'lib/libncurses/lib_mvcur.c')
| -rw-r--r-- | lib/libncurses/lib_mvcur.c | 700 |
1 files changed, 0 insertions, 700 deletions
diff --git a/lib/libncurses/lib_mvcur.c b/lib/libncurses/lib_mvcur.c deleted file mode 100644 index 388c680b42e2..000000000000 --- a/lib/libncurses/lib_mvcur.c +++ /dev/null @@ -1,700 +0,0 @@ -/*--------------------------------------------------------------------------- - * - * lib_mvcur.c - * - * The routine mvcur() etc. - * - * last edit-date: [Wed Jun 16 14:13:22 1993] - * - * -hm conversion from termcap -> terminfo - * -hm optimization debugging - * -hm zeyd's ncurses 0.7 update - * -hm eat_newline_glitch bugfix - * -hm hpux lint'ing .. - * - *---------------------------------------------------------------------------*/ - -/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for * -* details. If they are missing then this copy is in violation of * -* the copyright conditions. */ - -#include <string.h> -#include <stdlib.h> -#include "terminfo.h" -#include "curses.priv.h" - -#ifndef OPT_MVCUR -/* -** -** mvcur(oldrow, oldcol, newrow, newcol) -** A hack for terminals that are smart enough -** to know how to move cursor. -** There is still a bug in the alternative long- -** winded code. -** -*/ - -int mvcur(int oldrow, int oldcol, int newrow, int newcol) -{ - T(("mvcur(%d,%d,%d,%d) called", oldrow, oldcol, newrow, newcol)); - - if(!cursor_address) - return ERR; - - newrow %= lines; - newcol %= columns; - - if (cursor_address) - putp(tparm(cursor_address, newrow, newcol)); - return OK; - -} - -#else - -#define BUFSIZE 128 /* size of strategy buffer */ - -struct Sequence -{ - int vec[BUFSIZE]; /* vector of operations */ - int *end; /* end of vector */ - int cost; /* cost of vector */ -}; - -static void row(struct Sequence *outseq, int orow, int nrow); -static void column(struct Sequence *outseq, int ocol, int ncol); -static void simp_col(struct Sequence *outseq, int oc, int nc); -static void zero_seq(struct Sequence *seq); -static void add_seq(struct Sequence *seq1, struct Sequence *seq2); -static void out_seq(struct Sequence *seq); -static void update_ops(void); -static void init_costs(int costs[]); -static int countc(char ch); -static void add_op(struct Sequence *seq, int op, ...); -static char *sequence(int op); - -static int c_count; /* used for counting tputs output */ - -#define INFINITY 1000 /* biggest, impossible sequence cost */ -#define NUM_OPS 16 /* num. term. control sequences */ -#define NUM_NPARM 9 /* num. ops wo/ parameters */ - - /* operator indexes into op_info */ - -#define CARRIAGE_RETURN 0 /* watch out for nl mapping */ -#define CURS_DOWN 1 -#define CURS_HOME 2 -#define CURS_LEFT 3 -#define CURS_RIGHT 4 -#define CURS_TO_LL 5 -#define CURS_UP 6 -#define TAB 7 -#define BACK_TAB 8 -#define ROW_ADDR 9 -#define COL_ADDR 10 -#define P_DOWN_CURS 11 -#define P_LEFT_CURS 12 -#define P_RIGHT_CURS 13 -#define P_UP_CURS 14 -#define CURS_ADDR 15 - -static bool loc_init = FALSE; /* set if op_info is init'ed */ - -static bool rel_ok; /* set if we really know where we are */ - -/* - * op_info[NUM_OPS] - * - * op_info[] contains for operations with no parameters - * the cost of the operation. These ops should be first in the array. - * For operations with parameters, op_info[] contains - * the negative of the number of parameters. - */ - -static int op_info[NUM_OPS] = { - 0, /* carriage_return */ - 0, /* cursor_down */ - 0, /* cursor_home */ - 0, /* cursor_left */ - 0, /* cursor_right */ - 0, /* cursor_to_ll */ - 0, /* cursor_up */ - 0, /* tab */ - 0, /* back_tab */ - -1, /* row_address */ - -1, /* column_address */ - -1, /* parm_down_cursor */ - -1, /* parm_left_cursor */ - -1, /* parm_right_cursor */ - -1, /* parm_up_cursor */ - -2 /* cursor_address */ -}; - -/* -** Make_seq_best(best, try) -** -** Make_seq_best() copies try to best if try->cost < best->cost -** -** fixed the old version, now it really runs .. (-hm/08.04.93) -** -*/ - -inline void Make_seq_best(struct Sequence *best, struct Sequence *try) -{ - if (best->cost > try->cost) { - register int *sptr; - - sptr = try->vec; /* src ptr */ - best->end = best->vec; /* dst ptr */ - while(sptr != try->end) /* copy src -> dst */ - *(best->end++) = *(sptr++); - best->cost = try->cost; /* copy cost */ - } -} - - -/* -** -** mvcur(oldrow, oldcol, newrow, newcol) -** -** mvcur() optimally moves the cursor from the position -** specified by (oldrow, oldcol) to (newrow, newcol). If -** (oldrow, oldcol) == (-1, -1), mvcur() does not use relative -** cursor motions. If the coordinates are otherwise -** out of bounds, it mods them into range. -** -** Revisions needed: -** eat_newline_glitch, auto_right_margin -*/ - -int mvcur(int oldrow, int oldcol, int newrow, int newcol) -{ -struct Sequence seqA, seqB, /* allocate work structures */ - col0seq, /* sequence to get from col0 to nc */ - *best, /* best sequence so far */ - *try; /* next try */ -bool nlstat = SP->_nl; /* nl-output-mapping in effect ?*/ - - T(("=============================\nmvcur(%d,%d,%d,%d) called", - oldrow, oldcol, newrow, newcol)); - - if ((oldrow == newrow) && (oldcol == newcol)) - return OK; - - if (oldcol == columns-1 && eat_newline_glitch && auto_right_margin) { - putp(tparm(cursor_address, newrow, newcol)); - return OK; - } - -#if 0 - if (nlstat) - nonl(); -#endif - update_ops(); /* make sure op_info[] is current */ - - if (oldrow < 0 || oldcol < 0 || (eat_newline_glitch && oldcol == 0 )) { - rel_ok = FALSE; /* relative ops ok? */ - } else { - rel_ok = TRUE; - oldrow %= lines; /* mod values into range */ - oldcol %= columns; - } - - newrow %= lines; - newcol %= columns; - - best = &seqA; - try = &seqB; - - /* try out direct cursor addressing */ - - zero_seq(best); - add_op(best, CURS_ADDR, newrow, newcol); - - /* try out independent row/column addressing */ - - if(rel_ok) { - zero_seq(try); - row(try, oldrow, newrow); - column(try, oldcol, newcol); - Make_seq_best(best, try); - } - - zero_seq(&col0seq); /* store seq. to get from c0 to nc */ - column(&col0seq, 0, newcol); - - if(col0seq.cost < INFINITY) { /* can get from col0 to newcol */ - - /* try out homing and then row/column */ - - if (! rel_ok || newcol < oldcol || newrow < oldrow) { - zero_seq(try); - add_op(try, CURS_HOME, 1); - row(try, 0, newrow); - add_seq(try, &col0seq); - Make_seq_best(best, try); - } - - /* try out homing to last line and then row/column */ - - if (! rel_ok || newcol < oldcol || newrow > oldrow) { - zero_seq(try); - add_op(try, CURS_TO_LL, 1); - row(try, lines - 1, newrow); - add_seq(try, &col0seq); - Make_seq_best(best, try); - } - } - - out_seq(best); -#if 0 - if(nlstat) - nl(); -#endif - - T(("===================================")); - - return OK; -} - -/* -** row(outseq, oldrow, newrow) -** -** row() adds the best sequence for moving -** the cursor from oldrow to newrow to seq. -** row() considers row_address, parm_up/down_cursor -** and cursor_up/down. -*/ - -static void -row(struct Sequence *outseq, /* where to put the output */ -int orow, int nrow) /* old, new cursor locations */ -{ -struct Sequence seqA, seqB, - *best, /* best sequence so far */ - *try; /* next try */ - -int parm_cursor, one_step; - - best = &seqA; - try = &seqB; - - if (nrow == orow) - return; - - if (nrow < orow) { - parm_cursor = P_UP_CURS; - one_step = CURS_UP; - } else { - parm_cursor = P_DOWN_CURS; - one_step = CURS_DOWN; - } - - /* try out direct row addressing */ - - zero_seq(best); - add_op(best, ROW_ADDR, nrow); - - /* try out paramaterized up or down motion */ - - if (rel_ok) { - zero_seq(try); - add_op(try, parm_cursor, abs(orow - nrow)); - Make_seq_best(best, try); - } - - /* try getting there one step at a time... */ - - if (rel_ok) { - zero_seq(try); - add_op(try, one_step, abs(orow-nrow)); - Make_seq_best(best, try); - } - - add_seq(outseq, best); -} - - -/* -** column(outseq, oldcol, newcol) -** -** column() adds the best sequence for moving -** the cursor from oldcol to newcol to outseq. -** column() considers column_address, parm_left/right_cursor, -** simp_col(), and carriage_return followed by simp_col(). -*/ - -static void column(struct Sequence *outseq, /* where to put the output */ -int ocol, int ncol) /* old, new cursor column */ -{ -struct Sequence seqA, seqB, - *best, *try; -int parm_cursor; /* set to either parm_up/down_cursor */ - - best = &seqA; - try = &seqB; - - if (ncol == ocol) - return; - - if (ncol < ocol) - parm_cursor = P_LEFT_CURS; - else - parm_cursor = P_RIGHT_CURS; - - /* try out direct column addressing */ - - zero_seq(best); - add_op(best, COL_ADDR, ncol); - - /* try carriage_return then simp_col() */ - - if(! rel_ok || (ncol < ocol)) { - zero_seq(try); - add_op(try, CARRIAGE_RETURN, 1); - simp_col(try, 0, ncol); - Make_seq_best(best, try); - } - if(rel_ok) { - /* try out paramaterized left or right motion */ - - zero_seq(try); - add_op(try, parm_cursor, abs(ocol - ncol)); - Make_seq_best(best, try); - - /* try getting there with simp_col() */ - - zero_seq(try); - simp_col(try, ocol, ncol); - Make_seq_best(best, try); - } - - add_seq(outseq, best); -} - - -/* -** simp_col(outseq, oldcol, newcol) -** -** simp_col() adds the best simple sequence for getting -** from oldcol to newcol to outseq. -** simp_col() considers (back_)tab and cursor_left/right. -** -** Revisions needed: -** Simp_col asssumes that the cost of a (back_)tab -** is less then the cost of one-stepping to get to the same column. -** Should sometimes use overprinting instead of cursor_right. -*/ - -static void -simp_col( struct Sequence *outseq, /* place to put sequence */ -int oc, int nc) /* old column, new column */ -{ -struct Sequence seqA, seqB, tabseq, - *best, *try; -int mytab, tabs, onepast, - one_step, opp_step; - - onepast = -1; - - if (oc == nc) - return; - - if(! rel_ok) { - outseq->cost = INFINITY; - return; - } - - best = &seqA; - try = &seqB; - - if(oc < nc) { - mytab = TAB; - - if (init_tabs > 0 && op_info[TAB] < INFINITY) { - tabs = (nc / init_tabs) - (oc / init_tabs); - onepast = ((nc / init_tabs) + 1) * init_tabs; - if (tabs) - oc = onepast - init_tabs; /* consider it done */ - } else { - tabs = 0; - } - one_step = CURS_RIGHT; - opp_step = CURS_LEFT; - } else { - mytab = BACK_TAB; - if (init_tabs > 0 && op_info[BACK_TAB] < INFINITY) { - tabs = (oc / init_tabs) - (nc / init_tabs); - onepast = ((nc - 1) / init_tabs) * init_tabs; - if (tabs) - oc = onepast + init_tabs; /* consider it done */ - } else { - tabs = 0; - } - one_step = CURS_LEFT; - opp_step = CURS_RIGHT; - } - - /* tab as close as possible to nc */ - - zero_seq(&tabseq); - add_op(&tabseq, mytab, tabs); - - /* try extra tab and backing up */ - - zero_seq(best); - - if (onepast >= 0 && onepast < columns) { - add_op(best, mytab, 1); - add_op(best, opp_step, abs(onepast - nc)); - } else { - best->cost = INFINITY; /* make sure of next swap */ - } - - /* try stepping to nc */ - - zero_seq(try); - add_op(try, one_step, abs(nc - oc)); - Make_seq_best(best, try); - - if (tabseq.cost < INFINITY) - add_seq(outseq, &tabseq); - add_seq(outseq, best); -} - - -/* -** zero_seq(seq) empties seq. -** add_seq(seq1, seq2) adds seq1 to seq2. -** out_seq(seq) outputs a sequence. -*/ - -static void -zero_seq(seq) -struct Sequence *seq; -{ - seq->end = seq->vec; - seq->cost = 0; -} - -static void -add_seq(struct Sequence *seq1, struct Sequence *seq2) -{ -int *vptr; - - T(("add_seq(%x, %x)", seq1, seq2)); - - if(seq1->cost >= INFINITY || seq2->cost >= INFINITY) - seq1->cost = INFINITY; - else { - vptr = seq2->vec; - while (vptr != seq2->end) - *(seq1->end++) = *(vptr++); - seq1->cost += seq2->cost; - } -} - - -static void -out_seq(struct Sequence *seq) -{ -int *opptr, prm[9], ps, p, op; -int count; -char *sequence(); - - T(("out_seq(%x)", seq)); - - if (seq->cost >= INFINITY) - return; - - for (opptr = seq->vec; opptr < seq->end; opptr++) { - op = *opptr; /* grab operator */ - ps = -op_info[op]; - if(ps > 0) { /* parameterized */ - for (p = 0; p < ps; p++) /* fill in needed parms */ - prm[p] = *(++opptr); - - putp(tparm(sequence(op), - prm[0], prm[1], prm[2], prm[3], prm[4], - prm[5], prm[6], prm[7], prm[8])); - } else { - count = *(++opptr); - /*rev should save tputs output instead of mult calls */ - while (count--) /* do count times */ - putp(sequence(op)); - } - } -} - - -/* -** update_ops() -** -** update_ops() makes sure that -** the op_info[] array is updated and initializes -** the cost array for SP if needed. -*/ - -static void -update_ops() -{ - T(("update_ops()")); - - if (SP) { /* SP structure exists */ - int op; - - if (! SP->_costinit) { /* this term not yet assigned costs */ - loc_init = FALSE; /* if !SP in the future, new term */ - init_costs(SP->_costs); /* fill term costs */ - SP->_costinit = TRUE; - } - - for (op = 0; op < NUM_NPARM; op++) - op_info[op] = SP->_costs[op]; /* set up op_info */ - - /* check for newline that might be mapped... */ - - if (SP->_nlmapping && index(sequence(CURS_DOWN), '\n')) - op_info[CURS_DOWN] = INFINITY; - } else { - if (! loc_init) { /* using local costs */ - loc_init = TRUE; - init_costs(op_info); /* set up op_info */ - } - - /* check for newline that might be mapped... */ - - if (index(sequence(CURS_DOWN), '\n')) - op_info[CURS_DOWN] = INFINITY; - } -} - - -/* -** init_costs(costs) -** -** init_costs() fills the array costs[NUM_NPARM] -** with costs calculated by doing tputs() calls. -*/ - -static void -init_costs(int costs[]) -{ -int i; - - for (i = 0; i < NUM_NPARM; i++) { - if (sequence(i) != (char *) 0) { - c_count = 0; - tputs(sequence(i), 1, countc); - costs[i] = c_count; - } else - costs[i] = INFINITY; - } -} - - -/* -** countc() increments global var c_count. -*/ - -static int countc(char ch) -{ - return(c_count++); -} - -/* -** add_op(seq, op, p0, p1, ... , p8) -** -** add_op() adds the operator op and the appropriate -** number of paramaters to seq. It also increases the -** cost appropriately. -** if op has no parameters, p0 is taken to be a count. -*/ - -static void add_op(struct Sequence *seq, int op, ...) -{ -va_list argp; -int num_ps, p; - - T(("adding op %d to sequence", op)); - - va_start(argp, op); - - num_ps = - op_info[op]; /* get parms or -cost */ - - *(seq->end++) = op; - - if (num_ps == (- INFINITY) || sequence(op) == (char *) 0) { - seq->cost = INFINITY; - } else if (num_ps <= 0) { /* no parms, -cost */ - int i = va_arg(argp, int); - seq->cost -= i * num_ps; /* ADD count * cost */ - *(seq->end++) = i; - } else { - int prm[9]; - - for (p = 0; p < num_ps; p++) - *(seq->end++) = prm[p] = va_arg(argp, int); - - c_count = 0; - - tputs(tparm(sequence(op), prm[0], prm[1], prm[2], prm[3], prm[4], - prm[5], prm[6], prm[7], prm[8]), 1, countc); - - seq->cost += c_count; - } - va_end(argp); -} - - -/* -** char *sequence(op) -** -** sequence() returns a pointer to the op's -** terminal control sequence. -*/ - -static char *sequence(int op) -{ - T(("sequence(%d)", op)); - - switch(op) { - case CARRIAGE_RETURN: - return (carriage_return); - case CURS_DOWN: - return (cursor_down); - case CURS_HOME: - return (cursor_home); - case CURS_LEFT: - return (cursor_left); - case CURS_RIGHT: - return (cursor_right); - case CURS_TO_LL: - return (cursor_to_ll); - case CURS_UP: - return (cursor_up); - case TAB: - return (tab); - case BACK_TAB: - return (back_tab); - case ROW_ADDR: - return (row_address); - case COL_ADDR: - return (column_address); - case P_DOWN_CURS: - return (parm_down_cursor); - case P_LEFT_CURS: - return (parm_left_cursor); - case P_RIGHT_CURS: - return (parm_right_cursor); - case P_UP_CURS: - return (parm_up_cursor); - case CURS_ADDR: - return (cursor_address); - default: - return ((char *) 0); - } -} - -#endif - |
