menu(1) part 6 of 11
Paul J. Condie
pjc at pcbox.UUCP
Sat Apr 7 03:53:04 AEST 1990
#!/bin/sh
# this is part 6 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file runscreen.c continued
#
CurArch=6
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 runscreen.c"
sed 's/^X//' << 'SHAR_EOF' >> runscreen.c
X char screen_name[];
X struct MenuInfo *menu;
X int opnumber;
X{
X FILE *popen(), *pp;
X char *getenv();
X char *getval();
X char *findfile();
X WINDOW *swin;
X union FldUnion Fld;
X int rc; /* return code */
X int exitkey;
X int sidx;
X int fidx = 0;
X char fieldinput[MAXFIELDS+1][100];
X int fieldcount;
X char *promptptr;
X char *mask; /* mask pointer */
X char fmtdefault[100];/* formated default value */
X char *wsptr; /* working storage pointer */
X char *source; /* default data pointer */
X int helpflag = TRUE;
X char helpfile[80];
X char tmptitle[100];
X int toprow;
X int leftcol;
X
X
X
X /* Find the screen definition */
X for (sidx = 0; menu->srn[sidx] != (struct ScreenInfo *)NULL &&
X sidx <= MAXSCREENS; sidx++)
X {
X if (strcmp (screen_name, menu->srn[sidx]->name) == 0)
X break;
X }
X if (sidx > MAXSCREENS || menu->srn[sidx] == (struct ScreenInfo *)NULL)
X {
X BEEP;
X mvprintw (ErrRow-2,0, "Could not find your screen definition.");
X shutdown ();
X }
X
X wsptr = SRN->toprowvar;
X if (strcmp (SRN->toprowvar, "") != 0)
X toprow = atoi (getval (&wsptr, '1'));
X else
X toprow = SRN->toprow;
X wsptr = SRN->leftcolvar;
X if (strcmp (SRN->leftcolvar, "") != 0)
X leftcol = atoi (getval (&wsptr, '1'));
X else
X leftcol = SRN->leftcol;
X
X if (toprow == AUTO)
X {
X /*
X ** Figure out where to put the screen
X ** try to put screen as close to the option as possible
X */
X toprow = menu->option[opnumber]->row - 2;
X /*
X for (rc = 0, leftcol = 0; rc < menu->optioncount ; rc ++)
X if (strlen (menu->option[rc]->description) > leftcol)
X leftcol = strlen (menu->option[rc]->description);
X leftcol = menu->option[opnumber]->col +
X ((leftcol + 4) / 2);
X */
X leftcol = menu->option[opnumber]->col +
X strlen(menu->option[opnumber]->description) + 4;
X
X /* make sure it fits on the screen */
X if ((toprow + SRN->rows) > LINES-1)
X toprow = LINES - SRN->rows - 1;
X
X if ((leftcol + SRN->cols + 2) > COLS)
X leftcol = COLS - SRN->cols - 1;
X }
X
X
X /* create the window */
X swin = newwin (SRN->rows, SRN->cols, toprow, leftcol);
X keypad (swin, TRUE);
X
X /*
X ** check if recalculation of rows & cols is necessary
X ** see newwin() for info on why
X */
X if (SRN->rows == 0 && SRN->cols == 0 &&
X toprow == 0 && leftcol == 0)
X {
X /* a full-screen was created */
X SRN->rows = LINES-1;
X SRN->cols = COLS;
X }
X else if (SRN->rows == 0 || SRN->cols == 0)
X {
X SRN->rows = LINES - toprow;
X SRN->cols = COLS - leftcol;
X if (SRN->rows == LINES)
X SRN->rows--;
X }
X
X
X if (strcmp (SRN->helpfile, "") == 0)
X helpflag = FALSE;
X else
X strcpy (helpfile, findfile (SRN->helpfile, ".",
X getenv("HELPDIR"), getenv("MENUDIR"), ""));
X drawbox (swin, 1,1, SRN->rows,SRN->cols, SRN->boxtype & 0777,
X StandoutLine, FALSE, helpflag);
X
X /* display title */
X wsptr = SRN->title;
X strcpy (tmptitle, getval (&wsptr, '1'));
X wattrset (swin, A_STANDOUT);
X mvwprintw (swin, 0, ((SRN->cols)/2)-(strlen(tmptitle)/2),
X "%s", tmptitle);
X /*
X if (strcmp (menu->helpfile, "") != 0)
X mvwprintw (menu->win, menu->NumItems+2,menu->width+3, "?");
X */
X wattrset (swin, A_NORMAL);
X
X /*
X ** Run fielddefaults if there is one and load results into fieldinput
X */
X if (SRN->fielddefaults != (char *)NULL)
X {
X if (debug)
X {
X fprintf (stderr, "\n[runscreen] <%s> popen=:%s:",
X SRN->name, SRN->fielddefaults);
X fflush (stderr);
X }
X move (ErrRow,0); clrtoeol();
X mvprintw (ErrRow,1, "Initializing screen fields...");
X refresh ();
X if ((pp = popen (SRN->fielddefaults, "r")) == (FILE *)NULL)
X {
X BEEP;
X mvprintw (ErrRow-2,0, "Could not open pipe = %s",
X SRN->fielddefaults);
X shutdown ();
X }
X
X /* read and set each field until no more input */
X rc = 99;
X for (fidx = 0; SRN->field[fidx] != (struct FieldInfo *)NULL &&
X fidx <= MAXFIELDS; fidx++)
X {
X strcpy (fieldinput[fidx], "");
X if (rc == EOF)
X {
X if (debug)
X {
X fprintf (stderr,
X "\n[runscreen] <%s> read nothing from popen",
X SRN->name);
X fprintf (stderr,
X "\n[runscreen] <%s> field %d =:%s:",
X SRN->name,fidx, fieldinput[fidx]);
X fflush (stderr);
X }
X continue;
X }
X
X /* get a word from the pipe */
X rc = fscanf (pp, "%s", fmtdefault);
X if (rc == EOF) continue;
X if (debug)
X {
X fprintf (stderr,
X "\n[runscreen] <%s> read from popen=:%s:",
X SRN->name, fmtdefault);
X fflush (stderr);
X }
X
X /* check for NULL value */
X if (strcmp (fmtdefault, "NULL") == 0)
X {
X strcpy (fieldinput[fidx], "");
X if (debug)
X {
X fprintf (stderr,
X "\n[runscreen] <%s> field %d =:%s:",
X SRN->name,fidx, fieldinput[fidx]);
X fflush (stderr);
X }
X continue;
X }
X
X /* check for a quoted value */
X if (fmtdefault[0] == '"')
X {
X /*
X ** found a quoted value
X ** read until another quote or end of line
X */
X strcpy (fieldinput[fidx], fmtdefault+1);
X if (fmtdefault[strlen(fmtdefault)-1] == '"')
X {
X /* end of quote is on first word */
X fieldinput[fidx][strlen(fieldinput[fidx])-1] = '\0';
X if (debug)
X {
X fprintf (stderr,
X "\n[runscreen] <%s> field %d =:%s:",
X SRN->name, fidx,
X fieldinput[fidx]);
X fflush (stderr);
X }
X continue;
X }
X while ((rc = fscanf (pp, "%s", fmtdefault)) != EOF)
X {
X if (debug)
X {
X fprintf (stderr,
X "\n[runscreen] <%s> read from popen=:%s:",
X SRN->name, fmtdefault);
X fflush (stderr);
X }
X strcat (fieldinput[fidx], " ");
X strcat (fieldinput[fidx], fmtdefault);
X if (fmtdefault[strlen(fmtdefault)-1] == '"')
X {
X /* end of quote */
X fieldinput[fidx][strlen(fieldinput[fidx])-1] = '\0';
X break;
X }
X }
X }
X else
X strcpy (fieldinput[fidx], fmtdefault);
X if (debug)
X {
X fprintf (stderr,
X "\n[runscreen] <%s> field %d =:%s:",
X SRN->name, fidx, fieldinput[fidx]);
X fflush (stderr);
X }
X } /* end for each field */
X pclose(pp);
X }
X
X /*
X ** Initialize the screen
X ** Loop through each field
X ** print the label
X ** for SET and MENU types determine field_length
X ** put in the field terminators
X ** get, format and print default value in getenv () or fielddefaults
X */
X for (fidx = 0; SRN->field[fidx] != (struct FieldInfo *)NULL &&
X fidx <= MAXFIELDS;
X fidx++)
X {
X /* print label */
X if (strlen(FLD->label) > 0)
X mvwprintw (swin, FLD->row,
X FLD->col - strlen(FLD->label) - 2,
X "%s", FLD->label);
X
X /* for SET and MENU types get field_length */
X if (FLD->type == SET || FLD->type == MENU)
X FLD->length = GetSetLen (FLD->range);
X
X /* print field terminators */
X if (strlen(FLD->terminator) > 0)
X {
X /* left */
X mvwprintw (swin, FLD->row, FLD->col - 1,
X "%c", FLD->terminator[0]);
X /* right */
X if (strlen(FLD->mask) > 0)
X mvwprintw (swin, FLD->row,
X FLD->col + strlen(FLD->mask),
X "%c", FLD->terminator[1]);
X else
X mvwprintw (swin, FLD->row,
X FLD->col + FLD->length,
X "%c", FLD->terminator[1]);
X }
X
X /*
X ** If a fielddefaults command was given
X ** then the default values are already in fieldinput
X ** else load from getenv()
X */
X if (SRN->fielddefaults == (char *)NULL)
X {
X /* get default value from getenv() */
X if (getenv(FLD->name) != (char *)NULL)
X strcpy (fieldinput[fidx], getenv (FLD->name));
X else
X strcpy (fieldinput[fidx], "");
X if (strcmp (fieldinput[fidx], "NULL") == 0)
X strcpy (fieldinput[fidx], "");
X }
X
X /* format default value to the mask */
X strcpy (fmtdefault, fieldinput[fidx]);
X if (strlen(FLD->mask) > 0)
X {
X wsptr = fmtdefault;
X mask = FLD->mask;
X source = fieldinput[fidx];
X for (; *mask != '\0'; mask++, wsptr++)
X {
X if (IsMask (FLD->type, *mask))
X *wsptr = *mask; /* format char */
X else
X {
X if (*source != '\0')
X {
X *wsptr = *source;
X source++;
X }
X else
X *wsptr = ' '; /* no data */
X }
X }
X *wsptr = '\0';
X }
X /* print default data */
X if (strlen(fmtdefault) > 0)
X mvwprintw (swin, FLD->row, FLD->col, "%s", fmtdefault);
X }
X fieldcount = fidx-1; /* save field count */
X
X
X /*
X ** GetInput from fields untill KEY_CANCEL || KEY_ACCEPT
X */
X move (ErrRow,0); clrtoeol();
X fidx = 0; /* start with first field */
X
X do
X {
X Fld.strVal = fieldinput[fidx];
X
X
X if (exitkey == 999)
X /*
X ** This is so GetInput doesn't overwrite the
X ** must enter message.
X */
X promptptr = NOMSG;
X else
X promptptr = FLD->prompt;
X
X /* if noinput == FALSE prompt for input */
X if (!FLD->noinput)
X {
X exitkey = GetInput (swin, FLD->row, FLD->col, &Fld,
X A_REVERSE, FLD->mask, FLD->range, FLD->length,
X FLD->min_input, FLD->type, FLD->adjust, CHAR,
X NOAUTO, FLD->mustenter, ErrRow, ErrRow,
X promptptr, helpfile, FLD->name);
X }
X else
X {
X /* use the exitkey from the last field */
X if (exitkey != KEY_UP)
X exitkey = KEY_DOWN;
X }
X
X
X if (exitkey == KeyReturn) exitkey = KEY_RETURN;
X if (exitkey == KeyUp) exitkey = KEY_UP;
X if (exitkey == KeyDown) exitkey = KEY_DOWN;
X if (exitkey == KeyTab) exitkey = KEY_TAB;
X if (exitkey == KeyBTab) exitkey = KEY_BTAB;
X if (exitkey == KeyCancel) exitkey = KEY_CANCEL;
X if (exitkey == KeyAccept) exitkey = KEY_ACCEPT;
X
X /* if exitlastfield accept input and exit on last field */
X if (SRN->exitlastfield && fidx == fieldcount &&
X exitkey == KEY_RETURN)
X exitkey = KEY_ACCEPT;
X
X switch (exitkey)
X {
X case KEY_CANCEL:
X break;
X
X case KEY_ACCEPT:
X /* make sure mustenter fields have been entered */
X for (fidx = 0; fidx <= fieldcount; fidx++)
X if (FLD->mustenter &&
X strcmp (fieldinput[fidx], "") == 0)
X {
X mvwprintw (stdscr, ErrRow,1,
X "This is a must enter field.");
X BEEP;
X wnoutrefresh (stdscr);
X exitkey = 999;
X break;
X }
X /* if mustenter then more input */
X if (fidx <= fieldcount)
X break;
X
X /* set the environment variables */
X for (fidx = 0; fidx <= fieldcount; fidx++)
X {
X if (strcmp (fieldinput[fidx], "") == 0)
X strcpy (fieldinput[fidx], "NULL");
X
X rc = setenv (FLD->name, fieldinput[fidx]);
X if (rc < 0)
X {
X mvwprintw (stdscr, ErrRow,0, "Unable to allocate environment memory to set variable %s.", fieldinput[fidx]);
X BEEP;
X }
X }
X break;
X
X case KEY_TAB:
X fidx += 4;
X fidx = fidx >= fieldcount ? 0 : ++fidx;
X break;
X
X case KEY_BTAB:
X fidx -= 4;
X fidx = fidx < 0 ? fieldcount : --fidx;
X break;
X
X case KEY_UP:
X fidx = fidx <= 0 ? fieldcount : --fidx;
X break;
X
X case KEY_RETURN:
X case KEY_DOWN:
X default:
X fidx = fidx >= fieldcount ? 0 : ++fidx;
X break;
X }
X } while (exitkey != KEY_CANCEL && exitkey != KEY_ACCEPT);
X
X delwin (swin); /* junk screen window */
X wmove (stdscr,LINES-1,0);
X clrtoeol (); /* clear field prompt */
X touchwin (stdscr);
X
X if (exitkey == KEY_CANCEL)
X return (exitkey);
X else
X return (0);
X}
X/* Paul J. Condie 11/88 */
SHAR_EOF
echo "File runscreen.c is complete"
chmod 0644 runscreen.c || echo "restore of runscreen.c fails"
echo "x - extracting getval.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > getval.c &&
X#ifndef LINT
Xstatic char Sccsid[] = "%W% DeltaDate %G% ExtrDate %H%";
X#endif
X
X/*
X** getval()
X** ARGS:
X** sptr - pointer to beginning of value 2b parsed
X** endch - $ process only the dollar part of value
X** - ` process only the single quote part of value
X** - " process only the double quote part of value
X** - 0 process until a space or invalid is found
X** - 1 process entire string until '\0' is found
X** RETURNS:
X** sptr - pointer to end of value 2b parsed
X** rval - the resulting value.
X**
X** var=one
X** var="one"
X** var=$var
X** var="one $var"
X** var=${var}
X** var=`ls`
X** var=one"two three"
X** var=~/
X** var=~usr/
X*/
X
X#include <stdio.h>
X#include <ctype.h>
X#include <pwd.h>
X
X#define DQUOTE '"'
X#define SQUOTE '`'
X#define LITERAL '\''
X#define DOLLAR '$'
X#define ESCAPE '\\'
X#define BRACE '{'
X#define COMCHAR '#'
X#define TILDE '~'
X#ifndef TRUE
X#define TRUE 1
X#define FALSE 0
X#endif
X
X#ifndef TEST
Xextern int debug;
X#endif
X
X
Xchar *getval (sptr, endch)
X char **sptr; /* pointer to $+1 */
X char endch;
X{
X char *getenv();
X struct passwd *getpwnam();
X FILE *popen(), *pp;
X static char value[400];
X char tmpval[400];
X static char *rval; /* pointer for return */
X int i;
X int EOV = FALSE; /* End Of Value */
X int dqflag = FALSE; /* double quote flag */
X struct passwd *pw;
X
X
X strcpy (value, "");
X rval = value;
X while (!EOV && **sptr)
X {
X switch (**sptr)
X {
X case SQUOTE:
X (*sptr)++; /* get past ' */
X for (i = 0; **sptr != '`' && **sptr; i++, (*sptr)++)
X tmpval[i] = **sptr;
X if (**sptr)
X (*sptr)++; /* get past ' */
X tmpval[i] = '\0';
X /* open pipe and read results */
X if ((pp = popen (tmpval, "r")) != NULL)
X {
X for (; ((i = fgetc(pp)) != EOF); rval++)
X {
X *rval = i ;
X if (!isprint(*rval))
X rval--;
X }
X pclose (pp);
X }
X if (endch == SQUOTE)
X {
X *rval = '\0';
X rval = value;
X return (rval);
X }
X break;
X
X case DQUOTE:
X (*sptr)++;
X dqflag = dqflag == FALSE ? TRUE : FALSE;
X if (endch == DQUOTE && dqflag == FALSE)
X {
X *rval = '\0';
X rval = value;
X return (rval);
X }
X break;
X
X case DOLLAR:
X /* Substitutable parameter */
X
X (*sptr)++; /* get past $ */
X
X /*
X ** The braces are required only when parameter is
X ** followed by a letter, digit, or underscore.
X */
X if (**sptr == BRACE)
X {
X (*sptr)++; /* get past { */
X for (i = 0; **sptr != '}' && **sptr;
X i++, (*sptr)++)
X tmpval[i] = **sptr;
X if (**sptr)
X (*sptr)++; /* get past } */
X }
X else
X {
X for (i = 0; isalnum(**sptr) || **sptr == '_';
X i++, (*sptr)++)
X tmpval[i] = **sptr;
X }
X tmpval[i] = '\0';
X if (getenv(tmpval) != (char *)NULL)
X strcpy (rval, getenv(tmpval));
X rval += strlen (rval);
X if (endch == DOLLAR)
X {
X *rval = '\0';
X rval = value;
X return (rval);
X }
X break;
X
X case TILDE:
X (*sptr)++; /* get past ~ */
X /*
X ** ~/ = $HOME
X ** ~user/ = home(user)
X */
X for (i = 0; **sptr != '/' && **sptr; i++, (*sptr)++)
X tmpval[i] = **sptr;
X tmpval[i] = '\0';
X if (strcmp (tmpval, "") == 0)
X if (getenv("LOGNAME") != (char *)NULL)
X strcpy (tmpval, getenv ("LOGNAME"));
X /*
X ** tmpval holds the user name
X ** now we get the password entry
X */
X pw = getpwnam (tmpval);
X strcpy (rval, pw->pw_dir);
X rval += strlen (pw->pw_dir);
X break;
X
X default:
X if (dqflag || **sptr != ' ' || endch == '1')
X {
X *rval++ = **sptr;
X (*sptr)++;
X }
X else
X EOV = TRUE;
X break;
X } /* end switch */
X } /* end while */
X
X *rval = '\0';
X rval = value;
X#ifndef TEST
X if (debug)
X {
X fprintf (stderr, "\n[%s] value=:%s:, :%s:",
X __FILE__, value, *sptr);
X fflush (stderr);
X }
X#endif
X return (rval);
X}
X
X
X
X#ifdef TEST
Xmain (argc, argv)
X int argc;
X char *argv[];
X{
X char *getval();
X char *sptr;
X char *rval;
X
X sptr = argv[1];
X if (argc == 3)
X rval = getval (&sptr, argv[2][0]);
X else
X rval = getval (&sptr, '1');
X printf ("\nparameter value :%s:", rval);
X printf ("\narg pointer :%s:", sptr);
X}
X#endif
X/* Paul J. Condie 5/89 */
SHAR_EOF
chmod 0644 getval.c || echo "restore of getval.c fails"
echo "x - extracting clean_menu.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > clean_menu.c &&
X#ifndef LINT
Xstatic char Sccsid[] = "@(#)clean_menu.c 1.1 DeltaDate 6/14/89 ExtrDate 1/22/90";
X#endif
X
X#include "menu.h"
X
Xclean_menu (menu)
X struct MenuInfo *menu;
X{
X int i,j;
X
X
X /*
X ** Just to keep things simple, lets start from scratch on the
X ** next menu selected.
X */
X
X /* free options */
X for (i = 0; i < menu->optioncount; i++)
X free (menu->option[i]);
X
X /* free screens */
X for (i = 0; menu->srn[i] != (struct ScreenInfo *)NULL &&
X i <= MAXSCREENS; i++)
X {
X if (menu->srn[i]->fielddefaults != (char *)NULL)
X free (menu->srn[i]->fielddefaults);
X /* free screen fields */
X for (j = 0;
X menu->srn[i]->field[j] != (struct FieldInfo *)NULL &&
X j <= MAXFIELDS; j++)
X free (menu->srn[i]->field[j]);
X free (menu->srn[i]);
X menu->srn[i] = (struct ScreenInfo *)NULL;
X }
X}
X/* Paul J. Condie 6/89 */
SHAR_EOF
chmod 0444 clean_menu.c || echo "restore of clean_menu.c fails"
echo "x - extracting System.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > System.c &&
X#ifndef LINT
Xstatic char Sccsid[] = "@(#)System.c 1.1 DeltaDate 1/22/90 ExtrDate 1/22/90";
X#endif
X
X/*
X** System()
X** Reset the effective uid/gid in case menu has the set uid bit set.
X*/
X
XSystem( cmdStr )
X char *cmdStr ;
X{
X register int uid, euid, gid, egid ;
X
X /* who am i */
X uid = getuid() ;
X euid = geteuid() ;
X gid = getgid() ;
X egid = getegid() ;
X
X /* reset back to the read id */
X setuid( uid ) ;
X setgid( gid ) ;
X
X system( cmdStr ) ;
X
X /* reset back to the fake id */
X setuid( euid ) ;
X setgid( egid ) ;
X}
X/* Sam S. Lok 11/89 */
SHAR_EOF
chmod 0444 System.c || echo "restore of System.c fails"
echo "x - extracting slength.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > slength.c &&
X#ifndef LINT
Xstatic char Sccsid[] = "@(#)slength.c 1.1 DeltaDate 1/22/90 ExtrDate 1/22/90";
X#endif
X
X/*
X** How long is a string not counting attributes.
X*/
X
Xslength (s)
X char *s;
X{
X register int i = 0;
X
X while (*s)
X {
X if (*s == '\\')
X {
X s++;
X s++;
X continue;
X }
X s++;
X i++;
X }
X return (i);
X}
X/* Paul J. Condie 11-89 */
SHAR_EOF
chmod 0444 slength.c || echo "restore of slength.c fails"
echo "x - extracting upper.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > upper.c &&
X#ifndef LINT
Xstatic char Sccsid[] = "@(#)upper.c 1.1 DeltaDate 1/22/90 ExtrDate 1/22/90";
X#endif
X
Xupper (s)
X
X char *s;
X{
X register int i;
X
X while (*s)
X {
X if (*s >= 'a' && *s <= 'z')
X *s = (*s + 'A' - 'a');
X s++;
X }
X}
SHAR_EOF
chmod 0444 upper.c || echo "restore of upper.c fails"
echo "x - extracting substr.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > substr.c &&
X/* E911 Project
X * substr()
X *
X * Purpose: To find a substring within a given string
X * Args: s1: The string being searched
X * s2: the string being searched for
X * Return: pointer to the where the searched for string resides
X * within the search string; otherwise NULL
X */
X
X
Xchar *
Xsubstr(s1, s2)
Xchar *s1;
Xchar *s2;
X{
X char *p1, *p2;
X
X for ( ; *s1; s1++) {
X if (*s1 != *s2)
X continue;
X p1 = s1 + 1;
X p2 = s2 + 1;
X while (1) {
X if (*p2 == '\0')
X return(s1);
X if (*p1++ != *p2++)
X break;
X }
X }
X return(0);
X}
X
X
X#ifdef LTEST
Xmain()
X{
X char *strtok();
X
X char *s1, *s2, *s3;
X char buffer[256];
X
X printf("ok\n");
X while (gets(buffer)) {
X s1 = strtok(buffer, " \t:\n");
X s2 = strtok(0, " \t:\n");
X printf("%s:%s:", s1, s2);
X if (s1 && s2)
X if (s3 = substr(s1, s2))
X printf("%.*s\n", strlen(s2), s3);
X else
X printf("no match\n");
X else
X printf("invalid input\n");
X }
X}
X#endif
X
X
SHAR_EOF
chmod 0666 substr.c || echo "restore of substr.c fails"
echo "x - extracting menu.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > menu.h &&
X#ifndef LINT
Xstatic char ID_menu[] = "%W% DeltaDate %G% ExtrDate %H%";
X#endif
X
X#define VERSION "3.41" /* current version */
X
X#ifndef BELL
X#define BELL printf ("%c", 7)
X#endif
X#ifndef BEEP
X#define BEEP printf ("%c", 7)
X#endif
X#ifndef NULL
X#define NULL 0
X#endif
X#define null 0
X#define MENUINIT ".menuinit" /* initialize filename */
X#define HELPFILE "menu.hlp"
X#define BORDERCHAR ' '
X#define MAXTITLE 6 /* maximum # of title lines */
X#define MAXKEYS 25 /* maximum # of keys */
X#define MAXKEYLENGTH 15 /* maximum length of keyword */
X#define MAXOPTION 60 /* max # of option 2b displayed */
X#define MAXMENU 20 /* max nested menus */
X#define MAXGNAME 20 /* max goto menu names */
X#define MAXLEN 1024 /* max length of option command */
X#define MAXSCREENS 10 /* max .DEFINE_SCREEN per menu */
X#define MAXFIELDS 20 /* max fields per .DEFINE_SCREEN */
X#define ErrRow (LINES-1) /* last line to print error message */
X#define GNAMEOFFSET 100 /* Offset return code for gnames */
X
X#define QUIT -1
X#define MAINMENU -2
X#define PREVIOUSMENU -3
X#define NOWAYJOSE -4 /* not authorized for menu */
X#define REPARSE -5 /* reparse & display the current menu */
X#define SUBMENU -99 /* a submenu was selected */
X
X#define BUFSIZE 512
X
X/* Line drawing types */
X#define DumbLine 1
X#define StandoutLine 2
X#define SingleLine 3
X#define MosaicLine 4
X#define DiamondLine 5
X#define DotLine 6
X#define PlusLine 7
X
X#define AUTO 999
X
X
X/*
X** Keys not defined in some curses.h
X*/
X
X#ifndef KEY_HELP
X# define KEY_HELP 0553
X#endif
X#ifndef KEY_REFRESH
X# define KEY_REFRESH 0565
X#endif
X#ifndef KEY_CANCEL
X# define KEY_CANCEL 0543
X#endif
X#ifndef KEY_TAB
X# define KEY_TAB '\t'
X#endif
X#ifndef KEY_BTAB
X# define KEY_BTAB 0541
X#endif
X#ifndef KEY_RETURN
X# define KEY_RETURN '\r'
X#endif
X#ifndef KEY_LINEFEED
X# define KEY_LINEFEED '\n'
X#endif
X#ifndef KEY_REFRESH
X# define KEY_REFRESH 0565
X#endif
X#ifndef KEY_BEG
X# define KEY_BEG 0542
X#endif
X#ifndef KEY_END
X# define KEY_END 0550
X#endif
X#define KEY_ACCEPT 1000
X#define KEY_MAINMENU 1001
X#define KEY_PREVMENU 1002
X#define KEY_EXITMENU 1003
X#define KEY_POPGNAME 1004
X#define KEY_GNAME 1005
X
X/*
X** MACROS
X*/
X
X#define SKIPJUNK(s) /* \
X ** This macro skips over spaces, tabs, etc. \
X ** ARGS: char *s \
X */ \
X for (;*s != '\0' && (isspace(*s)); s++) \
X ;
X
X
X/*
X** STRUCTURES
X*/
X
Xstruct MenuInfo
X{
X char name [15]; /* file name */
X int wfrow; /* window first row */
X int wlrow; /* window last row */
X int wfcol; /* window first col */
X int wlcol; /* window last col */
X int row_cursor; /* row for cursor */
X int col_cursor; /* col for cursor */
X unsigned boxtype; /* 0 = no box */
X unsigned linetype; /* same as box */
X int titlecount;
X int optioncount; /* base 0 */
X struct OptionInfo *option [MAXOPTION];
X struct ScreenInfo *srn [MAXSCREENS+1]; /* .DEFINE_SCREEN */
X /* NULL = EOL */
X};
X
X
Xstruct OptionInfo
X{
X char keyword [MAXKEYLENGTH+1];
X int opnumber; /* option number */
X char description [200];
X char command [MAXLEN];
X int row; /* row to display */
X int col; /* col to display */
X};
X
Xstruct ScreenInfo
X{
X char name [30]; /* screen name */
X char title [100]; /* window title */
X int toprow; /* upper left corner */
X char toprowvar[40];
X int leftcol;
X char leftcolvar[40];
X int rows; /* # rows in win */
X int cols; /* # cols in win */
X unsigned boxtype; /* 0 = no box */
X int exitlastfield; /* after last field */
X char helpfile[16];
X char *fielddefaults; /* init field command */
X struct FieldInfo *field [MAXFIELDS+1];
X};
X
X
Xstruct FieldInfo
X{
X char name [30]; /* field name */
X char label [50]; /* field label */
X int row; /* start position */
X int col;
X int length;
X int min_input;
X char mask [100];
X char range [1025];
X char type;
X char adjust;
X int mustenter;
X char prompt [100];
X char terminator[3]; /* field terminators */
X int noinput;
X};
SHAR_EOF
chmod 0644 menu.h || echo "restore of menu.h fails"
echo "x - extracting terminal.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > terminal.h &&
X#ifndef LINT
Xstatic char ID_terminal[] = "@(#)terminal.h 1.7 DeltaDate 1/22/90 ExtrDate 1/22/90";
X#endif
X
X/* Mover Keys */
Xextern int KeyReturn;
Xextern int KeyDown;
Xextern int KeyUp;
Xextern int KeyTab;
Xextern int KeyBTab;
X
X/* Edit Keys */
Xextern int KeyBeg;
Xextern int KeyEnd;
Xextern int KeyRight;
Xextern int KeyLeft;
Xextern int KeyBackspace;
Xextern int KeyEOL;
Xextern int KeyDL;
Xextern int KeyDC;
Xextern int KeyIC;
X
X/* Other Keys */
Xextern int KeyHelp;
Xextern int KeyRedraw;
Xextern int KeyCancel;
Xextern int KeySave;
Xextern int KeyPrint;
Xextern int KeyAccept;
X
X
X/* Menu Specific Keys */
Xextern int KeyMainMenu;
Xextern int KeyPrevMenu;
Xextern int KeyExitMenu;
Xextern int KeyGname;
Xextern int KeyPopGname;
SHAR_EOF
chmod 0444 terminal.h || echo "restore of terminal.h fails"
echo "x - extracting LexDeSrn.l (Text)"
sed 's/^X//' << 'SHAR_EOF' > LexDeSrn.l &&
X%{
X#ifndef LINT
Xstatic char Sccsid[] = "%W% DeltaDate %G% ExtrDate %H%";
X#endif
X%}
X
X%{
X#include "y.tab.h"
X#include "menu.h"
X
X#undef YYLMAX
X#define YYLMAX MAXLEN
X
Xchar *malloc();
X%}
X%%
X%{
X/*
X** Operators:
X** " \ [ ] ^ - ? . * + | ( ) $ / { } % < >
X** - match a range
X** ^ match all except or match begining of line if outside []
X** . match any character except \n
X** ? optional ab?c matches ac or abc
X** | alternation ab|cd matches either ab or cd
X** $ match end of line
X** / trailing context ab/cd matches ab only if followed by cd
X** <> start conditions
X** {} repetitions a{1,5} or definition expansion {abc}
X** % separator for source segments
X**
X** object match one occurence of object
X** object* matches zero or more occurrences of object
X** object+ matches one or more occurrences of object
X** object{m,n} match m through n occurrences of object
X*/
X%}
X
X%{ /* Screen Stuff
X%}
X"window_rows" return (SCREEN_ROWS);
X"window_title" return (SCREEN_TITLE);
X"window_cols" return (SCREEN_COLS);
X"window_border" return (SCREEN_BORDER);
X"window_pos" return (SCREEN_POS);
X"helpfile" return (SCREEN_HELP);
X"exit_last_field" return (EXIT_LAST_FIELD);
X
X%{ /* Field Stuff
X%}
X"field_name" return(FIELD_NAME);
X"field_label" return(FIELD_LABEL);
X"field_row" return (FIELD_ROW);
X"field_col" return (FIELD_COL);
X"field_mask" return (FIELD_MASK);
X"field_range" return (FIELD_RANGE);
X"field_length" return (FIELD_LENGTH);
X"field_min" return (FIELD_MIN);
X"field_type" return (FIELD_TYPE);
X"field_edits" return (FIELD_TYPE);
X"field_adjust" return (FIELD_ADJUST);
X"field_mustenter" return (FIELD_MUSTENTER);
X"field_prompt" return (FIELD_PROMPT);
X"field_terminator" return (FIELD_TERMINATOR);
X"field_defaults" return (FIELD_DEFAULTS);
X"field_noinput" return (FIELD_NOINPUT);
X
X"ENDSCREEN" return(0);
X
X
X%{ /* Comment line */
X%}
X### { while (input() != '\n'); }
X
X[0-9]+ {
X yylval.number = atoi (yytext);
X return (NUMBER);
X }
X
X%{ /* Alphanumeric string with a leading $ and alphabetic character. */
X%}
X[$][A-Za-z][A-Za-z0-9_]* {
X yylval.string = malloc(strlen(yytext)+1);
X strcpy(yylval.string,yytext);
X return (EVAR);
X }
X
X%{ /* Alphanumeric string with a leading alphabetic character. */
X%}
X[A-Za-z][A-Za-z0-9_]* {
X yylval.string = malloc(strlen(yytext)+1);
X strcpy(yylval.string,yytext);
X return (STRING);
X }
X
X%{/* Quoted string with a possible " in the string. ex. "abc\"def" */
X%}
X\"[^"]* {
X if (yytext[yyleng-1] == '\\')
X {
X yymore ();
X }
X else
X {
X int i,j;
X /*
X ** need to validate that it is a quote
X ** a core dump will occur if not.
X */
X input (); /* get last " */
X yylval.string=malloc(strlen(yytext)+1);
X for (j=0,i=1; i < strlen(yytext); i++)
X {
X if (yytext[i] == '\\' &&
X yytext[i+1] == '"')
X continue;
X yylval.string[j++] = yytext[i];
X }
X yylval.string[j] = '\0';
X return (QUOTE_STRING);
X }
X }
X
X"," return (COMMA);
X"=" return (EQUAL);
X%{/* Ignore blank, tab, newline */
X%}
X[ \t\n] ;
X%%
SHAR_EOF
chmod 0644 LexDeSrn.l || echo "restore of LexDeSrn.l fails"
echo "x - extracting menu.hlp (Text)"
sed 's/^X//' << 'SHAR_EOF' > menu.hlp &&
XTABLE_OF_CONTENTS
Xmenu.hlp menu Menus - Help using menus.
Xmenu.hlp popmenu Pop-menus - Help using popmenus.
Xmenu.hlp GETINPUT Input - Editing commands.
Xmenu.hlp help Help - Using help.
XTABLE_OF_CONTENTS
X
X
Xmenu
X.TITLE Menu Help
X
X \RMENU COMMANDS:\N
X M \D- Go directly to main menu.\N
X P \D- Return to previous menu.\N
X G or ^g \D- Go directly to a specific menu.\N
X H or ? \D- This help screen.\N
X ^r \D- Redraw the screen.\N
X E \D- Exit.\N
X ! \D- Enter a unix command.\N
X
X \RSELECTING OPTIONS:\N
X - Use "up arrow key", "^k", "down arrow key", "^j" or
X "tab key" to place bar on option and press "return".
X
X or
X
X - Enter option number and press "return".
X
Xmenu
X
X
Xpopmenu
X.TITLE Pop-Up Menu Help
XSELECTING OPTIONS:
X Use "up arrow key", "^k", "down arrow key", "^j",
X to place bar on option and press "return".
X
X or
X
X Enter the first character of the option you
X wish to select and press "return".
X
X KEY_CANCEL (esc) - Cancel selection.
Xpopmenu
X
X
XGETINPUT
X.TITLE GETINPUT Help
XMover Keys:
X KEY_RETURN (^m) Traverse forwards through the fields.
X KEY_DOWN (^j) Traverse forwards through the fields.
X KEY_UP (^k) Traverse backwards through the fields.
X KEY_TAB (^i) Fast forward through the fields.
X KEY_BTAB Fast reverse through the fields.
XField Editing Keys:
X KEY_BEG (^b) Place cursor at beginning of field.
X KEY_END (^e) Place cursor at end of input in field.
X KEY_RIGHT (^l) Forward space within the field.
X KEY_LEFT (^h) Backspace within the field (non-destructive).
X KEY_BACKSPACE (^h) Same as KEY_LEFT.
X KEY_EOL (^d) Delete from cursor to end of field.
X KEY_DL (^c) Clear field and home cursor.
X KEY_DC (^x) Delete a character.
X KEY_IC (^t) Toggle between type-over and insert mode.
XOther Keys:
X KEY_HELP (?) Display help screen.
X KEY_REFRESH (^r) Redraw the screen.
X KEY_ACCEPT (^a) Accept all input and exit screen.
X KEY_CANCEL (esc) Cancel all input and exit screen.
X KEY_SAVE (^f) Save screen to a file.
X KEY_PRINT (^p) Print screen to lp.
XGETINPUT
X
X
Xhelp
X.TITLE Using Help
XHelp displays consist of a description displayed in a window.
XIf the description doesn't fit in the window, the Up Arrow and
XDown Arrow keys can be used to view a few more lines of the
Xdisplay. Exiting the help system will return the display to
Xthe state it was in when you asked for help.
X
X The following keys are active in help:
X KEY_CANCEL (esc) Exit help.
X KEY_DOWN (^j) View a few more lines.
X KEY_UP (^k) View the previous lines.
X KEY_BEG (^b) Display first page.
X KEY_END (^e) Display last page.
X KEY_TOC (^t) Display help table of contents.
Xhelp
SHAR_EOF
chmod 0644 menu.hlp || echo "restore of menu.hlp fails"
echo "x - extracting runrealid.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > runrealid.c &&
X#ifndef LINT
Xstatic char Sccsid[] = "@(#)runrealid.c 1.1 DeltaDate 1/22/90 ExtrDate 1/22/90";
X#endif
X
X#include <stdio.h>
X
Xmain ( argc, argv )
X int argc;
X char *argv[];
X{
X register int uid, euid, gid, egid ;
X
X /* who am i */
X uid = getuid() ;
X euid = geteuid() ;
X gid = getgid() ;
X egid = getegid() ;
X
X /* reset back to the read id */
X setuid( uid ) ;
X setgid( gid ) ;
X
X system( argv[1] ) ;
X
X /* reset back to the fake id */
X setuid( euid ) ;
X setgid( egid ) ;
X}
X/* Sam S. Lok 11/89 */
SHAR_EOF
chmod 0444 runrealid.c || echo "restore of runrealid.c fails"
echo "x - extracting ParseDeSrn.y (Text)"
sed 's/^X//' << 'SHAR_EOF' > ParseDeSrn.y &&
X%{
X#ifndef LINT
Xstatic char Sccsid[] = "%W% DeltaDate %G% ExtrDate %H%";
X#endif
X%}
X
X%{
X#include <curses.h>
X#include "GetInput.h"
X#include "menu.h"
X
X#define FLD yyscreen->field[fieldcount-1]
X
X#ifdef _yydebug
Xextern int yydebug;
X#endif
Xextern int debug;
Xstruct ScreenInfo *yyscreen;
Xint fieldcount;
Xchar eott[50]; /* error on this token */
Xchar *malloc();
X%}
X%{
X/*
X** The %union declares yylval and the Yacc value stack as a C language
X** union of types specified in the body.
X**
X** The %type assigns member declared in the %union to non-terminals.
X** The %token <..> assigns member declared in the %union to terminals.
X*/
X%}
X%union{
X int number;
X char *string;
X}
X
X%token <number> NUMBER
X%token <string> STRING
X%token <string> QUOTE_STRING
X%token <string> EVAR
X%token COMMA EQUAL
X%token SCREEN_TITLE SCREEN_ROWS SCREEN_COLS SCREEN_BORDER SCREEN_POS
X%token SCREEN_HELP EXIT_LAST_FIELD
X%token FIELD_NAME FIELD_LABEL FIELD_ROW FIELD_COL FIELD_MASK FIELD_RANGE
X%token FIELD_LENGTH FIELD_MIN FIELD_TYPE FIELD_ADJUST FIELD_MUSTENTER
X%token FIELD_TERMINATOR FIELD_PROMPT FIELD_DEFAULTS FIELD_NOINPUT
X
X%%
X
X
Xscreen : valid_field
X | screen valid_field
X | screen COMMA valid_field
X ;
X
Xvalid_field : screen_pos
X {
X strcpy (eott, "window_pos");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> window_pos");
X fflush (stderr);
X }
X }
X ;
X | screen_rows
X {
X strcpy (eott, "window_rows");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> window_rows");
X fflush (stderr);
X }
X }
X ;
X | screen_cols
X {
X strcpy (eott, "window_cols");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> window_cols");
X fflush (stderr);
X }
X }
X ;
X | screen_border
X {
X strcpy (eott, "window_border");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> window_border");
X fflush (stderr);
X }
X }
X ;
X | screen_title
X {
X strcpy (eott, "window_title");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> window_title");
X fflush (stderr);
X }
X }
X ;
X | screen_help
X {
X strcpy (eott, "helpfile");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> helpfile");
X fflush (stderr);
X }
X }
X ;
X | exit_last_field
X {
X strcpy (eott, "exit_last_field");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> exit_last_field");
X fflush (stderr);
X }
X }
X ;
X
X | field_name
X {
X strcpy (eott, "field_name");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> field_name");
X fflush (stderr);
X }
X }
X ;
X | field_label
X {
X strcpy (eott, "field_label");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> field_label");
X fflush (stderr);
X }
X }
X ;
X | field_row
X {
X strcpy (eott, "field_row");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> field_row");
X fflush (stderr);
X }
X }
X ;
X | field_col
X {
X strcpy (eott, "field_col");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> field_col");
X fflush (stderr);
X }
X }
X ;
X | field_mask
X {
X strcpy (eott, "field_mask");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> field_mask");
X fflush (stderr);
X }
X }
X ;
X | field_range
X {
X strcpy (eott, "field_range");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> field_range");
X fflush (stderr);
X }
X }
X ;
X | field_length
X {
X strcpy (eott, "field_length");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> field_length");
X fflush (stderr);
X }
X }
X ;
X | field_min
X {
X strcpy (eott, "field_min");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> field_min");
X fflush (stderr);
X }
X }
X ;
X | field_type
X {
X strcpy (eott, "field_edits");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> field_edits");
X fflush (stderr);
X }
X }
X ;
X | field_adjust
X {
X strcpy (eott, "field_adjust");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> field_adjust");
X fflush (stderr);
X }
X }
X ;
X | field_mustenter
X {
X strcpy (eott, "field_mustenter");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> field_mustenter");
X fflush (stderr);
X }
X }
X ;
X | field_prompt
X {
X strcpy (eott, "field_prompt");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> field_prompt");
X fflush (stderr);
X }
X }
X ;
X | field_terminator
X {
X strcpy (eott, "field_terminator");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> field_terminator");
X fflush (stderr);
X }
X }
X ;
X | field_defaults
X {
X strcpy (eott, "field_defaults");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> field_defaults");
X fflush (stderr);
X }
X }
X ;
X
X | field_noinput
X {
X strcpy (eott, "field_noinput");
X if (debug)
X {
X fprintf (stderr,
X "\n[ParseDeSrn]<.DEFINE_SCREEN> field_noinput");
X fflush (stderr);
X }
X }
X ;
X
X
Xscreen_title : SCREEN_TITLE EQUAL STRING
X {
X strcpy (yyscreen->title, $3);
X }
X | SCREEN_TITLE EQUAL EVAR
X {
X strcpy (yyscreen->title, $3);
X /*
X strcpy (yyscreen->title, (char *)getval (&$3,'1'));
X */
X }
X | SCREEN_TITLE EQUAL QUOTE_STRING
X {
X strcpy (yyscreen->title, $3);
X /*
X strcpy (yyscreen->title, (char *)getval (&$3, '1'));
X */
X }
X ;
X
Xscreen_help : SCREEN_HELP EQUAL STRING
X {
X strcpy (yyscreen->helpfile, $3);
X }
X | SCREEN_HELP EQUAL QUOTE_STRING
X {
X strcpy (yyscreen->helpfile, $3);
X }
X ;
X
Xscreen_pos : SCREEN_POS EQUAL NUMBER NUMBER
X {
X yyscreen->toprow = $3;
X yyscreen->leftcol = $4;
X }
X | SCREEN_POS EQUAL EVAR EVAR
X {
X strcpy (yyscreen->toprowvar, $3);
X strcpy (yyscreen->leftcolvar, $4);
X /*
X yyscreen->toprow = atoi ((char *)getval (&$3, '1'));
X yyscreen->leftcol = atoi ((char *)getval (&$4, '1'));
X */
X }
X | SCREEN_POS EQUAL NUMBER EVAR
X {
X yyscreen->toprow = $3;
X strcpy (yyscreen->leftcolvar, $4);
X }
X | SCREEN_POS EQUAL EVAR NUMBER
X {
X /*
X yyscreen->toprow = atoi ((char *)getval (&$3, '1'));
X */
X strcpy (yyscreen->toprowvar, $3);
X yyscreen->leftcol = $4;
X }
X ;
X
Xscreen_rows : SCREEN_ROWS EQUAL NUMBER
SHAR_EOF
echo "End of part 6"
echo "File ParseDeSrn.y is continued in part 7"
echo "7" > s2_seq_.tmp
exit 0
More information about the Alt.sources
mailing list