home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume2 / usc / Part1 next >
Internet Message Format  |  1991-08-07  |  61KB

  1. From: allbery@ncoast.UUCP (Brandon S. Allbery)
  2. Newsgroups: comp.sources.misc
  3. Subject: v02i033: UNIFY(r) Screens with Curses, Part 1 of 4
  4. Message-ID: <7160@ncoast.UUCP>
  5. Date: 31 Jan 88 04:08:06 GMT
  6. Approved: allbery@ncoast.UUCP
  7.  
  8. Comp.sources.misc: Volume 2, Issue 33
  9. Submitted-By: The Moderator <allbery@ncoast.UUCP>
  10. Archive-Name: usc/Part1
  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. # -rw-r--r--  1 allbery users      6259 Jan 30 20:39 README
  32. # -rw-r--r--  1 allbery users      2745 Jan 30 20:44 Makefile
  33. # -rw-r--r--  1 allbery users      3344 Jan 30 18:01 Lcurses.c
  34. # -rw-r--r--  1 allbery users       909 Jan 30 18:01 Lunitrieve.c
  35. # -r--r--r--  1 allbery users       761 Jan 30 18:01 cleancrt.c
  36. # -r--r--r--  1 allbery users       886 Jan 30 18:01 clearscr.c
  37. # -r--r--r--  1 allbery users       938 Jan 30 18:01 clr_crt.c
  38. # -r--r--r--  1 allbery users      1406 Jan 30 18:01 curses.c
  39. # -r--r--r--  1 allbery users      1267 Jan 30 18:01 datefns.c
  40. # -r--r--r--  1 allbery users      1959 Jan 30 18:01 datetp.c
  41. # -r--r--r--  1 allbery users      1198 Jan 30 18:01 dbfile.c
  42. # -r--r--r--  1 allbery users       785 Jan 30 18:01 dbfopen.c
  43. # -r--r--r--  1 allbery users       804 Jan 30 18:01 dbherr.c
  44. # -r--r--r--  1 allbery users       628 Jan 30 18:01 dsply.c
  45. # -r--r--r--  1 allbery users       884 Jan 30 18:01 eras_ln.c
  46. # -r--r--r--  1 allbery users       717 Jan 30 18:01 eras_pg.c
  47. # -r--r--r--  1 allbery users      1226 Jan 30 18:01 erasprmp.c
  48. # -r--r--r--  1 allbery users       785 Jan 30 18:01 error.c
  49. # -r--r--r--  1 allbery users      2152 Jan 30 18:01 gdata.c
  50. # -r--r--r--  1 allbery users      1818 Jan 30 18:01 gprint.c
  51. # -r--r--r--  1 allbery users      2688 Jan 30 18:01 gtube.c
  52. # -r--r--r--  1 allbery users      2094 Jan 30 18:01 iamt.c
  53. # -r--r--r--  1 allbery users      5178 Jan 30 18:01 idate.c
  54. # -r--r--r--  1 allbery users      2070 Jan 30 18:01 iflt.c
  55. # -r--r--r--  1 allbery users      2114 Jan 30 18:01 ihamt.c
  56. # -r--r--r--  1 allbery users      1730 Jan 30 18:01 ilong.c
  57. #
  58. echo 'x - README'
  59. if test -f README; then echo 'shar: not overwriting README'; else
  60. sed 's/^X//' << '________This_Is_The_END________' > README
  61. X``USC'' -- UNIFY(r) Screens using Curses
  62. XUNIFY(r) is a registered trademark of Unify Corporation.
  63. X
  64. XTHIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  65. XIS HEREBY PLACED IN THE PUBLIC DOMAIN.
  66. X
  67. XThis is a short description of the extended functionality of USC.  The
  68. Xfunctions are source-level compatible with the standard UNIFY calls, but NOT
  69. Xcompatible with the special internal calls used in ENTER.  This code is known
  70. Xto work with UNIFY 3.2, it will probably work with UNIFY 3.1, I have no idea
  71. Xhow compatible it is with UNIFY 4.0.  INCLUDE THE COMPILER DIRECTIVE -DUNIFY32
  72. XTO ENABLE USE OF ADVANCED FIELD ATTRIBUTES IN UNIFY 3.2.
  73. X
  74. XAll the I/O functions use curses.  Provision is made only for stdscr; use of
  75. Xother windows must be made at the curses level.  For the low-level UNIFY
  76. Xfunctions which expect an fd argument, the provided fd MUST BE 1 or the USC
  77. Xroutines will print an error message and dump core.
  78. X
  79. XInput functions support the following special keys:
  80. X
  81. X^H    delete character before cursor
  82. X^F    move cursor forward; wraps to beginning of field
  83. X^B    move cursor backward; wraps to end of field
  84. X^A    move cursor to beginning of field
  85. X^N    move cursor to end of field
  86. X^O    insert a space
  87. X^D    delete character after cursor
  88. X^K    clear to end of field
  89. X^X    immediate program exit
  90. X^L, ^R    redisplay screen
  91. X^P    push a shell
  92. X^U, TAB    return -2
  93. X^M, ^J    return -3 or 0 depending on input state
  94. X
  95. XIf the "look" capability is enabled, the following character may be used:
  96. X
  97. X^V    view parent record
  98. X
  99. XIf extended return codes are enabled (see below), the following may be used:
  100. X
  101. X^E, ESC    return -5 or -6 depending on input state
  102. X^U, TAB    return -2 or -7 depending on input state
  103. X
  104. XThe input routines check to see if the buffer has been filled; if extended
  105. Xreturn codes are enabled, special codes are returned when ^E or ^U are done
  106. Xon fields after data is entered in them.  This allows the user to type
  107. Xsomething before a ^U or ^E and have it accepted.
  108. X
  109. XExtended return codes are processed via the setxrc() function.  To use this
  110. Xfunction, #include the file "xrc.h" in your program and invoke setxrc() with
  111. Xan integer containing a combination of zero or more of the following flags:
  112. X
  113. X    XRC_GO        allow the ^E key to cause end of input
  114. X    XRC_XOK        return special values if data entered in field
  115. X    XRC_LOOK    on screen fields in explicit relationships,
  116. X            allow ^V to display parent record
  117. X
  118. XTHE USE OF XRC_XOK WILL BREAK PROGRAMS NOT EXPECTING IT!!!  Use of XRC_GO may
  119. Xalso break programs; but XRC_LOOK alone will NEVER return an unexpected return
  120. Xcode.
  121. X
  122. XFor each input function in the UNIFY manual, there is an update function; the
  123. Xname of the update function is the name with the leading `g' replaced with a
  124. X`up'.  Thus, the update version of gtube() is uptube().  The update functions
  125. Xare called in the same way as the input functions, but they start with the
  126. Xexisting data values, and if XRC_XOK is enabled the -2, -3, and -5 return
  127. Xcodes will NEVER be returned.
  128. X
  129. XInput which can be related to a database field (primarily gdata()) will do
  130. Xsome extra work for you.  If write passwords are enabled and gdata() is
  131. Xinvoked on a write-protected field, USC will ask for the modify password and
  132. Xretry the pfield(); if the password is incorrect, the operation fails.  If the
  133. Xrecord is locked, the program will ask you if you wish to retry the pfield()
  134. Xor abort the operation.  Both of these make life easier on a programmer.  Note
  135. Xthat gdata() is called internally by input() and upfield() [the update form of
  136. Xinput(); update() is used].
  137. X
  138. XScreen fields may be enhanced by a program by setting special flags; in
  139. Xparticular, the UPCASE flag may be set to force USC to force all input to
  140. Xuppercase for the field.  NO PROVISION IS MADE TO STORE THIS IN UNIFY SCREEN
  141. XFILES, AS THIS WOULD BREAK EXISTING UNIFY PROGRAMS.  To use this feature,
  142. X#include the file "xsfldesc.h" and call the function xsfldesc(sfield).  This
  143. Xfunctioon returns a pointer to the internal screen field structure, which
  144. Xcontains *all* of the information for the screen field (not just the x, y,
  145. Xfield information in Unify's sfdesc structure).  THIS IS NOT A COPY OF THE
  146. XDATA; CORRUPTING THIS INFORMATION MAY CAUSE A CORE DUMP.  The UPCASE flag may
  147. Xthen be ORed in with the structure member xsf_typ to force uppercase input.
  148. X
  149. XSome new functions are provided as well; in particular, ringmenu() will
  150. Xexecute a ring menu at the top of the screen.  (For the more eclectic members
  151. Xof the audience, think of Informix-4GL's menus.)  The menu is defined as an
  152. Xarray of structures; the structure is defined in "ringmenu.h".  An example of
  153. Xa ring menu might be:
  154. X
  155. X#include "ringmenu.h"
  156. X
  157. Xstruct ringmenu mymenu[] = {
  158. X    'A',    "Add",        "Add a new order.",
  159. X    'D',    "Delete",    "Delete an order.",
  160. X    'M',    "Modify",    "Modify an existing order.",
  161. X    'E',    "Exit",        "Exit the order maintenance.",
  162. X    EOM,
  163. X};
  164. X
  165. X...
  166. Xringmenu("ORDERS", mymenu);
  167. X
  168. XMany of the function keys used in field I/O have similar meanings in a ring
  169. Xmenu.  In particular, since a ring menu may be larger than the screen width
  170. Xthe ^F and ^B keys move by "pages"; and ^V pops up a full-screen listing of
  171. Xall selections on the menu.
  172. X
  173. XSince the *error() routines had to be replaced anyway to insure that curses
  174. XI/O is reset, I provide 3.2-compatible error routines... which use an error
  175. Xlog even under UNIFY 3.1, so you get a bonus.  There are some added features:
  176. X
  177. Xextern void (*errexit)();
  178. X
  179. XSet this function to some function to execute after displaying the error
  180. Xmessage but before final program exit.  Curses mode is turned off before the
  181. Xfunction is called.  I most commonly point this to abort() so I have more
  182. Xinformation to work with when a program bombs.
  183. X
  184. Xint xerror(ier, id, format[, args ...])
  185. Xint ier;
  186. Xchar *id, *format;
  187. X
  188. XThis function is the lowest-level interface to the error mechanism; it
  189. X*should* be the highest, but....  The argument "ier" becomes the "Status" in
  190. Xthe error log; "id" is the offending function (the calling function is
  191. X"xerror"); the notes are built from the printf-style format and its arguments.
  192. X
  193. Xextern char errcall[30];
  194. X
  195. XThis string contains "xerror" initially; it is the value printed for "calling
  196. Xfunction" in the error log.  It is changed by the standard error routines to
  197. Xname themselves; you can change it in a custom error function if you wish.
  198. X
  199. ________This_Is_The_END________
  200. if test `wc -l < README` -ne 138; then
  201.     echo 'shar: README was damaged during transit (should have been 138 bytes)'
  202. fi
  203. fi        ; : end of overwriting check
  204. echo 'x - Makefile'
  205. if test -f Makefile; then echo 'shar: not overwriting Makefile'; else
  206. sed 's/^X//' << '________This_Is_The_END________' > Makefile
  207. XSHELL = /bin/sh
  208. X
  209. X.SUFFIXES: .c,v .h,v
  210. X
  211. X.c,v.o:
  212. X    @co -q $*.c
  213. X    cc $(CFLAGS) -c $*.c
  214. X    @rm -f $*.c
  215. X
  216. X.h,v.h:
  217. X    @co -q $*.h
  218. X
  219. XUNIFY = /appl/u32
  220. XUINCL = $(UNIFY)/include
  221. XOBJ = curses.o datetp.o gdata.o gtube.o iamt.o idate.o iflt.o ihamt.o ilong.o \
  222. X    inbuf.o inl.o inscrf.o ishort.o istr.o itime.o loadscr.o prtmsg.o \
  223. X    xerror.o dbfopen.o dbfile.o setxrc.o input.o setraw.o setcook.o \
  224. X    cleancrt.o clearscr.o clr_crt.o eras_ln.o dsply.o erasprmp.o keybrd.o \
  225. X    mv_cur.o priamd.o ptct_crt.o ptct_wrt.o prmp.o prmpf.o prmprv.o \
  226. X    yorn.o sfldesc.o xsfldesc.o pamt.o pdate.o pflt.o phamt.o plong.o \
  227. X    pshort.o pstr.o ptime.o outscrf.o ptube.o pdata.o outbuf.o output.o \
  228. X    error.o uerror.o dbherr.o pageout.o eras_pg.o xsize.o uamt.o udate.o \
  229. X    uflt.o uhamt.o ulong.o ushort.o ustr.o utime.o updata.o uptube.o \
  230. X    upbuf.o upscrf.o upfield.o zoom.o gprint.o pflush.o inc.o datefns.o \
  231. X    shellout.o incs.o ringmenu.o
  232. XSRC = curses.c datetp.c gdata.c gtube.c iamt.c idate.c iflt.c ihamt.c ilong.c \
  233. X    inbuf.c inl.c inscrf.c ishort.c istr.c itime.c loadscr.c prtmsg.c \
  234. X    xerror.c dbfopen.c dbfile.c setxrc.c input.c setraw.c setcook.c \
  235. X    cleancrt.c clearscr.c clr_crt.c eras_ln.c dsply.c erasprmp.c keybrd.c \
  236. X    mv_cur.c priamd.c ptct_crt.c ptct_wrt.c prmp.c prmpf.c prmprv.c \
  237. X    yorn.c sfldesc.c xsfldesc.c pamt.c pdate.c pflt.c phamt.c plong.c \
  238. X    pshort.c pstr.c ptime.c outscrf.c ptube.c pdata.c outbuf.c output.c \
  239. X    error.c uerror.c dbherr.c pageout.c eras_pg.c xsize.c uamt.c udate.c \
  240. X    uflt.c uhamt.c ulong.c ushort.c ustr.c utime.c updata.c uptube.c \
  241. X    upbuf.c upscrf.c upfield.c zoom.c gprint.c pflush.c inc.c datefns.c \
  242. X    shellout.c incs.c ringmenu.c
  243. XTG = tgraph.a
  244. XCFLAGS = -O -I$(UINCL) -DUNIFY32 -DTG
  245. X#CFLAGS = -O -DTERMCAP -I$(UINCL)
  246. XLINT =
  247. X
  248. Xlibusc.a: $(OBJ)
  249. X    @rm -f libusc.a
  250. X    ar rc libusc.a $(OBJ)
  251. X
  252. Xlint:
  253. X    @co -q $(SRC)
  254. X    lint $(CFLAGS) $(LINT) $(SRC) Lcurses.c Lunitrieve.c > lint.out
  255. X    @rm -f $(SRC)
  256. X
  257. Xlint31c:
  258. X    @co -q $(SRC)
  259. X    lint -UUNIFY32 -DTERMCAP -UTG $(SRC) Lcurses.c Lunitrieve.c > lint.out
  260. X    @rm -f $(SRC)
  261. X
  262. Xlint32c:
  263. X    @co -q $(SRC)
  264. X    lint -DUNIFY32 -DTERMCAP -UTG $(SRC) Lcurses.c Lunitrieve.c > lint.out
  265. X    @rm -f $(SRC)
  266. X
  267. Xlint31i:
  268. X    @co -q $(SRC)
  269. X    lint -UUNIFY32 -UTERMCAP -UTG $(SRC) Lcurses.c Lunitrieve.c > lint.out
  270. X    @rm -f $(SRC)
  271. X
  272. Xlint32i:
  273. X    @co -q $(SRC)
  274. X    lint -DUNIFY32 -UTERMCAP -UTG $(SRC) Lcurses.c Lunitrieve.c > lint.out
  275. X    @rm -f $(SRC)
  276. X
  277. Xlint31g:
  278. X    @co -q $(SRC)
  279. X    lint -UUNIFY32 -UTERMCAP -DTG $(SRC) Lcurses.c Lunitrieve.c > lint.out
  280. X    @rm -f $(SRC)
  281. X
  282. Xlint32g:
  283. X    @co -q $(SRC)
  284. X    lint -DUNIFY32 -UTERMCAP -DTG $(SRC) Lcurses.c Lunitrieve.c > lint.out
  285. X    @rm -f $(SRC)
  286. X
  287. X$(OBJ): usc.h
  288. X
  289. Xtester: tester.o libusc.a
  290. X    ld -x -o tester /lib/crt0.o \
  291. X        tester.o \
  292. X        libusc.a \
  293. X        $(UNIFY)/lib/libd[12].a \
  294. X        libusc.a \
  295. X        $(UNIFY)/lib/libx.a $(TG) -lcurses -lm -lc
  296. ________This_Is_The_END________
  297. if test `wc -l < Makefile` -ne 89; then
  298.     echo 'shar: Makefile was damaged during transit (should have been 89 bytes)'
  299. fi
  300. fi        ; : end of overwriting check
  301. echo 'x - Lcurses.c'
  302. if test -f Lcurses.c; then echo 'shar: not overwriting Lcurses.c'; else
  303. sed 's/^X//' << '________This_Is_The_END________' > Lcurses.c
  304. X/*LINTLIBRARY*/
  305. X
  306. X/*
  307. X * Curses(3x) routines (llib-lcurses is empty!!!?)
  308. X */
  309. X
  310. X#define NOMACROS
  311. X#include <curses.h>
  312. X
  313. X#ifndef TERMCAP
  314. X
  315. X/* curses.h defines struct screen, never declares structure */
  316. X
  317. Xstruct screen { char dummy; };
  318. X
  319. X#endif
  320. X
  321. XWINDOW *stdscr = (WINDOW *) 0;
  322. XWINDOW *curscr = (WINDOW *) 0;
  323. Xint LINES = 0, COLS = 0;
  324. Xchar *Def_term = "unknown";
  325. Xchar ttytype[128] = "unknown";
  326. X
  327. Xint echo() {return 0;}
  328. Xint noecho() {return 0;}
  329. Xint cbreak() {return 0;}
  330. Xint nocbreak() {return 0;}
  331. Xint nl() {return 0;}
  332. Xint nonl() {return 0;}
  333. Xint waddch(win, ch) WINDOW *win; {return 0;}
  334. Xint wgetch(win) WINDOW *win; {return 0;}
  335. Xint waddstr(win, s) WINDOW *win; char *s; {return 0;}
  336. Xint wgetstr(win, s) WINDOW *win; char *s; {return 0;}
  337. Xint wmove(win, y, x) WINDOW *win; {return 0;}
  338. Xint wclear(win) WINDOW *win; {return 0;}
  339. Xint werase(win) WINDOW *win; {return 0;}
  340. Xint wclrtobot(win) WINDOW *win; {return 0;}
  341. Xint wclrtoeol(win) WINDOW *win; {return 0;}
  342. Xint winsertln(win) WINDOW *win; {return 0;}
  343. Xint wdeleteln(win) WINDOW *win; {return 0;}
  344. Xint wrefresh(win) WINDOW *win; {return 0;}
  345. Xint winsch(win, ch) WINDOW *win; {return 0;}
  346. Xint wdelch(win) WINDOW *win; {return 0;}
  347. Xint wstandout(win) WINDOW *win; {return 0;}
  348. Xint wstandend(win) WINDOW *win; {return 0;}
  349. X#ifndef TERMCAP
  350. Xint flushinp() {return 0;}
  351. Xint wattron(win, at) WINDOW *win; {return 0;}
  352. Xint wattroff(win, at) WINDOW *win; {return 0;}
  353. Xint wattrset(win, at) WINDOW *win; {return 0;}
  354. Xint beep() { return 0; }
  355. X#endif TERMCAP
  356. X/* AARGH! ! ! ! !  Why is initscr() defined as (WINDOW *) ????? */
  357. XWINDOW *initscr() { return (WINDOW *) 0; }
  358. Xint endwin() { return 0; }
  359. X/*VARARGS1 PRINTFLIKE1*/
  360. Xint printw(s) char *s; { return 0; }
  361. X/*VARARGS2 PRINTFLIKE2*/
  362. Xint wprintw(win, s) WINDOW *win; char *s; { return 0; }
  363. X/*VARARGS3 PRINTFLIKE3*/
  364. Xint mvprintw(y, x, s) char *s; { return 0; }
  365. X/*VARARGS4 PRINTFLIKE4*/
  366. Xint mvwprintw(win, y, x, s) WINDOW *win; char *s; { return 0; }
  367. Xint winch(win) WINDOW *win; { return 0; }
  368. Xint wsetscrreg(win, t, b) WINDOW *win; { return 0; }
  369. Xint mvwaddch(win, y, x, ch) WINDOW *win; { return 0; }
  370. Xint mvwgetch(win, y, x) WINDOW *win; { return 0; }
  371. Xint mvwaddstr(win, y, x, s) char *s; WINDOW *win; { return 0; }
  372. Xint mvwgetstr(win, y, x, s) char *s; WINDOW *win; { return 0; }
  373. Xint mvwinch(win, y, x) WINDOW *win; { return 0; }
  374. Xint mvwdelch(win, y, x) WINDOW *win; { return 0; }
  375. Xint mvwinsch(win, y, x, c) WINDOW *win; { return 0; }
  376. Xint mvaddch(y, x, c) { return 0; }
  377. Xint mvgetch(y, x) { return 0; }
  378. Xint mvaddstr(y, x, s) char *s; { return 0; }
  379. Xint mvgetstr(y, x, s) char *s; { return 0; }
  380. Xint mvinch(y, x) { return 0; }
  381. Xint mvdelch(y, x) { return 0; }
  382. Xint mvinsch(y, x, c) { return 0; }
  383. Xint refresh() { return 0; }
  384. Xint move(y, x) { return 0; }
  385. Xint clrtoeol() { return 0; }
  386. Xint addch(c) { return 0; }
  387. Xint addstr(s) char *s; { return 0; }
  388. Xint attron(a) { return 0; }
  389. Xint attroff(a) { return 0; }
  390. Xint erase() { return 0; }
  391. Xint attrset(a) { return 0; }
  392. Xint clearok(win) WINDOW *win; { return 0; }
  393. Xint clear() { return 0; }
  394. Xint standout() { return 0; }
  395. Xint standend() { return 0; }
  396. Xint clrtobot() { return 0; }
  397. XWINDOW *newwin(x, y, x1, y1) { return (WINDOW *) 0; }
  398. Xint delwin(w) WINDOW *w; { return 0; }
  399. Xint touchwin(w) WINDOW *w; { return 0; }
  400. Xint box(w, v, h) WINDOW *w; { return 0; }
  401. X#ifdef TG
  402. Xvoid wgraph(w, s) WINDOW *w; char *s; {}
  403. X#include "tgraph.h"
  404. Xstruct __g__ch_ __graph[25];
  405. X#endif
  406. ________This_Is_The_END________
  407. if test `wc -l < Lcurses.c` -ne 102; then
  408.     echo 'shar: Lcurses.c was damaged during transit (should have been 102 bytes)'
  409. fi
  410. fi        ; : end of overwriting check
  411. echo 'x - Lunitrieve.c'
  412. if test -f Lunitrieve.c; then echo 'shar: not overwriting Lunitrieve.c'; else
  413. sed 's/^X//' << '________This_Is_The_END________' > Lunitrieve.c
  414. X/*LINTLIBRARY*/
  415. X
  416. X/*
  417. X * UNITRIEVE(r) lint library
  418. X */
  419. X
  420. X#include <fdesc.h>
  421. X
  422. Xchar langtp[2] = {'A', 'M'};
  423. Xint logacl = 0;
  424. Xstatic char __v_p_buf[128] = "unknown";
  425. Xchar *V_prgnm = __v_p_buf;
  426. X
  427. Xint pfield(fld, buf) char *buf; { return 0; }
  428. Xint accsfld(fld, pass, rwf) char *pass; { return 0; }
  429. Xint fldesc(fld, buf) FLDESC *buf; { return 0; }
  430. Xshort kday(date) int date[3]; { return 0; }
  431. Xvoid kdate(day, date) short day; int date[3]; {}
  432. Xint ivcmp(v1, v2, l) char *v1, *v2; { return 0; }
  433. Xvoid cfill(c, v, l) char *v; {}
  434. Xint gfield(fld, buf) char *buf; { return 0; }
  435. X#ifdef UNIFY32
  436. Xvoid dspdt(d, buf) short d; char *buf; {}
  437. Xchar *getdoms(fld, typ) { return (char *) 0; }
  438. Xint domchk(fld, buf) char *buf; { return 0; }
  439. Xint numflds() { return 0; }
  440. Xchar *fldsyn(f) { return ""; }
  441. Xint reckey(r) { return 0; }
  442. Xint seqacc(r, t) { return 0; }
  443. Xint loc(r, tp) long *tp; { return 0; }
  444. Xint setloc(r, t) long t; { return 0; }
  445. X#endif
  446. ________This_Is_The_END________
  447. if test `wc -l < Lunitrieve.c` -ne 32; then
  448.     echo 'shar: Lunitrieve.c was damaged during transit (should have been 32 bytes)'
  449. fi
  450. fi        ; : end of overwriting check
  451. echo 'x - cleancrt.c'
  452. if test -f cleancrt.c; then echo 'shar: not overwriting cleancrt.c'; else
  453. sed 's/^X//' << '________This_Is_The_END________' > cleancrt.c
  454. X/*
  455. X * $Header: cleancrt.c,v 1.2 87/04/29 11:29:57 brandon Exp $
  456. X *
  457. X * ``USC'' -- UNIFY(r) Screens using Curses
  458. X * UNIFY(r) is a registered trademark of Unify Corporation.
  459. X *
  460. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  461. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  462. X *
  463. X * $Log:    cleancrt.c,v $
  464. X * Revision 1.2  87/04/29  11:29:57  brandon
  465. X * Added RCS header information
  466. X * 
  467. X */
  468. X
  469. X/*LINTLIBRARY*/
  470. X
  471. X#include "usc.h"
  472. X
  473. X/*
  474. X * ENTRY POINT:  cleancrt() -- Clear the foreground (data prompts) on the
  475. X * screen.
  476. X *
  477. X * DIFFERENCE FROM UNIFY:  Curses doesn't know about clear foreground, and
  478. X * if it did it'd do it iteself anyway.  We always call erasprmp() and let
  479. X * curses optimize the result.
  480. X */
  481. X
  482. Xvoid cleancrt() {
  483. X    erasprmp(0, __nsf - 1);
  484. X}
  485. ________This_Is_The_END________
  486. if test `wc -l < cleancrt.c` -ne 31; then
  487.     echo 'shar: cleancrt.c was damaged during transit (should have been 31 bytes)'
  488. fi
  489. fi        ; : end of overwriting check
  490. echo 'x - clearscr.c'
  491. if test -f clearscr.c; then echo 'shar: not overwriting clearscr.c'; else
  492. sed 's/^X//' << '________This_Is_The_END________' > clearscr.c
  493. X/*
  494. X * $Header: clearscr.c,v 1.3 87/04/29 17:06:53 brandon Exp $
  495. X *
  496. X * ``USC'' -- UNIFY(r) Screens using Curses
  497. X * UNIFY(r) is a registered trademark of Unify Corporation.
  498. X *
  499. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  500. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  501. X *
  502. X * $Log:    clearscr.c,v $
  503. X * Revision 1.3  87/04/29  17:06:53  brandon
  504. X * Now retains top 2 lines AFTER curses.  You can roll your own screen, but
  505. X * you still can't use the menu handler's heading.
  506. X * 
  507. X * Revision 1.2  87/04/29  11:30:09  brandon
  508. X * Added RCS header information
  509. X * 
  510. X */
  511. X
  512. X/*LINTLIBRARY*/
  513. X
  514. X#include "usc.h"
  515. X
  516. X/*
  517. X * ENTRY POINT:  clearscr() -- Clear the screen preparatory to loading a new
  518. X * screen form.
  519. X *
  520. X * DIFFERENCE FROM UNIFY:  Curses can't save the first three lines of the
  521. X * screen.  (Two for UNIFY 3.2.)
  522. X */
  523. X
  524. Xvoid clearscr() {
  525. X    (void) move(2, 0);
  526. X    (void) clrtobot();
  527. X}
  528. ________This_Is_The_END________
  529. if test `wc -l < clearscr.c` -ne 35; then
  530.     echo 'shar: clearscr.c was damaged during transit (should have been 35 bytes)'
  531. fi
  532. fi        ; : end of overwriting check
  533. echo 'x - clr_crt.c'
  534. if test -f clr_crt.c; then echo 'shar: not overwriting clr_crt.c'; else
  535. sed 's/^X//' << '________This_Is_The_END________' > clr_crt.c
  536. X/*
  537. X * $Header: clr_crt.c,v 1.2 87/04/29 11:30:12 brandon Exp $
  538. X *
  539. X * ``USC'' -- UNIFY(r) Screens using Curses
  540. X * UNIFY(r) is a registered trademark of Unify Corporation.
  541. X *
  542. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  543. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  544. X *
  545. X * $Log:    clr_crt.c,v $
  546. X * Revision 1.2  87/04/29  11:30:12  brandon
  547. X * Added RCS header information
  548. X * 
  549. X */
  550. X
  551. X/*LINTLIBRARY*/
  552. X
  553. X#include "usc.h"
  554. X
  555. X/*
  556. X * ENTRY POINT:  clr_crt() -- clear, forcibly, a screen on a given fd.
  557. X *
  558. X * DIFFERENCE FROM UNIFY:  If fd isn't 1, you get a run-time error; use the
  559. X * old library if you want funny terminal stuff, or else hook into terminfo-
  560. X * based curses and call newterm().  I daresay nobody uses the fd hook anyway.
  561. X */
  562. X
  563. Xvoid clr_crt(fd, flg) {
  564. X    if (fd != 1)
  565. X        xerror(-1, "clr_crt", "Multi-terminal operation on fd %d not supported", fd);
  566. X    if (flg == 'a')
  567. X        (void) clear();
  568. X    else
  569. X        erasprmp(0, __nsf - 1);
  570. X}
  571. ________This_Is_The_END________
  572. if test `wc -l < clr_crt.c` -ne 35; then
  573.     echo 'shar: clr_crt.c was damaged during transit (should have been 35 bytes)'
  574. fi
  575. fi        ; : end of overwriting check
  576. echo 'x - curses.c'
  577. if test -f curses.c; then echo 'shar: not overwriting curses.c'; else
  578. sed 's/^X//' << '________This_Is_The_END________' > curses.c
  579. X/*
  580. X * $Header: curses.c,v 1.2 87/04/29 11:30:14 brandon Exp $
  581. X *
  582. X * ``USC'' -- UNIFY(r) Screens using Curses
  583. X * UNIFY(r) is a registered trademark of Unify Corporation.
  584. X *
  585. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  586. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  587. X *
  588. X * $Log:    curses.c,v $
  589. X * Revision 1.2  87/04/29  11:30:14  brandon
  590. X * Added RCS header information
  591. X * 
  592. X */
  593. X
  594. X/*LINTLIBRARY*/
  595. X
  596. X#include "usc.h"
  597. X
  598. X#ifdef TERMCAP
  599. X
  600. X/*
  601. X * The old style curses doesn't know about attributes, except for standout.
  602. X * We have to emulate them... which basically means ignoring them, except
  603. X * for A_STANDOUT == A_REVERSE.
  604. X */
  605. X
  606. Xint setattr(win, att)
  607. XWINDOW *win; {
  608. X    if (att == A_STANDOUT)
  609. X        return wstandout(win);
  610. X    else
  611. X        return wstandend(win);
  612. X}
  613. X
  614. Xint attron(win, att)
  615. XWINDOW *win; {
  616. X    if (att == A_STANDOUT)
  617. X        return wstandout(win);
  618. X    return OK;
  619. X}
  620. X
  621. Xint attroff(win, att)
  622. XWINDOW *win; {
  623. X    if (att == A_STANDOUT)
  624. X        return wstandend(win);
  625. X    return OK;
  626. X}
  627. X
  628. Xint flushinp() {
  629. X#ifdef TIOCGETP
  630. X    struct sgttyb t;
  631. X
  632. X    if (ioctl(0, TIOCGETP, &t) == -1)
  633. X        return ERR;
  634. X    if (ioctl(0, TIOCSETP, &t) == -1)
  635. X        return ERR;
  636. X#else
  637. X# ifdef TCFLSH
  638. X    if (ioctl(0, TCFLSH, 0) == -1)
  639. X        return ERR;
  640. X# else
  641. X    struct sgttyb t;
  642. X
  643. X    if (gtty(0, &t) == -1)
  644. X        return ERR;
  645. X    if (stty(0, &t) == -1)
  646. X        return ERR;
  647. X# endif
  648. X#endif
  649. X    return OK;
  650. X}
  651. X
  652. X#else
  653. X# ifndef lint
  654. Xstatic char dummy[] = "";    /* gratuitous dumb-loader food */
  655. X# endif
  656. X#endif
  657. ________This_Is_The_END________
  658. if test `wc -l < curses.c` -ne 78; then
  659.     echo 'shar: curses.c was damaged during transit (should have been 78 bytes)'
  660. fi
  661. fi        ; : end of overwriting check
  662. echo 'x - datefns.c'
  663. if test -f datefns.c; then echo 'shar: not overwriting datefns.c'; else
  664. sed 's/^X//' << '________This_Is_The_END________' > datefns.c
  665. X/*
  666. X * $Header: datefns.c,v 1.1 87/06/01 16:24:26 brandon Exp $
  667. X *
  668. X * ``USC'' -- UNIFY(r) Screens using Curses
  669. X * UNIFY(r) is a registered trademark of Unify Corporation.
  670. X *
  671. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  672. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  673. X *
  674. X * $Log:    datefns.c,v $
  675. X * Revision 1.1  87/06/01  16:24:26  brandon
  676. X * Initial revision
  677. X * 
  678. X */
  679. X
  680. X/*LINTLIBRARY*/
  681. X
  682. X#include "usc.h"
  683. X#ifdef BSD
  684. X/*
  685. X * What is this, anyway?  Did UCB make localtime() a system call???
  686. X * (If this is because of setitimer(), then WHY ARE setitimer() AND localtime()
  687. X * IN THE SAME INCLUDE FILE?????)
  688. X */
  689. X# include <sys/time.h>
  690. X#else
  691. X# include <time.h>
  692. X#endif
  693. X
  694. Xextern struct tm *localtime();
  695. X
  696. X/*
  697. X * Internal date manipulating functions.  They may be called by external
  698. X * functions safely.
  699. X */
  700. X
  701. X/*
  702. X * Return today's date in UNIFY(r) internal format.
  703. X */
  704. X
  705. Xshort _dt_today() {
  706. X    long now;
  707. X    struct tm *tmbuf;
  708. X    int date[3];
  709. X
  710. X    now = time((long *) 0);
  711. X    tmbuf = localtime(&now);
  712. X    date[MONTH] = tmbuf->tm_mon + 1;
  713. X    date[DAY] = tmbuf->tm_mday;
  714. X    date[YEAR] = tmbuf->tm_year;
  715. X    return kday(date);
  716. X}
  717. X
  718. X/*
  719. X * Return the current year.
  720. X */
  721. X
  722. Xint _dt_year() {
  723. X    long now;
  724. X    struct tm *tmbuf;
  725. X
  726. X    now = time((long *) 0);
  727. X    tmbuf = localtime(&now);
  728. X    return tmbuf->tm_year;
  729. X}
  730. ________This_Is_The_END________
  731. if test `wc -l < datefns.c` -ne 65; then
  732.     echo 'shar: datefns.c was damaged during transit (should have been 65 bytes)'
  733. fi
  734. fi        ; : end of overwriting check
  735. echo 'x - datetp.c'
  736. if test -f datetp.c; then echo 'shar: not overwriting datetp.c'; else
  737. sed 's/^X//' << '________This_Is_The_END________' > datetp.c
  738. X/*
  739. X * $Header: datetp.c,v 1.5 87/05/12 15:35:12 brandon Exp $
  740. X *
  741. X * ``USC'' -- UNIFY(r) Screens using Curses
  742. X * UNIFY(r) is a registered trademark of Unify Corporation.
  743. X *
  744. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  745. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  746. X *
  747. X * $Log:    datetp.c,v $
  748. X * Revision 1.5  87/05/12  15:35:12  brandon
  749. X * langtp[] wasn't being set properly.
  750. X * 
  751. X * Revision 1.4  87/04/29  16:01:06  brandon
  752. X * The #ifdef for UNIFY32 should have been an #ifndef.
  753. X * 
  754. X * Revision 1.3  87/04/29  12:20:40  brandon
  755. X * Not only is DATETP not supported under pre-3.2 UNIFY, but parmnt tends to
  756. X * dump core if you attempt to change it.
  757. X * 
  758. X * Revision 1.2  87/04/29  11:30:15  brandon
  759. X * Added RCS header information
  760. X * 
  761. X */
  762. X
  763. X/*LINTLIBRARY*/
  764. X
  765. X#include "usc.h"
  766. X
  767. X#ifndef UNIFY32
  768. X
  769. X/* No real choice, unfortunately -- and parmnt dumps core if you try!  :-( */
  770. Xint _ldbrt = UNITED_STATES | MDY;
  771. X
  772. X#else
  773. X
  774. X/*
  775. X * Under UNIFY 3.2, the "langtp" variable becomes a means of changing the
  776. X * parsing of dates, and also determines whether a bracket conforms to the
  777. X * standards of the United States -- `[]' -- or to the rest of the world
  778. X * -- `()'.  (As usual, the U.S. is oddball.  Kind of makes you wonder...)
  779. X */
  780. X
  781. Xextern char langtp[2];
  782. Xint _ldbrt = -1;
  783. X
  784. X#define CH(x,y)        (((x) << 8) | (y))
  785. X
  786. Xvoid _sdbrt() {
  787. X    if (_ldbrt != -1)
  788. X        return;
  789. X    if (langtp[0] == '\0') {
  790. X        char *cp;
  791. X
  792. X        if ((cp = getenv("DATETP")) == (char *) 0)
  793. X            cp = "EN";    /* UNIFY still has old default?! */
  794. X        langtp[0] = cp[0];
  795. X        langtp[1] = cp[1];
  796. X    }
  797. X    switch (CH(langtp[0], langtp[1])) {
  798. X    case CH('A', 'M'):
  799. X    case CH('E', 'N'):
  800. X        _ldbrt = UNITED_STATES | MDY;
  801. X        break;
  802. X    case CH('E', 'U'):
  803. X        _ldbrt = INTERNATIONAL | DMY;
  804. X        break;
  805. X    case CH('U', 'S'):
  806. X        _ldbrt = INTERNATIONAL | MDY;
  807. X        break;
  808. X    default:
  809. X        {
  810. X            char buf[3];
  811. X            buf[0] = langtp[0];
  812. X            buf[1] = langtp[1];
  813. X            buf[2] = '\0';
  814. X            prtmsg(1, 22, buf);
  815. X        }
  816. X        _ldbrt = INTERNATIONAL | YMD;
  817. X    }
  818. X}
  819. X
  820. X#endif    /* UNIFY32 */
  821. ________This_Is_The_END________
  822. if test `wc -l < datetp.c` -ne 83; then
  823.     echo 'shar: datetp.c was damaged during transit (should have been 83 bytes)'
  824. fi
  825. fi        ; : end of overwriting check
  826. echo 'x - dbfile.c'
  827. if test -f dbfile.c; then echo 'shar: not overwriting dbfile.c'; else
  828. sed 's/^X//' << '________This_Is_The_END________' > dbfile.c
  829. X/*
  830. X * $Header: dbfile.c,v 1.3 87/05/12 10:58:24 brandon Exp $
  831. X *
  832. X * ``USC'' -- UNIFY(r) Screens using Curses
  833. X * UNIFY(r) is a registered trademark of Unify Corporation.
  834. X *
  835. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  836. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  837. X *
  838. X * $Log:    dbfile.c,v $
  839. X * Revision 1.3  87/05/12  10:58:24  brandon
  840. X * OOPS:  null filename if no extension!
  841. X * 
  842. X * Revision 1.2  87/04/29  11:30:17  brandon
  843. X * Added RCS header information
  844. X * 
  845. X */
  846. X
  847. X/*LINTLIBRARY*/
  848. X
  849. X#include "usc.h"
  850. X#include <sys/types.h>
  851. X#include <sys/stat.h>
  852. X
  853. X/*
  854. X * Generate a file name.  Append the given extension (if any), and try to
  855. X * find it in the DBPATH or the current directory.
  856. X */
  857. X
  858. Xchar *dbfile(fn, ext)
  859. Xchar *fn, *ext; {
  860. X    char fnb[1024];
  861. X    static char path[1024];
  862. X    static char *dbpath = (char *) 0;
  863. X    struct stat exist;
  864. X
  865. X    if (ext != (char *) 0)
  866. X        (void) sprintf(fnb, "%s.%s", fn, ext);
  867. X    else
  868. X        (void) strcpy(fnb, fn);
  869. X    if (dbpath == (char *) 0 && (dbpath = getenv("DBPATH")) == (char *) 0)
  870. X        dbpath = ".";
  871. X    (void) sprintf(path, "%s/%s", dbpath, fnb);
  872. X    if (stat(path, &exist) == 0)
  873. X        return path;
  874. X    (void) strcpy(path, fnb);
  875. X    return (stat(path, &exist) == 0? path: (char *) 0);
  876. X}
  877. ________This_Is_The_END________
  878. if test `wc -l < dbfile.c` -ne 48; then
  879.     echo 'shar: dbfile.c was damaged during transit (should have been 48 bytes)'
  880. fi
  881. fi        ; : end of overwriting check
  882. echo 'x - dbfopen.c'
  883. if test -f dbfopen.c; then echo 'shar: not overwriting dbfopen.c'; else
  884. sed 's/^X//' << '________This_Is_The_END________' > dbfopen.c
  885. X/*
  886. X * $Header: dbfopen.c,v 1.3 87/04/29 15:00:47 brandon Exp $
  887. X *
  888. X * ``USC'' -- UNIFY(r) Screens using Curses
  889. X * UNIFY(r) is a registered trademark of Unify Corporation.
  890. X *
  891. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  892. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  893. X *
  894. X * $Log:    dbfopen.c,v $
  895. X * Revision 1.3  87/04/29  15:00:47  brandon
  896. X * Since xerror() calls dbfopen(), dbfopen() cannot call xerror().
  897. X * 
  898. X * Revision 1.2  87/04/29  11:30:19  brandon
  899. X * Added RCS header information
  900. X * 
  901. X */
  902. X
  903. X/*LINTLIBRARY*/
  904. X
  905. X#include "usc.h"
  906. X
  907. X/*
  908. X * Open a file associated with a database.
  909. X */
  910. X
  911. XFILE *_dbfopen(fn, mode)
  912. Xchar *fn, *mode; {
  913. X    char *dbf;
  914. X
  915. X    if ((dbf = dbfile(fn, (char *) 0)) == (char *) 0)
  916. X        return (FILE *) 0;    /* xerror() calls us */
  917. X    return fopen(dbf, mode);
  918. X}
  919. ________This_Is_The_END________
  920. if test `wc -l < dbfopen.c` -ne 34; then
  921.     echo 'shar: dbfopen.c was damaged during transit (should have been 34 bytes)'
  922. fi
  923. fi        ; : end of overwriting check
  924. echo 'x - dbherr.c'
  925. if test -f dbherr.c; then echo 'shar: not overwriting dbherr.c'; else
  926. sed 's/^X//' << '________This_Is_The_END________' > dbherr.c
  927. X/*
  928. X * $Header: dbherr.c,v 1.1 87/04/29 14:57:38 brandon Exp $
  929. X *
  930. X * ``USC'' -- UNIFY(r) Screens using Curses
  931. X * UNIFY(r) is a registered trademark of Unify Corporation.
  932. X *
  933. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  934. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  935. X *
  936. X * $Log:    dbherr.c,v $
  937. X * Revision 1.1  87/04/29  14:57:38  brandon
  938. X * Initial revision
  939. X * 
  940. X */
  941. X
  942. X/*LINTLIBRARY*/
  943. X
  944. X#include "usc.h"
  945. X
  946. X/*
  947. X * ENTRY POINT:  dbherr() -- Print a data dictionary error message and exit
  948. X *
  949. X * DIFFERENCE FROM UNIFY:  *Always* uses the error log, even in pre-3.2
  950. X * versions.  Also, my idea of what an error should log seems to differ from
  951. X * that of Unify Corp.
  952. X */
  953. X
  954. Xvoid dbherr(s)
  955. Xchar *s; {
  956. X    (void) strcpy(errcall, "dbherr");
  957. X    xerror(0, "Data Dictionary error -- see Notes", "%s", s);
  958. X}
  959. ________This_Is_The_END________
  960. if test `wc -l < dbherr.c` -ne 32; then
  961.     echo 'shar: dbherr.c was damaged during transit (should have been 32 bytes)'
  962. fi
  963. fi        ; : end of overwriting check
  964. echo 'x - dsply.c'
  965. if test -f dsply.c; then echo 'shar: not overwriting dsply.c'; else
  966. sed 's/^X//' << '________This_Is_The_END________' > dsply.c
  967. X/*
  968. X * $Header: dsply.c,v 1.2 87/04/29 11:30:21 brandon Exp $
  969. X *
  970. X * ``USC'' -- UNIFY(r) Screens using Curses
  971. X * UNIFY(r) is a registered trademark of Unify Corporation.
  972. X *
  973. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  974. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  975. X *
  976. X * $Log:    dsply.c,v $
  977. X * Revision 1.2  87/04/29  11:30:21  brandon
  978. X * Added RCS header information
  979. X * 
  980. X */
  981. X
  982. X/*LINTLIBRARY*/
  983. X
  984. X#include "usc.h"
  985. X
  986. X/*
  987. X * ENTRY POINT:  dsply() -- Display a set of screen fields
  988. X *
  989. X * DIFFERENCE FROM UNIFY:  None (!) at this level.
  990. X */
  991. X
  992. Xdsply(ssfld, esfld) {
  993. X    for (; ssfld <= esfld; ssfld++)
  994. X        output(ssfld);
  995. X}
  996. ________This_Is_The_END________
  997. if test `wc -l < dsply.c` -ne 29; then
  998.     echo 'shar: dsply.c was damaged during transit (should have been 29 bytes)'
  999. fi
  1000. fi        ; : end of overwriting check
  1001. echo 'x - eras_ln.c'
  1002. if test -f eras_ln.c; then echo 'shar: not overwriting eras_ln.c'; else
  1003. sed 's/^X//' << '________This_Is_The_END________' > eras_ln.c
  1004. X/*
  1005. X * $Header: eras_ln.c,v 1.2 87/04/29 11:30:22 brandon Exp $
  1006. X *
  1007. X * ``USC'' -- UNIFY(r) Screens using Curses
  1008. X * UNIFY(r) is a registered trademark of Unify Corporation.
  1009. X *
  1010. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  1011. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  1012. X *
  1013. X * $Log:    eras_ln.c,v $
  1014. X * Revision 1.2  87/04/29  11:30:22  brandon
  1015. X * Added RCS header information
  1016. X * 
  1017. X */
  1018. X
  1019. X/*LINTLIBRARY*/
  1020. X
  1021. X#include "usc.h"
  1022. X
  1023. X/*
  1024. X * ENTRY POINT:  eras_ln() -- clear, forcibly, a line on a given fd.
  1025. X *
  1026. X * DIFFERENCE FROM UNIFY:  If fd isn't 1, you get a run-time error; use the
  1027. X * old library if you want funny terminal stuff, or else hook into terminfo-
  1028. X * based curses and call newterm().  I daresay nobody uses the fd hook anyway.
  1029. X */
  1030. X
  1031. Xvoid eras_ln(fd) {
  1032. X    if (fd != 1)
  1033. X        xerror(-1, "eras_ln", "Multi-terminal operation on fd %d not supported", fd);
  1034. X    (void) clrtoeol();
  1035. X}
  1036. ________This_Is_The_END________
  1037. if test `wc -l < eras_ln.c` -ne 32; then
  1038.     echo 'shar: eras_ln.c was damaged during transit (should have been 32 bytes)'
  1039. fi
  1040. fi        ; : end of overwriting check
  1041. echo 'x - eras_pg.c'
  1042. if test -f eras_pg.c; then echo 'shar: not overwriting eras_pg.c'; else
  1043. sed 's/^X//' << '________This_Is_The_END________' > eras_pg.c
  1044. X/*
  1045. X * $Header: eras_pg.c,v 1.1 87/05/11 12:26:53 brandon Exp $
  1046. X *
  1047. X * ``USC'' -- UNIFY(r) Screens using Curses
  1048. X * UNIFY(r) is a registered trademark of Unify Corporation.
  1049. X *
  1050. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  1051. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  1052. X *
  1053. X * $Log:    eras_pg.c,v $
  1054. X * Revision 1.1  87/05/11  12:26:53  brandon
  1055. X * Initial revision
  1056. X * 
  1057. X */
  1058. X
  1059. X/*LINTLIBRARY*/
  1060. X
  1061. X#include "usc.h"
  1062. X
  1063. X/*
  1064. X * Groping in the dark, trying to prevent the loading of the original Unify
  1065. X * code, which conflicts with the curses echo() function (terminfo only)
  1066. X */
  1067. X
  1068. Xvoid eras_pg(fd) {
  1069. X    if (fd != 1)
  1070. X        xerror(-1, "eras_pg", "Multi-terminal operation on fd %d not supported", fd);
  1071. X    (void) clrtobot();
  1072. X}
  1073. ________This_Is_The_END________
  1074. if test `wc -l < eras_pg.c` -ne 29; then
  1075.     echo 'shar: eras_pg.c was damaged during transit (should have been 29 bytes)'
  1076. fi
  1077. fi        ; : end of overwriting check
  1078. echo 'x - erasprmp.c'
  1079. if test -f erasprmp.c; then echo 'shar: not overwriting erasprmp.c'; else
  1080. sed 's/^X//' << '________This_Is_The_END________' > erasprmp.c
  1081. X/*
  1082. X * $Header: erasprmp.c,v 1.2 87/04/29 11:30:24 brandon Exp $
  1083. X *
  1084. X * ``USC'' -- UNIFY(r) Screens using Curses
  1085. X * UNIFY(r) is a registered trademark of Unify Corporation.
  1086. X *
  1087. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  1088. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  1089. X *
  1090. X * $Log:    erasprmp.c,v $
  1091. X * Revision 1.2  87/04/29  11:30:24  brandon
  1092. X * Added RCS header information
  1093. X * 
  1094. X */
  1095. X
  1096. X/*LINTLIBRARY*/
  1097. X
  1098. X#include "usc.h"
  1099. X
  1100. X/*
  1101. X * ENTRY POINT:  erasprmp() -- Clear the data portions of screen fields
  1102. X *
  1103. X * DIFFERENCES FROM UNIFY:  Since data fields are foreground, we enter
  1104. X * underline mode (if supported).
  1105. X */
  1106. X
  1107. Xvoid erasprmp(ssfld, esfld) {
  1108. X    int len;
  1109. X
  1110. X    (void) attron(A_UNDERLINE);
  1111. X    for (; ssfld <= esfld; ssfld++) {
  1112. X        if (ssfld < 0 || ssfld >= __nsf)
  1113. X            xerror(-1, "erasprmp", "Invalid screen field %d", ssfld);
  1114. X        if (__scf[ssfld].q_len == 0)
  1115. X            continue;    /* no data field involved */
  1116. X        len = __scf[ssfld].q_len;
  1117. X        switch (__scf[ssfld].q_type) {
  1118. X        case DATE:
  1119. X            len = 8;
  1120. X            break;
  1121. X        case HR:
  1122. X            len = 5;
  1123. X            break;
  1124. X        case FLT:
  1125. X            len /= 10;
  1126. X            break;
  1127. X        case HAMT:
  1128. X        case AMT:
  1129. X            len += 3;
  1130. X            break;
  1131. X        }
  1132. X        (void) mvprintw(__scf[ssfld].q_fy, __scf[ssfld].q_fx, "%*s", len, "");
  1133. X    }
  1134. X    (void) attroff(A_UNDERLINE);
  1135. X}
  1136. ________This_Is_The_END________
  1137. if test `wc -l < erasprmp.c` -ne 55; then
  1138.     echo 'shar: erasprmp.c was damaged during transit (should have been 55 bytes)'
  1139. fi
  1140. fi        ; : end of overwriting check
  1141. echo 'x - error.c'
  1142. if test -f error.c; then echo 'shar: not overwriting error.c'; else
  1143. sed 's/^X//' << '________This_Is_The_END________' > error.c
  1144. X/*
  1145. X * $Header: error.c,v 1.1 87/04/29 14:57:30 brandon Exp $
  1146. X *
  1147. X * ``USC'' -- UNIFY(r) Screens using Curses
  1148. X * UNIFY(r) is a registered trademark of Unify Corporation.
  1149. X *
  1150. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  1151. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  1152. X *
  1153. X * $Log:    error.c,v $
  1154. X * Revision 1.1  87/04/29  14:57:30  brandon
  1155. X * Initial revision
  1156. X * 
  1157. X */
  1158. X
  1159. X/*LINTLIBRARY*/
  1160. X
  1161. X#include "usc.h"
  1162. X
  1163. X/*
  1164. X * ENTRY POINT:  error() -- Print an error message and exit
  1165. X *
  1166. X * DIFFERENCE FROM UNIFY:  *Always* uses the error log, even in pre-3.2
  1167. X * versions.  Also, my idea of what an error should log seems to differ from
  1168. X * that of Unify Corp.
  1169. X */
  1170. X
  1171. Xvoid error(s, ier)
  1172. Xchar *s; {
  1173. X    (void) strcpy(errcall, "error");
  1174. X    xerror(ier, "UNITRIEVE error -- see Notes", "%s", s);
  1175. X}
  1176. ________This_Is_The_END________
  1177. if test `wc -l < error.c` -ne 32; then
  1178.     echo 'shar: error.c was damaged during transit (should have been 32 bytes)'
  1179. fi
  1180. fi        ; : end of overwriting check
  1181. echo 'x - gdata.c'
  1182. if test -f gdata.c; then echo 'shar: not overwriting gdata.c'; else
  1183. sed 's/^X//' << '________This_Is_The_END________' > gdata.c
  1184. X/*
  1185. X * $Header: gdata.c,v 1.3 87/05/27 16:01:59 brandon Exp $
  1186. X *
  1187. X * ``USC'' -- UNIFY(r) Screens using Curses
  1188. X * UNIFY(r) is a registered trademark of Unify Corporation.
  1189. X *
  1190. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  1191. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  1192. X *
  1193. X * $Log:    gdata.c,v $
  1194. X * Revision 1.3  87/05/27  16:01:59  brandon
  1195. X * Had a break; on failed exp. rel. that should have been a continue;.
  1196. X * 
  1197. X * Revision 1.2  87/04/29  11:30:26  brandon
  1198. X * Added RCS header information
  1199. X * 
  1200. X */
  1201. X
  1202. X/*LINTLIBRARY*/
  1203. X
  1204. X#include "usc.h"
  1205. X
  1206. X/*
  1207. X * ENTRY POINT:  gdata() -- get a value at a specified location and store it
  1208. X * in the database.
  1209. X *
  1210. X * DIFFERENCE FROM UNIFY:  See inscrf().  Also, if a pfield() fails, the
  1211. X * operation will be retried as follows:
  1212. X *
  1213. X *    record locked:    asks retry or abort -- the latter acts as a -3
  1214. X *    no access:    asks for a password, wrong acts as -3 return
  1215. X */
  1216. X
  1217. Xgdata(fx, fy, field) {
  1218. X    char buf[256];
  1219. X    int rc, ch;
  1220. X
  1221. X    setraw();
  1222. X    for (;;) {
  1223. X        rc = gtube(fx, fy, field, buf);
  1224. X        if (rc == BACK || rc == FWD || rc == GO) {
  1225. X            if (rc == FWD)
  1226. X                rc = FWD_OK;
  1227. X            break;
  1228. X        }
  1229. X
  1230. Xrepass:
  1231. X        switch (ch = pfield(field, buf)) {
  1232. X        case -4:
  1233. X            (void) mvprintw(23, 1, "Enter modify password for field: ");
  1234. X            (void) refresh();
  1235. X            (void) nocbreak();
  1236. X            (void) nl();
  1237. X            if (accsfld(field, getpass(""), 'w') == 0)
  1238. X                goto repass;
  1239. X            (void) noecho();
  1240. X            (void) cbreak();
  1241. X            (void) nonl();
  1242. X            prtmsg(1, 23, "Wrong password");
  1243. X            rc = -3;
  1244. X            break;
  1245. X        case -5:
  1246. X            (void) mvprintw(23, 1, "Record is locked -- Retry or Abort? ");
  1247. X            (void) refresh();
  1248. X            ch = tolower(getchar() & 0x7f);
  1249. X            (void) move(23, 1);
  1250. X            (void) clrtoeol();
  1251. X            switch (ch) {
  1252. X            case 'a':
  1253. X                rc = -3;
  1254. X                break;
  1255. X            default:
  1256. X                goto repass;
  1257. X            }
  1258. X            break;
  1259. X        case 0:
  1260. X            break;
  1261. X        case -1:
  1262. X            prtmsg(1, 23, "Record is referenced, you may not change the key");
  1263. X            continue;
  1264. X        case -2:
  1265. X            prtmsg(1, 23, "This field has a unique index, and the value you entered exists");
  1266. X            continue;
  1267. X        case -3:
  1268. X            prtmsg(1, 23, "There is no related record with this key");
  1269. X            continue;
  1270. X        default:
  1271. X            xerror(-1, "gtube", "Unknown error %d from pfield", ch);
  1272. X        }
  1273. X        break;
  1274. X    }
  1275. X    return rc;
  1276. X}
  1277. ________This_Is_The_END________
  1278. if test `wc -l < gdata.c` -ne 93; then
  1279.     echo 'shar: gdata.c was damaged during transit (should have been 93 bytes)'
  1280. fi
  1281. fi        ; : end of overwriting check
  1282. echo 'x - gprint.c'
  1283. if test -f gprint.c; then echo 'shar: not overwriting gprint.c'; else
  1284. sed 's/^X//' << '________This_Is_The_END________' > gprint.c
  1285. X/*
  1286. X * $Header: gprint.c,v 1.2 87/06/02 12:51:46 brandon Exp $
  1287. X *
  1288. X * ``USC'' -- UNIFY(r) Screens using Curses
  1289. X * UNIFY(r) is a registered trademark of Unify Corporation.
  1290. X *
  1291. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  1292. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  1293. X *
  1294. X * $Log:    gprint.c,v $
  1295. X * Revision 1.2  87/06/02  12:51:46  brandon
  1296. X * Linted.
  1297. X * 
  1298. X * Revision 1.1  87/06/01  08:28:48  brandon
  1299. X * Initial revision
  1300. X * 
  1301. X */
  1302. X
  1303. X/*LINTLIBRARY*/
  1304. X
  1305. X#include "usc.h"
  1306. X
  1307. X/*
  1308. X * Generate a printable version of a database field.  This is similar to dspdt
  1309. X * but works for any data type.
  1310. X */
  1311. X
  1312. Xvoid uttoa(buf, typ, len, xbuf)
  1313. Xchar *buf, *xbuf; {
  1314. X#ifndef UNIFY32
  1315. X    int date[3];
  1316. X#endif UNIFY32
  1317. X
  1318. X    switch (typ) {
  1319. X    case INT:
  1320. X        (void) sprintf(buf, "%*d", len, *((short *) xbuf));
  1321. X        break;
  1322. X    case LONG:
  1323. X        (void) sprintf(buf, "%*ld", len, *((long *) xbuf));
  1324. X        break;
  1325. X    case AMT:
  1326. X        (void) sprintf(buf, "%*.2f", len, (double) *((long *) xbuf) / 100.0);
  1327. X        break;
  1328. X    case HAMT:
  1329. X        (void) sprintf(buf, "%*.2f", len, *((double *) xbuf) / 100.0);
  1330. X        break;
  1331. X    case STRNG:
  1332. X        (void) sprintf(buf, "%-*.*s", len, len, xbuf);
  1333. X        break;
  1334. X    case FLT:
  1335. X        (void) sprintf(buf, "%*g", len, *((double *) xbuf));
  1336. X        break;
  1337. X    case DATE:
  1338. X#ifdef UNIFY32
  1339. X        dspdt(*((short *) xbuf), buf);
  1340. X        buf[8] = '\0';
  1341. X#else
  1342. X        kdate(*((short *) buf), date);
  1343. X        (void) sprintf(buf, "%02d/%02d/%02d", date[MONTH], date[DAY], date[YEAR]);
  1344. X#endif UNIFY32
  1345. X        break;
  1346. X    case HR:
  1347. X        (void) sprintf(buf, "%02d:%02d", *((short *) xbuf) / 100, *((short *) xbuf) % 100);
  1348. X        break;
  1349. X    default:
  1350. X        xerror(-1, "uttoa", "Unknown or illegal type %d", typ);
  1351. X    }
  1352. X}
  1353. X
  1354. Xgprint(fld, fbuf)
  1355. Xchar *fbuf; {
  1356. X    char buf[256];
  1357. X    FLDESC fd;
  1358. X
  1359. X    if (!fldesc(fld, &fd))
  1360. X        xerror(-1, "gprint", "Unrecognized field %d", fld);
  1361. X    if (gfield(fld, buf) == -1)
  1362. X        return -1;
  1363. X    uttoa(fbuf, fd.f_typ, fd.f_len, buf);
  1364. X    return 0;
  1365. X}
  1366. ________This_Is_The_END________
  1367. if test `wc -l < gprint.c` -ne 81; then
  1368.     echo 'shar: gprint.c was damaged during transit (should have been 81 bytes)'
  1369. fi
  1370. fi        ; : end of overwriting check
  1371. echo 'x - gtube.c'
  1372. if test -f gtube.c; then echo 'shar: not overwriting gtube.c'; else
  1373. sed 's/^X//' << '________This_Is_The_END________' > gtube.c
  1374. X/*
  1375. X * $Header: gtube.c,v 1.6 87/06/09 12:22:11 brandon Exp $
  1376. X *
  1377. X * ``USC'' -- UNIFY(r) Screens using Curses
  1378. X * UNIFY(r) is a registered trademark of Unify Corporation.
  1379. X *
  1380. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  1381. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  1382. X *
  1383. X * $Log:    gtube.c,v $
  1384. X * Revision 1.6  87/06/09  12:22:11  brandon
  1385. X * Moved FYI message to line 23; cleared it after input.
  1386. X * 
  1387. X * Revision 1.5  87/06/01  08:29:28  brandon
  1388. X * Added ^V (view) capability for related records.
  1389. X * 
  1390. X * Revision 1.4  87/04/29  16:09:49  brandon
  1391. X * Added a cast to (void) of mvaddstr()
  1392. X * 
  1393. X * Revision 1.3  87/04/29  13:10:36  brandon
  1394. X * fldesc() returns display length, so mucking around with it isn't needed.
  1395. X * However, probably input() or inbuf() will need help...
  1396. X * 
  1397. X * Revision 1.2  87/04/29  11:30:28  brandon
  1398. X * Added RCS header information
  1399. X * 
  1400. X */
  1401. X
  1402. X/*LINTLIBRARY*/
  1403. X
  1404. X#include "usc.h"
  1405. X
  1406. X/*
  1407. X * ENTRY POINT:  gtube() -- Get input using a database field template.
  1408. X *
  1409. X * DIFFERENCE FROM UNIFY:  See inscrf().  Also, the UNIFY 3.2 manual says that
  1410. X * COMB fields are allowed in gtube(); they never were before.  I am assuming
  1411. X * that the manual is in error, since inputting a COMB field may be nice but
  1412. X * is extremely difficult and requires a search throuh every field in the
  1413. X * database, without the secret information internal to UNITRIEVE.  That, of
  1414. X * course, assumes that we're not treating it as type == STRNG, which would
  1415. X * be a *real* botch.
  1416. X *
  1417. X * Another major difference is that with XRC_LOOK enabled, ^V will cause a
  1418. X * browse screen for related records to pop up; select a record and press
  1419. X * GO (ESC) to enter that value.
  1420. X */
  1421. X
  1422. Xgtube(fx, fy, field, buf)
  1423. Xchar *buf; {
  1424. X    FLDESC fd;
  1425. X    int rc;
  1426. X#ifdef UNIFY32
  1427. X    char *cmsg, *emsg;
  1428. X#endif
  1429. X
  1430. X    setraw();
  1431. X    if (!fldesc(field, &fd))
  1432. X        xerror(-1, "gtube", "Invalid field %d", field);
  1433. X    if (fd.f_typ == COMB)
  1434. X        xerror(-2, "gtube", "COMB field %d illegal", field);
  1435. X#ifdef UNIFY32
  1436. X    cmsg = getdoms(field, FYISTR);
  1437. X    if ((emsg = getdoms(field, ERRSTR)) == (char *) 0)
  1438. X        emsg = "The value you entered is not legal for this field";
  1439. X    for (;;) {
  1440. X        if (cmsg != (char *) 0)
  1441. X            (void) mvaddstr(23, 1, cmsg);
  1442. X#endif
  1443. X        rc = inscrf(fx, fy, fd.f_typ, fd.f_len, buf);
  1444. X#ifdef UNIFY32
  1445. X        (void) move(23, 1);
  1446. X        (void) clrtoeol();
  1447. X#endif
  1448. X        if (rc == BACK || rc == FWD || rc == GO)
  1449. X            return rc;
  1450. X        if (rc == LOOK) {
  1451. X            if (fd.f_rpfld == 0) {
  1452. X                prtmsg(1, 23, "There is no related record to view");
  1453. X                continue;
  1454. X            }
  1455. X            if ((rc = zoom(fx, fy, field, &fd, buf)) == BACK || rc == FWD)
  1456. X                return rc;
  1457. X            outscrf(fx, fy, fd.f_typ, fd.f_len, buf);
  1458. X        }
  1459. X#ifdef UNIFY32
  1460. X        if (domchk(field, buf))
  1461. X            break;
  1462. X        prtmsg(1, 23, emsg);
  1463. X    }
  1464. X#endif
  1465. X    return rc;
  1466. X}
  1467. ________This_Is_The_END________
  1468. if test `wc -l < gtube.c` -ne 93; then
  1469.     echo 'shar: gtube.c was damaged during transit (should have been 93 bytes)'
  1470. fi
  1471. fi        ; : end of overwriting check
  1472. echo 'x - iamt.c'
  1473. if test -f iamt.c; then echo 'shar: not overwriting iamt.c'; else
  1474. sed 's/^X//' << '________This_Is_The_END________' > iamt.c
  1475. X/*
  1476. X * $Header: iamt.c,v 1.6 87/06/09 11:45:05 brandon Exp $
  1477. X *
  1478. X * ``USC'' -- UNIFY(r) Screens using Curses
  1479. X * UNIFY(r) is a registered trademark of Unify Corporation.
  1480. X *
  1481. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  1482. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  1483. X *
  1484. X * $Log:    iamt.c,v $
  1485. X * Revision 1.6  87/06/09  11:45:05  brandon
  1486. X * Added code to relocate cursor after conversion error message.
  1487. X * 
  1488. X * Revision 1.5  87/06/01  08:29:50  brandon
  1489. X * Added ^V (view) capability for related records.
  1490. X * 
  1491. X * Revision 1.4  87/05/26  13:31:23  brandon
  1492. X * Changed for new inl() (forces no-update mode).
  1493. X * 
  1494. X * Revision 1.3  87/05/12  12:04:06  brandon
  1495. X * Changed to pass FWD, BACK, GO without checking the data buffer
  1496. X * 
  1497. X * Revision 1.2  87/04/29  11:30:31  brandon
  1498. X * Added RCS header information
  1499. X * 
  1500. X */
  1501. X
  1502. X/*LINTLIBRARY*/
  1503. X
  1504. X#include "usc.h"
  1505. X
  1506. X/*
  1507. X * Input a small amount, into a (long).
  1508. X */
  1509. X
  1510. Xint iamt(len, buf)
  1511. Xlong *buf; {
  1512. X    char ibuf[10];
  1513. X    int rc, cnt, sign, dec, y, x;
  1514. X
  1515. X    setraw();
  1516. X    if (len > 10)
  1517. X        len = 10;
  1518. X    getyx(stdscr, y, x);
  1519. X    for (;;) {
  1520. X        (void) move(y, x);
  1521. X        if ((rc = inl(ibuf, len, 1)) == BACK || rc == FWD || rc == GO || rc == LOOK)
  1522. X            return rc;
  1523. X        for (cnt = 0; cnt < len && ibuf[cnt] == ' '; cnt++)
  1524. X            ;
  1525. X        if (cnt == len) {
  1526. X            prtmsg(1, 23, "Invalid amount");
  1527. X            continue;
  1528. X        }
  1529. X        *buf = 0L;
  1530. X        sign = 0;
  1531. X        dec = 0;
  1532. X        if (ibuf[cnt] == '-') {
  1533. X            sign = 1;
  1534. X            if (++cnt == len) {
  1535. X                prtmsg(1, 23, "Invalid amount");
  1536. X                continue;
  1537. X            }
  1538. X        }
  1539. X        for (; cnt < len && isdigit(ibuf[cnt]); cnt++) {
  1540. X            *buf *= 10;
  1541. X            *buf += ibuf[cnt] - '0';
  1542. X        }
  1543. X        if (ibuf[cnt] == '.') {
  1544. X            if (cnt > len - 2) {
  1545. X                prtmsg(1, 23, "Invalid amount");
  1546. X                continue;
  1547. X            }
  1548. X            if (!isdigit(ibuf[++cnt])) {
  1549. X                prtmsg(1, 23, "Invalid amount");
  1550. X                continue;
  1551. X            }
  1552. X            dec = (ibuf[cnt] - '0') * 10;
  1553. X            if (!isdigit(ibuf[++cnt])) {
  1554. X                prtmsg(1, 23, "Invalid amount");
  1555. X                continue;
  1556. X            }
  1557. X            dec += ibuf[cnt] - '0';
  1558. X        }
  1559. X        for (; cnt < len && ibuf[cnt] == ' '; cnt++)
  1560. X            ;
  1561. X        if (cnt == len)
  1562. X             break;
  1563. X        prtmsg(1, 23, "Invalid amount");
  1564. X    }
  1565. X    *buf = *buf * 100 + dec;
  1566. X    if (sign)
  1567. X        *buf = - *buf;
  1568. X    return rc;
  1569. X}
  1570. ________This_Is_The_END________
  1571. if test `wc -l < iamt.c` -ne 95; then
  1572.     echo 'shar: iamt.c was damaged during transit (should have been 95 bytes)'
  1573. fi
  1574. fi        ; : end of overwriting check
  1575. echo 'x - idate.c'
  1576. if test -f idate.c; then echo 'shar: not overwriting idate.c'; else
  1577. sed 's/^X//' << '________This_Is_The_END________' > idate.c
  1578. X/*
  1579. X * $Header: idate.c,v 1.16 87/06/01 16:28:46 brandon Exp $
  1580. X *
  1581. X * ``USC'' -- UNIFY(r) Screens using Curses
  1582. X * UNIFY(r) is a registered trademark of Unify Corporation.
  1583. X *
  1584. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  1585. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  1586. X *
  1587. X * $Log:    idate.c,v $
  1588. X * Revision 1.16  87/06/01  16:28:46  brandon
  1589. X * Moved today() and thisyear() to datefns.c with new names.
  1590. X * 
  1591. X * Revision 1.15  87/06/01  09:39:07  brandon
  1592. X * Missing move() before pdate() calls.
  1593. X * 
  1594. X * Revision 1.14  87/06/01  09:25:08  brandon
  1595. X * AARGH! ! !  Output func is pdate(), not odate()!
  1596. X * 
  1597. X * Revision 1.13  87/06/01  09:22:39  brandon
  1598. X * Forced redisplay of entered date, so `/' (today) shows up properly.
  1599. X * 
  1600. X * Revision 1.12  87/06/01  08:29:58  brandon
  1601. X * Added ^V (view) capability for related records.
  1602. X * 
  1603. X * Revision 1.11  87/05/27  15:53:15  brandon
  1604. X * Wasn't handling canonical NULLDATE correctly.
  1605. X * 
  1606. X * Revision 1.10  87/05/26  15:43:49  brandon
  1607. X * Forgot to cast move() call.
  1608. X * 
  1609. X * Revision 1.9  87/05/26  13:31:40  brandon
  1610. X * Changed for new inl() (forces no-update mode).
  1611. X * 
  1612. X * Revision 1.8  87/05/12  15:39:26  brandon
  1613. X * added call to _sdbrt() to insure correct date types
  1614. X * 
  1615. X * Revision 1.7  87/05/12  13:24:21  brandon
  1616. X * Dumb bugs in parsing /.
  1617. X * 
  1618. X * Revision 1.6  87/05/11  16:38:35  brandon
  1619. X * more checking and another bugfix; it was typechecking on no-data returns
  1620. X * 
  1621. X * Revision 1.5  87/05/11  16:30:07  brandon
  1622. X * more checking added (also friendlier error messages)
  1623. X * 
  1624. X * Revision 1.4  87/05/11  16:22:40  brandon
  1625. X * removed debugging and fixed bug!
  1626. X * 
  1627. X * Revision 1.3  87/05/11  16:13:54  brandon
  1628. X * bugchk
  1629. X * 
  1630. X * Revision 1.2  87/04/29  11:30:33  brandon
  1631. X * Added RCS header information
  1632. X * 
  1633. X */
  1634. X
  1635. X/*LINTLIBRARY*/
  1636. X
  1637. X#include "usc.h"
  1638. X#include <ctype.h>
  1639. X
  1640. X/*
  1641. X * Input a date.  This is effectively a (short), but outside may have one of
  1642. X * the following values:
  1643. X *
  1644. X *         n/n[/n]        **.**.**    *    /
  1645. X *
  1646. X * At any time, . or - may be used in place of /.  * is short for **.**.**;
  1647. X * / is short for today's date.  (Note:  I used . in place of / in the null
  1648. X * dates, the reason I leave as an exercise for the reader.)
  1649. X *
  1650. X * This routine is ugly, but it does it all.
  1651. X */
  1652. X
  1653. Xint idate(buf)
  1654. Xshort *buf; {
  1655. X    int odate[3], date[3];
  1656. X    int cnt, rc, DS1, DS2, DS3, x, y;
  1657. X    char ibuf[9];
  1658. X
  1659. X    setraw();
  1660. X    _sdbrt();
  1661. X    switch (_ldbrt & MASK_DATES) {
  1662. X    case YMD:
  1663. X        DS1 = YEAR;
  1664. X        DS2 = MONTH;
  1665. X        DS3 = DAY;
  1666. X        break;
  1667. X    case DMY:
  1668. X        DS1 = DAY;
  1669. X        DS2 = MONTH;
  1670. X        DS3 = YEAR;
  1671. X        break;
  1672. X    case MDY:
  1673. X        DS1 = MONTH;
  1674. X        DS2 = DAY;
  1675. X        DS3 = YEAR;
  1676. X        break;
  1677. X    default:
  1678. X        xerror(-1, "idate", "Unrecognized internal date code %d", _ldbrt & MASK_DATES);
  1679. X    }
  1680. X    getyx(stdscr, y, x);
  1681. X    for (;;) {
  1682. X        (void) move(y, x);
  1683. X        if ((rc = inl(ibuf, 8, 1)) == BACK || rc == FWD || rc == GO || rc == LOOK)
  1684. X            return rc;
  1685. X        for (cnt = 0; cnt < 8; cnt++)
  1686. X            if (ibuf[cnt] == '.' || ibuf[cnt] == '-')
  1687. X                ibuf[cnt] = '/';
  1688. X        for (cnt = 0; cnt < 8 && ibuf[cnt] == ' '; cnt++)
  1689. X            ;
  1690. X        if (cnt == 8) {
  1691. X            prtmsg(1, 23, "Invalid empty date");
  1692. X            continue;
  1693. X        }
  1694. X        if (ibuf[cnt] == '/') {
  1695. X            for (cnt++; cnt < 8 && ibuf[cnt] == ' '; cnt++)
  1696. X                ;
  1697. X            if (cnt < 8) {
  1698. X                prtmsg(1, 23, "Invalid date format");
  1699. X                continue;
  1700. X            }
  1701. X            *buf = _dt_today();
  1702. X            (void) move(y, x);
  1703. X            pdate(buf);
  1704. X            return rc;
  1705. X        }
  1706. X        if (ibuf[cnt] == '*') {
  1707. X            if (strncmp(ibuf, "**/**/**", 8) == 0) {
  1708. X                *buf = NULLDATE;
  1709. X                (void) attron(A_UNDERLINE);
  1710. X                (void) mvaddstr(y, x, "**/**/**");
  1711. X                (void) attroff(A_UNDERLINE);
  1712. X                return rc;
  1713. X            }
  1714. X            for (cnt++; cnt < 8 && ibuf[cnt] == ' '; cnt++)
  1715. X                ;
  1716. X            if (cnt < 8) {
  1717. X                prtmsg(1, 23, "Invalid null date format");
  1718. X                continue;
  1719. X            }
  1720. X            *buf = NULLDATE;
  1721. X            (void) attron(A_UNDERLINE);
  1722. X            (void) mvaddstr(y, x, "**/**/**");
  1723. X            (void) attroff(A_UNDERLINE);
  1724. X            return rc;
  1725. X        }
  1726. X        if (!isdigit(ibuf[cnt])) {
  1727. X            prtmsg(1, 23, "Invalid date -- bad digit");
  1728. X            continue;
  1729. X        }
  1730. X        date[MONTH] = 0;
  1731. X        date[DAY] = 0;
  1732. X        date[YEAR] = 0;
  1733. X        while (cnt < 8 && isdigit(ibuf[cnt])) {
  1734. X            date[DS1] *= 10;
  1735. X            date[DS1] += ibuf[cnt++] - '0';
  1736. X        }
  1737. X        if (cnt == 8 || ibuf[cnt++] != '/') {
  1738. X            prtmsg(1, 23, "Invalid date -- invalid 1pt");
  1739. X            continue;
  1740. X        }
  1741. X        while (cnt < 8 && isdigit(ibuf[cnt])) {
  1742. X            date[DS2] *= 10;
  1743. X            date[DS2] += ibuf[cnt++] - '0';
  1744. X        }
  1745. X        if (cnt < 8 && ibuf[cnt] == ' ') {
  1746. X            for (; cnt < 8 && ibuf[cnt] == ' '; cnt++)
  1747. X                ;
  1748. X            if (cnt < 8) {
  1749. X                prtmsg(1, 23, "Invalid date -- trailing garbage");
  1750. X                continue;
  1751. X            }
  1752. X            if (_ldbrt & YMD) {
  1753. X                date[DAY] = date[MONTH];
  1754. X                date[MONTH] = date[YEAR];
  1755. X            }
  1756. X            date[YEAR] = _dt_year();
  1757. X        }
  1758. X        else if (cnt == 8)
  1759. X            date[YEAR] = _dt_year();
  1760. X        else if (ibuf[cnt++] != '/') {
  1761. X            prtmsg(1, 23, "Invalid date -- invalid 2pt");
  1762. X            continue;
  1763. X        }
  1764. X        else {
  1765. X            while (cnt < 8 && isdigit(ibuf[cnt])) {
  1766. X                date[DS3] *= 10;
  1767. X                date[DS3] += ibuf[cnt++] - '0';
  1768. X            }
  1769. X            if (cnt < 8) {
  1770. X                for (; cnt < 8 && ibuf[cnt] == ' '; cnt++)
  1771. X                    ;
  1772. X                if (cnt < 8) {
  1773. X                    prtmsg(1, 23, "Invalid date -- trailing garbage in 3pt");
  1774. X                    continue;
  1775. X                }
  1776. X            }
  1777. X        }
  1778. X        *buf = kday(date);
  1779. X        kdate(*buf, odate);
  1780. X        if (ivcmp((char *) date, (char *) odate, sizeof date))
  1781. X            break;
  1782. X        prtmsg(1, 23, "Invalid date -- insane elements");
  1783. X    }
  1784. X    (void) move(y, x);
  1785. X    pdate(buf);
  1786. X    return rc;
  1787. X}
  1788. ________This_Is_The_END________
  1789. if test `wc -l < idate.c` -ne 210; then
  1790.     echo 'shar: idate.c was damaged during transit (should have been 210 bytes)'
  1791. fi
  1792. fi        ; : end of overwriting check
  1793. echo 'x - iflt.c'
  1794. if test -f iflt.c; then echo 'shar: not overwriting iflt.c'; else
  1795. sed 's/^X//' << '________This_Is_The_END________' > iflt.c
  1796. X/*
  1797. X * $Header: iflt.c,v 1.6 87/06/09 11:45:29 brandon Exp $
  1798. X *
  1799. X * ``USC'' -- UNIFY(r) Screens using Curses
  1800. X * UNIFY(r) is a registered trademark of Unify Corporation.
  1801. X *
  1802. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  1803. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  1804. X *
  1805. X * $Log:    iflt.c,v $
  1806. X * Revision 1.6  87/06/09  11:45:29  brandon
  1807. X * Added code to relocate cursor after conversion error message.
  1808. X * 
  1809. X * Revision 1.5  87/06/01  08:30:02  brandon
  1810. X * Added ^V (view) capability for related records.
  1811. X * 
  1812. X * Revision 1.4  87/05/26  13:31:47  brandon
  1813. X * Changed for new inl() (forces no-update mode).
  1814. X * 
  1815. X * Revision 1.3  87/05/12  12:04:13  brandon
  1816. X * Changed to pass FWD, BACK, GO without checking the data buffer
  1817. X * 
  1818. X * Revision 1.2  87/04/29  11:30:35  brandon
  1819. X * Added RCS header information
  1820. X * 
  1821. X */
  1822. X
  1823. X/*LINTLIBRARY*/
  1824. X
  1825. X#include "usc.h"
  1826. X
  1827. X/*
  1828. X * Input a float.  This time, they're dumb; take what we're given, no matter
  1829. X * how any decimals -- UNITRIEVE can figure it out for itself, since it won't
  1830. X * let me!  (This is UNIFY's own behavior, in fact.)
  1831. X */
  1832. X
  1833. Xint iflt(len, buf)
  1834. Xregister double *buf; {
  1835. X    char ibuf[17];
  1836. X    int rc, cnt, sign, y, x;
  1837. X    double dec;
  1838. X
  1839. X    setraw();
  1840. X    if (len > 17)
  1841. X        len = 17;
  1842. X    getyx(stdscr, y, x);
  1843. X    for (;;) {
  1844. X        (void) move(y, x);
  1845. X        if ((rc = inl(ibuf, len, 1)) == BACK || rc == FWD || rc == GO || rc == LOOK)
  1846. X            return rc;
  1847. X        for (cnt = 0; cnt < len && ibuf[cnt] == ' '; cnt++)
  1848. X            ;
  1849. X        if (cnt == len) {
  1850. X            prtmsg(1, 23, "Invalid float");
  1851. X            continue;
  1852. X        }
  1853. X        *buf = 0.0;
  1854. X        sign = 0;
  1855. X        dec = 0;
  1856. X        if (ibuf[cnt] == '-') {
  1857. X            sign = 1;
  1858. X            if (++cnt == len) {
  1859. X                prtmsg(1, 23, "Invalid float");
  1860. X                continue;
  1861. X            }
  1862. X        }
  1863. X        for (; cnt < len && isdigit(ibuf[cnt]); cnt++) {
  1864. X            *buf *= 10.0;
  1865. X            *buf += ibuf[cnt] - '0';
  1866. X        }
  1867. X        if (ibuf[cnt] == '.') {
  1868. X            dec = 10.0;
  1869. X            for (cnt++; cnt < len && isdigit(ibuf[cnt]); cnt++) {
  1870. X                *buf += (ibuf[cnt] - '0') / dec;
  1871. X                dec *= 10.0;
  1872. X            }
  1873. X        }
  1874. X        for (; cnt < len && ibuf[cnt] == ' '; cnt++)
  1875. X            ;
  1876. X        if (cnt == len)
  1877. X             break;
  1878. X        prtmsg(1, 23, "Invalid float");
  1879. X    }
  1880. X    if (sign)
  1881. X        *buf = - *buf;
  1882. X    return rc;
  1883. X}
  1884. ________This_Is_The_END________
  1885. if test `wc -l < iflt.c` -ne 88; then
  1886.     echo 'shar: iflt.c was damaged during transit (should have been 88 bytes)'
  1887. fi
  1888. fi        ; : end of overwriting check
  1889. echo 'x - ihamt.c'
  1890. if test -f ihamt.c; then echo 'shar: not overwriting ihamt.c'; else
  1891. sed 's/^X//' << '________This_Is_The_END________' > ihamt.c
  1892. X/*
  1893. X * $Header: ihamt.c,v 1.6 87/06/09 11:45:31 brandon Exp $
  1894. X *
  1895. X * ``USC'' -- UNIFY(r) Screens using Curses
  1896. X * UNIFY(r) is a registered trademark of Unify Corporation.
  1897. X *
  1898. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  1899. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  1900. X *
  1901. X * $Log:    ihamt.c,v $
  1902. X * Revision 1.6  87/06/09  11:45:31  brandon
  1903. X * Added code to relocate cursor after conversion error message.
  1904. X * 
  1905. X * Revision 1.5  87/06/01  08:30:09  brandon
  1906. X * Added ^V (view) capability for related records.
  1907. X * 
  1908. X * Revision 1.4  87/05/26  13:31:50  brandon
  1909. X * Changed for new inl() (forces no-update mode).
  1910. X * 
  1911. X * Revision 1.3  87/05/12  12:04:08  brandon
  1912. X * Changed to pass FWD, BACK, GO without checking the data buffer
  1913. X * 
  1914. X * Revision 1.2  87/04/29  11:30:37  brandon
  1915. X * Added RCS header information
  1916. X * 
  1917. X */
  1918. X
  1919. X/*LINTLIBRARY*/
  1920. X
  1921. X#include "usc.h"
  1922. X
  1923. X/*
  1924. X * Input a huge amount, into a (double).
  1925. X */
  1926. X
  1927. Xint ihamt(len, buf)
  1928. Xregister double *buf; {
  1929. X    char ibuf[14];
  1930. X    int rc, cnt, sign, dec, y, x;
  1931. X
  1932. X    setraw();
  1933. X    if (len > 14)
  1934. X        len = 14;
  1935. X    getyx(stdscr, y, x);
  1936. X    for (;;) {
  1937. X        (void) move(y, x);
  1938. X        if ((rc = inl(ibuf, len, 1)) == BACK || rc == FWD || rc == GO || rc == LOOK)
  1939. X            return rc;
  1940. X        for (cnt = 0; cnt < len && ibuf[cnt] == ' '; cnt++)
  1941. X            ;
  1942. X        if (cnt == len) {
  1943. X            prtmsg(1, 23, "Invalid amount");
  1944. X            continue;
  1945. X        }
  1946. X        *buf = 0.0;
  1947. X        sign = 0;
  1948. X        dec = 0;
  1949. X        if (ibuf[cnt] == '-') {
  1950. X            sign = 1;
  1951. X            if (++cnt == len) {
  1952. X                prtmsg(1, 23, "Invalid amount");
  1953. X                continue;
  1954. X            }
  1955. X        }
  1956. X        for (; cnt < len && isdigit(ibuf[cnt]); cnt++) {
  1957. X            *buf *= 10.0;
  1958. X            *buf += ibuf[cnt] - '0';
  1959. X        }
  1960. X        if (ibuf[cnt] == '.') {
  1961. X            if (cnt > len - 2) {
  1962. X                prtmsg(1, 23, "Invalid amount");
  1963. X                continue;
  1964. X            }
  1965. X            if (!isdigit(ibuf[++cnt])) {
  1966. X                prtmsg(1, 23, "Invalid amount");
  1967. X                continue;
  1968. X            }
  1969. X            dec = (ibuf[cnt] - '0') * 10;
  1970. X            if (!isdigit(ibuf[++cnt])) {
  1971. X                prtmsg(1, 23, "Invalid amount");
  1972. X                continue;
  1973. X            }
  1974. X            dec += ibuf[cnt] - '0';
  1975. X        }
  1976. X        for (; cnt < len && ibuf[cnt] == ' '; cnt++)
  1977. X            ;
  1978. X        if (cnt == len)
  1979. X             break;
  1980. X        prtmsg(1, 23, "Invalid amount");
  1981. X    }
  1982. X    *buf = *buf * 100.0 + dec;
  1983. X    if (sign)
  1984. X        *buf = - *buf;
  1985. X    return rc;
  1986. X}
  1987. ________This_Is_The_END________
  1988. if test `wc -l < ihamt.c` -ne 95; then
  1989.     echo 'shar: ihamt.c was damaged during transit (should have been 95 bytes)'
  1990. fi
  1991. fi        ; : end of overwriting check
  1992. echo 'x - ilong.c'
  1993. if test -f ilong.c; then echo 'shar: not overwriting ilong.c'; else
  1994. sed 's/^X//' << '________This_Is_The_END________' > ilong.c
  1995. X/*
  1996. X * $Header: ilong.c,v 1.6 87/06/09 11:45:33 brandon Exp $
  1997. X *
  1998. X * ``USC'' -- UNIFY(r) Screens using Curses
  1999. X * UNIFY(r) is a registered trademark of Unify Corporation.
  2000. X *
  2001. X * THIS PROGRAM IS NOT BASED ON COPYRIGHTED CODE OF UNIFY CORPORATION, AND
  2002. X * IS HEREBY PLACED IN THE PUBLIC DOMAIN.
  2003. X *
  2004. X * $Log:    ilong.c,v $
  2005. X * Revision 1.6  87/06/09  11:45:33  brandon
  2006. X * Added code to relocate cursor after conversion error message.
  2007. X * 
  2008. X * Revision 1.5  87/06/01  08:30:12  brandon
  2009. X * Added ^V (view) capability for related records.
  2010. X * 
  2011. X * Revision 1.4  87/05/26  13:31:52  brandon
  2012. X * Changed for new inl() (forces no-update mode).
  2013. X * 
  2014. X * Revision 1.3  87/05/12  12:04:03  brandon
  2015. X * Changed to pass FWD, BACK, GO without checking the data buffer
  2016. X * 
  2017. X * Revision 1.2  87/04/29  11:30:39  brandon
  2018. X * Added RCS header information
  2019. X * 
  2020. X */
  2021. X
  2022. X/*LINTLIBRARY*/
  2023. X
  2024. X#include "usc.h"
  2025. X
  2026. X/*
  2027. X * Input an item of type (long).
  2028. X */
  2029. X
  2030. Xint ilong(len, buf)
  2031. Xlong *buf; {
  2032. X    char ibuf[9];
  2033. X    int rc, cnt, sign, y, x;
  2034. X
  2035. X    setraw();
  2036. X    if (len > 9)
  2037. X        len = 9;    /* (long)'s are max len = 9 */
  2038. X    getyx(stdscr, y, x);
  2039. X    for (;;) {
  2040. X        (void) move(y, x);
  2041. X        if ((rc = inl(ibuf, len, 1)) == BACK || rc == FWD || rc == GO || rc == LOOK)
  2042. X            return rc;
  2043. X        for (cnt = 0; cnt < len && ibuf[cnt] == ' '; cnt++)
  2044. X            ;
  2045. X        if (cnt == len) {
  2046. X            prtmsg(1, 23, "Invalid number");
  2047. X            continue;
  2048. X        }
  2049. X        *buf = 0L;
  2050. X        sign = 0;
  2051. X        if (ibuf[cnt] == '-') {
  2052. X            sign = 1;
  2053. X            if (++cnt == len) {
  2054. X                prtmsg(1, 23, "Invalid number");
  2055. X                continue;
  2056. X            }
  2057. X        }
  2058. X        for (; cnt < len && isdigit(ibuf[cnt]); cnt++) {
  2059. X            *buf *= 10;
  2060. X            *buf += ibuf[cnt] - '0';
  2061. X        }
  2062. X        for (; cnt < len && ibuf[cnt] == ' '; cnt++)
  2063. X            ;
  2064. X        if (cnt == len)
  2065. X             break;
  2066. X        prtmsg(1, 23, "Invalid number");
  2067. X    }
  2068. X    if (sign)
  2069. X        *buf = - *buf;
  2070. X    return rc;
  2071. X}
  2072. ________This_Is_The_END________
  2073. if test `wc -l < ilong.c` -ne 77; then
  2074.     echo 'shar: ilong.c was damaged during transit (should have been 77 bytes)'
  2075. fi
  2076. fi        ; : end of overwriting check
  2077. exit 0
  2078. -- 
  2079.           Brandon S. Allbery, moderator of comp.sources.misc
  2080.        {well!hoptoad,uunet!hnsurg3,cbosgd,sun!mandrill}!ncoast!allbery
  2081. KABOOM!!! Worf: "I think I'm sick." LaForge: "I'm sure half the ship knows it."
  2082.