home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume2 / usc / Part4 < prev    next >
Internet Message Format  |  1991-08-07  |  23KB

  1. From: allbery@ncoast.UUCP (Brandon S. Allbery)
  2. Newsgroups: comp.sources.misc
  3. Subject: v02i036: UNIFY(r) Screens with Curses, Part 4 of 4
  4. Message-ID: <7163@ncoast.UUCP>
  5. Date: 31 Jan 88 04:16:49 GMT
  6. Approved: allbery@ncoast.UUCP
  7.  
  8. Comp.sources.misc: Volume 2, Issue 36
  9. Submitted-By: The Moderator <allbery@ncoast.UUCP>
  10. Archive-Name: usc/Part4
  11.  
  12. I've received so many requests for my Unify(r) screen routines that I am
  13. posting them.  The USC library is in four parts; unshar them and type "make".
  14. The curses used is System V; BSDers will want to tweak the usual stuff, such
  15. as beep() and cbreak().
  16.  
  17. I also have a simple screen program using this; if demand warrants, I will
  18. post it -- but in terms of features, you're probably better off with ENTER.
  19.  
  20. #--------------------------------CUT HERE-------------------------------------
  21. #! /bin/sh
  22. #
  23. # This is a shell archive.  Save this into a file, edit it
  24. # and delete all lines above this comment.  Then give this
  25. # file to sh by executing the command "sh file".  The files
  26. # will be extracted into the current directory owned by
  27. # you with default permissions.
  28. #
  29. # The files contained herein are:
  30. #
  31. # -r--r--r--  1 allbery users      2258 Jan 30 18:01 utime.c
  32. # -r--r--r--  1 allbery users      2712 Jan 30 18:01 xerror.c
  33. # -rw-r--r--  1 allbery users       222 Jan 30 18:01 xrc.h
  34. # -r--r--r--  1 allbery users      1363 Jan 30 18:01 xsfldesc.c
  35. # -rw-r--r--  1 allbery users       540 Jan 30 18:01 xsfldesc.h
  36. # -r--r--r--  1 allbery users       784 Jan 30 18:01 xsize.c
  37. # -r--r--r--  1 allbery users      1444 Jan 30 18:01 yorn.c
  38. # -r--r--r--  1 allbery users      8188 Jan 30 18:01 zoom.c
  39. #
  40. echo 'x - utime.c'
  41. if test -f utime.c; then echo 'shar: not overwriting utime.c'; else
  42. sed 's/^X//' << '________This_Is_The_END________' > utime.c
  43. X/*
  44. X * $Header: utime.c,v 1.5 87/06/09 11:53:19 brandon Exp $
  45. X *
  46. X * ``USC'' -- UNIFY(r) Screens using Curses
  47. X * UNIFY(r) is a registered trademark of Unify Corporation.
  48. X *
  49. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  50. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  51. X *
  52. X * $Log:    utime.c,v $
  53. X * Revision 1.5  87/06/09  11:53:19  brandon
  54. X * Right-justified buffer display; repositioned cursor after conversion errors.
  55. X * 
  56. X * Revision 1.4  87/06/01  08:37:49  brandon
  57. X * Added ^V (view) capability for related records.
  58. X * 
  59. X * Revision 1.3  87/05/27  14:43:30  brandon
  60. X * Made sure buffer was padded with spaces.
  61. X * 
  62. X * Revision 1.2  87/05/26  14:29:40  brandon
  63. X * Well, utime() was the culprit (be nice if I could read!)-:
  64. X * 
  65. X * Revision 1.1  87/05/26  13:34:36  brandon
  66. X * Initial revision
  67. X * 
  68. X * Revision 1.4  87/05/12  13:26:31  brandon
  69. X * Dumb bug in : parsing.
  70. X * 
  71. X * Revision 1.3  87/05/12  12:04:10  brandon
  72. X * Changed to pass FWD, BACK, GO without checking the data buffer
  73. X * 
  74. X * Revision 1.2  87/04/29  11:30:53  brandon
  75. X * Added RCS header information
  76. X * 
  77. X */
  78. X
  79. X/*LINTLIBRARY*/
  80. X
  81. X#include "usc.h"
  82. X
  83. X/*
  84. X * Get a time.  H:M only.
  85. X */
  86. X
  87. Xint updtime(buf)
  88. Xshort *buf; {
  89. X    int cnt, rc, hr, min, y, x;
  90. X    char ibuf[6];
  91. X
  92. X    setraw();
  93. X    (void) sprintf(ibuf, "%02d:%02d", *buf / 60, *buf % 60);
  94. X    getyx(stdscr, y, x);
  95. X    for (;;) {
  96. X        (void) move(y, x);
  97. X        if ((rc = inl(ibuf, 5, 0)) == BACK || rc == FWD || rc == GO || rc == LOOK)
  98. X            return rc;
  99. X        for (cnt = 0; cnt < 5 && ibuf[cnt] == ' '; cnt++)
  100. X            ;
  101. X        if (cnt == 5) {
  102. X            prtmsg(1, 23, "Invalid time");
  103. X            continue;
  104. X        }
  105. X        if (!isdigit(cnt)) {
  106. X            prtmsg(1, 23, "Invalid time");
  107. X            continue;
  108. X        }
  109. X        hr = 0;
  110. X        min = 0;
  111. X        while (cnt < 5 && isdigit(ibuf[cnt])) {
  112. X            hr *= 10;
  113. X            hr += ibuf[cnt++] - '0';
  114. X        }
  115. X        if (cnt > 2 || ibuf[cnt++] != ':') {
  116. X            prtmsg(1, 23, "Invalid time");
  117. X            continue;
  118. X        }
  119. X        if (!isdigit(ibuf[cnt])) {
  120. X            prtmsg(1, 23, "Invalid time");
  121. X            continue;
  122. X        }
  123. X        min = 10 * (ibuf[cnt++] - '0');
  124. X        if (!isdigit(ibuf[cnt])) {
  125. X            prtmsg(1, 23, "Invalid time");
  126. X            continue;
  127. X        }
  128. X        min += ibuf[cnt++] - '0';
  129. X        while (cnt < 5)
  130. X            if (ibuf[cnt++] != ' ') {
  131. X                prtmsg(1, 23, "Invalid time");
  132. X                continue;
  133. X            }
  134. X        if (hr < 23 && min < 59)
  135. X            break;
  136. X        prtmsg(1, 23, "Invalid time");
  137. X    }
  138. X    return rc;
  139. X}
  140. ________This_Is_The_END________
  141. if test `wc -l < utime.c` -ne 97; then
  142.     echo 'shar: utime.c was damaged during transit (should have been 97 bytes)'
  143. fi
  144. fi        ; : end of overwriting check
  145. echo 'x - xerror.c'
  146. if test -f xerror.c; then echo 'shar: not overwriting xerror.c'; else
  147. sed 's/^X//' << '________This_Is_The_END________' > xerror.c
  148. X/*
  149. X * $Header: xerror.c,v 1.9 87/05/29 10:53:45 brandon Exp $
  150. X *
  151. X * ``USC'' -- UNIFY(r) Screens using Curses
  152. X * UNIFY(r) is a registered trademark of Unify Corporation.
  153. X *
  154. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  155. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  156. X *
  157. X * $Log:    xerror.c,v $
  158. X * Revision 1.9  87/05/29  10:53:45  brandon
  159. X * Have to deal with an error before the screen is set up (was dumping core on
  160. X * endwin() with stdscr == NULL).
  161. X * 
  162. X * Revision 1.8  87/05/12  10:57:56  brandon
  163. X * Tried a better way of resetting to standard terminal mode.
  164. X * 
  165. X * Revision 1.7  87/05/11  17:03:57  brandon
  166. X * oops!  "errprog" -> "errcall"
  167. X * 
  168. X * Revision 1.6  87/05/11  16:57:44  brandon
  169. X * added an error hook (primary use is to dump core on error exit)
  170. X * 
  171. X * Revision 1.5  87/05/11  14:12:33  brandon
  172. X * rearranged order of echo() kludge and other I/O routines to make sure it
  173. X * takes
  174. X * 
  175. X * Revision 1.4  87/05/11  13:32:41  brandon
  176. X * echo() call conflicts with unify; changed to system("stty echo") [UGH!]
  177. X * 
  178. X * Revision 1.3  87/05/01  16:15:06  brandon
  179. X * V_prgnm turned out to be defined in libx.a (unify).
  180. X * 
  181. X * Revision 1.2  87/04/29  11:31:27  brandon
  182. X * Added RCS header information
  183. X * 
  184. X */
  185. X
  186. X/*LINTLIBRARY*/
  187. X
  188. X#include "usc.h"
  189. X#include <varargs.h>
  190. X
  191. X/*
  192. X * Error log operations.  We try to emulate UNIFY 3.2's error log stuff, but
  193. X * it's not absolutely essential that we succeed (thankfully).
  194. X *
  195. X * A side benefit of this for pre-3.2 users is that the error log is used
  196. X * regardless of the UNIFY version.  (The error log should have been in the
  197. X * first version of UNIFY.)
  198. X */
  199. X
  200. Xextern int errno;
  201. Xextern char *V_prgnm;
  202. X
  203. Xchar errcall[30] = "xerror";
  204. Xvoid (*errhook)() = (void (*)()) 0;
  205. X
  206. X/*VARARGS*/
  207. Xxerror(va_alist)
  208. Xva_dcl {
  209. X    va_list args;
  210. X    int ier;
  211. X    char *fnm, *fmt;
  212. X    FILE *errlog;
  213. X    long now;
  214. X
  215. X    if (stdscr != (WINDOW *) 0)
  216. X        (void) endwin();
  217. X    va_start(args);
  218. X    ier = va_arg(args, int);
  219. X    fnm = va_arg(args, char *);
  220. X    fmt = va_arg(args, char *);
  221. X    if ((errlog = _dbfopen("errlog", "a")) == (FILE *) 0) {
  222. X        errlog = stderr;
  223. X        (void) fprintf(stderr, "\r\nInternal error %d/%d from %s: ", ier, errno, fnm);
  224. X    }
  225. X    else {
  226. X        now = time((long *) 0);
  227. X        (void) fprintf(errlog, "\n***\n\n%s\nProgram: %s\nCalling function: %s\nOffending function: %s\nStatus: %d\nErrno: %d\nNotes: ",
  228. X            ctime(&now), V_prgnm, errcall, fnm, ier, errno);
  229. X        (void) fprintf(stderr, "\r\nAn internal program error has occurred.  Please see the error log for details.\r\n\r\n\r\n");
  230. X    }
  231. X    (void) vfprintf(errlog, fmt, args);
  232. X    va_end(args);
  233. X    if (errlog == stderr)
  234. X        (void) fprintf(stderr, "\r\n\r\n");
  235. X    else
  236. X        (void) putc('\n', errlog);
  237. X    if (errhook != (void (*)()) 0)
  238. X        (*errhook)(ier, fnm, errcall);
  239. X    exit(99);
  240. X}
  241. ________This_Is_The_END________
  242. if test `wc -l < xerror.c` -ne 93; then
  243.     echo 'shar: xerror.c was damaged during transit (should have been 93 bytes)'
  244. fi
  245. fi        ; : end of overwriting check
  246. echo 'x - xrc.h'
  247. if test -f xrc.h; then echo 'shar: not overwriting xrc.h'; else
  248. sed 's/^X//' << '________This_Is_The_END________' > xrc.h
  249. Xextern int setxrc();
  250. X
  251. X#define XRC_GO    1    /* allow new return code -5 (also -6 if XRC_XOK) */
  252. X#define XRC_XOK    2    /* allow new return code -7 (also -6 if XRC_GO)  */
  253. X#define XRC_LOOK 4    /* allow new return code -8 (internal) */
  254. ________This_Is_The_END________
  255. if test `wc -l < xrc.h` -ne 5; then
  256.     echo 'shar: xrc.h was damaged during transit (should have been 5 bytes)'
  257. fi
  258. fi        ; : end of overwriting check
  259. echo 'x - xsfldesc.c'
  260. if test -f xsfldesc.c; then echo 'shar: not overwriting xsfldesc.c'; else
  261. sed 's/^X//' << '________This_Is_The_END________' > xsfldesc.c
  262. X/*
  263. X * $Header: xsfldesc.c,v 1.6 87/05/11 15:50:16 brandon Exp $
  264. X *
  265. X * ``USC'' -- UNIFY(r) Screens using Curses
  266. X * UNIFY(r) is a registered trademark of Unify Corporation.
  267. X *
  268. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  269. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  270. X *
  271. X * $Log:    xsfldesc.c,v $
  272. X * Revision 1.6  87/05/11  15:50:16  brandon
  273. X * removed debugging
  274. X * 
  275. X * Revision 1.5  87/05/11  15:47:13  brandon
  276. X * another check added
  277. X * 
  278. X * Revision 1.4  87/05/11  15:42:25  brandon
  279. X * wrong debug sring
  280. X * 
  281. X * Revision 1.3  87/05/11  15:38:54  brandon
  282. X * bugchk
  283. X * 
  284. X * Revision 1.2  87/04/29  11:31:28  brandon
  285. X * Added RCS header information
  286. X * 
  287. X */
  288. X
  289. X/*LINTLIBRARY*/
  290. X
  291. X#include "usc.h"
  292. X
  293. X/*
  294. X * ENTRY POINT:  xsfldesc() -- Return complete screen field description
  295. X *
  296. X * DIFFERENCE FROM UNIFY:  This function is not provided in the UNIFY screen
  297. X * interface.  Its purpose is to allow screen fields to be examined or set
  298. X * from a program.  In particular, a program may load extended attributes
  299. X * (uppercase shifting only at present) for screen fields, which will then be
  300. X * used automatically by inbuf() and input().
  301. X *
  302. X * This function returns a pointer to the internal screen field structure,
  303. X * which is delared in xsfdesc.h.
  304. X */
  305. X
  306. Xstruct q *xsfldesc(sfld) {
  307. X    if (sfld < 0 || sfld >= __nsf)
  308. X        return (struct q *) 0;
  309. X    return &__scf[sfld];
  310. X}
  311. ________This_Is_The_END________
  312. if test `wc -l < xsfldesc.c` -ne 49; then
  313.     echo 'shar: xsfldesc.c was damaged during transit (should have been 49 bytes)'
  314. fi
  315. fi        ; : end of overwriting check
  316. echo 'x - xsfldesc.h'
  317. if test -f xsfldesc.h; then echo 'shar: not overwriting xsfldesc.h'; else
  318. sed 's/^X//' << '________This_Is_The_END________' > xsfldesc.h
  319. X/*
  320. X * The internal screen field structure.  xsfldesc() return a POINTER to the
  321. X * actual struct, so be careful!!!  Only one update operation is defined:  to
  322. X * OR the flag UPCASE (below) with it to tell USC to force input to be upper
  323. X * case on the field.
  324. X */
  325. X
  326. Xstruct xsfldesc {
  327. X    char xsf_nam[8];
  328. X    char xsf_dbfld[44];
  329. X    short xsf_fld;
  330. X    short xsf_typ;
  331. X    short xsf_len;
  332. X    short xsf_col;
  333. X    short xsf_lin;
  334. X    char xsf_prmp[40];
  335. X    short xsf_pcol;
  336. X    short xsf_plin;
  337. X};
  338. X
  339. X#define XSFLDESC    struct xsfldesc
  340. X#define UPCASE        0x80
  341. X
  342. Xextern XSFLDESC *xsfldesc();
  343. ________This_Is_The_END________
  344. if test `wc -l < xsfldesc.h` -ne 24; then
  345.     echo 'shar: xsfldesc.h was damaged during transit (should have been 24 bytes)'
  346. fi
  347. fi        ; : end of overwriting check
  348. echo 'x - xsize.c'
  349. if test -f xsize.c; then echo 'shar: not overwriting xsize.c'; else
  350. sed 's/^X//' << '________This_Is_The_END________' > xsize.c
  351. X/*
  352. X * $Header: xsize.c,v 1.1 87/05/12 10:49:42 brandon Exp $
  353. X *
  354. X * ``USC'' -- UNIFY(r) Screens using Curses
  355. X * UNIFY(r) is a registered trademark of Unify Corporation.
  356. X *
  357. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  358. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  359. X *
  360. X * $Log:    xsize.c,v $
  361. X * Revision 1.1  87/05/12  10:49:42  brandon
  362. X * Initial revision
  363. X * 
  364. X */
  365. X
  366. X/*LINTLIBRARY*/
  367. X
  368. X#include "usc.h"
  369. X
  370. X/*
  371. X * The "xsize" function returns the external size of a screen field.
  372. X */
  373. X
  374. Xint xsize(typ, len) {
  375. X    switch (typ) {
  376. X    case INT:
  377. X    case LONG:
  378. X    case STRNG:
  379. X        return len;
  380. X    case DATE:
  381. X        return 8;
  382. X    case HR:
  383. X        return 5;
  384. X    case AMT:
  385. X    case HAMT:
  386. X        return len + 3;
  387. X    case FLT:
  388. X        return len / 10;
  389. X    default:
  390. X        xerror(typ, "xsize", "Unknown internal type");
  391. X        /*NOTREACHED*/
  392. X    }
  393. X}
  394. ________This_Is_The_END________
  395. if test `wc -l < xsize.c` -ne 43; then
  396.     echo 'shar: xsize.c was damaged during transit (should have been 43 bytes)'
  397. fi
  398. fi        ; : end of overwriting check
  399. echo 'x - yorn.c'
  400. if test -f yorn.c; then echo 'shar: not overwriting yorn.c'; else
  401. sed 's/^X//' << '________This_Is_The_END________' > yorn.c
  402. X/*
  403. X * $Header: yorn.c,v 1.5 87/06/01 11:26:32 brandon Exp $
  404. X *
  405. X * ``USC'' -- UNIFY(r) Screens using Curses
  406. X * UNIFY(r) is a registered trademark of Unify Corporation.
  407. X *
  408. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  409. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  410. X *
  411. X * $Log:    yorn.c,v $
  412. X * Revision 1.5  87/06/01  11:26:32  brandon
  413. X * After adding code to save the upshift state, I forgot to assign the new
  414. X * state.  (oops :-)
  415. X * 
  416. X * Revision 1.4  87/06/01  11:15:46  brandon
  417. X * Smartened up response and cleared prompt before returning
  418. X * 
  419. X * Revision 1.3  87/05/26  13:34:48  brandon
  420. X * Uses update mode with default = 'N'.
  421. X * 
  422. X * Revision 1.2  87/04/29  11:31:30  brandon
  423. X * Added RCS header information
  424. X * 
  425. X */
  426. X
  427. X/*LINTLIBRARY*/
  428. X
  429. X#include "usc.h"
  430. X
  431. X/*
  432. X * ENTRY POINT:  yorn() -- Ask for confirmation of an operation
  433. X *
  434. X * DIFFERENCE FROM UNIFY:  None.
  435. X */
  436. X
  437. Xyorn(prompt)
  438. Xchar *prompt; {
  439. X    char ib[1];
  440. X    int oucf, ier;
  441. X
  442. X    setraw();
  443. X    (void) mvaddstr(22, 1, prompt);
  444. X    for (;;) {
  445. X        ib[0] = 'N';
  446. X        oucf = _sh_up;
  447. X        _sh_up = 1;
  448. X        ier = inl(ib, 1, 0);
  449. X        _sh_up = oucf;
  450. X        switch (ier) {
  451. X        case FWD_OK:
  452. X            break;
  453. X        case BACK:
  454. X        case BACK_OK:
  455. X        case GO:
  456. X        case GO_OK:
  457. X        case FWD:
  458. X            ib[0] = 'N';
  459. X        }
  460. X        switch (ib[0]) {
  461. X        case 'Y':
  462. X        case 'y':
  463. X            (void) move(22, 1);
  464. X            (void) clrtoeol();
  465. X            return 1;
  466. X        case 'N':
  467. X        case 'n':
  468. X            (void) move(22, 1);
  469. X            (void) clrtoeol();
  470. X            return 0;
  471. X        }
  472. X        prtmsg(1, 23, "Please enter Y or N");
  473. X    }
  474. X}
  475. ________This_Is_The_END________
  476. if test `wc -l < yorn.c` -ne 73; then
  477.     echo 'shar: yorn.c was damaged during transit (should have been 73 bytes)'
  478. fi
  479. fi        ; : end of overwriting check
  480. echo 'x - zoom.c'
  481. if test -f zoom.c; then echo 'shar: not overwriting zoom.c'; else
  482. sed 's/^X//' << '________This_Is_The_END________' > zoom.c
  483. X/*
  484. X * $Header: zoom.c,v 1.11 87/06/09 12:34:44 brandon Exp $
  485. X *
  486. X * ``USC'' -- UNIFY(r) Screens using Curses
  487. X * UNIFY(r) is a registered trademark of Unify Corporation.
  488. X *
  489. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  490. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  491. X *
  492. X * $Log:    zoom.c,v $
  493. X * Revision 1.11  87/06/09  12:34:44  brandon
  494. X * OOPS!  Wanted wattroff(), *used* attroff().... sigh.
  495. X * 
  496. X * Revision 1.10  87/06/09  12:31:57  brandon
  497. X * Added RV "cursor"; fixed clearing on last page.
  498. X * 
  499. X * Revision 1.9  87/06/03  13:17:30  brandon
  500. X * Fixed final paging bugs; now full functional.
  501. X * 
  502. X * Revision 1.8  87/06/03  11:10:01  brandon
  503. X * Added extra refresh() so the cursor will end up in the NEW window.  I hope.
  504. X * 
  505. X * Revision 1.7  87/06/02  12:51:55  brandon
  506. X * Linted.
  507. X * 
  508. X * Revision 1.6  87/06/02  12:34:22  brandon
  509. X * Linted.
  510. X * 
  511. X * Revision 1.5  87/06/02  12:16:40  brandon
  512. X * Changed error() to xerror(); also ifdefed for Unify 3.2 (it won't work under
  513. X * earlier versions, since it uses the new data dictionary access calls).
  514. X * 
  515. X * Revision 1.4  87/06/01  16:43:29  brandon
  516. X * Now uses incs() (input character by status code) instead of getchar().
  517. X * 
  518. X * Revision 1.3  87/06/01  10:05:16  brandon
  519. X * Made sure current-record cursor stayed in place on FWD from last record.
  520. X * 
  521. X * Revision 1.2  87/06/01  09:35:01  brandon
  522. X * Added touchwin() to fix curses bug with missing touchwin() in delwin().
  523. X * (This bug is actually a holdover from the old curses.??!)
  524. X * 
  525. X * Revision 1.1  87/06/01  08:31:27  brandon
  526. X * Initial revision
  527. X * 
  528. X */
  529. X
  530. X/*LINTLIBRARY*/
  531. X
  532. X#ifndef UNIFY32
  533. X#ifndef lint
  534. Xstatic char dummy = '\0';    /* dumb loaders (Sys III) need this, alas */
  535. X#endif
  536. X#else
  537. X
  538. X#include "usc.h"
  539. X#ifdef TG
  540. X#include "tgraph.h"
  541. X#else
  542. X#ifndef ACS_HLINE
  543. X#define ACS_HLINE    '-'
  544. X#define ACS_VLINE    '|'
  545. X#define ACS_LLCORNER    '`'
  546. X#define ACS_ULCORNER    ','
  547. X#define ACS_LRCORNER    '\''
  548. X#define ACS_URCORNER    '.'
  549. X#define ACS_TTEE    '+'
  550. X#define ACS_BTEE    '+'
  551. X#endif
  552. X#endif
  553. X
  554. Xextern char *fldsyn();
  555. Xextern long atol();
  556. X
  557. X/*
  558. X * When XRC_LOOK is enabled and ^V is entered in a field with an explicit
  559. X * relationship, zoom() is invoked to display a browse window.  The user may
  560. X * then move around within the window, select a record, and return, which
  561. X * causes that record's key to be entered as the value of the field.
  562. X *
  563. X *    TAB    move up one record
  564. X *    RET    move down one record
  565. X *    ^F    move forward one page
  566. X *    ^B    move back
  567. X *    ^V    exit without returning a value
  568. X *    ESC    exit and return key of current record
  569. X */
  570. X
  571. Xzoom(x, y, fld, fdp, buf)
  572. XFLDESC *fdp;
  573. Xchar *buf; {
  574. X    WINDOW *w;
  575. X    int nfld, bfld, cnt, len, ier;
  576. X    int *bwf;
  577. X    long myloc, endloc, pageloc, lastrec;
  578. X    FLDESC fd;
  579. X    char xbuf[256];
  580. X
  581. X    nfld = 0;
  582. X    for (bfld = numflds(); bfld > 0; bfld--)
  583. X        if (fldesc(bfld, &fd) && fd.f_rec == fdp->f_rprec && fd.f_typ != COMB)
  584. X            nfld++;
  585. X    if ((bwf = (int *) malloc((unsigned) (nfld + 1) * sizeof *bwf)) == (int *) 0)
  586. X        xerror("zoom", 0, "out of memory at field %d", fld);
  587. X    bwf[nfld--] = 0;
  588. X    for (bfld = numflds(); bfld > 0; bfld--)
  589. X        if (fldesc(bfld, &fd) && fd.f_rec == fdp->f_rprec && fd.f_typ != COMB)
  590. X            bwf[nfld--] = bfld;
  591. X    len = 3;
  592. X    for (nfld = 0; bwf[nfld] != 0; nfld++) {
  593. X        (void) fldesc(bwf[nfld], &fd);
  594. X        if ((bfld = strlen(fldsyn(bwf[nfld]))) > fd.f_len)
  595. X            fd.f_len = bfld;
  596. X        if ((len += fd.f_len + 1) >= COLS)
  597. X            break;
  598. X    }
  599. X    if (bwf[nfld] != 0) {
  600. X        len -= fd.f_len + 1;
  601. X        bwf[nfld] = 0;
  602. X    }
  603. X    if (LINES - y < 5)
  604. X        y = LINES - 5;
  605. X    if ((x -= len - 2) < 0)
  606. X        x = 0;
  607. X    if ((w = newwin(LINES - y - 1, len, y, x)) == (WINDOW *) 0)
  608. X        xerror("zoom", 0, "can't allocate window");
  609. X    /* now ready to display stuff in our pet window */
  610. X#ifdef TG
  611. X    graph("");
  612. X#endif
  613. X    (void) box(w, ACS_VLINE, ACS_HLINE);
  614. X    (void) mvwaddch(w, 0, 0, ACS_ULCORNER);
  615. X    (void) mvwaddch(w, LINES - y - 2, 0, ACS_LLCORNER);
  616. X    (void) mvwaddch(w, LINES - y - 2, len - 1, ACS_LRCORNER);
  617. X    (void) mvwaddch(w, 0, len - 1, ACS_URCORNER);
  618. X    cnt = 2;
  619. X    for (nfld = 0; bwf[nfld + 1] != 0; nfld++) {
  620. X        (void) fldesc(bwf[nfld], &fd);
  621. X        if ((bfld = strlen(fldsyn(bwf[nfld]))) > fd.f_len)
  622. X            fd.f_len = bfld;
  623. X        cnt += fd.f_len;
  624. X        (void) mvwaddch(w, 0, cnt, ACS_TTEE);
  625. X        (void) mvwaddch(w, LINES - y - 2, cnt, ACS_BTEE);
  626. X        cnt++;
  627. X    }
  628. X    (void) wmove(w, 1, 2);
  629. X    for (nfld = 0; bwf[nfld] != 0; nfld++) {
  630. X        (void) fldesc(bwf[nfld], &fd);
  631. X        if ((bfld = strlen(fldsyn(bwf[nfld]))) > fd.f_len)
  632. X            fd.f_len = bfld;
  633. X        (void) wattron(w, A_UNDERLINE);
  634. X        (void) wprintw(w, "%-*.*s", fd.f_len, fd.f_len, fldsyn(bwf[nfld]));
  635. X        (void) wattroff(w, A_UNDERLINE);
  636. X        if (bwf[nfld + 1] != 0)
  637. X            (void) waddch(w, ACS_VLINE);
  638. X    }
  639. X    myloc = 1;
  640. X    pageloc = 1;
  641. X    lastrec = sort(fdp->f_rprec);
  642. X    for (;;) {
  643. X        cnt = 2;
  644. X        endloc = pageloc;
  645. X        for (ier = sethere(fdp->f_rprec, pageloc); cnt < LINES - y - 2 && ier == 0; ier = sethere(fdp->f_rprec, ++endloc)) {
  646. X            (void) mvwaddch(w, cnt, 1, ' ');
  647. X            for (nfld = 0; bwf[nfld] != 0; nfld++) {
  648. X                (void) fldesc(bwf[nfld], &fd);
  649. X                (void) gprint(bwf[nfld], xbuf);
  650. X                if ((bfld = strlen(fldsyn(bwf[nfld]))) > fd.f_len)
  651. X                    fd.f_len = bfld;
  652. X                if (myloc == endloc)
  653. X                    (void) wattron(w, A_STANDOUT);
  654. X                (void) wprintw(w, "%-*.*s", fd.f_len, fd.f_len, xbuf);
  655. X                if (myloc == endloc)
  656. X                    (void) wattroff(w, A_STANDOUT);
  657. X                if (bwf[nfld + 1] != 0)
  658. X                    (void) waddch(w, ACS_VLINE);
  659. X            }
  660. X            cnt++;
  661. X        }
  662. X        endloc--;
  663. X/*        if (myloc < pageloc || myloc > endloc)
  664. X            myloc = pageloc;    */
  665. X        while (cnt < LINES - y - 2) {
  666. X            (void) mvwaddch(w, cnt, 1, ' ');
  667. X            for (nfld = 0; bwf[nfld] != 0; nfld++) {
  668. X                (void) fldesc(bwf[nfld], &fd);
  669. X                if ((bfld = strlen(fldsyn(bwf[nfld]))) > fd.f_len)
  670. X                    fd.f_len = bfld;
  671. X                (void) wprintw(w, "%*s", fd.f_len, "");
  672. X                if (bwf[nfld + 1] != 0)
  673. X                    (void) waddch(w, ACS_VLINE);
  674. X            }
  675. X            cnt++;
  676. X        }
  677. X        cnt = myloc - pageloc;
  678. X        (void) wattron(w, A_STANDOUT);
  679. X        (void) mvwaddch(w, 2 + cnt, 1, '>');
  680. X        (void) wattroff(w, A_STANDOUT);
  681. X        (void) wmove(w, 2 + cnt, 1);
  682. X        (void) refresh();    /* so the next one places the cursor */
  683. X        (void) wrefresh(w);
  684. X        ier = 0;
  685. X        switch (incs(XRC_GO|XRC_LOOK|XRC_CFB|XRC_NOFLSH)) {
  686. X        case GO:
  687. X            if ((ier = sethere(fdp->f_rprec, myloc)) != 0) {
  688. X                prtmsg(1, 23, "Record not available");
  689. X                continue;
  690. X            }
  691. X            (void) gfield(fdp->f_rpfld, buf);
  692. X            ier = 1;
  693. X            /*FALLTHROUGH*/
  694. X        case LOOK:
  695. X            unsort(fdp->f_rprec);
  696. X            (void) delwin(w);
  697. X            (void) touchwin(stdscr);
  698. X            free((char *) bwf);
  699. X            return (ier? OK: FWD);
  700. X        case FWD:
  701. X            if (++myloc <= endloc)
  702. X                break;
  703. X            if (myloc > lastrec)
  704. X                myloc = lastrec;
  705. X            /*FALLTHROUGH*/
  706. X        case CFWD:
  707. X            if ((pageloc += LINES - y - 4) > lastrec) {
  708. X                prtmsg(1, 23, "There is no next page");
  709. X                pageloc -= LINES - y - 4;
  710. X            }
  711. X            break;
  712. X        case BACK:
  713. X            if (--myloc >= pageloc)
  714. X                break;
  715. X            if (myloc < 0)
  716. X                myloc = 0;
  717. X            /*FALLTHROUGH*/
  718. X        case CBACK:
  719. X            if ((pageloc -= LINES - y - 4) < 1) {
  720. X                prtmsg(1, 23, "There is no previous page");
  721. X                pageloc = 1;
  722. X            }
  723. X            break;
  724. X        default:
  725. X            (void) beep();
  726. X        }
  727. X    }
  728. X}
  729. X
  730. X/*****************************************************************************/
  731. X
  732. Xstatic FILE *_F_ = (FILE *) 0;
  733. Xstatic int   _S_ =          0;
  734. X
  735. Xsort(r) {
  736. X    int ier, key;
  737. X    long nrec, here;
  738. X    FLDESC fd;
  739. X    char buf[1024], t[50];
  740. X
  741. X    if (_F_ != (FILE *) 0)
  742. X        unsort(r);
  743. X    (void) sprintf(t, "/tmp/,zt%05d", getpid());
  744. X    if ((_F_ = fopen(t, "w")) == (FILE *) 0)
  745. X        xerror("zoomsort", 0, "cannot create tag file %s", t);
  746. X    (void) fldesc(key = reckey(r), &fd);
  747. X    nrec = 0L;
  748. X    for (ier = seqacc(r, 1); ier == 0; ier = seqacc(r, 2)) {
  749. X        nrec++;
  750. X        (void) gprint(key, buf);
  751. X        (void) loc(r, &here);
  752. X        (void) sprintf(buf + fd.f_len, "%09ld\n", here);
  753. X        (void) fputs(buf, _F_);
  754. X    }
  755. X    (void) fclose(_F_);
  756. X    switch (fork()) {
  757. X    case -1:
  758. X        xerror("zoomsort", 0, "cannot fork");
  759. X    case 0:
  760. X        (void) sprintf(buf, "-0.%d", fd.f_len);
  761. X        (void) execlp("sort", "sort", "+0", buf, t, "-o", t, (char *) 0);
  762. X        _exit(-1);
  763. X    default:
  764. X        (void) wait((int *) 0);
  765. X    }
  766. X    if ((_F_ = fopen(t, "r")) == (FILE *) 0)
  767. X        xerror("zoomsort", -1, "cannot reopen tagfile %s", t);
  768. X    (void) unlink(t);
  769. X    _S_ = fd.f_len + 10;
  770. X    return nrec;
  771. X}
  772. X
  773. Xunsort(r) {
  774. X    (void) fclose(_F_);
  775. X    _F_ = (FILE *) 0;
  776. X    _S_ = 0;
  777. X}
  778. X
  779. Xsethere(r, pos)
  780. Xlong pos; {
  781. X    char buf[1024];
  782. X
  783. X    (void) fseek(_F_, (pos - 1) * _S_, 0);
  784. X    if (fgets(buf, sizeof buf, _F_) == (char *) 0)
  785. X        return -1;
  786. X    return setloc(r, atol(buf + _S_ - 10));
  787. X}
  788. X
  789. X#endif
  790. ________This_Is_The_END________
  791. if test `wc -l < zoom.c` -ne 307; then
  792.     echo 'shar: zoom.c was damaged during transit (should have been 307 bytes)'
  793. fi
  794. fi        ; : end of overwriting check
  795. exit 0
  796.