home *** CD-ROM | disk | FTP | other *** search
- From: ustel@well.UUCP (Mark Hargrove)
- Newsgroups: comp.sources.misc
- Subject: v02i054: Unify TEXT fields from ACCELL Part 5/5
- Message-ID: <7222@ncoast.UUCP>
- Date: 11 Feb 88 00:56:13 GMT
- Approved: allbery@ncoast.UUCP
-
- Comp.sources.misc: Volume 2, Issue 54
- Submitted-By: "Mark Hargrove" <ustel@well.UUCP>
- Archive-Name: accell-text/Part5
-
- #!/bin/sh
- # to extract, remove the header and type "sh filename"
- if `test ! -s ./README2`
- then
- echo "writing ./README2"
- cat > ./README2 << '\Rogue\Monster\'
- These are the c-hooks into the ACCELL amgr to use an editor
- to edit TEXT fields in the unify database. The file 'fedit.fs'
- is the accell forms script that all forms call to fire off the
- editor. 'fedit.fq' (uuencoded) is the form definition itself.
- Several global variables need to be set for fedit to work, these
- are documented in 'fedit.fs'.
-
- The various functions provide the following capabilities:
-
- edit_txt() : Provides an interface to an editor (or any other
- program) to modify text/binary fields. The
- routine will write the text field out into a
- temporary file, passing the filename as an
- argument to the editor program. The fields will
- be null padded to an allocation boundary when
- written back to file.dbv.
-
- display_txt() : Will display the first "line" of the
- text in the text field into the
- supplied screen string field. The string
- passed as the screen field argument must be
- pre-allocated to whatever display length
- you want. The easiest way to do this is
- to assign a strings of spaces to it just before
- the call to display_txt().
-
- show_txt() : A read-only version of edit_txt().
-
- to_upper() : Convert the supplied string field to UPPER case.
-
- week_day() : Return the day of the week of today. (0=Sunday,
- 6=Saturday).
-
- day_of_week() : Return the day of the week of the supplied
- unify short date field. We primarily use this
- to detect Saturdays and Sundays when users are
- entering due dates or tickler dates.
- \Rogue\Monster\
- else
- echo "will not over write ./README2"
- fi
- if `test ! -s ./Makefile`
- then
- echo "writing ./Makefile"
- cat > ./Makefile << '\Rogue\Monster\'
- # custom AMGR makefile
-
- SHELL=/bin/sh
- CC = cc
- INCLUDE = $(UUINCLUDE)
- CFLAGS = $(INCLUDE) -g
- LFLAGS = # -Wl,-n # used by NCR Tower32, forces shareable text
-
- OBJS = chooktb.o disp_txt.o get_fld_no.o edit_txt.o show_txt.o text_size.o \
- week_day.o to_upper.o
-
- amgr0887: $(OBJS)
- LDFLAGS="$LFLAGS"; export LDFLAGS; amgr.ld amgr0887 $(OBJS)
-
- install:
- mv amgr0887 $(UNIFY)/../bin
-
- clean:
- /bin/rm *~ *.o
- \Rogue\Monster\
- else
- echo "will not over write ./Makefile"
- fi
- if `test ! -s ./chooktb.c`
- then
- echo "writing ./chooktb.c"
- cat > ./chooktb.c << '\Rogue\Monster\'
- /**********************************************************************
- *
- * chooktb.c - ACCELL/C-Language function hook tables
- *
- **********************************************************************/
-
- #include <chookincl.h>
-
- extern int display_txt();
- extern int edit_txt();
- extern int to_upper();
- extern int show_txt();
- extern int text_size();
- extern int week_day();
- extern int day_of_week();
- #ifdef CP
- extern int get_txt();
- extern int put_txt();
- #endif
-
- CHOOK chooktb[] =
- {
- { "display_txt", display_txt },
- { "edit_txt", edit_txt },
- { "to_upper", to_upper },
- { "show_txt", show_txt },
- { "text_size", text_size },
- { "week_day", week_day },
- { "day_of_week", day_of_week }
- #ifdef CP
- ,{ "get_txt", get_txt },
- { "put_txt", put_txt }
- #endif
- };
-
- /*** # elements in chook table DO NOT MODIFY ***/;
-
- int nhooks = (sizeof(chooktb)/sizeof(*chooktb));
- \Rogue\Monster\
- else
- echo "will not over write ./chooktb.c"
- fi
- if `test ! -s ./common.h`
- then
- echo "writing ./common.h"
- cat > ./common.h << '\Rogue\Monster\'
- /* stuff common to all language scripts */
-
- #include "mesgnums.h"
-
- #define BLANKS_30 ' '
- #define BLANKS_35 ' '
- #define BLANKS_40 ' '
- #define BLANKS_50 ' '
- #define BLANKS_60 ' '
- #define BLANKS_80 ' '
- #define GENERAL_MGR 16
- #define SALES_MGR 4
- #define PREVIOUS_FIELD 3
- #define ADD_UPDATE 31
- \Rogue\Monster\
- else
- echo "will not over write ./common.h"
- fi
- if `test ! -s ./disp_txt.c`
- then
- echo "writing ./disp_txt.c"
- cat > ./disp_txt.c << '\Rogue\Monster\'
- /*****************************************************************************
- *
- * %W% %G% %U%
- *
- * NAME: display_txt
- * DESCRIPTION: Accell/C-hook for displaying a text field
- *
- * ACCELL USAGE: display_txt(target_variable, screen_variable)
- * where:
- * target_variable is the long name of
- * a UNIFY database field
- * screen_variable is an ACCELL screen variable
- * which MUST be pre-initialized
- * to be at least as long as the
- * display length of the text field.
- *
- *
- * AUTHOR: Mark Hargrove
- * DATE: 7/17/87
- *
- * Modification History:
- *
- ******************************************************************************/
- #include <chookincl.h>
- #define YES 1
- #define NO 0
-
- int
- display_txt(numargs, acclarg)
- int numargs;
- AVAL acclarg[];
- {
- char *field_name, *screen_field;
- int rc, field_number, screen_field_width;
- AVAL retval;
-
- /* set up for an error return condition */
- retval.aknd = A_INT;
- retval.dfflg = YES;
-
- if (numargs != 2)
- {
- retval.aval.inval = 1;
- chookrt(&retval);
- return;
- }
- if (acclarg[0].dfflg == NO || acclarg[1].dfflg == NO)
- {
- retval.aval.inval = 2;
- chookrt(&retval);
- return;
- }
-
- field_name = acclarg[0].aval.stval;
- screen_field = acclarg[1].aval.stval;
-
- if ((field_number = get_fld_num(field_name)) < 0)
- {
- retval.aval.inval = 3;
- chookrt(&retval);
- return;
- }
-
- if ((rc = get_txt_hd(screen_field, field_number)) != 0)
- {
- retval.aval.inval = 4;
- chookrt(&retval);
- return;
- }
- retval.aval.inval = 0;
- chookrt(&retval);
- return;
- }
- \Rogue\Monster\
- else
- echo "will not over write ./disp_txt.c"
- fi
- if `test ! -s ./edit_txt.c`
- then
- echo "writing ./edit_txt.c"
- cat > ./edit_txt.c << '\Rogue\Monster\'
- /*****************************************************************************
- *
- *
- * NAME: edit_txt
- * DESCRIPTION: Accell/C-hook for editing a text field
- *
- * ACCELL USAGE: edit_txt(target_variable)
- * where:
- * target_variable is the long name of
- * a UNIFY database field
- *
- * AUTHOR: Howie Johnson
- * ^^^^^^^^^^^^^
- * Not the world's prettiest C programmer
- *
- * DATE: 7/17/87
- *
- * NOTES:
- * 0 indicates successful termination - buffer not modified
- * 1 indicates successful termination - buffer modified
- * -1 unsuccessful termination
- *
- * the buffer memory for the transfer of data from the database
- * into a temporary file and vice versa is allocated as size
- * TRANS_BUF_SIZE or less.
- *
- * Modification History:
- * $Log: edit_txt.c,v $
- * Revision 1.3 88/01/25 12:54:58 mark
- * .dbv bug workaround code installed by scotth.
- *
- * Revision 1.2 88/01/20 16:24:03 scotth
- * baseline before code changes to workaround dbv problem
- *
- *
- *****************************************************************************/
-
- #include "fdesc.h"
- #include "chookincl.h"
- #include "dbtypes.h"
- #include "domains.h"
- #include <stdio.h>
- #include <fcntl.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <termio.h>
-
- /* do NOT change the following value unless you know *exactly* what
- * you're doing
- */
- #define TRANS_BUF_SIZE 32752L /* 32K-16 buffer size */
-
- #define YES 1
- #define NO 0
-
- #ifdef DEBUG
- # define DCLOSE {if (errlog != NULL) {fclose( errlog); errlog=NULL;}}
- # define DPRINT0(s) {if (errlog != NULL) fprintf( errlog, s);}
- # define DPRINT1(s,a1) {if (errlog != NULL) fprintf( errlog, s, a1);}
- # define DPRINT2(s,a1,a2) {if (errlog != NULL) fprintf( errlog, s, a1, a2);}
- # define DPRINT3(s,a1,a2,a3) {if (errlog != NULL) fprintf( errlog, s, a1, a2, a3);}
- # define DFLUSH {if (errlog != NULL) fflush( errlog);}
- #else
- # define DCLOSE
- # define DPRINT0(s)
- # define DPRINT1(s,a1)
- # define DPRINT2(s,a1,a2)
- # define DPRINT3(s,a1,a2,a3)
- # define DFLUSH
- #endif
-
- static char RCS_ID[]="$Header: edit_txt.c,v 1.3 88/01/25 12:54:58 mark Exp $";
- static struct termio term_buf, new_termio;
- static long dbv_alloc();
- static FILE *errlog;
- extern int get_fld_num();
- extern int errno;
- extern int terminate();
-
- int
- edit_txt(numargs, acclarg)
- int numargs;
- AVAL acclarg[];
- {
- AVAL retval;
- char *field_name; /* long name of database field */
- int fld; /* field number */
- long text_size; /* Actual size of text in DB */
- off_t file_size; /* Actual size of edited temp. file */
- long t_size; /* Number of bytes to transfer at a whack */
- int rc; /* Return code */
- char tname[20]; /* Name of temporary file */
- int fd; /* File descriptor */
- char *b_ptr; /* Pointer to transfer buffer */
- long b_size; /* Size of transfer buffer */
- FIELDLIST flist; /* Data transfer descriptor block for gfield and pfield */
- FLDESC fdsc; /* Data base field descriptor */
- struct stat stat_buf; /* File status block */
- time_t mod_time; /* Last modification time of file */
- char errbuf[256]; /* For output messages */
- char cmdbuf[256]; /* Command line buffer for edit command */
- char *editor; /* Points to EDIT environment variable */
- int pid; /* process id of child */
- int wait_sts; /* Status returned by wait() */
- char *Debug; /* MISBUG environment value */
- extern char *getenv();
-
- /*********************************** work around code **********************/
- long orig_size, padded_size;
- /***************************************************************************/
-
- /* set up for an error return condition */
- retval.aknd = A_INT;
- retval.dfflg = YES;
- Debug = NULL;
- errlog = (FILE *)NULL;
-
- #ifdef DEBUG
- if ((Debug = getenv("MISBUG")) != NULL)
- {
- if (*Debug == '\0')
- {
- Debug = NULL;
- errlog = (FILE *)NULL;
- }
- else if ((errlog = fopen("ferrlog", "a+")) == NULL)
- {
- fprintf(stderr, "couldn't open the errlog for append\n");
- return -1;
- }
- fprintf(stderr, "starting debug, value='%s'\n", Debug);
- }
- else
- {
- fprintf(stderr, "no debug this time\n");
- }
- #endif
-
- DPRINT0("=============== entering edit_txt ============================\n");
- if (numargs < 1)
- {
- DCLOSE;
- retval.aval.inval = -1;
- chookrt(&retval);
- return;
- }
- if (acclarg[0].dfflg == NO)
- {
- DCLOSE;
- retval.aval.inval = -2;
- chookrt(&retval);
- return;
- }
-
- field_name = acclarg[0].aval.stval;
-
- if ((fld = get_fld_num(field_name)) < 0)
- {
- DCLOSE;
- retval.aval.inval = -3;
- chookrt(&retval);
- return;
- }
-
- /* Initialization */
- b_ptr = NULL;
- tname[0] = '\0';
- fd = -1;
-
- /* Check for valid field type */
- if ((rc = fldesc( fld, &fdsc )) != 1)
- {
- sprintf(errbuf,"edit_txt: got bad field=%d",fld);
- DPRINT1("edit_txt: got bad field=%d\n",fld);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- DCLOSE;
- chookrt(&retval);
- return;
- }
-
- if ((rc = fdsc.f_typ) != TEXT )
- {
- sprintf(errbuf,"edit_txt: got non-TEXT field=%d",fld);
- DPRINT1("edit_txt: got non-TEXT field=%d",fld);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- DCLOSE;
- chookrt(&retval);
- return;
- }
-
- /* Get size of actual text in database */
- if ((rc = gsize(fld,&text_size)) != 0)
- {
- sprintf(errbuf,"edit_txt: can't retrieve gsize for field=%d",fld);
- DPRINT1("edit_txt: can't retrieve gsize for field=%d",fld);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- DCLOSE;
- chookrt(&retval);
- return;
- }
-
- /*********************************** work around code **********************/
- /* remember the size of the original text! */
- orig_size = text_size;
- DPRINT1("edit_txt: original size=%d\n", orig_size);
- /***************************************************************************/
-
- /* Open a temporary file */
- strcpy(tname,"edtdbXXXXXX");
- mktemp(tname);
- if ((fd=open(tname, O_RDWR | O_CREAT | O_TRUNC, 0666 )) < 0)
- {
- sprintf(errbuf,"edit_txt: can't open temp. file=%s",tname);
- DPRINT1("edit_txt: can't open temp. file=%s",tname);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(-1,b_ptr,"",-1);
- DCLOSE;
- chookrt(&retval);
- return;
- }
-
- /* Open buffer for transfer of data from database to temp file */
- b_size = (text_size > TRANS_BUF_SIZE) ? TRANS_BUF_SIZE : text_size;
- DPRINT1("edit_txt: malloc'ed size = %d\n", b_size);
- if ((b_ptr = (char *)malloc((unsigned)b_size)) == NULL)
- {
- sprintf(errbuf,"edit_txt: can't malloc buffer for data transfer");
- DPRINT0("edit_txt: can't malloc buffer for data transfer");
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- DCLOSE;
- chookrt(&retval);
- return;
- }
-
- /* Transfer data from database to temporary file */
- flist.fnum = fld;
- flist.fdata = b_ptr;
- flist.mode = FL_TRUNC;
- flist.start = 0L;
- while(text_size > 0L)
- {
- t_size = (text_size > b_size) ? b_size : text_size;
- flist.size = t_size;
- DPRINT3("edit_txt: flist.fnum=%d, flist.start=%d, flist.size=%d\n",
- flist.fnum, flist.start, flist.size);
- if ((rc = gfield(fld, (char *)0, &flist)) != 0)
- {
- sprintf(errbuf,"edit_txt: gfield error=%d",rc);
- DPRINT1("\tedit_txt: gfield error=%d",rc);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- DCLOSE;
- chookrt(&retval);
- return;
- }
-
- if ((rc = write(fd, b_ptr, (unsigned)t_size)) != t_size)
- {
- sprintf(errbuf,"edit_txt: write error on file=%s",tname);
- DPRINT1("edit_txt: write error on file=%s",tname);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- DCLOSE;
- chookrt(&retval);
- return;
- }
- flist.start += t_size;
- text_size -= t_size;
- }
-
- /* Free previously allocated buffer */
- free(b_ptr);
- b_ptr = NULL;
-
- /* Note the file modification time */
- if ((rc = fstat(fd, &stat_buf)) != 0)
- {
- sprintf(errbuf,"edit_txt: can't fstat file=%s",tname);
- DPRINT1("edit_txt: can't fstat file=%s",tname);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- DCLOSE;
- chookrt(&retval);
- return;
- }
- mod_time = stat_buf.st_mtime;
-
- /* Check for EDIT environment variable */
- if ((editor = (char *)getenv("EDIT")) == NULL)
- {
- editor = "/usr/bin/vedit";
- sprintf(errbuf,"EDIT environment variable is not set, using vedit");
- prtmsg(0,22,errbuf);
- }
-
-
- /* save stty settings */
- ioctl(0,TCGETA, &term_buf);
-
- DPRINT0( "TTY Settings:\n");
- DPRINT1( "c_cflag: %o\n", term_buf.c_cflag);
- DPRINT1( "c_iflag: %o\n", term_buf.c_iflag);
- DPRINT1( "c_oflag: %o\n", term_buf.c_oflag);
- DPRINT1( "c_lflag: %o\n", term_buf.c_lflag);
- DFLUSH;
-
- /* Establish new termio values for raw input mode */
- new_termio = term_buf;
- new_termio.c_iflag = IGNBRK;
- new_termio.c_lflag = 0;
- new_termio.c_cc[VMIN] = 1;
- new_termio.c_cc[VTIME] = 0;
-
- /* set the new values */
- ioctl(0,TCSETA, &new_termio);
-
- /* Invoke the editor */
- if ((pid = fork()) == 0)
- {
- if (execlp(editor, editor, tname, NULL) == -1)
- {
- sprintf(errbuf, "can't exec %s, %s", editor, tname);
- DPRINT2( "can't exec %s, %s", editor, tname);
- prtmsg(0,22,errbuf);
- DCLOSE;
- exit(-1);
- }
- }
- else
- {
-
- DPRINT1( "waiting for pid %d\n", pid);
- DFLUSH;
- while((rc=wait(&wait_sts)) != pid )
- {
-
- DPRINT3( "! wait returned BAD pid %d, status %d, errno %d\n", rc, wait_sts,errno);
- DFLUSH;
- if( rc == -1 )
- {
- DPRINT1( "! killing process no. %d\n",pid);
- DFLUSH;
- rc=kill(pid,9);
- DPRINT2( "kill return code=%d, errno=%d\n",rc,errno);
- DFLUSH;
- break;
- }
- }
-
- DPRINT2( " wait returned OK pid %d, status %d\n", rc, wait_sts);
- DFLUSH;
-
- }
- /* restore stty settings */
- ioctl( 0, TCSETA, &term_buf);
-
- DPRINT0("edit_txt: after edit\n");
- /* Write file to database if necessary */
- if ((rc = fstat(fd, &stat_buf)) != 0)
- {
- sprintf(errbuf,"edit_txt: can't fstat file=%s",tname);
- DPRINT1("edit_txt: can't fstat file=%s",tname);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- DCLOSE;
- chookrt(&retval);
- return;
- }
-
- if (stat_buf.st_mtime != mod_time) /* then buffer was modified */
- {
- /* Open buffer for transfer of data from database to temp. file */
- file_size = stat_buf.st_size;
-
- /*********************************** work around code **********************/
- DPRINT1("edit_txt: file_size=%d\n", file_size);
- padded_size = dbv_alloc((long)file_size);
- b_size = (padded_size > TRANS_BUF_SIZE) ? TRANS_BUF_SIZE : padded_size;
- DPRINT2("edit_txt: padded_size=%d, b_size=%d\n", padded_size, b_size);
- /***************************************************************************/
-
- if ((b_ptr = (char *)malloc((unsigned)b_size)) == NULL)
- {
- sprintf(errbuf,"edit_txt: can't retrieve gsize for field=%d",fld);
- DPRINT1("edit_txt: can't retrieve gsize for field=%d",fld);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- DCLOSE;
- chookrt(&retval);
- return;
- }
-
- /* Transfer data from database to temp. file */
- flist.fnum = fld;
- flist.fdata = b_ptr;
- flist.mode = FL_TRUNC;
- flist.start = 0L;
- (void) lseek(fd,0L,0); /* Rewind the temp file */
-
- /*********************** work around code modifications **********************/
-
- while(file_size > 0)
- {
- t_size = ((file_size > b_size) ? b_size : file_size);
- flist.size = ((padded_size > b_size) ? b_size : padded_size);
- DPRINT3("\tedit_txt: flist.start=%d, flist.size=%d, t_size=%d\n",
- flist.start, flist.size, t_size);
- (void)memset( b_ptr, '\0', b_size);
- if ((rc=read(fd, b_ptr, (unsigned)t_size)) != t_size)
- {
- DPRINT1("edit_txt: read error, rc=%d\n", rc);
- sprintf(errbuf, "edit_txt: error reading file, rc=%d", rc);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- chookrt(&retval);
- return;
- }
-
- if ((rc=pfield(fld,(char *)0,&flist)) != 0)
- {
- sprintf(errbuf,"edit_txt: pfield error=%d",rc);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- DCLOSE;
- chookrt(&retval);
- return;
- }
- flist.start += t_size;
- file_size -= t_size;
- padded_size -= t_size;
- }
-
- /************************************************************************/
-
- retval.aval.inval = terminate(fd, b_ptr, tname, 1);
- chookrt(&retval);
- } /* End if (stat_buf . . . */
- else /* buffer was NOT modified */
- {
- retval.aval.inval = terminate(fd, b_ptr, tname, 0);
- chookrt(&retval);
- }
- DCLOSE;
- return;
- }
-
- /* Clean up all open files, buffers, and remove temp. file from directory */
- int
- terminate(fd, b_ptr, file_name, val)
- int fd; /* File descriptor */
- char *b_ptr; /* Buffer area */
- char *file_name; /* Pointer to file name */
- int val; /* Value to return */
- {
- if (fd >= 0)
- {
- close(fd);
- }
-
- if (b_ptr != NULL)
- {
- free(b_ptr);
- }
-
- if (*file_name != '\0')
- {
- unlink(file_name);
- }
- return(val);
- }
-
- /****************************************************************/
-
- struct allocsize {
- long boundary; /* break point for allocation changes */
- long increment; /* allocation increment below this boundary */
- };
- static struct allocsize btab[] = {
- { 32768L-16L, 32L },
- { (1024L*1024L)-16L, 32768L },
- { (1024L*1024L*1024L)-16L, (1024L*1024L) }
- };
- #define BTABSIZ (sizeof(btab) / sizeof(btab[0]))
-
- static long
- dbv_alloc(insize)
- long insize;
- {
- register int i;
- register long retval;
-
- for (i=0; i < BTABSIZ; ++i)
- {
- if (insize <= btab[i].boundary)
- {
- break;
- }
- }
- retval = ((insize / btab[i].increment) + 1) * btab[i].increment - 16L;
- if (retval < insize)
- {
- retval += btab[i].increment;
- }
- return retval;
- }
- \Rogue\Monster\
- else
- echo "will not over write ./edit_txt.c"
- fi
- if `test ! -s ./extern.h`
- then
- echo "writing ./extern.h"
- cat > ./extern.h << '\Rogue\Monster\'
- /* external C-Hook declarations */
-
- EXTERN C NUMERIC FUNCTION display_txt($x1, RESULT $x2)
- EXTERN C NUMERIC FUNCTION edit_txt($x1)
- EXTERN C NUMERIC FUNCTION show_txt($x1)
- EXTERN C NUMERIC FUNCTION to_upper($x1, RESULT $x2)
- EXTERN C NUMERIC FUNCTION text_size($x1)
- EXTERN C NUMERIC FUNCTION week_day()
- EXTERN C NUMERIC FUNCTION day_of_week($x1)
- \Rogue\Monster\
- else
- echo "will not over write ./extern.h"
- fi
- if `test ! -s ./get_fld_no.c`
- then
- echo "writing ./get_fld_no.c"
- cat > ./get_fld_no.c << '\Rogue\Monster\'
- #include <stdio.h>
- /*
- get_fld_num() -- gets field number from short field name (or long name)
-
- USAGE:
- int field
- char *string_ptr Points to name of desired field
-
- field = get_fld_num( string_ptr );
-
- NOTES:
- returns zero if name not recognized
- */
- char *fldname();
- char *fldsyn();
-
- /*-------------------------------------------------------------*/
- int get_fld_num( s_ptr )
- char *s_ptr;
- {
- int max_field; /* Highest field index in use in system */
- int fld; /* Counter */
- char *t_ptr; /* temp. string pointer */
-
- /*----------------------------------------------------------*/
- /* Find out how many fields are in the database */
- max_field = numflds();
-
- /*----------------------------------------------------------*/
- /* Try all short database names looking for a match */
- for (fld=1; fld<=max_field; fld++ )
- {
- if ( (t_ptr=fldsyn(fld)) != NULL )
- {
- if ( strcmp( s_ptr, t_ptr ) == 0 )
- {
- return( fld );
- }
- }
-
- }
-
- /*----------------------------------------------------------*/
- /* Try all long database names looking for a match */
- for (fld=1; fld<=max_field; fld++ )
- {
- if ( (t_ptr=fldname(fld)) != NULL )
- {
- if ( strcmp( s_ptr, t_ptr ) == 0 )
- {
- return( fld );
- }
- }
-
- }
-
- /*----------------------------------------------------------*/
- /* Field name not recognized */
- return( -1 );
- }
- \Rogue\Monster\
- else
- echo "will not over write ./get_fld_no.c"
- fi
- if `test ! -s ./show_txt.c`
- then
- echo "writing ./show_txt.c"
- cat > ./show_txt.c << '\Rogue\Monster\'
- /*****************************************************************************
- *
- * %W% %G% %U%
- *
- * NAME: show_txt
- * DESCRIPTION: Accell/C-hook for displaying a text field
- *
- * ACCELL USAGE: show_txt(target_variable)
- * where:
- * target_variable is the long name of
- * a UNIFY database field
- *
- * AUTHOR: Mark Hargrove (based on code in edit_txt)
- * DATE: 8/6/87
- *
- * RETURNS:
- * 0 - successful termination
- * -1 - unsuccessful termintation
- *
- * the buffer memory for the transfer of data from the database
- * into a temporary file and vice versa is allocated as size
- * TRANS_BUF_SIZE or less.
- *
- * Modification History:
- *
- ******************************************************************************/
- #include "fdesc.h"
- #include "chookincl.h"
- #include "dbtypes.h"
- #include "domains.h"
- #include <stdio.h>
- #include <fcntl.h>
- #include <sys/types.h>
- #include <sys/stat.h>
-
- #define TRANS_BUF_SIZE 8192L
- #define YES 1
- #define NO 0
-
- extern int get_fld_num();
-
- int
- show_txt(numargs, acclarg)
- int numargs;
- AVAL acclarg[];
- {
- AVAL retval;
- char *field_name; /* long name of database field */
- int fld; /* field number */
- long text_size; /* Actual size of text in DB */
- off_t file_size; /* Actual size of edited temp. file */
- long t_size; /* Number of bytes to transfer at a whack */
- int rc; /* Return code */
- char tname[20]; /* Name of temporary file */
- int fd; /* File descriptor */
- char *b_ptr; /* Pointer to transfer buffer */
- long b_size; /* Size of transfer buffer */
- FIELDLIST flist; /* Data transfer descriptor block for gfield and pfield */
- FLDESC fdsc; /* Data base field descriptor */
- struct stat stat_buf; /* File status block */
- time_t mod_time; /* Last modification time of file */
- char errbuf[256]; /* For output messages */
- char cmdbuf[256]; /* Command line buffer for edit command */
- char *editor; /* Points to EDIT environment variable */
- int pid; /* process id of child */
-
-
- /* set up for an error return condition */
- retval.aknd = A_INT;
- retval.dfflg = YES;
-
- if (numargs != 1)
- {
- retval.aval.inval = -1;
- chookrt(&retval);
- return;
- }
- if (acclarg[0].dfflg == NO)
- {
- retval.aval.inval = -2;
- chookrt(&retval);
- return;
- }
-
- field_name = acclarg[0].aval.stval;
-
- if ((fld = get_fld_num(field_name)) < 0)
- {
- retval.aval.inval = -3;
- chookrt(&retval);
- return;
- }
-
- /* Initialization */
- b_ptr = NULL;
- tname[0] = '\0';
- fd = -1;
-
- /* Check for valid field type */
- if ((rc = fldesc( fld, &fdsc )) != 1)
- {
- sprintf(errbuf,"edit_txt: got bad field=%d",fld);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- chookrt(&retval);
- return;
- }
-
- if ((rc = fdsc.f_typ) != TEXT )
- {
- sprintf(errbuf,"edit_txt: got non-TEXT field=%d",fld);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- chookrt(&retval);
- return;
- }
-
- /* Get size of actual text in database */
- if ((rc = gsize(fld,&text_size)) != 0)
- {
- sprintf(errbuf,"edit_txt: can't retrieve gsize for field=%d",fld);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- chookrt(&retval);
- return;
- }
-
- /* Open a temporary file */
- strcpy(tname,"edtdbXXXXXX");
- mktemp(tname);
- if ((fd=open(tname, O_RDWR | O_CREAT | O_TRUNC, 0666 )) < 0)
- {
- sprintf(errbuf,"edit_txt: can't open temp. file=%s",tname);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(-1,b_ptr,"",-1);
- chookrt(&retval);
- return;
- }
-
- /* Open buffer for transfer of data from database to temp file */
- b_size = (text_size > TRANS_BUF_SIZE) ? TRANS_BUF_SIZE : text_size;
- if ((b_ptr = (char *)malloc((unsigned)b_size)) == NULL)
- {
- sprintf(errbuf,"edit_txt: can't retrieve gsize for field=%d",fld);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- chookrt(&retval);
- return;
- }
-
- /* Transfer data from database to temporary file */
- flist.fnum = fld;
- flist.fdata = b_ptr;
- flist.mode = FL_TRUNC;
- flist.start = (long)0;
- while(text_size > 0)
- {
- t_size = (text_size > b_size) ? b_size : text_size;
- flist.size = t_size;
- if ((rc = gfield(fld,(char *)0,&flist)) != 0)
- {
- sprintf(errbuf,"edit_txt: gfield error=%d",rc);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- chookrt(&retval);
- return;
- }
-
- if ((rc = write(fd, b_ptr, (unsigned)t_size)) != t_size)
- {
- sprintf(errbuf,"edit_txt: write error on file=%s",tname);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- chookrt(&retval);
- return;
- }
- flist.start += t_size;
- text_size -= t_size;
- }
-
- /* Free previously allocated buffer */
- free(b_ptr);
- b_ptr = NULL;
-
- /* Note the file modification time */
- if ((rc = fstat(fd, &stat_buf)) != 0)
- {
- sprintf(errbuf,"edit_txt: can't fstat file=%s",tname);
- prtmsg(0,22,errbuf);
- retval.aval.inval = terminate(fd, b_ptr, tname, -1);
- chookrt(&retval);
- return;
- }
- mod_time = stat_buf.st_mtime;
-
- /* Check for EDIT environment variable */
- if ((editor = (char *)getenv("EDIT")) == NULL)
- {
- editor = "/usr/bin/vedit";
- sprintf(errbuf,"EDIT environment variable is not set, using vedit editor");
- prtmsg(0,22,errbuf);
- }
-
- /* Invoke the editor */
- /* setcook(); */
- /*
- strcpy(cmdbuf, editor);
- strcat(cmdbuf, " ");
- strcat(cmdbuf, tname);
- system(cmdbuf);
- */
-
- if ((pid = fork()) == 0)
- {
- if (execlp(editor, editor, tname, NULL) == -1)
- {
- sprintf(errbuf, "can't exec %s, %s", editor, tname);
- prtmsg(0,22,errbuf);
- exit(-1);
- }
- }
- else
- {
- wait(NULL);
- }
- setraw();
- retval.aval.inval = terminate(fd, b_ptr, tname, 0);
- chookrt(&retval);
- return;
- }
- \Rogue\Monster\
- else
- echo "will not over write ./show_txt.c"
- fi
- if `test ! -s ./text_size.c`
- then
- echo "writing ./text_size.c"
- cat > ./text_size.c << '\Rogue\Monster\'
- /*****************************************************************************
- *
- * %W% %G% %U%
- *
- * NAME: text_size
- * DESCRIPTION: Accell/C-hook for determining actual size of a text field
- *
- * ACCELL USAGE: text_size(target_variable)
- * where:
- * target_variable is the long name of
- * a UNIFY database field
- *
- * AUTHOR: Mark Hargrove
- * DATE: 8/25/87
- *
- * RETURNS:
- * size of text on successul return
- * < 0 on error return
- *
- ******************************************************************************/
- #include "fdesc.h"
- #include "chookincl.h"
- #include "dbtypes.h"
- #include "domains.h"
- #include <stdio.h>
- #include <fcntl.h>
- #include <sys/types.h>
- #include <sys/stat.h>
-
- #define YES 1
- #define NO 0
-
- extern int get_fld_num();
-
- int
- text_size(numargs, acclarg)
- int numargs;
- AVAL acclarg[];
- {
- AVAL retval;
- char *field_name; /* long name of database field */
- int fld; /* field number */
- long txt_size; /* Actual size of text in DB */
- int rc; /* Return code */
- FIELDLIST flist; /* Data transfer descriptor block for gfield and pfield */
- FLDESC fdsc; /* Data base field descriptor */
- char errbuf[256]; /* For output messages */
-
- /* set up for an error return condition */
- retval.aknd = A_INT;
- retval.dfflg = YES;
-
- if (numargs != 1)
- {
- retval.aval.inval = -1;
- chookrt(&retval);
- return;
- }
- if (acclarg[0].dfflg == NO)
- {
- retval.aval.inval = -2;
- chookrt(&retval);
- return;
- }
-
- field_name = acclarg[0].aval.stval;
-
- if ((fld = get_fld_num(field_name)) < 0)
- {
- retval.aval.inval = -3;
- chookrt(&retval);
- return;
- }
-
- /* Check for valid field type */
- if ((rc = fldesc( fld, &fdsc )) != 1)
- {
- sprintf(errbuf,"txt_size: got bad field=%d",fld);
- prtmsg(0,22,errbuf);
- retval.aval.inval = -4;
- chookrt(&retval);
- return;
- }
-
- if ((rc = fdsc.f_typ) != TEXT )
- {
- sprintf(errbuf,"txt_size: got non-TEXT field=%d",fld);
- prtmsg(0,22,errbuf);
- retval.aval.inval = -5;
- chookrt(&retval);
- return;
- }
-
- /* Get size of actual text in database */
- if ((rc = gsize(fld, &txt_size)) != 0)
- {
- sprintf(errbuf,"text_size: can't retrieve gsize for field=%d",fld);
- prtmsg(0,22,errbuf);
- retval.aval.inval = -6;
- chookrt(&retval);
- return;
- }
- retval.aval.inval = txt_size;
- chookrt(&retval);
- return;
- }
- \Rogue\Monster\
- else
- echo "will not over write ./text_size.c"
- fi
- if `test ! -s ./to_upper.c`
- then
- echo "writing ./to_upper.c"
- cat > ./to_upper.c << '\Rogue\Monster\'
- /*****************************************************************************
- *
- * %W% %G% %U%
- *
- * NAME: to_upper
- * DESCRIPTION: Accell/C-hook for converting a string to all upper case
- *
- * ACCELL USAGE: to_upper(string)
- * where:
- * string is a string value
- *
- * AUTHOR: Mark Hargrove
- * DATE: 7/30/87
- *
- * Modification History:
- *
- ******************************************************************************/
- #include <chookincl.h>
- #define YES 1
- #define NO 0
-
- int
- to_upper(numargs, acclarg)
- int numargs;
- AVAL acclarg[];
- {
- AVAL retval;
- register int i;
-
- /* set up for an error return condition */
- retval.aknd = A_INT;
- retval.dfflg = YES;
-
- if (numargs != 2)
- {
- retval.aval.inval = 1;
- chookrt(&retval);
- return;
- }
- if (acclarg[0].dfflg == NO || acclarg[1].dfflg == NO)
- {
- retval.aval.inval = 2;
- chookrt(&retval);
- return;
- }
- if (acclarg[0].aknd != A_STR || acclarg[1].aknd != A_STR)
- {
- retval.aval.inval = 3;
- chookrt(&retval);
- return;
- }
- if (strlen(acclarg[0].aval.stval) > strlen(acclarg[1].aval.stval))
- {
- retval.aval.inval = 4;
- chookrt(&retval);
- return;
- }
- cfill('\0', acclarg[1].aval.stval, strlen(acclarg[1].aval.stval));
- for (i = 0; i < strlen(acclarg[0].aval.stval); i++)
- acclarg[1].aval.stval[i] = toupper(acclarg[0].aval.stval[i]);
-
- retval.aval.inval = 0;
- chookrt(&retval);
- return;
- }
- \Rogue\Monster\
- else
- echo "will not over write ./to_upper.c"
- fi
- if `test ! -s ./week_day.c`
- then
- echo "writing ./week_day.c"
- cat > ./week_day.c << '\Rogue\Monster\'
- /******************************************************************************
- * PROGRAM : week_day
- * DESCRIPTION: returns the day of the week given the current date
- *
- * AUTHOR : Scott Henry
- * DATE : 11/18/87
- ******************************************************************************/
- #include <time.h>
- #include <stdio.h>
- #include <chookincl.h>
- #define YES 1
- #define NO 0
- extern int errno;
- static char *RCSid = "$Header: week_day.c,v 1.2 88/01/20 16:29:47 root Exp $";
-
- int
- week_day(numargs, acclarg) /* returns 0 = Sunday, 6 = Saturday */
- int numargs;
- AVAL acclarg[];
- {
- AVAL retval;
- long clock, time();
- struct tm *timex;
-
- /* set up for an error return */
- retval.aknd = A_INT;
- retval.dfflg = YES;
- retval.aval.inval = 0;
-
- if (numargs == 0)
- { /* day-of-week based on system clock */
- clock = time((long *)0);
- timex = localtime(&clock);
- retval.aval.inval = timex->tm_wday;
- }
- chookrt(&retval);
- return;
- }
-
- /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
-
- int
- day_of_week( numarg, acclarg)
- int numarg;
- AVAL acclarg[];
- {
- AVAL retval;
- long udate;
-
- /* set up for an error return */
- retval.aknd = A_INT;
- retval.dfflg = YES;
- retval.aval.inval = 0;
-
- if (numarg == 1 && acclarg[0].dfflg == YES && acclarg[0].aknd == A_DATE)
- { /* day-of-week based on input date */
- udate = acclarg[0].aval.daval;
- retval.aval.inval = (udate + 32764L) % 7;
- }
-
- chookrt(&retval);
- return;
- }
-
- /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- $Log: week_day.c,v $
- * Revision 1.2 88/01/20 16:29:47 root
- * baseline before code changes to workaround .dbv bug
- *
- * Revision 1.1 87/11/18 12:19:31 scotth
- * Initial revision
- *
- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
- \Rogue\Monster\
- else
- echo "will not over write ./week_day.c"
- fi
- if `test ! -s ./fedit.fs`
- then
- echo "writing ./fedit.fs"
- cat > ./fedit.fs << '\Rogue\Monster\'
- /******************************************************************************
- * $Header: fedit.fs,v 2.1 88/01/13 09:30:36 scotth Exp $
- *
- * FORM : fedit
- * DESCRIPTION: text editor interface for Accell using c-hooks
- * in the customized AMGR
- *
- * AUTHOR : Mark Hargrove
- * DATE : 11/11/87
- *
- ******************************************************************************/
- #include "extern.h"
-
- FORM fedit
-
- #include "common.h"
-
- /***************************** FIELD SECTION ********************************/
-
- FIELD s_text
-
- BEFORE FIELD
- display 'Loading Editor...' for fyi_message
- set $rc to edit_txt($glob_text_field)
- repaint screen
- if $rc < 0 then
- begin
- display 'edit_txt returned error: ' + val_to_str$($rc) for fyi_message wait
- end
- next action is previous form
-
- /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- $Log: fedit.fs,v $
- Revision 2.1 88/01/13 09:30:36 scotth
- Frozen for 1.0 Release
-
- Revision 2.0 87/12/18 12:04:00 scotth
- first release
-
- Revision 1.7 87/11/25 08:45:52 scotth
- Alpha-1 release
-
- Revision 1.5 87/11/23 14:08:25 scotth
- frozen for Alpha test
-
- Revision 1.1 87/11/11 16:14:50 scotth
- mostly working state
-
- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
- \Rogue\Monster\
- else
- echo "will not over write ./fedit.fs"
- fi
- if `test ! -s ./fedit.fq.uue`
- then
- echo "writing ./fedit.fq.uue"
- cat > ./fedit.fq.uue << '\Rogue\Monster\'
-
- begin 664 fedit.fq
- M4U$``0`$```!20```&X``69E9&ET````````````````````````````````N
- M`````````````````````````````````````````````````````````````
- M``````````````````````````````#R```!<P``````````````````````F
- M`````````````````````````````````````````````````````````````
- M````````````````````````````````````````````%@`'``$````!````?
- M```!````````````````````"``=``8`$@`````````/``IF961I="YH;'``5
- M`````0````````````````````````$!`0$!`0$!```!`````'-?=&5X=```A
- M```````````!`)@``0`"````````!`!F`PP```,!```````````/<U]I;7!EE
- M;F1I;E]H;'``````%@T@(%!L96%S90T@(%=A:70N+BX-#0``````````````/
- B`````````````````````````````````````````````````
- ``
- end
- size 439
- \Rogue\Monster\
- else
- echo "will not over write ./fedit.fq.uue"
- fi
- echo "Finished archive 5 of 5"
- exit
-
-
- --
- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- Mark A. Hargrove U.S. TeleCenters
- Voice: 408-496-1800 Santa Clara, CA
- uucp : {dual, hoptoad, hplabs, portal, ptsfa}!well!ustel
-