|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that: (1) source distributions retain this entire copyright ! 7: * notice and comment, and (2) distributions including binaries display ! 8: * the following acknowledgement: ``This product includes software ! 9: * developed by the University of California, Berkeley and its contributors'' ! 10: * in the documentation or other materials provided with the distribution ! 11: * and in all advertising materials mentioning features or use of this ! 12: * software. Neither the name of the University nor the names of its ! 13: * contributors may be used to endorse or promote products derived ! 14: * from this software without specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: static char sccsid[] = "@(#)fancy.c 5.5 (Berkeley) 6/1/90"; ! 22: #endif /* not lint */ ! 23: ! 24: #include "back.h" ! 25: ! 26: char PC; /* padding character */ ! 27: char *BC; /* backspace sequence */ ! 28: char *CD; /* clear to end of screen sequence */ ! 29: char *CE; /* clear to end of line sequence */ ! 30: char *CL; /* clear screen sequence */ ! 31: char *CM; /* cursor movement instructions */ ! 32: char *HO; /* home cursor sequence */ ! 33: char *MC; /* column cursor movement map */ ! 34: char *ML; /* row cursor movement map */ ! 35: char *ND; /* forward cursor sequence */ ! 36: char *UP; /* up cursor sequence */ ! 37: ! 38: int lHO; /* length of HO */ ! 39: int lBC; /* length of BC */ ! 40: int lND; /* length of ND */ ! 41: int lUP; /* length of UP */ ! 42: int CO; /* number of columns */ ! 43: int LI; /* number of lines */ ! 44: int *linect; /* array of lengths of lines on screen ! 45: (the actual screen is not stored) */ ! 46: ! 47: /* two letter codes */ ! 48: char tcap[] = "bccdceclcmhomcmlndup"; ! 49: /* corresponding strings */ ! 50: char **tstr[] = { &BC, &CD, &CE, &CL, &CM, &HO, &MC, &ML, &ND, &UP }; ! 51: ! 52: int buffnum; /* pointer to output buffer */ ! 53: ! 54: char tbuf[1024]; /* buffer for decoded termcap entries */ ! 55: ! 56: int oldb[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; ! 57: ! 58: int oldr; ! 59: int oldw; ! 60: /* "real" cursor positions, so ! 61: * it knows when to reposition. ! 62: * These are -1 if curr and curc ! 63: * are accurate */ ! 64: int realr; ! 65: int realc; ! 66: ! 67: void addbuf(); ! 68: ! 69: fboard () { ! 70: register int i, j, l; ! 71: ! 72: curmove (0,0); /* do top line */ ! 73: for (i = 0; i < 53; i++) ! 74: fancyc ('_'); ! 75: ! 76: curmove (15,0); /* do botttom line */ ! 77: for (i = 0; i < 53; i++) ! 78: fancyc ('_'); ! 79: ! 80: l = 1; /* do vertical lines */ ! 81: for (i = 52; i > -1; i -= 28) { ! 82: curmove ( (l == 1? 1: 15) ,i); ! 83: fancyc ('|'); ! 84: for (j = 0; j < 14; j++) { ! 85: curmove (curr+l,curc-1); ! 86: fancyc ('|'); ! 87: } ! 88: if (i == 24) ! 89: i += 32; ! 90: l = -l; /* alternate directions */ ! 91: } ! 92: ! 93: curmove (2,1); /* label positions 13-18 */ ! 94: for (i = 13; i < 18; i++) { ! 95: fancyc ('1'); ! 96: fancyc ((i % 10)+'0'); ! 97: curmove (curr,curc+2); ! 98: } ! 99: fancyc ('1'); ! 100: fancyc ('8'); ! 101: ! 102: curmove (2,29); /* label positions 19-24 */ ! 103: fancyc ('1'); ! 104: fancyc ('9'); ! 105: for (i = 20; i < 25; i++) { ! 106: curmove (curr,curc+2); ! 107: fancyc ('2'); ! 108: fancyc ((i % 10)+'0'); ! 109: } ! 110: ! 111: curmove (14,1); /* label positions 12-7 */ ! 112: fancyc ('1'); ! 113: fancyc ('2'); ! 114: for (i = 11; i > 6; i--) { ! 115: curmove (curr,curc+2); ! 116: fancyc (i > 9? '1': ' '); ! 117: fancyc ((i % 10)+'0'); ! 118: } ! 119: ! 120: curmove (14,30); /* label positions 6-1 */ ! 121: fancyc ('6'); ! 122: for (i = 5; i > 0; i--) { ! 123: curmove (curr,curc+3); ! 124: fancyc (i+'0'); ! 125: } ! 126: ! 127: for (i = 12; i > 6; i--) /* print positions 12-7 */ ! 128: if (board[i]) ! 129: bsect (board[i],13,1+4*(12-i),-1); ! 130: ! 131: if (board[0]) /* print red men on bar */ ! 132: bsect (board[0],13,25,-1); ! 133: ! 134: for (i = 6; i > 0; i--) /* print positions 6-1 */ ! 135: if (board[i]) ! 136: bsect (board[i],13,29+4*(6-i),-1); ! 137: ! 138: l = (off[1] < 0? off[1]+15: off[1]); /* print white's home */ ! 139: bsect (l,3,54,1); ! 140: ! 141: curmove (8,25); /* print the word BAR */ ! 142: fancyc ('B'); ! 143: fancyc ('A'); ! 144: fancyc ('R'); ! 145: ! 146: for (i = 13; i < 19; i++) /* print positions 13-18 */ ! 147: if (board[i]) ! 148: bsect (board[i],3,1+4*(i-13),1); ! 149: ! 150: if (board[25]) /* print white's men on bar */ ! 151: bsect (board[25],3,25,1); ! 152: ! 153: for (i = 19; i < 25; i++) /* print positions 19-24 */ ! 154: if (board[i]) ! 155: bsect (board[i],3,29+4*(i-19),1); ! 156: ! 157: l = (off[0] < 0? off[0]+15: off[0]); /* print red's home */ ! 158: bsect (-l,13,54,-1); ! 159: ! 160: for (i = 0; i < 26; i++) /* save board position ! 161: * for refresh later */ ! 162: oldb[i] = board[i]; ! 163: oldr = (off[1] < 0? off[1]+15: off[1]); ! 164: oldw = -(off[0] < 0? off[0]+15: off[0]); ! 165: } ! 166: ! 167: /* ! 168: * bsect (b,rpos,cpos,cnext) ! 169: * Print the contents of a board position. "b" has the value of the ! 170: * position, "rpos" is the row to start printing, "cpos" is the column to ! 171: * start printing, and "cnext" is positive if the position starts at the top ! 172: * and negative if it starts at the bottom. The value of "cpos" is checked ! 173: * to see if the position is a player's home, since those are printed ! 174: * differently. ! 175: */ ! 176: ! 177: bsect (b,rpos,cpos,cnext) ! 178: int b; /* contents of position */ ! 179: int rpos; /* row of position */ ! 180: int cpos; /* column of position */ ! 181: int cnext; /* direction of position */ ! 182: ! 183: { ! 184: register int j; /* index */ ! 185: register int n; /* number of men on position */ ! 186: register int bct; /* counter */ ! 187: int k; /* index */ ! 188: char pc; /* color of men on position */ ! 189: ! 190: n = abs(b); /* initialize n and pc */ ! 191: pc = (b > 0? 'r': 'w'); ! 192: ! 193: if (n < 6 && cpos < 54) /* position cursor at start */ ! 194: curmove (rpos,cpos+1); ! 195: else ! 196: curmove (rpos,cpos); ! 197: ! 198: for (j = 0; j < 5; j++) { /* print position row by row */ ! 199: ! 200: for (k = 0; k < 15; k += 5) /* print men */ ! 201: if (n > j+k) ! 202: fancyc (pc); ! 203: ! 204: if (j < 4) { /* figure how far to ! 205: * back up for next ! 206: * row */ ! 207: if (n < 6) { /* stop if none left */ ! 208: if (j+1 == n) ! 209: break; ! 210: bct = 1; /* single column */ ! 211: } else { ! 212: if (n < 11) { /* two columns */ ! 213: if (cpos == 54) { /* home pos */ ! 214: if (j+5 >= n) ! 215: bct = 1; ! 216: else ! 217: bct = 2; ! 218: } ! 219: if (cpos < 54) { /* not home */ ! 220: if (j+6 >= n) ! 221: bct = 1; ! 222: else ! 223: bct = 2; ! 224: } ! 225: } else { /* three columns */ ! 226: if (j+10 >= n) ! 227: bct = 2; ! 228: else ! 229: bct = 3; ! 230: } ! 231: } ! 232: curmove (curr+cnext,curc-bct); /* reposition cursor */ ! 233: } ! 234: } ! 235: } ! 236: ! 237: refresh() { ! 238: register int i, r, c; ! 239: ! 240: r = curr; /* save current position */ ! 241: c = curc; ! 242: ! 243: for (i = 12; i > 6; i--) /* fix positions 12-7 */ ! 244: if (board[i] != oldb[i]) { ! 245: fixpos (oldb[i],board[i],13,1+(12-i)*4,-1); ! 246: oldb[i] = board[i]; ! 247: } ! 248: ! 249: if (board[0] != oldb[0]) { /* fix red men on bar */ ! 250: fixpos (oldb[0],board[0],13,25,-1); ! 251: oldb[0] = board[0]; ! 252: } ! 253: ! 254: for (i = 6; i > 0; i--) /* fix positions 6-1 */ ! 255: if (board[i] != oldb[i]) { ! 256: fixpos (oldb[i],board[i],13,29+(6-i)*4,-1); ! 257: oldb[i] = board[i]; ! 258: } ! 259: ! 260: i = -(off[0] < 0? off[0]+15: off[0]); /* fix white's home */ ! 261: if (oldw != i) { ! 262: fixpos (oldw,i,13,54,-1); ! 263: oldw = i; ! 264: } ! 265: ! 266: for (i = 13; i < 19; i++) /* fix positions 13-18 */ ! 267: if (board[i] != oldb[i]) { ! 268: fixpos (oldb[i],board[i],3,1+(i-13)*4,1); ! 269: oldb[i] = board[i]; ! 270: } ! 271: ! 272: if (board[25] != oldb[25]) { /* fix white men on bar */ ! 273: fixpos (oldb[25],board[25],3,25,1); ! 274: oldb[25] = board[25]; ! 275: } ! 276: ! 277: for (i = 19; i < 25; i++) /* fix positions 19-24 */ ! 278: if (board[i] != oldb[i]) { ! 279: fixpos (oldb[i],board[i],3,29+(i-19)*4,1); ! 280: oldb[i] = board[i]; ! 281: } ! 282: ! 283: i = (off[1] < 0? off[1]+15: off[1]); /* fix red's home */ ! 284: if (oldr != i) { ! 285: fixpos (oldr,i,3,54,1); ! 286: oldr = i; ! 287: } ! 288: ! 289: curmove (r,c); /* return to saved position */ ! 290: newpos(); ! 291: buflush(); ! 292: } ! 293: ! 294: fixpos (old,new,r,c,inc) ! 295: int old, new, r, c, inc; ! 296: ! 297: { ! 298: register int o, n, nv; ! 299: int ov, nc; ! 300: char col; ! 301: ! 302: if (old*new >= 0) { ! 303: ov = abs(old); ! 304: nv = abs(new); ! 305: col = (old+new > 0? 'r': 'w'); ! 306: o = (ov-1)/5; ! 307: n = (nv-1)/5; ! 308: if (o == n) { ! 309: if (o == 2) ! 310: nc = c+2; ! 311: if (o == 1) ! 312: nc = c < 54? c: c+1; ! 313: if (o == 0) ! 314: nc = c < 54? c+1: c; ! 315: if (ov > nv) ! 316: fixcol (r+inc*(nv-n*5),nc,abs(ov-nv),' ',inc); ! 317: else ! 318: fixcol (r+inc*(ov-o*5),nc,abs(ov-nv),col,inc); ! 319: return; ! 320: } else { ! 321: if (c < 54) { ! 322: if (o+n == 1) { ! 323: if (n) { ! 324: fixcol (r,c,abs(nv-5),col,inc); ! 325: if (ov != 5) ! 326: fixcol (r+inc*ov,c+1,abs(ov-5),col,inc); ! 327: } else { ! 328: fixcol (r,c,abs(ov-5),' ',inc); ! 329: if (nv != 5) ! 330: fixcol (r+inc*nv,c+1,abs(nv-5),' ',inc); ! 331: } ! 332: return; ! 333: } ! 334: if (n == 2) { ! 335: if (ov != 10) ! 336: fixcol (r+inc*(ov-5),c,abs(ov-10),col,inc); ! 337: fixcol (r,c+2,abs(nv-10),col,inc); ! 338: } else { ! 339: if (nv != 10) ! 340: fixcol (r+inc*(nv-5),c,abs(nv-10),' ',inc); ! 341: fixcol (r,c+2,abs(ov-10),' ',inc); ! 342: } ! 343: return; ! 344: } ! 345: if (n > o) { ! 346: fixcol (r+inc*(ov%5),c+o,abs(5*n-ov),col,inc); ! 347: if (nv != 5*n) ! 348: fixcol (r,c+n,abs(5*n-nv),col,inc); ! 349: } else { ! 350: fixcol (r+inc*(nv%5),c+n,abs(5*n-nv),' ',inc); ! 351: if (ov != 5*o) ! 352: fixcol (r,c+o,abs(5*o-ov),' ',inc); ! 353: } ! 354: return; ! 355: } ! 356: } ! 357: nv = abs(new); ! 358: fixcol (r,c+1,nv,new > 0? 'r': 'w',inc); ! 359: if (abs(old) <= abs(new)) ! 360: return; ! 361: fixcol (r+inc*new,c+1,abs(old+new),' ',inc); ! 362: } ! 363: ! 364: fixcol (r,c,l,ch,inc) ! 365: register int l, ch; ! 366: int r, c, inc; ! 367: ! 368: { ! 369: register int i; ! 370: ! 371: curmove (r,c); ! 372: fancyc (ch); ! 373: for (i = 1; i < l; i++) { ! 374: curmove (curr+inc,curc-1); ! 375: fancyc (ch); ! 376: } ! 377: } ! 378: ! 379: curmove (r,c) ! 380: register int r, c; ! 381: ! 382: { ! 383: if (curr == r && curc == c) ! 384: return; ! 385: if (realr == -1) { ! 386: realr = curr; ! 387: realc = curc; ! 388: } ! 389: curr = r; ! 390: curc = c; ! 391: } ! 392: ! 393: newpos () { ! 394: register int r; /* destination row */ ! 395: register int c; /* destination column */ ! 396: register int mode = -1; /* mode of movement */ ! 397: ! 398: int count = 1000; /* character count */ ! 399: int i; /* index */ ! 400: int j; /* index */ ! 401: int n; /* temporary variable */ ! 402: char *m; /* string containing CM movement */ ! 403: ! 404: ! 405: if (realr == -1) /* see if already there */ ! 406: return; ! 407: ! 408: r = curr; /* set current and dest. positions */ ! 409: c = curc; ! 410: curr = realr; ! 411: curc = realc; ! 412: ! 413: /* double check position */ ! 414: if (curr == r && curc == c) { ! 415: realr = realc = -1; ! 416: return; ! 417: } ! 418: ! 419: if (CM) { /* try CM to get there */ ! 420: mode = 0; ! 421: m = (char *)tgoto (CM,c,r); ! 422: count = strlen (m); ! 423: } ! 424: ! 425: /* try HO and local movement */ ! 426: if (HO && (n = r+c*lND+lHO) < count) { ! 427: mode = 1; ! 428: count = n; ! 429: } ! 430: ! 431: /* try various LF combinations */ ! 432: if (r >= curr) { ! 433: /* CR, LF, and ND */ ! 434: if ((n = (r-curr)+c*lND+1) < count) { ! 435: mode = 2; ! 436: count = n; ! 437: } ! 438: /* LF, ND */ ! 439: if (c >= curc && (n = (r-curr)+(c-curc)*lND) < count) { ! 440: mode = 3; ! 441: count = n; ! 442: } ! 443: /* LF, BS */ ! 444: if (c < curc && (n = (r-curr)+(curc-c)*lBC) < count) { ! 445: mode = 4; ! 446: count = n; ! 447: } ! 448: } ! 449: ! 450: /* try corresponding UP combinations */ ! 451: if (r < curr) { ! 452: /* CR, UP, and ND */ ! 453: if ((n = (curr-r)*lUP+c*lND+1) < count) { ! 454: mode = 5; ! 455: count = n; ! 456: } ! 457: /* UP and ND */ ! 458: if (c >= curc && (n = (curr-r)*lUP+(c-curc)*lND) < count) { ! 459: mode = 6; ! 460: count = n; ! 461: } ! 462: /* UP and BS */ ! 463: if (c < curc && (n = (curr-r)*lUP+(curc-c)*lBC) < count) { ! 464: mode = 7; ! 465: count = n; ! 466: } ! 467: } ! 468: ! 469: /* space over */ ! 470: if (curr == r && c > curc && linect[r] < curc && c-curc < count) ! 471: mode = 8; ! 472: ! 473: switch (mode) { ! 474: ! 475: case -1: /* error! */ ! 476: write (2,"\r\nInternal cursor error.\r\n",26); ! 477: getout(); ! 478: ! 479: /* direct cursor motion */ ! 480: case 0: ! 481: tputs (m,abs(curr-r),addbuf); ! 482: break; ! 483: ! 484: /* relative to "home" */ ! 485: case 1: ! 486: tputs (HO,r,addbuf); ! 487: for (i = 0; i < r; i++) ! 488: addbuf ('\012'); ! 489: for (i = 0; i < c; i++) ! 490: tputs (ND,1,addbuf); ! 491: break; ! 492: ! 493: /* CR and down and over */ ! 494: case 2: ! 495: addbuf ('\015'); ! 496: for (i = 0; i < r-curr; i++) ! 497: addbuf ('\012'); ! 498: for (i = 0; i < c; i++) ! 499: tputs (ND,1,addbuf); ! 500: break; ! 501: ! 502: /* down and over */ ! 503: case 3: ! 504: for (i = 0; i < r-curr; i++) ! 505: addbuf ('\012'); ! 506: for (i = 0; i < c-curc; i++) ! 507: tputs (ND,1,addbuf); ! 508: break; ! 509: ! 510: /* down and back */ ! 511: case 4: ! 512: for (i = 0; i < r-curr; i++) ! 513: addbuf ('\012'); ! 514: for (i = 0; i < curc-c; i++) ! 515: addbuf ('\010'); ! 516: break; ! 517: ! 518: /* CR and up and over */ ! 519: case 5: ! 520: addbuf ('\015'); ! 521: for (i = 0; i < curr-r; i++) ! 522: tputs (UP,1,addbuf); ! 523: for (i = 0; i < c; i++) ! 524: tputs (ND,1,addbuf); ! 525: break; ! 526: ! 527: /* up and over */ ! 528: case 6: ! 529: for (i = 0; i < curr-r; i++) ! 530: tputs (UP,1,addbuf); ! 531: for (i = 0; i < c-curc; i++) ! 532: tputs (ND,1,addbuf); ! 533: break; ! 534: ! 535: /* up and back */ ! 536: case 7: ! 537: for (i = 0; i < curr-r; i++) ! 538: tputs (UP,1,addbuf); ! 539: for (i = 0; i < curc-c; i++) { ! 540: if (BC) ! 541: tputs (BC,1,addbuf); ! 542: else ! 543: addbuf ('\010'); ! 544: } ! 545: break; ! 546: ! 547: /* safe space */ ! 548: case 8: ! 549: for (i = 0; i < c-curc; i++) ! 550: addbuf (' '); ! 551: } ! 552: ! 553: /* fix positions */ ! 554: curr = r; ! 555: curc = c; ! 556: realr = -1; ! 557: realc = -1; ! 558: } ! 559: ! 560: clear () { ! 561: register int i; ! 562: ! 563: /* double space if can't clear */ ! 564: if (CL == 0) { ! 565: writel ("\n\n"); ! 566: return; ! 567: } ! 568: ! 569: curr = curc = 0; /* fix position markers */ ! 570: realr = realc = -1; ! 571: for (i = 0; i < 24; i++) /* clear line counts */ ! 572: linect[i] = -1; ! 573: buffnum = -1; /* ignore leftover buffer contents */ ! 574: tputs (CL,CO,addbuf); /* put CL in buffer */ ! 575: } ! 576: ! 577: tos () { /* home cursor */ ! 578: curmove (0,0); ! 579: } ! 580: ! 581: fancyc (c) ! 582: register char c; /* character to output */ ! 583: { ! 584: register int sp; /* counts spaces in a tab */ ! 585: ! 586: if (c == '\007') { /* bells go in blindly */ ! 587: addbuf (c); ! 588: return; ! 589: } ! 590: ! 591: /* process tabs, use spaces if the ! 592: * the tab should be erasing things, ! 593: * otherwise use cursor movement ! 594: * routines. Note this does not use ! 595: * hardware tabs at all. */ ! 596: if (c == '\t') { ! 597: sp = (curc+8) & (~ 7); /* compute spaces */ ! 598: /* check line length */ ! 599: if (linect[curr] >= curc || sp < 4) { ! 600: for (; sp > curc; sp--) ! 601: addbuf (' '); ! 602: curc = sp; /* fix curc */ ! 603: } else ! 604: curmove (curr,sp); ! 605: return; ! 606: } ! 607: ! 608: /* do newline be calling newline */ ! 609: if (c == '\n') { ! 610: newline(); ! 611: return; ! 612: } ! 613: ! 614: /* ignore any other control chars */ ! 615: if (c < ' ') ! 616: return; ! 617: ! 618: /* if an erasing space or non-space, ! 619: * just add it to buffer. Otherwise ! 620: * use cursor movement routine, so that ! 621: * multiple spaces will be grouped ! 622: * together */ ! 623: if (c > ' ' || linect[curr] >= curc) { ! 624: newpos (); /* make sure position correct */ ! 625: addbuf (c); /* add character to buffer */ ! 626: /* fix line length */ ! 627: if (c == ' ' && linect[curr] == curc) ! 628: linect[curr]--; ! 629: else if (linect[curr] < curc) ! 630: linect[curr] = curc; ! 631: curc++; /* fix curc */ ! 632: } else ! 633: /* use cursor movement routine */ ! 634: curmove (curr,curc+1); ! 635: } ! 636: ! 637: clend() { ! 638: register int i; ! 639: register char *s; ! 640: ! 641: ! 642: if (CD) { ! 643: tputs (CD,CO-curr,addbuf); ! 644: for (i = curr; i < LI; i++) ! 645: linect[i] = -1; ! 646: return; ! 647: } ! 648: ! 649: curmove (i = curr,0); ! 650: cline(); ! 651: while (curr < LI-1) { ! 652: curmove (curr+1,0); ! 653: if (linect[curr] > -1) ! 654: cline (); ! 655: } ! 656: curmove (i,0); ! 657: } ! 658: ! 659: cline () { ! 660: register int i; ! 661: register int c; ! 662: register char *s; ! 663: ! 664: if (curc > linect[curr]) ! 665: return; ! 666: newpos (); ! 667: if (CE) { ! 668: tputs (CE,1,addbuf); ! 669: linect[curr] = curc-1; ! 670: } else { ! 671: c = curc-1; ! 672: while (linect[curr] > c) { ! 673: addbuf (' '); ! 674: curc++; ! 675: linect[curr]--; ! 676: } ! 677: curmove (curr,c+1); ! 678: } ! 679: } ! 680: ! 681: newline () { ! 682: cline(); ! 683: if (curr == LI-1) ! 684: curmove (begscr,0); ! 685: else ! 686: curmove (curr+1,0); ! 687: } ! 688: ! 689: getcaps (s) ! 690: register char *s; ! 691: ! 692: { ! 693: register char *code; /* two letter code */ ! 694: register char ***cap; /* pointer to cap string */ ! 695: char *bufp; /* pointer to cap buffer */ ! 696: char tentry[1024]; /* temporary uncoded caps buffer */ ! 697: ! 698: tgetent (tentry,s); /* get uncoded termcap entry */ ! 699: ! 700: LI = tgetnum ("li"); /* get number of lines */ ! 701: if (LI == -1) ! 702: LI = 12; ! 703: CO = tgetnum ("co"); /* get number of columns */ ! 704: if (CO == -1) ! 705: CO = 65; ! 706: ! 707: bufp = tbuf; /* get padding character */ ! 708: tgetstr ("pc",&bufp); ! 709: if (bufp != tbuf) ! 710: PC = *tbuf; ! 711: else ! 712: PC = 0; ! 713: ! 714: bufp = tbuf; /* get string entries */ ! 715: cap = tstr; ! 716: for (code = tcap; *code; code += 2) ! 717: **cap++ = (char *)tgetstr (code,&bufp); ! 718: ! 719: /* get pertinent lengths */ ! 720: if (HO) ! 721: lHO = strlen (HO); ! 722: if (BC) ! 723: lBC = strlen (BC); ! 724: else ! 725: lBC = 1; ! 726: if (UP) ! 727: lUP = strlen (UP); ! 728: if (ND) ! 729: lND = strlen (ND); ! 730: if (LI < 24 || CO < 72 || !(CL && UP && ND)) ! 731: return (0); ! 732: linect = (int *)calloc (LI+1,sizeof(int)); ! 733: return (1); ! 734: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.