allbery@ncoast.UUCP (Brandon S. Allbery) (01/31/88)
Comp.sources.misc: Volume 2, Issue 35 Submitted-By: The Moderator <allbery@ncoast.UUCP> Archive-Name: usc/Part3 I've received so many requests for my Unify(r) screen routines that I am posting them. The USC library is in four parts; unshar them and type "make". The curses used is System V; BSDers will want to tweak the usual stuff, such as beep() and cbreak(). I also have a simple screen program using this; if demand warrants, I will post it -- but in terms of features, you're probably better off with ENTER. #--------------------------------CUT HERE------------------------------------- #! /bin/sh # # This is a shell archive. Save this into a file, edit it # and delete all lines above this comment. Then give this # file to sh by executing the command "sh file". The files # will be extracted into the current directory owned by # you with default permissions. # # The files contained herein are: # # -r--r--r-- 1 allbery users 761 Jan 30 18:01 ptct_wrt.c # -r--r--r-- 1 allbery users 710 Jan 30 18:01 ptime.c # -r--r--r-- 1 allbery users 800 Jan 30 18:01 ptube.c # -r--r--r-- 1 allbery users 6626 Jan 30 18:01 ringmenu.c # -rw-rw-rw- 1 allbery users 152 Jan 30 18:01 ringmenu.h # -r--r--r-- 1 allbery users 769 Jan 30 18:01 setcook.c # -r--r--r-- 1 allbery users 703 Jan 30 18:01 setraw.c # -r--r--r-- 1 allbery users 583 Jan 30 18:01 setxrc.c # -r--r--r-- 1 allbery users 761 Jan 30 18:01 sfldesc.c # -r--r--r-- 1 allbery users 2483 Jan 30 18:01 shellout.c # -rw-r--r-- 1 allbery users 302 Jan 30 18:01 tester.c # -r--r--r-- 1 allbery users 2314 Jan 30 18:01 uamt.c # -r--r--r-- 1 allbery users 5459 Jan 30 18:01 udate.c # -r--r--r-- 1 allbery users 789 Jan 30 18:01 uerror.c # -r--r--r-- 1 allbery users 2267 Jan 30 18:01 uflt.c # -r--r--r-- 1 allbery users 2325 Jan 30 18:01 uhamt.c # -r--r--r-- 1 allbery users 1929 Jan 30 18:01 ulong.c # -r--r--r-- 1 allbery users 1849 Jan 30 18:01 upbuf.c # -r--r--r-- 1 allbery users 2266 Jan 30 18:01 updata.c # -r--r--r-- 1 allbery users 1252 Jan 30 18:01 upfield.c # -r--r--r-- 1 allbery users 2779 Jan 30 18:01 upscrf.c # -r--r--r-- 1 allbery users 2172 Jan 30 18:01 uptube.c # -rw-r--r-- 1 allbery users 4578 Jan 30 18:01 usc.h # -r--r--r-- 1 allbery users 2034 Jan 30 18:01 ushort.c # -r--r--r-- 1 allbery users 1339 Jan 30 18:01 ustr.c # echo 'x - ptct_wrt.c' if test -f ptct_wrt.c; then echo 'shar: not overwriting ptct_wrt.c'; else sed 's/^X//' << '________This_Is_The_END________' > ptct_wrt.c X/* X * $Header: ptct_wrt.c,v 1.2 87/04/29 11:31:19 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: ptct_wrt.c,v $ X * Revision 1.2 87/04/29 11:31:19 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * ENTRY POINT: ptct_wrt() -- Specify whether output is to be in protected X * mode or not X * X * DIFFERENCE FROM UNIFY: All we do is check fd == 1, since curses handles the X * screen itself. X */ X Xvoid ptct_wrt(fd, flg) { X if (fd != 1) X xerror(-1, "ptct_wrt", "Multi-terminal operation on fd %d not supported", fd); X} ________This_Is_The_END________ if test `wc -l < ptct_wrt.c` -ne 31; then echo 'shar: ptct_wrt.c was damaged during transit (should have been 31 bytes)' fi fi ; : end of overwriting check echo 'x - ptime.c' if test -f ptime.c; then echo 'shar: not overwriting ptime.c'; else sed 's/^X//' << '________This_Is_The_END________' > ptime.c X/* X * $Header: ptime.c,v 1.2 87/04/29 12:57:34 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: ptime.c,v $ X * Revision 1.2 87/04/29 12:57:34 brandon X * DUMB!!! Forgot to deref the buffer X * X * Revision 1.1 87/04/29 12:49:31 brandon X * Initial revision X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * Display a value of type HR. X */ X Xvoid ptime(buf) Xshort *buf; { X (void) setraw(); X (void) attron(A_UNDERLINE); X (void) printw("%02d:%02d", *buf / 100, *buf % 100); X (void) attroff(A_UNDERLINE); X} ________This_Is_The_END________ if test `wc -l < ptime.c` -ne 33; then echo 'shar: ptime.c was damaged during transit (should have been 33 bytes)' fi fi ; : end of overwriting check echo 'x - ptube.c' if test -f ptube.c; then echo 'shar: not overwriting ptube.c'; else sed 's/^X//' << '________This_Is_The_END________' > ptube.c X/* X * $Header: ptube.c,v 1.1 87/04/29 13:37:02 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: ptube.c,v $ X * Revision 1.1 87/04/29 13:37:02 brandon X * Initial revision X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * ENTRY POINT: ptube() -- Display data from a buffer in the format of a X * database field X * X * DIFFERENCE FROM UNIFY: FLT ends up being printed with %g. See pflt() X * for the gory details. X */ X Xvoid ptube(x, y, fld, buf) Xchar *buf; { X FLDESC fd; X X if (!fldesc(fld, &fd)) X xerror(-1, "ptube", "Invalid database field %d", fld); X outscrf(x, y, fd.f_typ, fd.f_len, buf); X} ________This_Is_The_END________ if test `wc -l < ptube.c` -ne 35; then echo 'shar: ptube.c was damaged during transit (should have been 35 bytes)' fi fi ; : end of overwriting check echo 'x - ringmenu.c' if test -f ringmenu.c; then echo 'shar: not overwriting ringmenu.c'; else sed 's/^X//' << '________This_Is_The_END________' > ringmenu.c X/* X * $Header: ringmenu.c,v 1.9 87/06/11 15:50:36 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: ringmenu.c,v $ X * Revision 1.9 87/06/11 15:50:36 brandon X * Fixed page backup bug, used XRC_NOFLSH in showmenu(), misc. other fixes. X * X * Revision 1.8 87/06/02 18:47:53 brandon X * Had forgotten to force input to uppercase. X * X * Revision 1.7 87/06/02 18:41:05 brandon X * Now uses XRC_FWDGO, so pressing RETURN has a more intuitive result. X * X * Revision 1.6 87/06/02 18:23:10 brandon X * Fixed another page-number bug. X * X * Revision 1.5 87/06/02 17:35:22 brandon X * Fixed bug with `page' numbering, and added a setraw() in case it's called X * before any other USC functions. X * X * Revision 1.4 87/06/02 16:14:38 brandon X * Fully linted. X * X * Revision 1.3 87/06/02 16:02:33 brandon X * Partially linted. X * X * Revision 1.2 87/06/02 15:47:15 brandon X * Partially linted. X * X * Revision 1.1 87/06/02 15:37:27 brandon X * Initial revision X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * Ring menu manager. You haven't seen a real ring menu yet; this one uses X * the full capability of the key primitives (including using "view" to show X * all the entries on the menu, one per line in a temp window), it scrolls if X * the menu is wider than the screen, etc. Rather than using `!' shellout, X * the ^P convention is used (subshell for Sys5, suspend for BSD) as a part X * of the input function (the same one used by inl()). (Late-breaking news: X * the latest version of I4GL now supports wrapound ring menus. But the help X * feature is still unique to USC.) X * X * space, CR next (wraps) X * tab exit without selecting X * esc execute X * ^F next `page' X * ^B last `page' X * ^X exit program X * ^P shellout/suspend X * ^H previous (wraps) X * ^V display all menu entries in a window X */ X Xstatic int paws(w) XWINDOW *w; { X (void) wmove(w, LINES - 1, 0); X (void) wattron(w, A_STANDOUT); X (void) waddstr(w, " Press ENTER for the next page, or TAB to return: "); X (void) wattroff(w, A_STANDOUT); X (void) wclrtoeol(w); X (void) wrefresh(w); X switch (incs(XRC_NOFLSH)) { X case -2: X return 0; X case -3: X return 1; X } X /*NOTREACHED*/ X} X Xstatic void showmenu(title, items) Xchar *title; Xstruct cmd *items; { X int nitem, line; X WINDOW *w; X X (void) refresh(); /* otherwise incs() zaps the top two lines */ X if ((w = newwin(LINES, COLS, 0, 0)) == (WINDOW *) 0) X xerror("showmenu", -1, "no space for menu window for `%s'", (title == (char *) 0? "(null)": title)); X (void) mvwaddstr(w, 0, 0, "Commands on th"); X if (title == (char *) 0 || title[0] == '\0') X (void) waddstr(w, "is"); X else X (void) wprintw(w, "e %s", title); X (void) waddstr(w, " menu:\n"); X (void) waddstr(w, "SPACE or ENTER moves forward, BACKSPACE moves backward, ESC selects, TAB exits;\n"); X (void) waddstr(w, " CONTROL-F moves forward one page, CONTROL-B moves backward one page.\n"); X line = 4; X for (nitem = 0; items[nitem].c_key != EOM; nitem++) { X if (line == LINES - 1) X if (!paws(w)) X break; X else { X (void) wmove(w, 4, 0); X (void) wclrtobot(w); X line = 4; X } X (void) wmove(w, line, 0); X if (items[nitem].c_title != INVISIBLE) X (void) waddstr(w, items[nitem].c_title); X else X (void) waddch(w, items[nitem].c_key); X (void) wprintw(w, "\t%s", items[nitem].c_desc); X line++; X } X (void) paws(w); X (void) delwin(w); X (void) touchwin(stdscr); X} X Xint ringmenu(title, menu/* , initial */) Xchar *title; Xstruct cmd *menu; { X int *mpage; X int nitem, npage, len, page, item, ch, x, y; X X setraw(); X npage = 1; X if (title != (char *) 0 && *title != '\0') X len = strlen(title) + 2; X else X len = 0; X for (nitem = 0; menu[nitem].c_key != EOM; nitem++) X if (menu[nitem].c_title != INVISIBLE) X if ((len += strlen(menu[nitem].c_title) + 2) >= COLS - 1) { X npage++; X if (title != (char *) 0 && *title != '\0') X len = strlen(title) + 2; X else X len = 0; X } X if ((mpage = (int *) malloc((unsigned) (npage + 1) * sizeof *mpage)) == (int *) 0) X xerror("ringmenu", 0, "No memory for menu `%s' page layout", (title == (char *) 0? "(null)": title)); X npage = 0; X if (title != (char *) 0 && *title != '\0') X len = strlen(title) + 2; X else X len = 0; X mpage[0] = 0; X for (nitem = 0; menu[nitem].c_key != EOM; nitem++) X if (menu[nitem].c_title != INVISIBLE) X if ((len += strlen(menu[nitem].c_title) + 2) >= COLS - 1) { X mpage[++npage] = nitem; X if (title != (char *) 0 && *title != '\0') X len = strlen(title) + 2; X else X len = 0; X } X mpage[++npage] = -1; X item = 0; X page = 0; X for (;;) { X (void) move(0, 0); X if (title != (char *) 0 && title[0] != '\0') X (void) printw("%s: ", title); X for (len = mpage[page]; menu[len].c_key != EOM && (page == npage - 1 || len < mpage[page + 1]); len++) { X if (menu[len].c_title == INVISIBLE) X continue; X if (len == item) X (void) attron(A_STANDOUT); X (void) printw(" %s ", menu[len].c_title); X if (len == item) { X (void) attroff(A_STANDOUT); X if (menu[len].c_desc != (char *) 0) { X getyx(stdscr, y, x); X (void) mvaddstr(1, 0, menu[len].c_desc); X (void) clrtoeol(); X (void) move(y, x); X } X } X } X (void) clrtoeol(); X if (title != (char *) 0 && *title != '\0') X (void) move(0, strlen(title) + 1); X else X (void) move(0, COLS - 1); X (void) refresh(); X ch = incs(XRC_CFB|XRC_LOOK|XRC_GO|XRC_CHAR|XRC_BKSP|XRC_FWDGO); X if (islower(ch)) X ch = toupper(ch); X (void) move(0, 0); X (void) clrtoeol(); X (void) move(1, 0); X (void) clrtoeol(); X switch (ch) { X case BKSP: X if (--item < mpage[page]) X if (page-- == 0) { X page = npage - 1; X for (item = mpage[page]; menu[item].c_key != EOM; item++) X ; X item--; X } X break; X case BACK: X free((char *) mpage); X return BACK; X case FWD: X if (menu[++item].c_key == EOM) { X page = 0; X item = 0; X } X else if (mpage[page + 1] != -1 && item == mpage[page + 1]) X page++; X break; X case LOOK: X showmenu(title, menu); X break; X case GO: X free((char *) mpage); X return menu[item].c_key; X case CFWD: X if (mpage[++page] == -1) X page = 0; X item = mpage[page]; X break; X case CBACK: X if (page-- == 0) X page = npage - 1; X item = mpage[page]; X break; X default: X for (len = 0; menu[len].c_key != EOM; len++) X if ((islower(menu[len].c_key)? toupper(menu[len].c_key): menu[len].c_key) == ch) { X free((char *) mpage); X return menu[len].c_key; X } X (void) beep(); X } X } X} ________This_Is_The_END________ if test `wc -l < ringmenu.c` -ne 243; then echo 'shar: ringmenu.c was damaged during transit (should have been 243 bytes)' fi fi ; : end of overwriting check echo 'x - ringmenu.h' if test -f ringmenu.h; then echo 'shar: not overwriting ringmenu.h'; else sed 's/^X//' << '________This_Is_The_END________' > ringmenu.h Xstruct ringmenu { X char c_key; X char *c_title; X char *c_desc; X}; X X#define EOM '\0' /* end of ring menu */ X#define INVIS "" /* invisible menu entry */ ________This_Is_The_END________ if test `wc -l < ringmenu.h` -ne 8; then echo 'shar: ringmenu.h was damaged during transit (should have been 8 bytes)' fi fi ; : end of overwriting check echo 'x - setcook.c' if test -f setcook.c; then echo 'shar: not overwriting setcook.c'; else sed 's/^X//' << '________This_Is_The_END________' > setcook.c X/* X * $Header: setcook.c,v 1.2 87/04/29 11:31:20 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: setcook.c,v $ X * Revision 1.2 87/04/29 11:31:20 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * Leave curses mode. Again, an assumption is made -- most UNIFY programs X * under pre-3.2 UNIFY DO NOT FOLLOW THE ASSUMPTION!!! so don't recompile X * UNIFY stuff unless you don't mind the program not cleaing up after itself. X */ X Xvoid setcook() { X if (stdscr != (WINDOW *) 0) { X (void) endwin(); X stdscr = (WINDOW *) 0; X } X} ________This_Is_The_END________ if test `wc -l < setcook.c` -ne 31; then echo 'shar: setcook.c was damaged during transit (should have been 31 bytes)' fi fi ; : end of overwriting check echo 'x - setraw.c' if test -f setraw.c; then echo 'shar: not overwriting setraw.c'; else sed 's/^X//' << '________This_Is_The_END________' > setraw.c X/* X * $Header: setraw.c,v 1.2 87/04/29 11:31:22 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: setraw.c,v $ X * Revision 1.2 87/04/29 11:31:22 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * Set up curses, if necessary. Called by all USC I/O routines. This routine X * is based on an assumption of how setraw() is used. X */ X Xvoid setraw() { X if (stdscr == (WINDOW *) 0) { X (void) initscr(); X (void) noecho(); X (void) cbreak(); X (void) nonl(); X } X} ________This_Is_The_END________ if test `wc -l < setraw.c` -ne 32; then echo 'shar: setraw.c was damaged during transit (should have been 32 bytes)' fi fi ; : end of overwriting check echo 'x - setxrc.c' if test -f setxrc.c; then echo 'shar: not overwriting setxrc.c'; else sed 's/^X//' << '________This_Is_The_END________' > setxrc.c X/* X * $Header: setxrc.c,v 1.2 87/04/29 11:31:23 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: setxrc.c,v $ X * Revision 1.2 87/04/29 11:31:23 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * Set the extended-return-code flag to the specified value. X */ X Xint setxrc(f) { X int of; X X of = __ext_rcodes; X __ext_rcodes = f; X return of; X} ________This_Is_The_END________ if test `wc -l < setxrc.c` -ne 30; then echo 'shar: setxrc.c was damaged during transit (should have been 30 bytes)' fi fi ; : end of overwriting check echo 'x - sfldesc.c' if test -f sfldesc.c; then echo 'shar: not overwriting sfldesc.c'; else sed 's/^X//' << '________This_Is_The_END________' > sfldesc.c X/* X * $Header: sfldesc.c,v 1.2 87/04/29 11:31:25 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: sfldesc.c,v $ X * Revision 1.2 87/04/29 11:31:25 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * ENTRY POINT: sfldesc() -- Return screen field description X * X * DIFFERENCE FROM UNIFY: None. However, see xsfldesc(). X */ X Xsfldesc(sfld, buf) XSFLDESC *buf; { X if (sfld < 0 || sfld >= __nsf) X return 0; X buf->sf_fld = __scf[sfld].q_fld; X buf->sf_col = __scf[sfld].q_fx; X buf->sf_lin = __scf[sfld].q_fy; X return 1; X} ________This_Is_The_END________ if test `wc -l < sfldesc.c` -ne 34; then echo 'shar: sfldesc.c was damaged during transit (should have been 34 bytes)' fi fi ; : end of overwriting check echo 'x - shellout.c' if test -f shellout.c; then echo 'shar: not overwriting shellout.c'; else sed 's/^X//' << '________This_Is_The_END________' > shellout.c X/* X * $Header: shellout.c,v 1.4 87/06/17 17:40:53 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: shellout.c,v $ X * Revision 1.4 87/06/17 17:40:53 brandon X * I'm beginning to think that it is impossible to get to the bottom of the X * screen.... X * X * Revision 1.3 87/06/11 16:37:20 brandon X * Still didn't move to BOS. Now using term{cap, info} low-level code. X * X * Revision 1.2 87/06/09 11:28:14 brandon X * Forgot to move to BOS before starting the shell (suspending). This is done X * with mvcur(), since otherwise temporary windows (^V) would fail. X * X * Revision 1.1 87/06/01 16:32:06 brandon X * Initial revision X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X#include <signal.h> X X/* X * Internal routine used by inl() and inc() to suspend the program. Under X * System V, this does a subshell instead. X */ X Xstatic void _putc(ch) Xchar ch; { X (void) write(1, &ch, 1); X} X X#ifndef TERMCAP X#include <term.h> X#define CM cursor_address X#endif X Xstatic void bos() { X/* this does a move without changing curses... multiple windows would fail. */ X (void) tputs(tgoto(CM, 1, LINES - 1), 0, _putc); X} X X#ifdef SIGTSTP X Xvoid _inlsusp() { X (void) nocbreak(); X (void) nonl(); X (void) echo(); /* this is a macro in the BSD curses, hurrah! */ X bos(); X (void) kill(getpid(), SIGSTOP); X (void) cbreak(); X (void) nl(); X (void) noecho(); X (void) move(y, x); X (void) clearok(curscr); X (void) wrefresh(curscr); X} X X#else X Xvoid _inlsusp() { X char *sh; X int (*oint)(), (*oquit)(); X int pid, status; X X if ((sh = getenv("SHELL")) == (char *) 0) X sh = "/bin/sh"; X oint = signal(SIGINT, SIG_IGN); X oquit = signal(SIGQUIT, SIG_IGN); X bos(); X (void) nocbreak(); X (void) nl(); X (void) system("stty echo"); /* ECCH! echo() conflicts with Unify!!! */ X /* presumably, I don't need vfork() because of the above */ X switch (pid = fork()) { X case -1: X status = -1; X break; X case 0: X (void) signal(SIGINT, SIG_DFL); X (void) signal(SIGQUIT, SIG_DFL); X (void) execlp(sh, sh, "-i", (char *) 0); X _exit(-1); X default: X while (wait(&status) != pid) X ; X break; X } X (void) noecho(); X (void) nonl(); X (void) cbreak(); X (void) signal(SIGINT, oint); X (void) signal(SIGQUIT, oquit); X (void) clearok(curscr); X (void) wrefresh(curscr); X if (status == -1) X prtmsg(1, 23, "Shell returned -1"); X} X X#endif ________This_Is_The_END________ if test `wc -l < shellout.c` -ne 109; then echo 'shar: shellout.c was damaged during transit (should have been 109 bytes)' fi fi ; : end of overwriting check echo 'x - tester.c' if test -f tester.c; then echo 'shar: not overwriting tester.c'; else sed 's/^X//' << '________This_Is_The_END________' > tester.c X#include <curses.h> X#include <signal.h> X Xbye() { X setcook(); X abort(); X abort(); X} X Xmain() { X signal(SIGQUIT, bye); X putenv("DBPATH=/proj/e_u"); X setxrc(4); X addrec(4, "TEST#001"); X gdata(0, 5, 11); X delete(4); X setcook(); X exit(0); X} X Xerror(s,ier){setcook();printf("%s(%d)\n",s,ier);abort();abort();} ________This_Is_The_END________ if test `wc -l < tester.c` -ne 21; then echo 'shar: tester.c was damaged during transit (should have been 21 bytes)' fi fi ; : end of overwriting check echo 'x - uamt.c' if test -f uamt.c; then echo 'shar: not overwriting uamt.c'; else sed 's/^X//' << '________This_Is_The_END________' > uamt.c X/* X * $Header: uamt.c,v 1.5 87/06/09 11:52:25 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: uamt.c,v $ X * Revision 1.5 87/06/09 11:52:25 brandon X * Right-justified buffer display; repositioned cursor after conversion errors. X * X * Revision 1.4 87/06/01 08:37:14 brandon X * Added ^V (view) capability for related records. X * X * Revision 1.3 87/05/27 14:42:07 brandon X * Made sure buffer was padded with spaces. X * X * Revision 1.2 87/05/26 15:43:58 brandon X * Forgot to cast sprintf(). X * X * Revision 1.1 87/05/26 13:32:55 brandon X * Initial revision X * X * Revision 1.3 87/05/12 12:04:06 brandon X * Changed to pass FWD, BACK, GO without checking the data buffer X * X * Revision 1.2 87/04/29 11:30:31 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * Input a small amount, into a (long). X */ X Xint uamt(len, buf) Xlong *buf; { X char ibuf[11]; X int rc, cnt, sign, dec, y, x; X X setraw(); X if (len > 10) X len = 10; X (void) sprintf(ibuf, "%*.2f", len + 3, (double) *buf / 100.0); X getyx(stdscr, y, x); X for (;;) { X (void) move(y, x); X if ((rc = inl(ibuf, len, 0)) == BACK || rc == FWD || rc == GO || rc == LOOK) X return rc; X for (cnt = 0; cnt < len && ibuf[cnt] == ' '; cnt++) X ; X if (cnt == len) { X prtmsg(1, 23, "Invalid amount"); X continue; X } X *buf = 0L; X sign = 0; X dec = 0; X if (ibuf[cnt] == '-') { X sign = 1; X if (++cnt == len) { X prtmsg(1, 23, "Invalid amount"); X continue; X } X } X for (; cnt < len && isdigit(ibuf[cnt]); cnt++) { X *buf *= 10; X *buf += ibuf[cnt] - '0'; X } X if (ibuf[cnt] == '.') { X if (cnt > len - 2) { X prtmsg(1, 23, "Invalid amount"); X continue; X } X if (!isdigit(ibuf[++cnt])) { X prtmsg(1, 23, "Invalid amount"); X continue; X } X dec = (ibuf[cnt] - '0') * 10; X if (!isdigit(ibuf[++cnt])) { X prtmsg(1, 23, "Invalid amount"); X continue; X } X dec += ibuf[cnt] - '0'; X } X for (; cnt < len && ibuf[cnt] == ' '; cnt++) X ; X if (cnt == len) X break; X prtmsg(1, 23, "Invalid amount"); X } X *buf = *buf * 100 + dec; X if (sign) X *buf = - *buf; X return rc; X} ________This_Is_The_END________ if test `wc -l < uamt.c` -ne 102; then echo 'shar: uamt.c was damaged during transit (should have been 102 bytes)' fi fi ; : end of overwriting check echo 'x - udate.c' if test -f udate.c; then echo 'shar: not overwriting udate.c'; else sed 's/^X//' << '________This_Is_The_END________' > udate.c X/* X * $Header: udate.c,v 1.11 87/06/02 12:51:52 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: udate.c,v $ X * Revision 1.11 87/06/02 12:51:52 brandon X * Linted. X * X * Revision 1.10 87/06/01 16:29:20 brandon X * Moved today() and thisyear() to datefns.c with new names. X * X * Revision 1.9 87/06/01 09:39:27 brandon X * Missing move() before pdate() calls. X * X * Revision 1.8 87/06/01 09:25:26 brandon X * AARGH! ! ! Output func is pdate(), not odate()! X * X * Revision 1.7 87/06/01 09:23:01 brandon X * Forced redisplay of entered date, so `/' (today) shows up properly. X * X * Revision 1.6 87/06/01 08:37:30 brandon X * Added ^V (view) capability for related records. X * X * Revision 1.5 87/05/27 15:51:59 brandon X * Wasn't handling canonical form of NULLDATE. X * X * Revision 1.4 87/05/27 14:42:24 brandon X * Made sure buffer was padded with spaces. X * X * Revision 1.3 87/05/26 15:44:12 brandon X * Forgot to cast sprintf(). X * X * Revision 1.2 87/05/26 14:08:02 brandon X * udate() conflicted with UN*X call; changed to upddate(). X * X * Revision 1.1 87/05/26 13:33:23 brandon X * Initial revision X * X * (Log: idate.c,v) X * Revision 1.8 87/05/12 15:39:26 brandon X * added call to _sdbrt() to insure correct date types X * X * Revision 1.7 87/05/12 13:24:21 brandon X * Dumb bugs in parsing /. X * X * Revision 1.6 87/05/11 16:38:35 brandon X * more checking and another bugfix; it was typechecking on no-data returns X * X * Revision 1.5 87/05/11 16:30:07 brandon X * more checking added (also friendlier error messages) X * X * Revision 1.4 87/05/11 16:22:40 brandon X * removed debugging and fixed bug! X * X * Revision 1.3 87/05/11 16:13:54 brandon X * bugchk X * X * Revision 1.2 87/04/29 11:30:33 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X#include <ctype.h> X X/* X * Input a date. This is effectively a (short), but outside may have one of X * the following values: X * X * n/n[/n] **.**.** * / X * X * At any time, . or - may be used in place of /. * is short for **.**.**; X * / is short for today's date. (Note: I used . in place of / in the null X * dates, the reason I leave as an exercise for the reader.) X * X * This routine is ugly, but it does it all. X */ X Xint upddate(buf) Xshort *buf; { X int odate[3], date[3]; X int cnt, rc, DS1, DS2, DS3, x, y; X char ibuf[9]; X X setraw(); X _sdbrt(); X switch (_ldbrt & MASK_DATES) { X case YMD: X DS1 = YEAR; X DS2 = MONTH; X DS3 = DAY; X break; X case DMY: X DS1 = DAY; X DS2 = MONTH; X DS3 = YEAR; X break; X case MDY: X DS1 = MONTH; X DS2 = DAY; X DS3 = YEAR; X break; X default: X xerror(-1, "udate", "Unrecognized internal date code %d", _ldbrt & MASK_DATES); X } X if (*buf == NULLDATE) X (void) strcpy(ibuf, "**/**/**"); X else { X kdate(*buf, date); X (void) sprintf(ibuf, "%02d/%02d/%02d", date[DS1], date[DS2], date[DS3]); X } X getyx(stdscr, y, x); X for (;;) { X (void) move(y, x); X if ((rc = inl(ibuf, 8, 0)) == BACK || rc == FWD || rc == GO || rc == LOOK) X return rc; X for (cnt = 0; cnt < 8; cnt++) X if (ibuf[cnt] == '.' || ibuf[cnt] == '-') X ibuf[cnt] = '/'; X for (cnt = 0; cnt < 8 && ibuf[cnt] == ' '; cnt++) X ; X if (cnt == 8) { X prtmsg(1, 23, "Invalid empty date"); X continue; X } X if (ibuf[cnt] == '/') { X for (cnt++; cnt < 8 && ibuf[cnt] == ' '; cnt++) X ; X if (cnt < 8) { X prtmsg(1, 23, "Invalid date format"); X continue; X } X *buf = _dt_today(); X (void) move(y, x); X pdate(buf); X return rc; X } X if (ibuf[cnt] == '*') { X if (strncmp(ibuf, "**/**/**", 8) == 0) { X *buf = NULLDATE; X (void) move(y, x); X pdate(buf); X return rc; X } X for (cnt++; cnt < 8 && ibuf[cnt] == ' '; cnt++) X ; X if (cnt < 8) { X prtmsg(1, 23, "Invalid null date format"); X continue; X } X *buf = NULLDATE; X (void) move(y, x); X pdate(buf); X return rc; X } X if (!isdigit(ibuf[cnt])) { X prtmsg(1, 23, "Invalid date -- bad digit"); X continue; X } X date[MONTH] = 0; X date[DAY] = 0; X date[YEAR] = 0; X while (cnt < 8 && isdigit(ibuf[cnt])) { X date[DS1] *= 10; X date[DS1] += ibuf[cnt++] - '0'; X } X if (cnt == 8 || ibuf[cnt++] != '/') { X prtmsg(1, 23, "Invalid date -- invalid 1pt"); X continue; X } X while (cnt < 8 && isdigit(ibuf[cnt])) { X date[DS2] *= 10; X date[DS2] += ibuf[cnt++] - '0'; X } X if (cnt < 8 && ibuf[cnt] == ' ') { X for (; cnt < 8 && ibuf[cnt] == ' '; cnt++) X ; X if (cnt < 8) { X prtmsg(1, 23, "Invalid date -- trailing garbage"); X continue; X } X if (_ldbrt & YMD) { X date[DAY] = date[MONTH]; X date[MONTH] = date[YEAR]; X } X date[YEAR] = _dt_year(); X } X else if (cnt == 8) X date[YEAR] = _dt_year(); X else if (ibuf[cnt++] != '/') { X prtmsg(1, 23, "Invalid date -- invalid 2pt"); X continue; X } X else { X while (cnt < 8 && isdigit(ibuf[cnt])) { X date[DS3] *= 10; X date[DS3] += ibuf[cnt++] - '0'; X } X if (cnt < 8) { X for (; cnt < 8 && ibuf[cnt] == ' '; cnt++) X ; X if (cnt < 8) { X prtmsg(1, 23, "Invalid date -- trailing garbage in 3pt"); X continue; X } X } X } X *buf = kday(date); X kdate(*buf, odate); X if (ivcmp((char *) date, (char *) odate, sizeof date)) X break; X prtmsg(1, 23, "Invalid date -- insane elements"); X } X (void) move(y, x); X pdate(buf); X return rc; X} ________This_Is_The_END________ if test `wc -l < udate.c` -ne 224; then echo 'shar: udate.c was damaged during transit (should have been 224 bytes)' fi fi ; : end of overwriting check echo 'x - uerror.c' if test -f uerror.c; then echo 'shar: not overwriting uerror.c'; else sed 's/^X//' << '________This_Is_The_END________' > uerror.c X/* X * $Header: uerror.c,v 1.1 87/04/29 14:57:46 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: uerror.c,v $ X * Revision 1.1 87/04/29 14:57:46 brandon X * Initial revision X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * ENTRY POINT: uerror() -- Print a user error message and exit X * X * DIFFERENCE FROM UNIFY: *Always* uses the error log, even in pre-3.2 X * versions. Also, my idea of what an error should log seems to differ from X * that of Unify Corp. X */ X Xvoid uerror(s, ier) Xchar *s; { X (void) strcpy(errcall, "uerror"); X xerror(ier, "User error -- see Notes", "%s", s); X} ________This_Is_The_END________ if test `wc -l < uerror.c` -ne 32; then echo 'shar: uerror.c was damaged during transit (should have been 32 bytes)' fi fi ; : end of overwriting check echo 'x - uflt.c' if test -f uflt.c; then echo 'shar: not overwriting uflt.c'; else sed 's/^X//' << '________This_Is_The_END________' > uflt.c X/* X * $Header: uflt.c,v 1.5 87/06/09 11:53:03 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: uflt.c,v $ X * Revision 1.5 87/06/09 11:53:03 brandon X * Right-justified buffer display; repositioned cursor after conversion errors. X * X * Revision 1.4 87/06/01 08:37:36 brandon X * Added ^V (view) capability for related records. X * X * Revision 1.3 87/05/27 14:42:30 brandon X * Made sure buffer was padded with spaces. X * X * Revision 1.2 87/05/26 15:44:16 brandon X * Forgot to cast sprintf(). X * X * Revision 1.1 87/05/26 13:33:48 brandon X * Initial revision X * X * Revision 1.3 87/05/12 12:04:13 brandon X * Changed to pass FWD, BACK, GO without checking the data buffer X * X * Revision 1.2 87/04/29 11:30:35 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * Input a float. This time, they're dumb; take what we're given, no matter X * how any decimals -- UNITRIEVE can figure it out for itself, since it won't X * let me! (This is UNIFY's own behavior, in fact.) X */ X Xint uflt(len, buf) Xregister double *buf; { X char ibuf[18]; X int rc, cnt, sign, y, x; X double dec; X X setraw(); X if (len > 17) X len = 17; X (void) sprintf(ibuf, "%*g", len, *buf); X getyx(stdscr, y, x); X for (;;) { X (void) move(y, x); X if ((rc = inl(ibuf, len, 0)) == BACK || rc == FWD || rc == GO || rc == LOOK) X return rc; X for (cnt = 0; cnt < len && ibuf[cnt] == ' '; cnt++) X ; X if (cnt == len) { X prtmsg(1, 23, "Invalid float"); X continue; X } X *buf = 0.0; X sign = 0; X dec = 0; X if (ibuf[cnt] == '-') { X sign = 1; X if (++cnt == len) { X prtmsg(1, 23, "Invalid float"); X continue; X } X } X for (; cnt < len && isdigit(ibuf[cnt]); cnt++) { X *buf *= 10.0; X *buf += ibuf[cnt] - '0'; X } X if (ibuf[cnt] == '.') { X dec = 10.0; X for (cnt++; cnt < len && isdigit(ibuf[cnt]); cnt++) { X *buf += (ibuf[cnt] - '0') / dec; X dec *= 10.0; X } X } X for (; cnt < len && ibuf[cnt] == ' '; cnt++) X ; X if (cnt == len) X break; X prtmsg(1, 23, "Invalid float"); X } X if (sign) X *buf = - *buf; X return rc; X} ________This_Is_The_END________ if test `wc -l < uflt.c` -ne 95; then echo 'shar: uflt.c was damaged during transit (should have been 95 bytes)' fi fi ; : end of overwriting check echo 'x - uhamt.c' if test -f uhamt.c; then echo 'shar: not overwriting uhamt.c'; else sed 's/^X//' << '________This_Is_The_END________' > uhamt.c X/* X * $Header: uhamt.c,v 1.5 87/06/09 11:53:05 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: uhamt.c,v $ X * Revision 1.5 87/06/09 11:53:05 brandon X * Right-justified buffer display; repositioned cursor after conversion errors. X * X * Revision 1.4 87/06/01 08:37:39 brandon X * Added ^V (view) capability for related records. X * X * Revision 1.3 87/05/27 14:42:45 brandon X * Made sure buffer was padded with spaces. X * X * Revision 1.2 87/05/26 15:44:18 brandon X * Forgot to cast sprintf(). X * X * Revision 1.1 87/05/26 13:33:59 brandon X * Initial revision X * X * Revision 1.3 87/05/12 12:04:08 brandon X * Changed to pass FWD, BACK, GO without checking the data buffer X * X * Revision 1.2 87/04/29 11:30:37 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * Input a huge amount, into a (double). X */ X Xint uhamt(len, buf) Xregister double *buf; { X char ibuf[15]; X int rc, cnt, sign, dec, y, x; X X setraw(); X if (len > 14) X len = 14; X (void) sprintf(ibuf, "%*.2f", len + 3, *buf / 100.0); X getyx(stdscr, y, x); X for (;;) { X (void) move(y, x); X if ((rc = inl(ibuf, len, 0)) == BACK || rc == FWD || rc == GO || rc == LOOK) X return rc; X for (cnt = 0; cnt < len && ibuf[cnt] == ' '; cnt++) X ; X if (cnt == len) { X prtmsg(1, 23, "Invalid amount"); X continue; X } X *buf = 0.0; X sign = 0; X dec = 0; X if (ibuf[cnt] == '-') { X sign = 1; X if (++cnt == len) { X prtmsg(1, 23, "Invalid amount"); X continue; X } X } X for (; cnt < len && isdigit(ibuf[cnt]); cnt++) { X *buf *= 10.0; X *buf += ibuf[cnt] - '0'; X } X if (ibuf[cnt] == '.') { X if (cnt > len - 2) { X prtmsg(1, 23, "Invalid amount"); X continue; X } X if (!isdigit(ibuf[++cnt])) { X prtmsg(1, 23, "Invalid amount"); X continue; X } X dec = (ibuf[cnt] - '0') * 10; X if (!isdigit(ibuf[++cnt])) { X prtmsg(1, 23, "Invalid amount"); X continue; X } X dec += ibuf[cnt] - '0'; X } X for (; cnt < len && ibuf[cnt] == ' '; cnt++) X ; X if (cnt == len) X break; X prtmsg(1, 23, "Invalid amount"); X } X *buf = *buf * 100.0 + dec; X if (sign) X *buf = - *buf; X return rc; X} ________This_Is_The_END________ if test `wc -l < uhamt.c` -ne 102; then echo 'shar: uhamt.c was damaged during transit (should have been 102 bytes)' fi fi ; : end of overwriting check echo 'x - ulong.c' if test -f ulong.c; then echo 'shar: not overwriting ulong.c'; else sed 's/^X//' << '________This_Is_The_END________' > ulong.c X/* X * $Header: ulong.c,v 1.5 87/06/09 11:53:15 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: ulong.c,v $ X * Revision 1.5 87/06/09 11:53:15 brandon X * Right-justified buffer display; repositioned cursor after conversion errors. X * X * Revision 1.4 87/06/01 08:37:43 brandon X * Added ^V (view) capability for related records. X * X * Revision 1.3 87/05/27 14:42:56 brandon X * Made sure buffer was padded with spaces. X * X * Revision 1.2 87/05/26 15:44:20 brandon X * Forgot to cast sprintf(). X * X * Revision 1.1 87/05/26 13:34:07 brandon X * Initial revision X * X * Revision 1.3 87/05/12 12:04:03 brandon X * Changed to pass FWD, BACK, GO without checking the data buffer X * X * Revision 1.2 87/04/29 11:30:39 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * Input an item of type (long). X */ X Xint ulong(len, buf) Xlong *buf; { X char ibuf[10]; X int rc, cnt, sign, y, x; X X setraw(); X if (len > 9) X len = 9; /* (long)'s are max len = 9 */ X (void) sprintf(ibuf, "%*ld", len, *buf); X getyx(stdscr, y, x); X for (;;) { X (void) move(y, x); X if ((rc = inl(ibuf, len, 0)) == BACK || rc == FWD || rc == GO || rc == LOOK) X return rc; X for (cnt = 0; cnt < len && ibuf[cnt] == ' '; cnt++) X ; X if (cnt == len) { X prtmsg(1, 23, "Invalid number"); X continue; X } X *buf = 0L; X sign = 0; X if (ibuf[cnt] == '-') { X sign = 1; X if (++cnt == len) { X prtmsg(1, 23, "Invalid number"); X continue; X } X } X for (; cnt < len && isdigit(ibuf[cnt]); cnt++) { X *buf *= 10; X *buf += ibuf[cnt] - '0'; X } X for (; cnt < len && ibuf[cnt] == ' '; cnt++) X ; X if (cnt == len) X break; X prtmsg(1, 23, "Invalid number"); X } X if (sign) X *buf = - *buf; X return rc; X} ________This_Is_The_END________ if test `wc -l < ulong.c` -ne 84; then echo 'shar: ulong.c was damaged during transit (should have been 84 bytes)' fi fi ; : end of overwriting check echo 'x - upbuf.c' if test -f upbuf.c; then echo 'shar: not overwriting upbuf.c'; else sed 's/^X//' << '________This_Is_The_END________' > upbuf.c X/* X * $Header: upbuf.c,v 1.1 87/05/26 13:49:35 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: upbuf.c,v $ X * Revision 1.1 87/05/26 13:49:35 brandon X * Initial revision X * X * Revision 1.5 87/04/29 14:19:12 brandon X * FLT display length is sfield length / 10 X * X * Revision 1.4 87/04/29 13:17:22 brandon X * The code to convert internal to display lengths was in gtube(); it belonged X * in here, so here it is. X * X * Revision 1.3 87/04/29 11:40:50 brandon X * Added ability to OR an upshift flag with a screen field type to get auto X * upshifting on certain screen fields. See also gdata.c. X * X * Revision 1.2 87/04/29 11:30:40 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * ENTRY POINT: upbuf() -- Update from a screen field to a buffer X * X * DIFFERENCE FROM UNIFY: See upscrf(). X */ X Xupbuf(sfld, buf) Xchar *buf; { X int rc, oucf, len; X X setraw(); X if (sfld < 0 || sfld > __nsf) X xerror(-1, "upbuf", "Invalid screen field %d", sfld); X oucf = _sh_up; X _sh_up = __scf[sfld].q_type & _UCF; X /* This code was in gtube(), because I screwed up! */ X len = __scf[sfld].q_len; X switch (__scf[sfld].q_type) { X case INT: X case LONG: X case STRNG: X break; X case AMT: X case HAMT: X len += 3; X break; X case DATE: X len = 8; X break; X case HR: X len = 5; X break; X case FLT: X len /= 10; X break; X case COMB: X xerror(-2, "upbuf", "COMB field %d illegal", sfld); X } X if (__scf[sfld].q_fld != 0) X rc = uptube(__scf[sfld].q_fx, __scf[sfld].q_fy, __scf[sfld].q_fld, buf); X else X rc = upscrf(__scf[sfld].q_fx, __scf[sfld].q_fy, __scf[sfld].q_type & ~_UCF, len, buf); X _sh_up = oucf; X return rc; X} ________This_Is_The_END________ if test `wc -l < upbuf.c` -ne 78; then echo 'shar: upbuf.c was damaged during transit (should have been 78 bytes)' fi fi ; : end of overwriting check echo 'x - updata.c' if test -f updata.c; then echo 'shar: not overwriting updata.c'; else sed 's/^X//' << '________This_Is_The_END________' > updata.c X/* X * $Header: updata.c,v 1.3 87/05/27 16:02:26 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: updata.c,v $ X * Revision 1.3 87/05/27 16:02:26 brandon X * Had a break; on failed exp. rel. that should have been a continue;. X * X * Revision 1.2 87/05/26 14:29:07 brandon X * Well, utime() was the culprit (be nice if I could read!)-: X * X * Revision 1.1 87/05/26 13:49:49 brandon X * Initial revision X * X * Revision 1.2 87/04/29 11:30:26 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * ENTRY POINT: updata() -- get a value at a specified location and store it X * in the database. X * X * DIFFERENCE FROM UNIFY: Update function are not provided in UNIFY(r). X */ X Xupdata(fx, fy, field) { X char buf[256]; X int rc, ch; X X setraw(); X if (gfield(field, buf) != 0) X xerror(-1, "updata", "Read access for field %d denied", field); X for (;;) { X rc = uptube(fx, fy, field, buf); X if (rc == BACK || rc == FWD || rc == GO) { X if (rc == FWD) X rc = FWD_OK; X break; X } X Xrepass: X switch (ch = pfield(field, buf)) { X case -4: X (void) mvprintw(23, 1, "Enter modify password for field: "); X (void) refresh(); X (void) nocbreak(); X (void) nl(); X if (accsfld(field, getpass(""), 'w') == 0) X goto repass; X (void) noecho(); X (void) cbreak(); X (void) nonl(); X prtmsg(1, 23, "Wrong password"); X rc = -3; X break; X case -5: X (void) mvprintw(23, 1, "Record is locked -- Retry or Abort? "); X (void) refresh(); X ch = tolower(getchar() & 0x7f); X (void) move(23, 1); X (void) clrtoeol(); X switch (ch) { X case 'a': X rc = -3; X break; X default: X goto repass; X } X break; X case 0: X break; X case -1: X prtmsg(1, 23, "Record is referenced, you may not change the key"); X continue; X case -2: X prtmsg(1, 23, "This field has a unique index, and the value you entered exists"); X continue; X case -3: X prtmsg(1, 23, "There is no related record with this key"); X continue; X default: X xerror(-2, "updata", "Unknown error %d from pfield", ch); X } X break; X } X return rc; X} ________This_Is_The_END________ if test `wc -l < updata.c` -ne 97; then echo 'shar: updata.c was damaged during transit (should have been 97 bytes)' fi fi ; : end of overwriting check echo 'x - upfield.c' if test -f upfield.c; then echo 'shar: not overwriting upfield.c'; else sed 's/^X//' << '________This_Is_The_END________' > upfield.c X/* X * $Header: upfield.c,v 1.1 87/05/26 13:50:09 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: upfield.c,v $ X * Revision 1.1 87/05/26 13:50:09 brandon X * Initial revision X * X * Revision 1.3 87/04/29 11:44:40 brandon X * Added _UCF upshifting. See also inbuf.c, xsfldesc.c. (The comment in X * inbuf.c is WRONG!) X * Also caused error on screen field w/o database field. X * X * Revision 1.2 87/04/29 11:30:44 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * ENTRY POINT: upfield() -- Updata a database field using a screen field. X * X * DIFFERENCE FROM UNIFY: UNIFY(r) does not provide update functions. X */ X Xupfield(sfld) { X int rc, ousf; X X if (sfld < 0 || sfld >= __nsf) X xerror(-1, "upfield", "Invalid screen field %d", sfld); X if (__scf[sfld].q_fld == 0) X xerror(-2, "upfield", "Screen field %d has no associated database field", sfld); X ousf = _sh_up; X _sh_up = __scf[sfld].q_type & _UCF; X rc = updata(__scf[sfld].q_fx, __scf[sfld].q_fy, __scf[sfld].q_fld); X _sh_up = ousf; X return rc; X} ________This_Is_The_END________ if test `wc -l < upfield.c` -ne 46; then echo 'shar: upfield.c was damaged during transit (should have been 46 bytes)' fi fi ; : end of overwriting check echo 'x - upscrf.c' if test -f upscrf.c; then echo 'shar: not overwriting upscrf.c'; else sed 's/^X//' << '________This_Is_The_END________' > upscrf.c X/* X * $Header: upscrf.c,v 1.4 87/06/01 10:56:07 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: upscrf.c,v $ X * Revision 1.4 87/06/01 10:56:07 brandon X * _sh_up only forced up; left as is if type doesn't have _UCF. X * X * Revision 1.3 87/05/26 14:29:33 brandon X * Well, utime() was the culprit (be nice if I could read!)-: X * X * Revision 1.2 87/05/26 14:08:27 brandon X * udate() conflicted with UN*X call; changed to upddate(). X * X * Revision 1.1 87/05/26 13:50:24 brandon X * Initial revision X * X * Revision 1.5 87/05/22 15:39:06 brandon X * whoops! It doesn't help to leave off the "break"'s in a switch(). X * X * Revision 1.4 87/05/12 17:19:19 brandon X * Forgot to get rid of _UCF temporarily during type check X * X * Revision 1.3 87/05/12 17:00:28 brandon X * Enabled _UCF flag for type. X * X * Revision 1.2 87/04/29 11:30:46 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * ENTRY POINT: upscrf() -- Take a type and (character) length, and call the X * correct input routine for the type for UPDATE. X * X * DIFFERENCE FROM UNIFY: In addition to the standard return codes, there are X * a number of new ones. If you want to use them, call setxrc() with a non- X * zero argument. The new codes are: X * X * -5 ESC or ^E X * -6 ESC or ^E, returns buffer X * -7 ^U or TAB, returns buffer X * X * Also, the following line-editing characters are supported: X * X * ^H delete last charater X * ^F move forward (wraps to beginning) X * ^B move backward (wraps to end) X * ^A move to start of field X * ^N move to end of field X * ^O insert a space X * ^D delete a character X * ^K clear to end of field X * ^X exit program X * ^R, ^L redraw screen X * ^P shell out X * X * I would have used ^Z for end-of-field, but I see no reason to get the X * people with job control or sxt's upset at me... X */ X Xint upscrf(x, y, type, len, buf) Xchar *buf; { X int rc, oucf; X X setraw(); X mv_cur(1, x, y); X oucf = _sh_up; X if (type & _UCF) X _sh_up = type & _UCF; X type &= ~_UCF; X switch (type) { X case INT: X rc = ushort(len, (short *) buf); X break; X case LONG: X rc = ulong(len, (long *) buf); X break; X case AMT: X rc = uamt(len, (long *) buf); X break; X case HAMT: X rc = uhamt(len, (double *) buf); X break; X case STRNG: X rc = ustr(len, buf); X break; X case DATE: X rc = upddate((short *) buf); X break; X case HR: X rc = updtime((short *) buf); X break; X case FLT: X rc = uflt(len, (double *) buf); X break; X default: X xerror(-1, "upscrf", "Unknown type %d", type); X /*NOTREACHED*/ X } X _sh_up = oucf; X return rc; X} ________This_Is_The_END________ if test `wc -l < upscrf.c` -ne 112; then echo 'shar: upscrf.c was damaged during transit (should have been 112 bytes)' fi fi ; : end of overwriting check echo 'x - uptube.c' if test -f uptube.c; then echo 'shar: not overwriting uptube.c'; else sed 's/^X//' << '________This_Is_The_END________' > uptube.c X/* X * $Header: uptube.c,v 1.3 87/06/09 12:22:37 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: uptube.c,v $ X * Revision 1.3 87/06/09 12:22:37 brandon X * Moved FYI message to line 23; cleared it after input. X * X * Revision 1.2 87/06/01 08:31:13 brandon X * Added ^V (view) capability for related records. X * X * Revision 1.1 87/05/26 13:50:36 brandon X * Initial revision X * X * Revision 1.4 87/04/29 16:09:49 brandon X * Added a cast to (void) of mvaddstr() X * X * Revision 1.3 87/04/29 13:10:36 brandon X * fldesc() returns display length, so mucking around with it isn't needed. X * However, probably input() or inbuf() will need help... X * X * Revision 1.2 87/04/29 11:30:28 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * ENTRY POINT: uptube() -- Update a buffer using a database field template. X * X * DIFFERENCE FROM UNIFY: UNIFY(r) does not support update functions. X */ X Xuptube(fx, fy, field, buf) Xchar *buf; { X FLDESC fd; X int rc; X#ifdef UNIFY32 X char *cmsg, *emsg; X#endif X X setraw(); X if (!fldesc(field, &fd)) X xerror(-1, "uptube", "Invalid field %d", field); X if (fd.f_typ == COMB) X xerror(-2, "uptube", "COMB field %d illegal", field); X#ifdef UNIFY32 X cmsg = getdoms(field, FYISTR); X if ((emsg = getdoms(field, ERRSTR)) == (char *) 0) X emsg = "The value you entered is not legal for this field"; X for (;;) { X if (cmsg != (char *) 0) X (void) mvaddstr(23, 1, cmsg); X#endif X rc = upscrf(fx, fy, fd.f_typ, fd.f_len, buf); X#ifdef UNIFY32 X (void) move(23, 1); X (void) clrtoeol(); X#endif X if (rc == BACK || rc == FWD || rc == GO) X return rc; X if (rc == LOOK) { X if (fd.f_rpfld == 0) { X prtmsg(1, 23, "There is no related record to view"); X continue; X } X if ((rc = zoom(fx, fy, field, &fd, buf)) == BACK || rc == FWD) X return rc; X outscrf(fx, fy, fd.f_typ, fd.f_len, buf); X } X#ifdef UNIFY32 X if (domchk(field, buf)) X break; X prtmsg(1, 23, emsg); X } X#endif X return rc; X} ________This_Is_The_END________ if test `wc -l < uptube.c` -ne 86; then echo 'shar: uptube.c was damaged during transit (should have been 86 bytes)' fi fi ; : end of overwriting check echo 'x - usc.h' if test -f usc.h; then echo 'shar: not overwriting usc.h'; else sed 's/^X//' << '________This_Is_The_END________' > usc.h X/* X * $Header: usc.h,v 1.1 87/05/28 14:04:04 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: usc.h,v $ X * Revision 1.1 87/05/28 14:04:04 brandon X * Initial revision X * X */ X X#ifdef lint X# define NOMACROS X#endif X#include <curses.h> X#include <dbtypes.h> X#include <fdesc.h> X#include <ctype.h> X#ifdef UNIFY32 X#include <domains.h> X#endif X X#ifdef TERMCAP X X/* Old curses. We have to emulate some of the new features. */ X X#define beep() write(1, "\7", 1) X#define flash() beep() X#define cbreak() crmode() X#define nocbreak() nocrmode() X X#endif X#if defined(lint) || defined(TERMCAP) X X#define A_STANDOUT 0x80 X#define A_REVERSE 0x80 X#define A_UNDERLINE 0x00 X#define A_ALTCHARSET 0x00 X#define A_BLINK 0x00 X#define A_DIM 0x00 X#define A_BOLD 0x00 X#define A_INVIS 0x00 X#define A_PROTECT 0x00 X#define A_ATTRIBUTES A_STANDOUT X#define A_CHARTEXT 0x7f X X#endif X Xstruct q { X char q_name[8]; X char q_dbfld[44]; X short q_fld; X short q_type; X short q_len; X short q_fx; X short q_fy; X char q_prmp[40]; X short q_px; X short q_py; X}; X Xextern struct q *__scf; Xextern int __nsf; X X/* X * If a screen field's type has _UCF OR'ed in with it, it will be upshifted X * during calls to input() and inbuf(). X */ X Xextern int _sh_up; /* set this flag nonzero for upshifting */ X#define _UCF 0x80 /* the flag value for upshifted sfields */ X X/* X * Date and brackets, since the U.S. (as usual) is different from the rest X * of the world... X */ X X/* brackets */ X X#define MASK_BRACKETS 0x80 X#define INTERNATIONAL 0x00 X#define UNITED_STATES 0x80 X X/* dates */ X X#define MASK_DATES 0x03 X#define YMD 0x00 X#define DMY 0x01 X#define MDY 0x02 X Xextern int _ldbrt; X X/* used internally for date array addressing */ X X#define MONTH 0 X#define DAY 1 X#define YEAR 2 /* ...guess what country Unify Corp. is in! */ X X#if defined(lint) && !defined(TERMCAP) X X/* X * Curses defines <struct screen> under USG, but doesn't declare it. This X * makes lint upset. X */ X Xstruct screen { X char dummy; X}; X X#endif X X/* return codes for input routines */ X X#define FWD_OK 0 /* RETURN with data */ X#define BKSP -1 /* inc() backspace */ X#define BACK -2 /* TAB */ X#define FWD -3 /* RETURN */ X#define LOOK -4 /* ^V `view mode' (aka ACCELL `zoom') */ X#define GO -5 /* ESC */ X#define GO_OK -6 /* ESC with data */ X#define BACK_OK -7 /* TAB with data */ X#define CFWD -8 /* inc() forward */ X#define CBACK -9 /* inc() backward */ X X#define XRC_GO 1 /* allow GO, GO_OK return codes */ X#define XRC_XOK 2 /* allow GO_OK, BACK_OK return codes */ X#define XRC_LOOK 4 /* allow LOOK return code (no LOOK_OK) */ X#define XRC_CFB 8 /* for incs(): include CFWD, CBACK */ X#define XRC_BKSP 16 /* for incs(): include BKSP */ X#define XRC_CHAR 32 /* for incs(): return non-ctl chars */ X#define XRC_FWDGO 64 /* for incs(): RETURN == GO instead of FWD */ X#define XRC_NOFLSH 128 /* for incs(): suppress refresh() call */ X Xextern int __ext_rcodes; X X/* the eternal happiness of strict(-ish) type checking... */ X Xextern char *getpass(); Xextern char *malloc(); Xextern long time(); Xextern char *ctime(); Xextern void exit(); Xextern void _exit(); Xextern void free(); Xextern char *getenv(); Xextern char *strcpy(); Xextern char *strcat(); Xextern char *strchr(); Xextern WINDOW *newwin(); Xextern int sprintf(); X Xextern short kday(); Xextern void kdate(); Xextern void cfill(); X#ifdef UNIFY32 Xextern char *getdoms(); Xextern void dspdt(); X#endif X Xextern void setraw(); Xextern void prtmsg(); Xextern char *dbfile(); Xextern FILE *_dbfopen(); Xextern void erasprmp(); Xextern void outscrf(); Xextern void output(); Xextern void pamt(); Xextern void pdate(); Xextern void pflt(); Xextern void phamt(); Xextern void plong(); Xextern void pshort(); Xextern void pstr(); Xextern void ptime(); Xextern void mv_cur(); Xextern void _inlsusp(); Xextern int inc(); Xextern int inl(); Xextern short _dt_today(); Xextern int _dt_year(); X#ifdef UNIFY32 Xextern void _sdbrt(); X#endif X X#if defined(lint) && !defined(TERMCAP) Xextern WINDOW *initscr(); /* I had always understood this was (int)?? */ X#endif X X#ifdef lint X#define getyx(win, y, x) ((y) = 0, (x) = 0) X#endif X X/* Operational modes in logacl */ X X#define INQUIRE 010 X#define ADD 004 X#define MODIFY 002 X#define DELETE 001 X X/* Used by the error functions */ X Xextern char errcall[]; X X/* Ring menu definitions */ X Xstruct cmd { X char c_key; X char *c_title; X char *c_desc; X}; X X#define EOM '\0' /* end of menu */ X#define INVISIBLE "" /* invisible entry */ ________This_Is_The_END________ if test `wc -l < usc.h` -ne 217; then echo 'shar: usc.h was damaged during transit (should have been 217 bytes)' fi fi ; : end of overwriting check echo 'x - ushort.c' if test -f ushort.c; then echo 'shar: not overwriting ushort.c'; else sed 's/^X//' << '________This_Is_The_END________' > ushort.c X/* X * $Header: ushort.c,v 1.6 87/06/09 12:19:08 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: ushort.c,v $ X * Revision 1.6 87/06/09 12:19:08 brandon X * Fixed the format for the buffer value generation. X * X * Revision 1.5 87/06/09 11:53:17 brandon X * Right-justified buffer display; repositioned cursor after conversion errors. X * X * Revision 1.4 87/06/01 08:37:46 brandon X * Added ^V (view) capability for related records. X * X * Revision 1.3 87/05/27 14:43:23 brandon X * Made sure buffer was padded with spaces. X * X * Revision 1.2 87/05/26 15:44:23 brandon X * Forgot to cast sprintf(). X * X * Revision 1.1 87/05/26 13:34:19 brandon X * Initial revision X * X * Revision 1.3 87/05/12 12:03:40 brandon X * Changed to pass FWD, BACK, GO without checking the data buffer X * X * Revision 1.2 87/04/29 11:30:48 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * Input an item of type (short). X */ X Xint ushort(len, buf) Xshort *buf; { X char ibuf[5]; X int rc, cnt, sign, y, x; X X setraw(); X if (len > 4) X len = 4; /* (short)'s are max len = 4 */ X (void) sprintf(ibuf, "%*d", len, *buf); X getyx(stdscr, y, x); X for (;;) { X (void) move(y, x); X if ((rc = inl(ibuf, len, 0)) == BACK || rc == FWD || rc == GO || rc == LOOK) X return rc; X for (cnt = 0; cnt < len && ibuf[cnt] == ' '; cnt++) X ; X if (cnt == len) { X prtmsg(1, 23, "Invalid number"); X continue; X } X *buf = 0; X sign = 0; X if (ibuf[cnt] == '-') { X sign = 1; X if (++cnt == len) { X prtmsg(1, 23, "Invalid number"); X continue; X } X } X for (; cnt < len && isdigit(ibuf[cnt]); cnt++) { X *buf *= 10; X *buf += ibuf[cnt] - '0'; X } X for (; cnt < len && ibuf[cnt] == ' '; cnt++) X ; X if (cnt == len) X break; X prtmsg(1, 23, "Invalid number"); X } X if (sign) X *buf = - *buf; X return rc; X} ________This_Is_The_END________ if test `wc -l < ushort.c` -ne 87; then echo 'shar: ushort.c was damaged during transit (should have been 87 bytes)' fi fi ; : end of overwriting check echo 'x - ustr.c' if test -f ustr.c; then echo 'shar: not overwriting ustr.c'; else sed 's/^X//' << '________This_Is_The_END________' > ustr.c X/* X * $Header: ustr.c,v 1.4 87/06/09 11:38:17 brandon Exp $ X * X * ``USC'' -- UNIFY(r) Screens using Curses X * UNIFY(r) is a registered trademark of Unify Corporation. X * X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND X * IS HEREBY PLACED IN THE PUBLIC DOMAIN. X * X * $Log: ustr.c,v $ X * Revision 1.4 87/06/09 11:38:17 brandon X * Changed inl() call to use clrf == 2. X * X * Revision 1.3 87/06/01 11:36:44 brandon X * Was filling nulls[] instead of buf[]... dumb dumb da dumb :-) X * X * Revision 1.2 87/06/01 11:23:53 brandon X * UNIFY defaults STRNG fields to nulls (!) -- rather antisocial of it. We X * convert to spaces on update of an all-nulls STRNG field. X * X * Revision 1.1 87/05/26 13:34:28 brandon X * Initial revision X * X * Revision 1.2 87/04/29 11:30:50 brandon X * Added RCS header information X * X */ X X/*LINTLIBRARY*/ X X#include "usc.h" X X/* X * Get a string. Very easy, since no checking is needed. Except... UNIFY X * defaults string fields to nulls (!) so we should check for all nulls and X * convert to all spaces. (Rather rude, in my opinion.) X */ X Xstatic char nulls[256]; Xstatic int _init = 0; X Xint ustr(len, buf) Xchar *buf; { X setraw(); X if (!_init) { X cfill(0, nulls, sizeof nulls); X _init = 1; X } X if (ivcmp(buf, nulls, len)) X cfill(' ', buf, len); X return inl(buf, len, 2); X} ________This_Is_The_END________ if test `wc -l < ustr.c` -ne 52; then echo 'shar: ustr.c was damaged during transit (should have been 52 bytes)' fi fi ; : end of overwriting check exit 0