|
|
1.1 ! root 1: /********************************************************************* ! 2: * COPYRIGHT NOTICE * ! 3: ********************************************************************** ! 4: * This software is copyright (C) 1982 by Pavel Curtis * ! 5: * * ! 6: * Permission is granted to reproduce and distribute * ! 7: * this file by any means so long as no fee is charged * ! 8: * above a nominal handling fee and so long as this * ! 9: * notice is always included in the copies. * ! 10: * * ! 11: * Other rights are reserved except as explicitly granted * ! 12: * by written permission of the author. * ! 13: * Pavel Curtis * ! 14: * Computer Science Dept. * ! 15: * 405 Upson Hall * ! 16: * Cornell University * ! 17: * Ithaca, NY 14853 * ! 18: * * ! 19: * Ph- (607) 256-4934 * ! 20: * * ! 21: * Pavel.Cornell@Udel-Relay (ARPAnet) * ! 22: * decvax!cornell!pavel (UUCPnet) * ! 23: *********************************************************************/ ! 24: ! 25: /* ! 26: ** ! 27: ** lib_mvcur.c ! 28: ** ! 29: ** mvcur() and its subroutines ! 30: ** ! 31: ** $Log: lib_mvcur.c,v $ ! 32: * Revision 1.8 93/04/12 14:13:47 bin ! 33: * Udo: third color update ! 34: * ! 35: * Revision 1.2 92/04/13 14:37:43 bin ! 36: * update by vlad ! 37: * ! 38: * Revision 2.2 91/04/20 19:25:30 munk ! 39: * Usage of register variables ! 40: * ! 41: * Revision 2.1 82/10/25 14:47:54 pavel ! 42: * Added Copyright Notice ! 43: * ! 44: * Revision 2.0 82/10/25 13:46:40 pavel ! 45: * Beta-one Test Release ! 46: * ! 47: ** ! 48: ** Revisions needed: ! 49: ** implement c_save instead of multiple tputs() calls ! 50: ** routine revisions ! 51: */ ! 52: ! 53: #ifdef RCSHDR ! 54: static char RCSid[] = ! 55: "$Header: /src386/usr/lib/ncurses/RCS/lib_mvcur.c,v 1.8 93/04/12 14:13:47 bin Exp Locker: bin $"; ! 56: #endif ! 57: ! 58: #include "term.h" ! 59: #include "curses.h" ! 60: #include "curses.priv.h" ! 61: ! 62: ! 63: #define BUFSIZE 128 /* size of strategy buffer */ ! 64: ! 65: struct Sequence ! 66: { ! 67: int vec[BUFSIZE], /* vector of operations */ ! 68: *end, /* end of vector */ ! 69: cost; /* cost of vector */ ! 70: }; ! 71: ! 72: /* ! 73: ** #define ! 74: ** Make_seq_best(s1, s2) ! 75: ** ! 76: ** Make_seq_best() swaps the values ! 77: ** of the pointers if s1->cost > s2->cost. ! 78: */ ! 79: ! 80: #define Make_seq_best(s1, s2) \ ! 81: if (s1->cost > s2->cost) \ ! 82: { \ ! 83: struct Sequence *temp; \ ! 84: \ ! 85: temp = s1; \ ! 86: s1 = s2; \ ! 87: s2 = temp; \ ! 88: } ! 89: ! 90: ! 91: FILE *out_file; /* pointer to output file */ ! 92: ! 93: static int c_count; /* used for counting tputs output */ ! 94: ! 95: /*rev c_save not yet used*/ ! 96: /*static char *c_save;*/ /* used for saving tputs output */ ! 97: ! 98: #define INFINITY 1000 /* biggest, impossible sequence cost */ ! 99: ! 100: #define NUM_OPS 16 /* num. term. control sequences */ ! 101: #define NUM_NPARM 9 /* num. ops wo/ parameters */ ! 102: ! 103: /* operator indexes into op_info */ ! 104: ! 105: #define CARRIAGE_RETURN 0 /* watch out for nl mapping */ ! 106: #define CURS_DOWN 1 ! 107: #define CURS_HOME 2 ! 108: #define CURS_LEFT 3 ! 109: #define CURS_RIGHT 4 ! 110: #define CURS_TO_LL 5 ! 111: #define CURS_UP 6 ! 112: #define TAB 7 ! 113: #define BACK_TAB 8 ! 114: #define ROW_ADDR 9 ! 115: #define COL_ADDR 10 ! 116: #define P_DOWN_CURS 11 ! 117: #define P_LEFT_CURS 12 ! 118: #define P_RIGHT_CURS 13 ! 119: #define P_UP_CURS 14 ! 120: #define CURS_ADDR 15 ! 121: ! 122: static bool loc_init = FALSE; /* set if op_info is init'ed */ ! 123: ! 124: static bool rel_ok; /* set if we really know where we are */ ! 125: ! 126: /* ! 127: * op_info[NUM_OPS] ! 128: * ! 129: * op_info[] contains for operations with no parameters ! 130: * the cost of the operation. These ops should be first in the array. ! 131: * For operations with parameters, op_info[] contains ! 132: * the negative of the number of parameters. ! 133: */ ! 134: ! 135: static int op_info[NUM_OPS] = ! 136: { ! 137: 0, /* carriage_return */ ! 138: 0, /* cursor_down */ ! 139: 0, /* cursor_home */ ! 140: 0, /* cursor_left */ ! 141: 0, /* cursor_right */ ! 142: 0, /* cursor_to_ll */ ! 143: 0, /* cursor_up */ ! 144: 0, /* tab */ ! 145: 0, /* back_tab */ ! 146: -1, /* row_address */ ! 147: -1, /* column_address */ ! 148: -1, /* parm_down_cursor */ ! 149: -1, /* parm_left_cursor */ ! 150: -1, /* parm_right_cursor */ ! 151: -1, /* parm_up_cursor */ ! 152: -2 /* cursor_address */ ! 153: }; ! 154: ! 155: ! 156: /* ! 157: ** ! 158: ** mvcur(oldrow, oldcol, newrow, newcol) ! 159: ** ! 160: ** mvcur() optimally moves the cursor from the position ! 161: ** specified by (oldrow, oldcol) to (newrow, newcol). If ! 162: ** (oldrow, oldcol) == (-1, -1), mvcur() does not use relative ! 163: ** cursor motions. If the coordinates are otherwise ! 164: ** out of bounds, it mods them into range. ! 165: ** ! 166: ** Revisions needed: ! 167: ** eat_newline_glitch, auto_right_margin ! 168: */ ! 169: ! 170: mvcur(oldrow, oldcol, newrow, newcol) ! 171: int oldrow, oldcol, ! 172: newrow, newcol; ! 173: { ! 174: struct Sequence seqA, seqB, /* allocate work structures */ ! 175: col0seq, /* sequence to get from col0 to nc */ ! 176: *best, /* best sequence so far */ ! 177: *try; /* next try */ ! 178: ! 179: #ifdef TRACE ! 180: if (_tracing) ! 181: _tracef("mvcur(%d,%d,%d,%d) called", ! 182: oldrow, oldcol, newrow, newcol); ! 183: #endif ! 184: ! 185: update_ops(); /* make sure op_info[] is current */ ! 186: ! 187: if (oldrow < 0 || oldcol < 0) ! 188: rel_ok = FALSE; /* relative ops ok? */ ! 189: else ! 190: { ! 191: rel_ok = TRUE; ! 192: ! 193: oldrow %= lines; /* mod values into range */ ! 194: oldcol %= columns; ! 195: } ! 196: newrow %= lines; ! 197: newcol %= columns; ! 198: ! 199: best = &seqA; ! 200: try = &seqB; ! 201: ! 202: /* try out direct cursor addressing */ ! 203: ! 204: zero_seq(best); ! 205: add_op(best, CURS_ADDR, newrow, newcol); ! 206: ! 207: /* try out independent row/column addressing */ ! 208: ! 209: if (rel_ok) ! 210: { ! 211: zero_seq(try); ! 212: row(try, oldrow, newrow); ! 213: column(try, oldcol, newcol); ! 214: Make_seq_best(best, try); ! 215: } ! 216: ! 217: zero_seq(&col0seq); /* store seq. to get from c0 to nc */ ! 218: column(&col0seq, 0, newcol); ! 219: ! 220: if(col0seq.cost < INFINITY) /* can get from col0 to newcol */ ! 221: { ! 222: /* try out homing and then row/column */ ! 223: ! 224: if (! rel_ok || newcol < oldcol || newrow < oldrow) ! 225: { ! 226: zero_seq(try); ! 227: add_op(try, CURS_HOME, 1); ! 228: row(try, 0, newrow); ! 229: add_seq(try, &col0seq); ! 230: Make_seq_best(best, try); ! 231: } ! 232: ! 233: /* try out homing to last line and then row/column */ ! 234: ! 235: if (! rel_ok || newcol < oldcol || newrow > oldrow) ! 236: { ! 237: zero_seq(try); ! 238: add_op(try, CURS_TO_LL, 1); ! 239: row(try, lines - 1, newrow); ! 240: add_seq(try, &col0seq); ! 241: Make_seq_best(best, try); ! 242: } ! 243: } ! 244: ! 245: #ifdef TRACE ! 246: if (_tracing) ! 247: _tracef("\tmvcur: result follows"); ! 248: #endif ! 249: ! 250: out_seq(best); ! 251: ! 252: #ifdef TRACE ! 253: if (_tracing) ! 254: _tracef("\tmvcur: end of result"); ! 255: #endif ! 256: } ! 257: ! 258: ! 259: /* ! 260: ** row(outseq, oldrow, newrow) ! 261: ** ! 262: ** row() adds the best sequence for moving ! 263: ** the cursor from oldrow to newrow to seq. ! 264: ** row() considers row_address, parm_up/down_cursor ! 265: ** and cursor_up/down. ! 266: */ ! 267: ! 268: static ! 269: row(outseq, orow, nrow) ! 270: int orow, nrow; /* old, new cursor locations */ ! 271: struct Sequence *outseq; /* where to put the output */ ! 272: { ! 273: struct Sequence seqA, seqB, ! 274: *best, /* best sequence so far */ ! 275: *try; /* next try */ ! 276: int parm_cursor, one_step; ! 277: ! 278: best = &seqA; ! 279: try = &seqB; ! 280: ! 281: if (nrow == orow) ! 282: return; ! 283: ! 284: if (nrow < orow) ! 285: { ! 286: parm_cursor = P_UP_CURS; ! 287: one_step = CURS_UP; ! 288: } ! 289: else ! 290: { ! 291: parm_cursor = P_DOWN_CURS; ! 292: one_step = CURS_DOWN; ! 293: } ! 294: ! 295: /* try out direct row addressing */ ! 296: ! 297: zero_seq(best); ! 298: add_op(best, ROW_ADDR, nrow); ! 299: ! 300: /* try out paramaterized up or down motion */ ! 301: ! 302: if (rel_ok) ! 303: { ! 304: zero_seq(try); ! 305: add_op(try, parm_cursor, abs(orow - nrow)); ! 306: Make_seq_best(best, try); ! 307: } ! 308: /* try getting there one step at a time... */ ! 309: ! 310: if (rel_ok) ! 311: { ! 312: zero_seq(try); ! 313: add_op(try, one_step, abs(orow-nrow)); ! 314: Make_seq_best(best, try); ! 315: } ! 316: ! 317: add_seq(outseq, best); ! 318: } ! 319: ! 320: ! 321: /* ! 322: ** column(outseq, oldcol, newcol) ! 323: ** ! 324: ** column() adds the best sequence for moving ! 325: ** the cursor from oldcol to newcol to outseq. ! 326: ** column() considers column_address, parm_left/right_cursor, ! 327: ** simp_col(), and carriage_return followed by simp_col(). ! 328: */ ! 329: ! 330: static ! 331: column(outseq, ocol, ncol) ! 332: struct Sequence *outseq; /* where to put the output */ ! 333: int ocol, ncol; /* old, new cursor column */ ! 334: { ! 335: struct Sequence seqA, seqB, ! 336: *best, *try; ! 337: int parm_cursor; /* set to either parm_up/down_cursor */ ! 338: ! 339: best = &seqA; ! 340: try = &seqB; ! 341: ! 342: if (ncol == ocol) ! 343: return; ! 344: ! 345: if (ncol < ocol) ! 346: parm_cursor = P_LEFT_CURS; ! 347: else ! 348: parm_cursor = P_RIGHT_CURS; ! 349: ! 350: /* try out direct column addressing */ ! 351: ! 352: zero_seq(best); ! 353: add_op(best, COL_ADDR, ncol); ! 354: ! 355: /* try carriage_return then simp_col() */ ! 356: ! 357: if (! rel_ok || (ncol < ocol)) ! 358: { ! 359: zero_seq(try); ! 360: add_op(try, CARRIAGE_RETURN, 1); ! 361: simp_col(try, 0, ncol); ! 362: Make_seq_best(best, try); ! 363: } ! 364: if (rel_ok) ! 365: { ! 366: /* try out paramaterized left or right motion */ ! 367: ! 368: zero_seq(try); ! 369: add_op(try, parm_cursor, abs(ocol - ncol)); ! 370: Make_seq_best(best, try); ! 371: ! 372: /* try getting there with simp_col() */ ! 373: ! 374: zero_seq(try); ! 375: simp_col(try, ocol, ncol); ! 376: Make_seq_best(best, try); ! 377: } ! 378: ! 379: add_seq(outseq, best); ! 380: } ! 381: ! 382: ! 383: /* ! 384: ** simp_col(outseq, oldcol, newcol) ! 385: ** ! 386: ** simp_col() adds the best simple sequence for getting ! 387: ** from oldcol to newcol to outseq. ! 388: ** simp_col() considers (back_)tab and cursor_left/right. ! 389: ** ! 390: ** Revisions needed: ! 391: ** Simp_col asssumes that the cost of a (back_)tab ! 392: ** is less then the cost of one-stepping to get to the same column. ! 393: ** Should sometimes use overprinting instead of cursor_right. ! 394: */ ! 395: ! 396: static ! 397: simp_col(outseq, oc, nc) ! 398: struct Sequence *outseq; /* place to put sequence */ ! 399: int oc, nc; /* old column, new column */ ! 400: { ! 401: struct Sequence seqA, seqB, tabseq, ! 402: *best, *try; ! 403: int mytab, tabs, onepast, ! 404: one_step, opp_step; ! 405: ! 406: if (! rel_ok) ! 407: { ! 408: outseq->cost = INFINITY; ! 409: return; ! 410: } ! 411: ! 412: if (oc == nc) ! 413: return; ! 414: ! 415: best = &seqA; ! 416: try = &seqB; ! 417: ! 418: if (oc < nc) ! 419: { ! 420: mytab = TAB; ! 421: if (init_tabs > 0 && op_info[TAB] < INFINITY) ! 422: { ! 423: tabs = nc / init_tabs - oc / init_tabs; ! 424: onepast = ((nc / init_tabs) + 1) * init_tabs; ! 425: if (tabs) ! 426: oc = onepast - init_tabs; /* consider it done */ ! 427: } ! 428: else ! 429: tabs = 0; ! 430: ! 431: one_step = CURS_RIGHT; ! 432: opp_step = CURS_LEFT; ! 433: } ! 434: else ! 435: { ! 436: mytab = BACK_TAB; ! 437: if (init_tabs > 0 && op_info[BACK_TAB] < INFINITY) ! 438: { ! 439: tabs = oc / init_tabs - nc / init_tabs; ! 440: onepast = ((nc - 1) / init_tabs) * init_tabs; ! 441: if (tabs) ! 442: oc = onepast + init_tabs; /* consider it done */ ! 443: } ! 444: else ! 445: tabs = 0; ! 446: ! 447: one_step = CURS_LEFT; ! 448: opp_step = CURS_RIGHT; ! 449: } ! 450: ! 451: /* tab as close as possible to nc */ ! 452: ! 453: zero_seq(&tabseq); ! 454: add_op(&tabseq, mytab, tabs); ! 455: ! 456: /* try extra tab and backing up */ ! 457: ! 458: zero_seq(best); ! 459: ! 460: if (onepast >= 0 && onepast < columns) ! 461: { ! 462: add_op(best, mytab, 1); ! 463: add_op(best, opp_step, abs(onepast - nc)); ! 464: } ! 465: else ! 466: best->cost = INFINITY; /* make sure of next swap */ ! 467: ! 468: /* try stepping to nc */ ! 469: ! 470: zero_seq(try); ! 471: add_op(try, one_step, abs(nc - oc)); ! 472: Make_seq_best(best, try); ! 473: ! 474: if (tabseq.cost < INFINITY) ! 475: add_seq(outseq, &tabseq); ! 476: add_seq(outseq, best); ! 477: } ! 478: ! 479: ! 480: /* ! 481: ** zero_seq(seq) ! 482: ** add_seq(seq1, seq2) ! 483: ** out_seq(seq) ! 484: ** ! 485: ** zero_seq() empties seq. ! 486: ** add_seq() adds seq1 to seq2. ! 487: ** out_seq() outputs a sequence. ! 488: */ ! 489: ! 490: static ! 491: zero_seq(seq) ! 492: struct Sequence *seq; ! 493: { ! 494: seq->end = seq->vec; ! 495: seq->cost = 0; ! 496: } ! 497: ! 498: ! 499: static ! 500: add_seq(seq1, seq2) ! 501: register struct Sequence *seq1, *seq2; ! 502: { ! 503: int *vptr; ! 504: ! 505: if(seq1->cost >= INFINITY || seq2->cost >= INFINITY) ! 506: seq1->cost = INFINITY; ! 507: else ! 508: { ! 509: vptr = seq2->vec; ! 510: while (vptr != seq2->end) ! 511: *(seq1->end++) = *(vptr++); ! 512: seq1->cost += seq2->cost; ! 513: } ! 514: } ! 515: ! 516: ! 517: static ! 518: out_seq(seq) ! 519: register struct Sequence *seq; ! 520: { ! 521: char *tparm(); ! 522: register int *opptr; ! 523: int prm[9], ps, p, op, outc(); ! 524: int count; ! 525: char *sequence(); ! 526: ! 527: if (seq->cost >= INFINITY) ! 528: return; ! 529: ! 530: for (opptr = seq->vec; opptr < seq->end; opptr++) ! 531: { ! 532: op = *opptr; /* grab operator */ ! 533: ps = -op_info[op]; ! 534: if(ps > 0) /* parameterized */ ! 535: { ! 536: for (p = 0; p < ps; p++) /* fill in needed parms */ ! 537: prm[p] = *(++opptr); ! 538: ! 539: tputs(tparm(sequence(op), ! 540: prm[0], prm[1], prm[2], prm[3], prm[4], ! 541: prm[5], prm[6], prm[7], prm[8]), 1, outc); ! 542: } ! 543: else ! 544: { ! 545: count = *(++opptr); ! 546: /*rev should save tputs output instead of mult calls */ ! 547: while (count--) /* do count times */ ! 548: tputs(sequence(op), 1, outc); ! 549: } ! 550: } ! 551: } ! 552: ! 553: ! 554: /* ! 555: ** update_ops() ! 556: ** ! 557: ** update_ops() makes sure that ! 558: ** the op_info[] array is updated and initializes ! 559: ** the cost array for SP if needed. ! 560: */ ! 561: ! 562: static ! 563: update_ops() ! 564: { ! 565: char *index(); ! 566: ! 567: if (SP) /* SP structure exists */ ! 568: { ! 569: register int op; ! 570: ! 571: out_file = SP->_ofp; /* set output file pointer */ ! 572: ! 573: if (! SP->_costinit) /* this term not yet assigned costs */ ! 574: { ! 575: loc_init = FALSE; /* if !SP in the future, new term */ ! 576: init_costs(SP->_costs); /* fill term costs */ ! 577: SP->_costinit = TRUE; ! 578: } ! 579: ! 580: for (op = 0; op < NUM_NPARM; op++) ! 581: op_info[op] = SP->_costs[op]; /* set up op_info */ ! 582: ! 583: /* check for newline that might be mapped... */ ! 584: if (SP->_nlmapping && (index(sequence(CURS_DOWN), '\n') != NULL)) ! 585: op_info[CURS_DOWN] = INFINITY; ! 586: } ! 587: else ! 588: { ! 589: out_file = stdout; ! 590: ! 591: if (! loc_init) /* using local costs */ ! 592: { ! 593: loc_init = TRUE; ! 594: init_costs(op_info); /* set up op_info */ ! 595: } ! 596: /* check for newline that might be mapped... */ ! 597: if (index(sequence(CURS_DOWN), '\n') != NULL) ! 598: op_info[CURS_DOWN] = INFINITY; ! 599: } ! 600: } ! 601: ! 602: ! 603: /* ! 604: ** init_costs(costs) ! 605: ** ! 606: ** init_costs() fills the array costs[NUM_NPARM] ! 607: ** with costs calculated by doing tputs() calls. ! 608: */ ! 609: ! 610: static ! 611: init_costs(costs) ! 612: int costs[]; ! 613: { ! 614: register int i; ! 615: int countc(); ! 616: ! 617: for (i = 0; i < NUM_NPARM; i++) ! 618: if(sequence(i) != (char *) 0) ! 619: { ! 620: #ifdef TRACE ! 621: if (_tracing) ! 622: _tracef("\tinit_costs: pricing %d: '%s'", i, sequence(i)); ! 623: #endif ! 624: ! 625: c_count = 0; ! 626: tputs(sequence(i), 1, countc); ! 627: costs[i] = c_count; ! 628: } ! 629: else ! 630: costs[i] = INFINITY; ! 631: } ! 632: ! 633: ! 634: /* ! 635: ** countc() ! 636: ** outc(c) ! 637: ** savec(c) ! 638: ** ! 639: ** countc() increments global var c_count. ! 640: ** outc() outputs a single character. ! 641: ** savec() saves c in *c_save and increments c_save and c_count. ! 642: */ ! 643: ! 644: static ! 645: countc() ! 646: { ! 647: c_count++; ! 648: } ! 649: ! 650: ! 651: static ! 652: outc(c) ! 653: char c; ! 654: { ! 655: fputc(c, out_file); ! 656: } ! 657: ! 658: ! 659: /*rev not yet needed ! 660: static ! 661: savec(c) ! 662: char c; ! 663: { ! 664: *(c_save++) = c; ! 665: c_count++; ! 666: } ! 667: */ ! 668: ! 669: ! 670: /* ! 671: ** add_op(seq, op, p0, p1, ... , p8) ! 672: ** ! 673: ** add_op() adds the operator op and the appropriate ! 674: ** number of paramaters to seq. It also increases the ! 675: ** cost appropriately. ! 676: ** if op has no parameters, p0 is taken to be a count. ! 677: */ ! 678: ! 679: static ! 680: add_op(seq, op, p0, p1, p2, p3, p4, p5, p6, p7, p8) ! 681: struct Sequence *seq; ! 682: int op, p0, p1, p2, p3, p4, p5, p6, p7, p8; ! 683: { ! 684: char *tparm(); ! 685: int num_ps, p; ! 686: ! 687: #ifdef TRACE ! 688: if (_tracing) ! 689: _tracef("\tadd_op(%o,%d,%d,%d) called", seq, op, p0, p1); ! 690: #endif ! 691: ! 692: num_ps = - op_info[op]; /* get parms or -cost */ ! 693: *(seq->end++) = op; ! 694: ! 695: if (num_ps == (- INFINITY) || sequence(op) == (char *) 0) ! 696: seq->cost = INFINITY; ! 697: else ! 698: if (num_ps <= 0) /* no parms, -cost */ ! 699: { ! 700: seq->cost -= p0 * num_ps; /* ADD count * cost */ ! 701: *(seq->end++) = p0; ! 702: } ! 703: else ! 704: { ! 705: int pms[9]; ! 706: ! 707: pms[0] = p0; pms[1] = p1; pms[2] = p2; ! 708: pms[3] = p3; pms[4] = p4; pms[5] = p5; ! 709: pms[6] = p6; pms[7] = p7; pms[8] = p8; ! 710: for(p = 0; p < num_ps; p++) ! 711: *(seq->end++) = pms[p]; ! 712: c_count = 0; ! 713: tputs(tparm(sequence(op), p0, p1, p2, p3, p4, p5, p6, p7, p8), ! 714: 1, countc); ! 715: seq->cost += c_count; ! 716: } ! 717: } ! 718: ! 719: ! 720: /* ! 721: ** char * ! 722: ** sequence(op) ! 723: ** ! 724: ** sequence() returns a pointer to the op's ! 725: ** terminal control sequence. ! 726: */ ! 727: ! 728: static char * ! 729: sequence(op) ! 730: register int op; ! 731: { ! 732: ! 733: switch(op) ! 734: { ! 735: case CARRIAGE_RETURN: ! 736: return (carriage_return); ! 737: case CURS_DOWN: ! 738: return (cursor_down); ! 739: case CURS_HOME: ! 740: return (cursor_home); ! 741: case CURS_LEFT: ! 742: return (cursor_left); ! 743: case CURS_RIGHT: ! 744: return (cursor_right); ! 745: case CURS_TO_LL: ! 746: return (cursor_to_ll); ! 747: case CURS_UP: ! 748: return (cursor_up); ! 749: case TAB: ! 750: return (tab); ! 751: case BACK_TAB: ! 752: return (back_tab); ! 753: case ROW_ADDR: ! 754: return (row_address); ! 755: case COL_ADDR: ! 756: return (column_address); ! 757: case P_DOWN_CURS: ! 758: return (parm_down_cursor); ! 759: case P_LEFT_CURS: ! 760: return (parm_left_cursor); ! 761: case P_RIGHT_CURS: ! 762: return (parm_right_cursor); ! 763: case P_UP_CURS: ! 764: return (parm_up_cursor); ! 765: case CURS_ADDR: ! 766: return (cursor_address); ! 767: default: ! 768: return ((char *) 0); ! 769: } ! 770: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.