menu(1) part 7 of 11
Paul J. Condie
pjc at pcbox.UUCP
Sat Apr 7 03:54:11 AEST 1990
#!/bin/sh
# this is part 7 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file ParseDeSrn.y continued
#
CurArch=7
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
exit 1; fi
( read Scheck
if test "$Scheck" != $CurArch
then echo "Please unpack part $Scheck next!"
exit 1;
else exit 0; fi
) < s2_seq_.tmp || exit 1
echo "x - Continuing file ParseDeSrn.y"
sed 's/^X//' << 'SHAR_EOF' >> ParseDeSrn.y
X {
X yyscreen->rows = $3;
X }
X ;
Xscreen_cols : SCREEN_COLS EQUAL NUMBER
X {
X yyscreen->cols = $3;
X }
X ;
Xscreen_border : SCREEN_BORDER EQUAL STRING
X {
X /* get border type for active menu */
X if (strcmp ($3, "DumbLine") == 0)
X yyscreen->boxtype = DumbLine;
X else if (strcmp ($3, "StandoutLine") == 0)
X yyscreen->boxtype = StandoutLine;
X else if (strcmp ($3, "SingleLine") == 0 ||
X strcmp ($3, "DrawLine") == 0)
X yyscreen->boxtype = SingleLine;
X else if (strcmp ($3, "MosaicLine") == 0)
X yyscreen->boxtype = MosaicLine;
X else if (strcmp ($3, "DiamondLine") == 0)
X yyscreen->boxtype = DiamondLine;
X else if (strcmp ($3, "DotLine") == 0)
X yyscreen->boxtype = DotLine;
X else if (strcmp ($3, "PlusLine") == 0)
X yyscreen->boxtype = PlusLine;
X }
X |SCREEN_BORDER EQUAL STRING STRING
X {
X /* get border type for active menu */
X if (strcmp ($3, "DumbLine") == 0)
X yyscreen->boxtype = DumbLine;
X else if (strcmp ($3, "StandoutLine") == 0)
X yyscreen->boxtype = StandoutLine;
X else if (strcmp ($3, "SingleLine") == 0 ||
X strcmp ($3, "DrawLine") == 0)
X yyscreen->boxtype = SingleLine;
X else if (strcmp ($3, "MosaicLine") == 0)
X yyscreen->boxtype = MosaicLine;
X else if (strcmp ($3, "DiamondLine") == 0)
X yyscreen->boxtype = DiamondLine;
X else if (strcmp ($3, "DotLine") == 0)
X yyscreen->boxtype = DotLine;
X else if (strcmp ($3, "PlusLine") == 0)
X yyscreen->boxtype = PlusLine;
X
X /* border type for inactive menu - dim (high 8 bits) */
X if (strcmp ($4, "DumbLine") == 0)
X yyscreen->boxtype = yyscreen->boxtype |
X (DumbLine << 9);
X else if (strcmp ($4, "StandoutLine") == 0)
X yyscreen->boxtype = yyscreen->boxtype |
X (StandoutLine << 9);
X else if (strcmp ($4, "SingleLine") == 0 ||
X strcmp ($4, "DrawLine") == 0)
X yyscreen->boxtype = yyscreen->boxtype |
X (SingleLine << 9);
X else if (strcmp ($4, "MosaicLine") == 0)
X yyscreen->boxtype = yyscreen->boxtype |
X (MosaicLine << 9);
X else if (strcmp ($4, "DiamondLine") == 0)
X yyscreen->boxtype = yyscreen->boxtype |
X (DiamondLine << 9);
X else if (strcmp ($4, "DotLine") == 0)
X yyscreen->boxtype = yyscreen->boxtype |
X (DotLine << 9);
X else if (strcmp ($4, "PlusLine") == 0)
X yyscreen->boxtype = yyscreen->boxtype |
X (PlusLine << 9);
X }
X ;
Xexit_last_field : EXIT_LAST_FIELD
X {
X yyscreen->exitlastfield = TRUE;
X }
X ;
X
X
Xfield_name : FIELD_NAME EQUAL EVAR
X {
X /*
X ** The field_name token signifes a new field
X ** we need to malloc the field structure.
X */
X if ((++fieldcount) > MAXFIELDS)
X {
X BEEP;
X mvprintw (ErrRow-2, 0,
X "Exceeded maximum screen fields of %d.",
X MAXFIELDS);
X shutdown ();
X }
X FLD = (struct FieldInfo *)malloc (sizeof (struct FieldInfo));
X yyscreen->field[fieldcount] = (struct FieldInfo *)NULL;
X strcpy (FLD->name, $3+1);
X
X /* Set default field values */
X strcpy (FLD->label, "");
X FLD->min_input = 0;
X strcpy (FLD->mask, "");
X strcpy (FLD->range, "");
X FLD->type = UPPER_AN;
X FLD->adjust = NOFILL;
X FLD->mustenter = FALSE;
X strcpy (FLD->prompt, "");
X strcpy (FLD->terminator, "[]");
X FLD->noinput = FALSE;
X }
X ;
X
Xfield_label : FIELD_LABEL EQUAL STRING
X {
X strcpy (FLD->label, $3);
X }
X | FIELD_LABEL EQUAL QUOTE_STRING
X {
X strcpy (FLD->label, $3);
X }
X ;
X
Xfield_row : FIELD_ROW EQUAL NUMBER
X {
X FLD->row = $3;
X }
X ;
Xfield_col : FIELD_COL EQUAL NUMBER
X {
X FLD->col = $3;
X }
X ;
X
Xfield_mask : FIELD_MASK EQUAL STRING
X {
X strcpy (FLD->mask, $3);
X }
X | FIELD_MASK EQUAL QUOTE_STRING
X {
X strcpy (FLD->mask, $3);
X }
X ;
X
Xfield_range : FIELD_RANGE EQUAL STRING
X {
X strcpy (FLD->range, $3);
X }
X | FIELD_RANGE EQUAL QUOTE_STRING
X {
X strcpy (FLD->range, $3);
X }
X ;
X
Xfield_length : FIELD_LENGTH EQUAL NUMBER
X {
X FLD->length = $3;
X }
X ;
Xfield_min : FIELD_MIN EQUAL NUMBER
X {
X FLD->min_input = $3;
X }
X ;
Xfield_type : FIELD_TYPE EQUAL STRING
X {
X if (strcmp ($3, "ALPHANUM") == 0)
X FLD->type = ALPHANUM;
X else if (strcmp ($3, "ALPHA") == 0)
X FLD->type = ALPHA;
X else if (strcmp ($3, "NUMERIC") == 0)
X FLD->type = NUMERIC;
X else if (strcmp ($3, "SET") == 0)
X FLD->type = SET;
X else if (strcmp ($3, "UPPER") == 0)
X FLD->type = UPPER;
X else if (strcmp ($3, "UPPER_AN") == 0)
X FLD->type = UPPER_AN;
X else if (strcmp ($3, "HEX") == 0)
X FLD->type = HEX;
X else if (strcmp ($3, "STATE") == 0)
X FLD->type = STATE;
X else if (strcmp ($3, "ZIP") == 0)
X FLD->type = ZIP;
X else if (strcmp ($3, "DATE") == 0)
X FLD->type = DATE;
X else if (strcmp ($3, "TIME") == 0)
X FLD->type = TIME;
X else if (strcmp ($3, "MENU") == 0)
X FLD->type = MENU;
X else if (strcmp ($3, "PROTECT") == 0)
X FLD->type = PROTECT;
X else yyerror ("Invalid field_edits");
X }
X ;
Xfield_adjust : FIELD_ADJUST EQUAL STRING
X {
X if (strcmp ($3, "NOFILL") == 0)
X FLD->adjust = NOFILL;
X else if (strcmp ($3, "RTADJ_ZFILL") == 0)
X FLD->adjust = RTADJ_ZFILL;
X else if (strcmp ($3, "RTADJ_BFILL") == 0)
X FLD->adjust = RTADJ_BFILL;
X else if (strcmp ($3, "LFADJ_ZFILL") == 0)
X FLD->adjust = LFADJ_ZFILL;
X else if (strcmp ($3, "LFADJ_BFILL") == 0)
X FLD->adjust = LFADJ_BFILL;
X }
X | FIELD_ADJUST EQUAL QUOTE_STRING
X {
X if (strcmp ($3, "NOFILL") == 0)
X FLD->adjust = NOFILL;
X else if (strcmp ($3, "RTADJ_ZFILL") == 0)
X FLD->adjust = RTADJ_ZFILL;
X else if (strcmp ($3, "RTADJ_BFILL") == 0)
X FLD->adjust = RTADJ_BFILL;
X else if (strcmp ($3, "LFADJ_ZFILL") == 0)
X FLD->adjust = LFADJ_ZFILL;
X else if (strcmp ($3, "LFADJ_BFILL") == 0)
X FLD->adjust = LFADJ_BFILL;
X }
X ;
X
Xfield_mustenter : FIELD_MUSTENTER
X {
X FLD->mustenter = TRUE;
X }
X ;
X
Xfield_prompt : FIELD_PROMPT EQUAL STRING
X {
X strcpy (FLD->prompt, $3);
X }
X | FIELD_PROMPT EQUAL QUOTE_STRING
X {
X strcpy (FLD->prompt, $3);
X }
X ;
X
Xfield_terminator : FIELD_TERMINATOR EQUAL QUOTE_STRING
X {
X if (strlen ($3) != 2)
X yyerror ("Bad field_terminator.");
X strcpy (FLD->terminator, $3);
X }
X ;
X
Xfield_defaults : FIELD_DEFAULTS EQUAL QUOTE_STRING
X {
X yyscreen->fielddefaults = (char *)malloc (strlen($3)+5);
X strcpy (yyscreen->fielddefaults, $3);
X }
X ;
X
Xfield_noinput : FIELD_NOINPUT
X {
X FLD->noinput = TRUE;
X }
X ;
X
X
X
X%%
X
X/* FUNCTION: ParseDefineScreen()
X** This function parses .DEFINE_SCREEN
X** ARGS: keyword the keyword found
X** menufile the unix menu file
X** menu menu structure
X** gnames holder of goto menu names
X** gfiles holder of goto menu names (menu file)
X** gindex # of gnames
X** RETURNS: 0
X*/
X
X
X#define SRN menu->srn[screencount-1]
X
Xextern FILE *yyin;
Xextern FILE *yyout;
Xextern int swin, ewin, longest;
X
X char ScreenName[50]; /* for yyerror */
X
X
XParseDefineScreen (keyword, menufile, menu, gnames, gfiles, gindex, opnumber)
X
X char keyword[];
X FILE *menufile;
X struct MenuInfo *menu;
X char gnames[][15], gfiles[][15];
X int *gindex;
X int *opnumber;
X{
X char *fgets(), line[BUFSIZE];
X static int screencount;
X int i = 0;
X int j;
X char *ws;
X
X
X /* check if this is the first screen for this menu */
X if (menu->srn[0] == (struct ScreenInfo *)NULL)
X screencount = 0;
X
X if ((++screencount) > MAXSCREENS)
X {
X BEEP;
X mvprintw (ErrRow, 0,
X "Exceeded maximum allowable .DEFINE_SCREEN.");
X shutdown ();
X }
X
X SRN = (struct ScreenInfo *)malloc (sizeof (struct ScreenInfo));
X if (SRN == NULL)
X {
X BEEP;
X mvprintw (ErrRow, 0,
X "Unable to allocate memory for .DEFINE_SCREEN.");
X shutdown ();
X }
X /* terminate the screens list */
X menu->srn[screencount] = (struct ScreenInfo *)NULL;
X SRN->field[0] = (struct FieldInfo *)NULL; /* no fields yet */
X
X
X /* get screen name */
X fgets (line, BUFSIZE, menufile);
X sscanf (line, "%s", SRN->name); /* screen name */
X strcpy (ScreenName, SRN->name); /* for yyerror */
X
X yyin = menufile;
X yyscreen = SRN;
X fieldcount = 0;
X
X /*
X ** Set default screen values.
X */
X strcpy (SRN->title, "");
X SRN->toprow = AUTO;
X SRN->leftcol = AUTO;
X strcpy (SRN->toprowvar, "");
X strcpy (SRN->leftcolvar, "");
X SRN->boxtype = StandoutLine;
X SRN->fielddefaults = (char *)NULL;
X strcpy (SRN->helpfile, "menu.hlp");
X SRN->exitlastfield = FALSE;
X
X#ifdef _yydebug
X if (debug)
X yydebug = 1;
X#endif
X
X yyparse ();
X
X return (0);
X}
X
X
Xyyerror (s)
X char *s;
X{
X mvprintw (ErrRow-5,0, "Unable to process .DEFINE_SCREEN %s",
X ScreenName);
X mvprintw (ErrRow-4,0, "Field Number %d", fieldcount);
X mvprintw (ErrRow-3,0, "%s", s);
X mvprintw (ErrRow-2,0, "The error occured on token = \"%s\"", eott);
X mvprintw (ErrRow-1,0, "Look ahead token number %d <tokens.h>", yychar);
X shutdown ();
X}
SHAR_EOF
echo "File ParseDeSrn.y is complete"
chmod 0644 ParseDeSrn.y || echo "restore of ParseDeSrn.y fails"
echo "x - extracting utilities.d/libgeti.d/AdjField.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utilities.d/libgeti.d/AdjField.c &&
Xstatic char Sccsid[] = "@(#)AdjField.c 1.1 DeltaDate 8/30/87 ExtrDate 1/22/90";
X#include <curses.h>
X#include "GetInput.h"
X#include <ctype.h>
X
XAdjField(win, rowStart, colStart, fldAttrib, fldAdjust, colEnd, charKeyed)
X WINDOW *win ; /* Window */
X int rowStart ;
X int colStart ;
X int fldAttrib ; /* Curses attribute */
X char fldAdjust ; /* adjust/fill field */
X int colEnd ; /* column where field ends */
X char charKeyed[] ; /* characters keyed */
X{
X int col ; /* working column field */
X int row ; /* working row field */
X int colMove ; /* working column field for adjusting
X routines */
X int ch ; /* contains character keyed or being
X moved */
X
X char *wrkKeyed ; /* working pointer for charKeyed */
X char fillChar ;
X
X
X getyx (win, row, col) ;
X
X if (fldAdjust == RTADJ_BFILL || fldAdjust == LFADJ_BFILL)
X fillChar = ' ' ;
X else if (fldAdjust == RTADJ_ZFILL || fldAdjust == LFADJ_ZFILL)
X fillChar = '0' ;
X
X if (fldAdjust == RTADJ_BFILL || fldAdjust == RTADJ_ZFILL) {
X
X col-- ;
X
X wrkKeyed = charKeyed + (col - colStart) ;
X
X colMove = colEnd - 1 ;
X
X while (col >= colStart) {
X
X while ( *wrkKeyed != 'Y') {
X wrkKeyed-- ;
X col-- ;
X }
X
X if (col < colStart)
X break ;
X
X ch = mvwinch(win, rowStart, col--) & A_CHARTEXT ;
X *wrkKeyed-- = 'N' ;
X
X while ( colMove > colStart &&
X charKeyed [colMove - colStart] != 'N')
X colMove-- ;
X
X charKeyed [colMove - colStart] = 'Y' ;
X
X wattrset (win, fldAttrib) ;
X mvwaddch (win, rowStart, colMove--, ch) ;
X wattrset (win, 0) ;
X }
X
X wattrset (win, fldAttrib) ;
X
X while (colMove >= colStart) {
X
X if ( charKeyed [colMove - colStart] != 'N')
X colMove-- ;
X else {
X charKeyed [colMove - colStart] = 'Y' ;
X mvwaddch(win, rowStart, colMove--, fillChar) ;
X }
X }
X
X wattrset (win, 0) ;
X wmove (win, rowStart, colEnd) ;
X
X } else if (fldAdjust == LFADJ_BFILL || fldAdjust == LFADJ_ZFILL) {
X
X if (col < colStart)
X col = colStart;
X
X wattrset (win, fldAttrib) ;
X
X while (col < colEnd) {
X
X if ( charKeyed [col - colStart] != 'N')
X col++ ;
X else {
X charKeyed [col - colStart] = 'Y' ;
X mvwaddch (win, rowStart, col++, fillChar) ;
X }
X }
X
X wattrset (win, 0) ;
X wmove (win, rowStart, colEnd) ;
X }
X
X wrefresh (win) ;
X
X return(0) ;
X
X}
SHAR_EOF
chmod 0444 utilities.d/libgeti.d/AdjField.c || echo "restore of utilities.d/libgeti.d/AdjField.c fails"
echo "x - extracting utilities.d/libgeti.d/BuildMenu.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utilities.d/libgeti.d/BuildMenu.c &&
X#ifndef LINT
Xstatic char Sccsid[] = "@(#)BuildMenu.c 1.1 DeltaDate 1/22/90 ExtrDate 1/22/90";
X#endif
X
X#include <curses.h>
X
XBuildMenu (menu, fldRange)
X char menu[][80];
X char *fldRange;
X{
X int eidx = 0; /* element index */
X char *rptr; /* range pointer */
X char *eptr; /* element pointer */
X
X rptr = fldRange;
X
X while (*rptr != '\0')
X {
X /* get range element eidx */
X eptr = menu[eidx];
X while (*rptr != ',' && *rptr != '\0')
X *eptr++ = *rptr++;
X *eptr = '\0';
X
X /* skip junk */
X while (*rptr == ',' || *rptr == ' ' || *rptr == '\t')
X *rptr++;
X eidx++;
X }
X strcpy (menu[eidx], "");
X}
X/* Paul J. Condie 11/88 */
SHAR_EOF
chmod 0444 utilities.d/libgeti.d/BuildMenu.c || echo "restore of utilities.d/libgeti.d/BuildMenu.c fails"
echo "x - extracting utilities.d/libgeti.d/DateFun.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utilities.d/libgeti.d/DateFun.c &&
Xstatic char Sccsid[] = "@(#)DateFun.c 1.1 DeltaDate 8/30/87 ExtrDate 1/22/90";
X/*
X * is_leap - returns 1 if year is a leap year, 0 if not
X */
Xint is_leap(y)
Xint y;
X{
X return(y % 4 == 0 && y % 100 != 0 || y % 400 == 0);
X}
X
X/*
X**
X** maxdays, returns maximum number of days for 'year'
X**
X*/
Xint maxdays(y)
Xregister int y;
X{
X return(is_leap(y) ? 366 : 365);
X}
X
Xstatic int day_tab[2][13] = {
X {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
X {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
X};
X
X
X/*
X * julian - converts year month and day to julian date and returns it
X */
Xint julian(year, month, day)
Xint year, month, day;
X{
X int i, leap;
X
X leap = is_leap(year);
X for (i = 1; i < month; i++)
X day += day_tab[leap][i];
X return(day);
X}
X
X
X
X/*
X**
X** week_day - returns the day of the week given the Year,
X** Month and Day. Year must be >= 1973.
X** If not, -1 is returned.
X** day of the week:
X** Sunday = 0, Monday = 1, ..., Saturday = 6.
X*/
Xint week_day(year,month,date) int year,month,date;
X{
X if(year<73)
X return(-1);
X else
X return((((year-73)*365)+julian(year,month,date)+((year-73)/4))%7);
X}
X
X
X/*
X * month_day - Converts julian date to month and day. Month and day must be passed as addresses of ints.
X */
Xvoid
Xmonth_day(year, yearday, pmonth, pday)
Xint year, yearday, *pmonth, *pday;
X{
X int i, leap;
X
X leap = is_leap(year);
X for (i = 1; yearday > day_tab[leap][i]; i++) {
X yearday -= day_tab[leap][i];
X }
X if(i > 12)
X i = 1;
X
X if(yearday <= 0) { /* special kludge for julian day 0 = Dec. 31st */
X *pmonth = 12;
X *pday = 31 + yearday;
X } else {
X *pmonth = i;
X *pday = yearday;
X }
X}
X
X
X/* back up (if necessary) month and date to nearest sunday */
X/* return julian date of new date as well */
X
X/*
X * weekstart - returns julian data of Sunday start date of given YY/MM/DD.
X */
Xint weekstart(year, month, date)
Xregister int year, *month, *date;
X{
X int mp, dp, i, t;
X
X if ((i = week_day(year, *month, *date)) != 0) {
X t = julian(year, *month, *date);
X month_day(year, t - i, &mp, &dp);
X if(mp > *month)
X year--;
X *month = mp;
X *date = dp;
X }
X return(julian(year, *month, *date));
X}
X
X
X/* verifies the integrity of a date, returns 1 if good, 0 if bad */
Xint valid_date(yr, mo, day)
Xint yr, mo, day;
X{
X int days, leap;
X
X leap = is_leap(yr);
X if (mo > 0 && mo < 13) {
X days = day_tab[leap][mo];
X if (day > 0 && day <= days && yr > 0)
X return(1);
X }
X return(0);
X}
X
X
SHAR_EOF
chmod 0444 utilities.d/libgeti.d/DateFun.c || echo "restore of utilities.d/libgeti.d/DateFun.c fails"
echo "x - extracting utilities.d/libgeti.d/DisPrmpt.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utilities.d/libgeti.d/DisPrmpt.c &&
Xstatic char Sccsid[] = "@(#)DisPrmpt.c 1.1 DeltaDate 8/30/87 ExtrDate 1/22/90";
X#include <curses.h>
X#include "GetInput.h"
X
XDisPrmpt(win, Fld, fldAttrib, fldMask, fldLength, fldCharType, fldAdjust, fldType, colStart, colEnd, fldStr, charKeyed)
X WINDOW *win ; /* Window */
X FldUnPointer Fld ; /* Pointer to union for field */
X int fldAttrib ; /* Curses attribute */
X char *fldMask ; /* mask for character string */
X unsigned fldLength ; /* Maximum length of output */
X char fldCharType ; /* type of character */
X char fldAdjust ; /* Type of adjustment */
X char fldType ; /* type of field */
X int colStart ; /* column start of field */
X int colEnd ; /* column end of field */
X char *fldStr ; /* buffer that will contain output */
X char *charKeyed ; /* characters keyed */
X{
X char *wrk, *fldWrk, *malloc() ;
X
X int ch ;
X int col ;
X int initFld ;
X int i, j ;
X
X *fldStr = '\0' ;
X
X /*
X if (((fldType == HEX || fldType == CHAR) && *Fld->strVal == '\0') ||
X (fldType == INT && *Fld->intVal == 0) ||
X (fldType == SHORT && *Fld->shortVal == 0) ||
X (fldType == LONG && *Fld->longVal == 0L) ||
X (fldType == FLOAT && *Fld->floatVal == 0.0) ||
X (fldType == DOUBLE && *Fld->doubleVal == 0.0) ||
X (fldType == MONEY && *Fld->doubleVal == 0.0) ) {
X */
X if (((fldType == HEX || fldType == CHAR) && *Fld->strVal == '\0')) {
X
X initFld = FALSE ;
X fldWrk = fldStr ;
X while (fldLength--)
X *fldWrk++ = ' ' ;
X *fldWrk = '\0' ;
X } else {
X
X initFld = TRUE ;
X
X fldWrk = malloc(fldLength + 1) ;
X
X if (fldType == HEX || fldType == CHAR)
X strcpy (fldWrk, Fld->strVal) ;
X else if (fldType == INT)
X sprintf (fldWrk, "%d", *Fld->intVal) ;
X else if (fldType == SHORT)
X sprintf (fldWrk, "%d", *Fld->shortVal) ;
X else if (fldType == LONG)
X sprintf (fldWrk, "%ld", *Fld->longVal) ;
X else if (fldType == FLOAT)
X sprintf (fldWrk, "%f", *Fld->floatVal) ;
X else if (fldType == DOUBLE)
X sprintf (fldWrk, "%g", *Fld->doubleVal) ;
X else if (fldType == MONEY) {
X sprintf (fldWrk, "%g", *Fld->doubleVal) ;
X i = strlen(fldWrk) - 1 ;
X wrk = fldWrk ;
X while(*wrk != '.' && *wrk != '\0')
X wrk++ ;
X if(*wrk == '\0')
X strcat(fldWrk, ".00") ;
X else {
X wrk++ ;
X j = 0 ;
X while(*wrk++ != '\0')
X j++ ;
X
X if(j == 0)
X strcat(fldWrk, "00") ;
X else if(j == 1)
X strcat(fldWrk, "0") ;
X }
X }
X
X if (fldAdjust == NOFILL)
X strcpy (fldStr, fldWrk) ;
X else if (fldAdjust == LFADJ_BFILL || fldAdjust == LFADJ_ZFILL){
X strcpy (fldStr, fldWrk) ;
X
X for (i = strlen(fldStr) ; i < fldLength ; i++)
X fldStr[i] = (fldAdjust == LFADJ_ZFILL) ? '0' : ' ' ;
X fldStr[fldLength] = '\0' ;
X } else if (fldAdjust == RTADJ_BFILL || fldAdjust == RTADJ_ZFILL) {
X
X for (i = 0 ; i < fldLength - strlen(fldWrk) ; i++)
X fldStr[i] = (fldAdjust == RTADJ_ZFILL) ? '0' : ' ' ;
X fldStr[fldLength - strlen(fldWrk)] = '\0' ;
X strcat (fldStr, fldWrk) ;
X }
X
X free (fldWrk) ;
X
X }
X wattrset (win, fldAttrib) ;
X
X col = colStart ;
X
X do {
X if (fldMask == NULL) {
X *charKeyed++ = (initFld) ? 'Y' : 'N' ;
X waddch(win, *fldStr++) ;
X } else if (fldCharType != DATE && fldCharType != TIME) {
X /*
X if(*(fldMask + col - colStart) == ' ')
X *(fldMask + col - colStart) = fldCharType ;
X */
X if(IsMask(fldCharType, *(fldMask + col - colStart))) {
X *charKeyed++ = 'M' ;
X waddch(win, *(fldMask + col - colStart) );
X } else {
X *charKeyed++ = (initFld) ? 'Y' : 'N' ;
X waddch(win, *fldStr++) ;
X }
X } else {
X if( (fldCharType == DATE &&
X (ch = *(fldMask + col - colStart)) == 'M' ||
X ch == 'D' || ch == 'Y') ||
X (fldCharType == TIME &&
X (ch = *(fldMask + col - colStart)) == 'I' ||
X ch == 'H' || ch == 'M' ||
X ch == 'S' || ch == 'T')) {
X *charKeyed++ = (initFld) ? 'Y' : 'N' ;
X waddch(win, *fldStr++) ;
X } else {
X *charKeyed++ = 'M' ;
X waddch(win, *(fldMask + col - colStart) );
X }
X }
X col++ ;
X } while (*fldStr != '\0' && col < colEnd) ;
X
X while(col < colEnd) {
X if (fldMask == NULL) {
X *charKeyed++ = 'N' ;
X waddch(win, ' ') ;
X } else if (fldCharType != DATE && fldCharType != TIME) {
X if(*(fldMask + col - colStart) == ' ')
X *(fldMask + col - colStart) = fldCharType ;
X if(IsMask(fldCharType, *(fldMask + col - colStart))) {
X *charKeyed++ = 'M' ;
X waddch(win, *(fldMask + col - colStart) );
X } else {
X *charKeyed++ = 'N' ;
X waddch(win, ' ') ;
X }
X } else {
X if( (fldCharType == DATE &&
X (ch = *(fldMask + col - colStart)) == 'M' ||
X ch == 'D' || ch == 'Y') ||
X (fldCharType == TIME &&
X (ch = *(fldMask + col - colStart)) == 'I' ||
X ch == 'H' || ch == 'M' ||
X ch == 'S' || ch == 'T')) {
X *charKeyed++ = 'N' ;
X waddch(win, ' ') ;
X } else {
X *charKeyed++ = 'M' ;
X waddch(win, *(fldMask + col - colStart) );
X }
X }
X col++ ;
X }
X
X wattrset (win, 0) ;
X
X return(initFld) ;
X
X}
SHAR_EOF
chmod 0444 utilities.d/libgeti.d/DisPrmpt.c || echo "restore of utilities.d/libgeti.d/DisPrmpt.c fails"
echo "x - extracting utilities.d/libgeti.d/FindSet.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utilities.d/libgeti.d/FindSet.c &&
X#ifndef LINT
Xstatic char Sccsid[] = "@(#)FindSet.c 1.3 DeltaDate 1/22/90 ExtrDate 1/22/90";
X#endif
X
X/*
X** FindSet()
X** Determines if the value loaded into Fld is a member of the set.
X** RETURNS:
X** -1 not a element of the set
X** eNum otherwise returns the element number (base 0)
X*/
X
X#include "GetInput.h"
X
X
XFindSet(Fld, fldRange, fldLength, fldType)
X FldUnPointer Fld ;
X char *fldRange ;
X int fldLength ;
X char fldType ;
X{
X static char *upper();
X char *a,
X *b,
X *fldCmp ;
X
X char *malloc() ;
X
X int eNum, /* element number matched */
X gotAmatch ;
X
X gotAmatch = 0 ;
X
X eNum = 0 ;
X
X fldCmp = malloc(fldLength+1);
X
X a = fldRange ;
X
X while(*a != '\0') {
X
X b = fldCmp ;
X
X while(*a != ',' && *a != '\0')
X /* load the next element into fldCmp */
X *b++ = *a++ ;
X
X *b = '\0' ;
X
X switch(fldType) {
X case CHAR:
X case DATE:
X case TIME:
X if(strncmp(upper(fldCmp), upper(Fld->strVal), strlen(Fld->strVal)) == 0)
X gotAmatch = 1 ;
X break ;
X case INT:
X if(*Fld->intVal == atoi(fldCmp))
X gotAmatch = 1 ;
X break ;
X case SHORT:
X if(*Fld->shortVal == atoi(fldCmp))
X gotAmatch = 1 ;
X break ;
X case LONG:
X if(*Fld->longVal == atoi(fldCmp))
X gotAmatch = 1 ;
X break ;
X case FLOAT:
X if(*Fld->floatVal == atof(fldCmp))
X gotAmatch = 1 ;
X break ;
X case DOUBLE:
X if(*Fld->doubleVal == atof(fldCmp))
X gotAmatch = 1 ;
X break ;
X }
X
X if(gotAmatch)
X break ;
X
X eNum++ ;
X
X while(*a == ',' || *a == ' ' || *a == '\t')
X a++ ;
X }
X
X free(fldCmp) ;
X
X if(gotAmatch)
X return(eNum) ;
X else
X return (-1) ;
X}
X
X
Xstatic char *upper (s)
X
X char *s;
X{
X register int i;
X char *ws;
X
X ws = s;
X while (*s)
X {
X if (*s >= 'a' && *s <= 'z')
X *s = (*s + 'A' - 'a');
X s++;
X }
X return (ws);
X}
SHAR_EOF
chmod 0444 utilities.d/libgeti.d/FindSet.c || echo "restore of utilities.d/libgeti.d/FindSet.c fails"
echo "x - extracting utilities.d/libgeti.d/GetInput.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utilities.d/libgeti.d/GetInput.c &&
Xstatic char Sccsid[] = "@(#)GetInput.c 1.7 DeltaDate 1/22/90 ExtrDate 1/22/90";
X
X#include <curses.h>
X#include <ctype.h>
X#include "keys.h"
X#include "GetInput.h"
X
X#define MAXITEMS 100
X#define CREATEMENU -2
X
Xint insertmode = FALSE;
X
X
XGetInput (win, rowStart, colStart, Fld, fldAttrib, fldMask, fldRange, fldLength,
X fldMin, fldCharType, fldAdjust, fldType, keyStream, mustEnter,
X fldErrRow, fldDispRow, helpMsg, helpFile, helpTag)
X
X WINDOW *win ; /* Window */
X int rowStart ;
X int colStart ;
X FldUnPointer Fld ; /* Pointer to union for field */
X int fldAttrib ; /* Curses attribute */
X char *fldMask ; /* mask for character string */
X char *fldRange ; /* range of valid values for output */
X int fldLength; /* Maximum length of output */
X int fldMin; /* Minimum length of output */
X char fldCharType; /* type of character */
X char fldAdjust ; /* adjust/fill field */
X char fldType ; /* type of field */
X int keyStream ; /* if TRUE then the function will
X exit when the last character is
X keyed */
X int mustEnter ; /* boolean */
X int fldErrRow ; /* where to display error message */
X int fldDispRow ; /* where to display help message */
X char *helpMsg ; /* help message */
X char helpFile[] ; /* help file name */
X char helpTag[] ; /* tag where help begins */
X{
X int colEnd ; /* column end of field */
X int row ; /* working row field */
X int col ; /* working column field */
X int colSave ; /* working column field */
X int colMove ; /* working col field for adjusting routines */
X int colBegInput; /* column where input begins */
X int ch ; /* contains character keyed or being moved */
X int notFinished ; /* bool indicator that indicates when the user
X is finished with keying in data */
X int setNumb ; /* number to be returned showing which
X selection the user chose */
X int controlKey ; /* if not 0 then the user hit a control key */
X int bytesKeyed ; /* how many bytes were keyed */
X int initFld ; /* indicate if field was initialized going into
X this routine */
X char *fldStr ; /* buffer that will contain output */
X char *charKeyed ; /* characters keyed by the user Y/N */
X /*
X ** charKeyd indicates how many characters
X ** has been keyed in. A "Y" in the position
X ** indicates that the user has keyed a char
X ** at that position, otherwise it will be "N"
X ** or a "M" for a mask format character.
X */
X char *fldWrk ; /* working field */
X int origAttr[80] ; /* original field attributes */
X char *malloc() ;
X int i;
X int junk; /* use for anything */
X char menu[MAXITEMS+2][80]; /* popmenu items */
X int menuid;
X
X
X
X
X
X if (fldCharType == PROTECT)
X {
X /* X out the field */
X for (i = 0; i < fldLength; i++)
X Fld->strVal[i] = 'X';
X Fld->strVal[i] = '\0';
X }
X
X /*
X ** bug fix - pjc 08/26/86
X ** bytesKeyed = 0
X */
X setNumb = controlKey = bytesKeyed = 0;
X
X /* find length of field from the values in fldRange */
X if (fldCharType == SET || fldCharType == MENU)
X fldLength = GetSetLen(fldRange);
X
X /*
X ** pjc - 11/88
X ** This allows you to pass ""
X */
X if (fldRange != NORANGE && strcmp(fldRange, "") == 0)
X fldRange = NORANGE;
X
X if (fldMask != NOMASK && strcmp(fldMask, "") == 0)
X fldMask = NOMASK;
X if (fldMask == NOMASK)
X {
X colEnd = colStart + fldLength ;
X fldStr = malloc(fldLength + 1) ;
X charKeyed = malloc(fldLength + 1) ;
X }
X else
X {
X colEnd = colStart + strlen(fldMask) ;
X fldStr = malloc(strlen(fldMask) + 1) ;
X charKeyed = malloc(strlen(fldMask) + 1) ;
X }
X
X /*
X ** Save original terminal attributes.
X */
X for (col = colStart; col < colEnd; col++)
X origAttr[col - colStart] = mvwinch(win, rowStart, col) &
X A_ATTRIBUTES ;
X
X CLEARROW (fldDispRow);
X /*
X ** bug fix pjc 8/22/86
X ** test for NOMSG
X ** Display help message.
X */
X if (helpMsg != NOMSG)
X {
X /* pjc 7/87 - clrtoeol for new message
X */
X /* pjc 11/88 -
X ** change helpMsg to always display to standard screen.
X ** That way popup screens will work right.
X ** Display message between col 1 to COLS-1 ... so that
X ** it will work with a box border.
X */
X
X mvwaddstr (stdscr,
X ((fldDispRow%100) == fldDispRow) ? fldDispRow : fldDispRow/100,
X ((fldDispRow%100) == fldDispRow) ? 0 : fldDispRow%100,
X helpMsg) ;
X wnoutrefresh (stdscr);
X }
X
X /*
X ** pjc 9/87
X ** Added new attributes
X ** If A_SAME then use the attributes that is showing
X ** on the screen in that position.
X ** As you see it is determined from first column.
X */
X if (fldAttrib == A_SAME)
X fldAttrib = origAttr[0];
X
X wmove(win, rowStart, colStart) ;
X if (fldCharType == SET || fldCharType == MENU)
X {
X setNumb = FindSet(Fld, fldRange, fldLength, fldType) ;
X ShowSet(win, rowStart, colStart, fldAttrib, fldRange,
X fldLength, &setNumb, colEnd, charKeyed, origAttr) ;
X if (fldCharType == MENU)
X {
X char menustrid[10];
X int mrow;
X int mcol;
X
X /* make a unique menuid from the row & column */
X sprintf (menustrid, "%2d%2d", rowStart, colStart);
X menuid = atoi (menustrid);
X
X /* try to put menu as close to the field as possible */
X if ((rowStart + win->_begy) > 0)
X mrow = rowStart + win->_begy - 1;
X else
X mrow = 0;
X /* off the edge of the screen ? */
X if ((colEnd + fldLength + 4) + win->_begx > COLS)
X {
X mcol = COLS - fldLength + 4;
X mrow += 2;
X }
X else
X mcol = colEnd + win->_begx;
X
X BuildMenu (menu, fldRange);
X popmenu (CREATEMENU, menuid, mrow, mcol, "",
X helpFile, LINES-mrow-2, sizeof(menu[0]), menu);
X
X /* replace with new popmenu(3)
X popmenu (CREATEMENU, menuid, mrow, mcol, "","",
X menu[0], menu[1], menu[2], menu[3], menu[4],
X menu[5], menu[6], menu[7], menu[8], menu[9],
X menu[10], menu[11]);
X */
X }
X }
X else
X /*
X ** FALSE if Fld->strval == '\0'
X ** TRUE if Fld contained a default value.
X */
X initFld = DisPrmpt(win, Fld, fldAttrib, fldMask, fldLength,
X fldCharType, fldAdjust, fldType, colStart,
X colEnd, fldStr, charKeyed) ;
X
X
X
X /*
X ** find the first column where there is not a mask(M) character
X ** This is the column where we begin the input.
X */
X col = colStart ;
X fldWrk = charKeyed ;
X /*
X ** fldWrk - M = mask character, N = no mask character
X */
X while (col != colEnd && *fldWrk++ == 'M')
X col++;
X
X colBegInput = col ;
X wmove(win, rowStart, col) ;
X notFinished = TRUE ;
X
X
X if (fldCharType == PROTECT)
X {
X /* Password entry field */
X wattrset (win, A_REVERSE);
X strcpy (Fld->strVal, "");
X free (fldStr);
X free (charKeyed);
X row = rowStart;
X col = colStart;
X fldStr = Fld->strVal;
X *fldStr = '\0';
X do
X {
X wmove (win, row, col);
X wnoutrefresh (win);
X doupdate ();
X ch = wgetch (win);
X if (ch == KeyHelp || ch == KEY_HELP)
X {
X ShowHelp (helpFile, helpTag, fldErrRow);
X touchwin (win);
X wnoutrefresh (win);
X }
X } while (ch == KeyHelp || ch == KEY_HELP);
X *fldStr = (char)ch;
X while (*fldStr != '\r')
X {
X if (col > colStart + fldLength - 1)
X beep ();
X else
X {
X addch ('X');
X fldStr++;
X col++;
X }
X wmove (win, row, col);
X wnoutrefresh (win);
X doupdate ();
X ch = wgetch (win);
X if (ch == KeyHelp || ch == KEY_HELP)
X {
X ShowHelp (helpFile, helpTag, fldErrRow);
X touchwin (win);
X wnoutrefresh (win);
X }
X else
X *fldStr = (char)ch;
X }
X *fldStr = '\0';
X wattrset (win, A_NORMAL);
X return ((int)'\r');
X }
X
X
X while (TRUE)
X {
X do
X {
X /* pjc 11/88 for message and errors to stdscr */
X wnoutrefresh (stdscr);
X wnoutrefresh(win) ;
X doupdate ();
X
X getyx(win, row, col) ;
X
X ch = wgetch(win);
X
X CLEARROW (fldErrRow);
X if (helpMsg != NOMSG)
X {
X mvwaddstr (stdscr,
X ((fldDispRow%100) == fldDispRow) ? fldDispRow : fldDispRow/100,
X ((fldDispRow%100) == fldDispRow) ? 0 : fldDispRow%100,
X helpMsg) ;
X }
X
X wmove(win, row, col) ;
X
X /* these keys accept the input before returning */
X if (ch == KeyReturn) ch = KEY_RETURN;
X if (ch == KeyDown) ch = KEY_DOWN;
X if (ch == KeyUp) ch = KEY_UP;
X if (ch == KeyTab) ch = KEY_TAB;
X if (ch == KeyBTab) ch = KEY_BTAB;
X if (ch == KeyAccept) ch = KEY_ACCEPT;
X
X /* other keys */
X if (ch == KeyHelp) ch = KEY_HELP;
X if (ch == KeyRedraw) ch = KEY_REFRESH;
X if (ch == KeyLeft) ch = KEY_LEFT;
X if (ch == KeyRight) ch = KEY_RIGHT;
X if (ch == KeyEOL) ch = KEY_EOL;
X if (ch == KeyDL) ch = KEY_DL;
X if (ch == KeyDC) ch = KEY_DC;
X if (ch == KeyIC) ch = KEY_IC;
X if (ch == KeySave) ch = KEY_SAVE;
X if (ch == KeyPrint) ch = KEY_PRINT;
X if (ch == KeyBeg) ch = KEY_BEG;
X if (ch == KeyEnd) ch = KEY_END;
X if (ch == KeyCancel) ch = KEY_CANCEL;
X
X switch (ch)
X {
X case KEY_BEG:
X /* place cursor at beg of field */
X col = colStart;
X wmove(win, rowStart, col) ;
X break;
X
X case KEY_END:
X /* place cursor at end of input */
X col = colEnd;
X junk = colEnd;
X while (col >= colStart)
X {
X if (*(charKeyed+col-colStart) == 'N')
X junk = col;
X if (*(charKeyed+col-colStart) == 'Y')
X break;
X col--;
X }
X col = junk;
X wmove(win, rowStart, col) ;
X break;
X
X case KEY_HELP:
X ShowHelp (helpFile, helpTag, fldErrRow);
X touchwin (win);
X wnoutrefresh (win);
X continue;
X
X case KEY_REFRESH:
X clearok (win, TRUE);
X continue;
X
X case KEY_LEFT:
X /* fixme
X if (col > colBegInput)
X */
X if (col > colStart)
X col--;
X else
X BELL;
X while (col > colStart &&
X *(charKeyed + col - colStart) == 'M')
X --col ;
X while (*(charKeyed + col - colStart) == 'M')
X col++;
X wmove(win, rowStart, col) ;
X continue;
X
X case KEY_RIGHT:
X if (col < colEnd - 1 &&
X (*(charKeyed + col - colStart) == 'Y' ||
X *(charKeyed + col - colStart) == 'M' ) )
X col++;
X else
X BELL;
X while (col < colEnd &&
X *(charKeyed + col - colStart) == 'M')
X col++;
X while (*(charKeyed + col - colStart) == 'M')
X col--;
X wmove(win, rowStart, col) ;
X break;
X
X case KEY_EOL:
X /*
X ** Clear from cursor to end of field.
X */
X if (col == colBegInput) initFld = FALSE ;
X colSave = col ;
X fldWrk = fldStr ;
X col = colStart ;
X while (col < colSave)
X {
X if (*(charKeyed + col - colStart)=='Y')
X *fldWrk++ = mvwinch(win, row,
X col) & A_CHARTEXT ;
X col++;
X }
X *fldWrk = '\0' ;
X
X col = colSave ;
X while (col < colEnd)
X {
X if (*(charKeyed + col-colStart) != 'M')
X *(charKeyed + col-colStart)='N';
X col++;
X }
X ReDispFld(win, rowStart, colStart, fldAttrib,
X fldMask, fldRange, fldLength,
X fldCharType, fldType,
X fldStr, colEnd, charKeyed, 0, origAttr);
X
X wmove(win, rowStart, colSave) ;
X break;
X
X case KEY_DL:
X /*
X ** Clear field and home cursor.
X */
X if (col == colBegInput)
X initFld = FALSE ;
X fldWrk = fldStr ;
X *fldWrk = '\0' ;
X
X col = colStart ;
X /* check for a mask character */
X while (col < colEnd)
X {
X if (*(charKeyed + col-colStart) != 'M')
X *(charKeyed + col-colStart)='N';
X col++;
X }
X /* redisplay field */
X ReDispFld(win, rowStart, colStart, fldAttrib,
X fldMask, fldRange, fldLength,
X fldCharType, fldType,
X fldStr, colEnd, charKeyed, 0, origAttr);
X
X col = colBegInput;
X wmove(win, rowStart, col) ;
X break;
X
X case KEY_DC:
X /*
X ** pjc 11/88
X ** Delete character at cursor.
X */
X
X /*
X ** no can do for SET, MENU or
X ** cursor past end of input or
X ** cursor past end of field
X */
X if (fldCharType == SET || fldCharType == MENU ||
X *(charKeyed+col-colStart) == 'N' ||
X col >= colEnd)
X break;
X colSave = col; /* cursor location */
X
X /* get field content & delete char */
X col = colStart;
X fldWrk = fldStr;
X while (col < colEnd)
X {
X if (col == colSave)
X col++; /* delete char */
X if (*(charKeyed+col-colStart) == 'Y')
X *fldWrk++ = mvwinch(win, row,
X col) & A_CHARTEXT ;
X col++;
X }
X *fldWrk = '\0';
X
X /* validate new field against the mask */
X if (fldMask != NOMASK)
X {
X junk = 0;
X /* fldWrk - fldWrk, col - charKeyed */
X for (fldWrk = fldStr, col = colStart;
X col < colEnd && *fldWrk != '\0';
X col++)
X {
X /* only check shifted chars */
X if (col < colSave ||
X *(charKeyed+col-colStart) == 'M')
X {
X if (*(charKeyed+col-colStart) == 'Y')
X fldWrk++;
X continue;
X }
X
X junk = checkmask (col, colStart,
X fldMask, fldCharType,
X fldType, *fldWrk);
X
X if (junk == -1)
X break;
X *fldWrk++ = junk;
X junk = 0;
X } /* end for */
X if (junk == -1)
X {
X CLEARROW (fldErrRow);
X wattrOn (stdscr,
X A_REVERSE|A_BOLD);
X mvwaddstr(stdscr,
X ((fldErrRow%100) == fldErrRow) ? fldErrRow : fldErrRow/100,
X ((fldErrRow%100) == fldErrRow) ? 0 : fldErrRow%100,
X "Unable to delete character due to edits.");
X wattrOff (stdscr);
X BELL;
X col = colSave;
X wmove (win, rowStart, colSave);
X break;
X }
X }
X
X /* set last Y in charKeyd to N */
X col = colEnd;
X while (col >= colStart)
X {
X if (*(charKeyed+col-colStart) == 'Y')
X {
X *(charKeyed+col-colStart) = 'N';
X break;
X }
X col--;
X }
X
X
X ReDispFld(win, rowStart, colStart, fldAttrib,
X fldMask, fldRange, fldLength,
X fldCharType, fldType,
X fldStr, colEnd, charKeyed, 0, origAttr);
X
X col = colSave;
X wmove (win, rowStart, colSave);
X break;
X
X case KEY_IC:
SHAR_EOF
echo "End of part 7"
echo "File utilities.d/libgeti.d/GetInput.c is continued in part 8"
echo "8" > s2_seq_.tmp
exit 0
More information about the Alt.sources
mailing list