menu(1) part 4 of 14
Paul J. Condie
pjc at pcbox.UUCP
Thu Dec 27 07:06:34 AEST 1990
#!/bin/sh
# this is part 4 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file rundriver.c continued
#
CurArch=4
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 rundriver.c"
sed 's/^X//' << 'SHAR_EOF' >> rundriver.c
X ++(*option);
X break;
X
X case KEY_BTAB:
X /* A back tab will hop backward 4 options at a time. */
X if (menu.optioncount > 4)
X {
X *option -= 4;
X if (*option < 0)
X *option = menu.optioncount - abs(*option);
X }
X else
X *option = *option <= 1 ? menu.optioncount:--(*option);
X break;
X
X /*
X ** This section is to highlight the selected option
X ** before the user presses the return_key to select it.
X */
X case '0':
X case '1':
X case '2':
X case '3':
X case '4':
X case '5':
X case '6':
X case '7':
X case '8':
X case '9':
X sprintf (select, "%s%c", select, exitkey);
X if (matoi (select) < 1 ||
X matoi (select) > lastopnumber)
X {
X /* Invalid Option */
X attrset (A_REVERSE);
X mvprintw (ErrRow, 0, "To select an option enter the option number and press return.");
X attrset (A_NORMAL);
X select[0] = '\0';
X }
X else
X {
X /* find the element cooresponding to opnumber */
X for (i = 0; i < menu.optioncount; i++)
X if (matoi(select) == menu.option[i]->opnumber)
X {
X *option = i+1;
X break;
X }
X }
X break;
X
X case 'A':
X case 'B':
X case 'C':
X case 'D':
X case 'E':
X case 'F':
X case 'G':
X case 'H':
X case 'I':
X case 'J':
X case 'K':
X case 'L':
X case 'M':
X case 'N':
X case 'O':
X case 'P':
X case 'Q':
X case 'R':
X case 'S':
X case 'T':
X case 'U':
X case 'V':
X case 'W':
X case 'X':
X case 'Y':
X case 'Z':
X case ' ':
X /* character matching */
X sprintf (matchstr, "%s%c", matchstr, exitkey);
X MATCHED = FALSE;
X for (i = 0; i < menu.optioncount; i++)
X {
X strcpy (command, menu.option[i]->description);
X upper (command);
X if (strncmp (command, matchstr,
X strlen(matchstr)) == 0)
X {
X MATCHED = TRUE;
X sprintf (select, "%d",
X menu.option[i]->opnumber);
X *option = i + 1;
X break;
X }
X }
X if (!MATCHED)
X strcpy (matchstr, "");
X break;
X
X case KEY_EXITMENU:
X /* check if we have a .EXIT option */
X for (i = 0; i < menu.optioncount; i++)
X if (strcmp (menu.option[i]->keyword, ".EXIT") == 0)
X RunExit (&menu, i, KeyWord, ParseKey, ShowKey,
X RunKey, gnames, gfiles, gindex);
X return (QUIT);
X
X case KEY_MAINMENU:
X return (MAINMENU);
X
X case KEY_PREVMENU:
X return (PREVIOUSMENU);
X
X case '!':
X /*
X ** Shell Option.
X ** Prompt user for a command to be executed within a
X ** shell (system(1)).
X */
X select[0] = '\0';
X mvaddch (ErrRow, 0, '!');
X move (ErrRow, 1);
X echo ();
X refresh ();
X#ifdef ALARM
X alarm (0); /* turn off mail check */
X signal (SIGALRM, SIG_IGN);
X#endif
X getstr (select);
X#ifdef ALARM
X if (MAILCALL)
X checkmail ();
X#endif
X noecho ();
X sprintf (command, "%s;runrealid \"%s\";%s;%s",
X#if BSD || SUN
X "clear",
X#else
X "tput clear",
X#endif
X select,
X "echo \"\\n[Press return to continue]\\c\"",
X "read reply");
X reset_shell_mode ();
X signal (SIGINT, shutdown);
X signal (SIGQUIT, shutdown);
X system (command);
X if (trapsigs)
X {
X signal (SIGINT, SIG_IGN);
X signal (SIGQUIT, SIG_IGN);
X }
X reset_prog_mode ();
X keypad (stdscr, TRUE);
X move (ErrRow,0);
X clrtoeol ();
X select[0] = '\0';
X matchstr[0] = '\0';
X clearok (stdscr, TRUE);
X break;
X
X case KEY_HELP:
X /*
X ** Show Help Screen Option.
X ** Search directories for a menu.hlp file.
X ** If found display to screen.
X */
X strcpy (command, findfile ("menu.hlp", ".",
X getenv("HELPDIR"), getenv("MENUDIR"),
X ""));
X#ifdef ALARM
X alarm (0); /* turn off mail check */
X signal (SIGALRM, SIG_IGN);
X#endif
X ShowHelp (command, "menu", ErrRow);
X#ifdef ALARM
X if (MAILCALL)
X checkmail ();
X#endif
X clearok (stdscr, TRUE);
X select[0] ='\0';
X matchstr[0] ='\0';
X break;
X
X case KEY_GNAME:
X /*
X ** Goto Menu option
X ** Prompt user for the Gname (goto menu name)
X ** that the user wants to go to.
X ** And then return GNAMEOFFSET + gindex to main.
X ** The > GNAMEOFFSET indicates a goto menu option.
X */
X select[0] = '\0';
X echo ();
X mvprintw (ErrRow, 0, "Goto ");
X#ifdef ALARM
X alarm (0); /* turn off mail check */
X signal (SIGALRM, SIG_IGN);
X#endif
X getstr (select);
X#ifdef ALARM
X if (MAILCALL)
X checkmail ();
X#endif
X noecho ();
X for (i = 0; i < gindex; i++)
X {
X if (strcmp (select, gnames[i]) == 0)
X return (GNAMEOFFSET + i);
X }
X BEEP;
X attrset (A_REVERSE);
X mvprintw (ErrRow, 0, "[%s] not found.", select);
X attrset (A_NORMAL);
X select[0] = '\0';
X matchstr[0] ='\0';
X break;
X
X case KEY_RETURN:
X case KEY_LINEFEED:
X /*
X ** We now take an action based upon what is in
X ** select - that which the user typed in.
X */
X if (select[0] == KeyExitMenu)
X {
X /* check if we have a .EXIT option */
X for (i = 0; i < menu.optioncount; i++)
X if (strcmp (menu.option[i]->keyword,
X ".EXIT") == 0)
X {
X RunExit (&menu, i, KeyWord,
X ParseKey, ShowKey, RunKey,
X gnames, gfiles, gindex);
X break;
X }
X return (QUIT);
X }
X if (select[0] == KeyMainMenu) return (MAINMENU);
X if (select[0] == KeyPrevMenu) return (PREVIOUSMENU);
X
X /*
X ** Goto Menu option
X ** Prompt user for the Gname (goto menu name)
X ** that the user wants to go to.
X ** And then return GNAMEOFFSET + gindex to main.
X ** The > GNAMEOFFSET indicates a goto menu option.
X */
X if (select[0] == KeyGname)
X {
X select[0] = '\0';
X echo ();
X mvprintw (ErrRow, 0, "Goto ");
X#ifdef ALARM
X alarm (0); /* turn off mail check */
X signal (SIGALRM, SIG_IGN);
X#endif
X getstr (select);
X#ifdef ALARM
X if (MAILCALL)
X checkmail ();
X#endif
X noecho ();
X for (i = 0; i < gindex; i++)
X {
X if (strcmp (select, gnames[i]) == 0)
X return (GNAMEOFFSET + i);
X }
X BEEP;
X attrset (A_REVERSE);
X mvprintw (ErrRow, 0, "[%s] not found.", select);
X attrset (A_NORMAL);
X select[0] = '\0';
X matchstr[0] ='\0';
X break;
X }
X
X /*
X ** Show Help Screen Option.
X ** Search directories for a menu.hlp file.
X ** If found display to screen.
X */
X if (select[0] == KeyHelp)
X {
X strcpy (command, findfile ("menu.hlp",
X ".", getenv("HELPDIR"),
X getenv("MENUDIR"), ""));
X#ifdef ALARM
X alarm (0); /* turn off mail check */
X signal (SIGALRM, SIG_IGN);
X#endif
X ShowHelp (command, "menu", ErrRow);
X#ifdef ALARM
X if (MAILCALL)
X checkmail ();
X#endif
X clearok (stdscr, TRUE);
X select[0] ='\0';
X matchstr[0] ='\0';
X break;
X }
X
X
X /*
X ** The user has manually typed in a option to be
X ** executed. Execute the appropriate option.
X */
X if (strlen (select) > 0)
X {
X index = matoi (select);
X if (index < 1 || index > lastopnumber)
X {
X /* Invalid Option */
X attrset (A_REVERSE);
X mvprintw (ErrRow, 0, "To select an option enter the option number and press return.");
X attrset (A_NORMAL);
X select[0] = '\0';
X break;
X }
X /* find the element cooresponding to opnumber */
X for (i = 0; i < menu.optioncount; i++)
X if (index == menu.option[i]->opnumber)
X {
X *option = i+1;
X break;
X }
X }
X
X /*
X ** Run the option the user selected.
X */
X for (i = 1; i <= MAXKEYS; i++)
X if (strcmp (menu.option[*option-1]->keyword,
X KeyWord[i]) == 0)
X {
X if (RunKey[i] != NULL)
X {
X#ifdef ALARM
X alarm (0); /* turn off mail */
X signal (SIGALRM, SIG_IGN);
X#endif
X exitkey = (*RunKey[i]) (&menu, *option-1, KeyWord,
X ParseKey, ShowKey, RunKey,
X gnames, gfiles, gindex);
X /* .MENU is a special case */
X if (exitkey == SUBMENU)
X return (*option-1);
X if (exitkey == MAINMENU)
X return (MAINMENU);
X if (exitkey == PREVIOUSMENU)
X return (PREVIOUSMENU);
X if (exitkey == QUIT)
X return (QUIT);
X if (exitkey == REPARSE)
X return (REPARSE);
X if (exitkey >= GNAMEOFFSET &&
X exitkey <= GNAMEOFFSET + gindex)
X return (exitkey);
X#ifdef ALARM
X if (MAILCALL)
X checkmail ();
X#endif
X }
X break;
X }
X select[0] = '\0';
X matchstr[0] = '\0';
X break;
X
X default:
X if (exitkey == KeyPopGname && gindex > 0)
X {
X /*
X ** Popup menu for goto names.
X */
X#ifdef ALARM
X alarm (0); /* turn off mail check */
X signal (SIGALRM, SIG_IGN);
X#endif
X popmenu (INITMENU, GOTOMENU, gotorow, gotocol,
X "GOTO MENU", HELPFILE, LINES-2,
X sizeof(gnames[0]), gnames);
X
X move (ErrRow,0);
X clrtoeol ();
X BEEP;
X mvprintw (ErrRow, 0, "Goto what menu ?");
X refresh ();
X exitkey = popmenu (GOTOMENU, (char *)NULL);
X touchwin (stdscr);
X refresh ();
X#ifdef ALARM
X if (MAILCALL)
X checkmail ();
X#endif
X if (exitkey >= 1 && exitkey <= gindex)
X return (GNAMEOFFSET + exitkey-1);
X }
X
X move (ErrRow,0);
X clrtoeol ();
X mvprintw (ErrRow, 0, "Say What.");
X select[0] = '\0';
X matchstr[0] = '\0';
X break;
X }
X }
X}
X
X
X
X/*
X** My ascii to integer
X** Return -1 if string contains more than digits.
X*/
Xmatoi (s)
X char *s;
X{
X int value;
X
X value = atoi (s);
X while (*s)
X {
X if (*s < '0' || *s > '9')
X return (-1);
X s++;
X }
X return (value);
X}
X
X
X
Xsetoption (row, col)
X int row;
X int col;
X{
X static int *saveoption;
X int newoption;
X int rc;
X int j;
X int ch;
X int found;
X
X /* find the option associated with this row/col */
X found = FALSE;
X for (newoption = 0; newoption < menu.optioncount; newoption++)
X {
X if (row == menu.option[newoption]->row &&
X (col >= menu.option[newoption]->col &&
X col <= (menu.option[newoption]->col +
X strlen(menu.option[newoption]->description))))
X {
X found = TRUE;
X break;
X }
X }
X newoption++; /* base 1 */
X if (debug)
X {
X fprintf (stderr, "\n[%s] newoption %d, %s, row %d, col %d",
X __FILE__,
X newoption, menu.option[newoption]->description,
X row, col);
X fflush (stderr);
X }
X if (!found || newoption == tmpoption)
X return;
X
X
X
X /* unhighlight current option */
X#ifdef BSD
X standend ();
X#else
X attrset (A_NORMAL);
X#endif
X if (ShowKey[ckik] != NULL)
X {
X mvaddch (menu.option[(tmpoption)-1]->row,
X menu.option[(tmpoption)-1]->col-1, ' ');
X strcat (menu.option[(tmpoption)-1]->description, " ");
X (*ShowKey[ckik]) (&menu, tmpoption-1);
X menu.option[(tmpoption)-1]->description[strlen(menu.option[(tmpoption)-1]->description)-1] = '\0';
X }
X
X
X tmpoption = newoption;
X /* highlight new option */
X for (ckik = 1; ckik <= MAXKEYS && KeyWord[ckik] != NULL;
X ckik++)
X {
X if (strcmp (menu.option[(tmpoption)-1]->keyword,
X KeyWord[ckik]) == 0)
X {
X if (ShowKey[ckik] != NULL)
X {
X /* display option */
X (*ShowKey[ckik]) (&menu, (tmpoption)-1);
X mvaddch (menu.option[(tmpoption)-1]->row,
X menu.option[(tmpoption)-1]->col-1, ' ');
X /*
X ** turn on reverse video
X ** maintaining current attributes
X */
X rc = slength(menu.option[(tmpoption)-1]->description) + menu.option[(tmpoption)-1]->col + 5;
X for (j = menu.option[(tmpoption)-1]->col-1; j <= rc; j++)
X {
X ch = mvinch (menu.option[(tmpoption)-1]->row, j);
X ch |= A_REVERSE;
X mvaddch (menu.option[(tmpoption)-1]->row, j, ch);
X }
X
X }
X break;
X } /* end if */
X }
X
X#ifdef BSD
X standend ();
X#else
X attrset (A_NORMAL);
X#endif
X refresh ();
X}
SHAR_EOF
echo "File rundriver.c is complete"
chmod 0644 rundriver.c || echo "restore of rundriver.c fails"
echo "x - extracting ParseOpton.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ParseOpton.c &&
Xstatic char Sccsid[] = "%W% DeltaDate %G% ExtrDate %H%";
X
X/* FUNCTION: ParseOption()
X** This function parses user selectable options.
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#include <curses.h>
X#include "menu.h"
X
Xextern int swin, ewin, longest;
Xextern int debug;
X
X
XParseOption (keyword, menufile, menu, KeyWord, ParseKey, gnames, gfiles,
Xgindex, opnumber)
X
X char keyword[];
X FILE *menufile;
X struct MenuInfo *menu;
X char KeyWord[][MAXKEYLENGTH];
X int (*ParseKey[])();
X char gnames[][15], gfiles[][15];
X int *gindex;
X int *opnumber;
X{
X struct OptionInfo *malloc();
X char *getval();
X char *fgets(), line[MAXLEN+100];
X int i = 0;
X int j;
X char *ws;
X
X
X if (menu->optioncount >= MAXOPTION)
X {
X BEEP;
X mvprintw (ErrRow-2, 0, "Exceeded maximum allowable options.");
X shutdown ();
X }
X menu->option[menu->optioncount] = malloc (sizeof (struct OptionInfo));
X if (menu->option[menu->optioncount] == NULL)
X {
X BEEP;
X mvprintw (ErrRow-2, 0, "Unable to allocate memory for option.");
X shutdown ();
X }
X
X strcpy (menu->option[menu->optioncount]->keyword, keyword);
X
X /*
X ** Read in option command
X ** strcat continuation lines
X */
X fgets (line, sizeof(line)-1, menufile);
X line[strlen(line)-1] = '\0'; /* get rid of \n */
X while (line[strlen(line)-1] == '\\')
X {
X if (strlen(line) >= MAXLEN)
X {
X BEEP;
X mvprintw (ErrRow-2, 0,
X "Option command is too long. Max = %d",MAXLEN);
X shutdown ();
X }
X line[strlen(line)-1] = '\n'; /* replace \ with \n */
X fgets (line+strlen(line), sizeof(line)-1, menufile);
X line[strlen(line)-1] = '\0'; /* get rid of \n */
X }
X menu->option[menu->optioncount]->command =
X (char *) malloc (strlen(line)+5);
X strcpy (menu->option[menu->optioncount]->command, line);
X if (debug)
X {
X fprintf (stderr, "\n[ParseOpton] <%s> command=:%s:",
X keyword, menu->option[menu->optioncount]->command);
X fflush (stderr);
X }
X
X /*
X ** Read in option description
X */
X fgets (line, BUFSIZE+1, menufile);
X line[strlen(line)-1] = '\0';
X for (j = 0, i = 0; i < strlen (line); j++, i++)
X if (line[i] == '$')
X {
X char *sptr, *b4ptr;
X
X sptr = b4ptr = line+i;
X strcpy (menu->option[menu->optioncount]->description+j,
X getval (&sptr, '$'));
X i += (int)(sptr - b4ptr);
X j += strlen (menu->option[menu->optioncount]->description+j) - 1;
X i--;
X }
X else
X {
X menu->option[menu->optioncount]->description[j] = line[i];
X }
X menu->option[menu->optioncount]->description[j] = '\0';
X
X
X /*
X ** Determine length of longest option
X */
X if (slength (menu->option[menu->optioncount]->description) > longest)
X longest = slength(menu->option[menu->optioncount]->description);
X
X /* set option number 2b displayed */
X (*opnumber)++;
X menu->option[menu->optioncount]->opnumber = *opnumber;
X
X menu->optioncount++;
X ewin++;
X return (0);
X}
SHAR_EOF
chmod 0644 ParseOpton.c || echo "restore of ParseOpton.c fails"
echo "x - extracting ParseBaner.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ParseBaner.c &&
Xstatic char Sccsid[] = "%W% DeltaDate %G% ExtrDate %H%";
X
X/* FUNCTION: ParseBanner()
X** Parses the "BANNER" keyword.
X** RETURNS: 0
X*/
X
X#include <curses.h>
X#include "menu.h"
X
X
XParseBanner (keyword, menufile, menu, KeyWord, ParseKey, gnames, gfiles,
X gindex, opnumber)
X
X char keyword[];
X FILE *menufile;
X struct MenuInfo *menu;
X char KeyWord[][MAXKEYLENGTH];
X int (*ParseKey[])();
X char gnames[][15], gfiles[][15];
X int *gindex;
X int *opnumber;
X{
X static int onetime = FALSE; /* show only 1 time */
X int row, col, rstart, rstop, cstart, cstop;
X int ulc=0, llc=0, linecount, increment;
X char flag[5], tophalf[4][30], lower[4][30];
X
X
X fscanf (menufile, "%d", &linecount);
X
X/*
X** Load the input banner text into tophalf and lower arrays.
X*/
X
X for (row = 1; row <= linecount; row++)
X {
X fscanf (menufile, "%s", flag);
X if (strncmp (flag, ".U", 2) == 0)
X {
X fgets (tophalf[ulc], 80, menufile);
X tophalf[ulc][strlen(tophalf[ulc])-1] = '\0';
X ulc++;
X }
X else
X {
X fgets (lower[llc], 80, menufile);
X lower[llc][strlen(lower[llc])-1] = '\0';
X llc++;
X }
X }
X
X if (onetime)
X return (0);
X onetime++;
X
X#ifdef BSD
X standout ();
X#else
X attrset (A_STANDOUT);
X#endif
X for (rstart = 24/2-1, rstop = 24/2+1,
X cstart = COLS/2-2, cstop = COLS/2+1;
X rstart >= 0 && rstop <= 23 && cstart >= 0 && cstop <= COLS-1;
X rstart--, rstop++, cstart-=3, cstop+=3)
X {
X for (row = rstart; row <= rstop; row++)
X {
X if (row == rstart || row == rstop)
X {
X for (col = cstart; col <= cstop; col++)
X mvaddch (row, col, BORDERCHAR);
X }
X else
X {
X mvaddch (row, cstart, BORDERCHAR);
X mvaddch (row, cstop, BORDERCHAR);
X }
X }
X refresh ();
X }
X
X increment = 2;
X for (rstart = rstart+3, rstop=rstop-2, cstart = cstart+1, cstop = cstop-1;
X cstart >= 0 && cstop <= COLS-1;
X rstart++, rstop--, cstart-=increment, cstop+=increment)
X {
X for (row = 1; row <= 23; row++)
X {
X if (row < rstart || row > rstop)
X {
X for (col = cstart; col <= cstart+increment; col++)
X mvaddch (row, col, BORDERCHAR);
X for (col = cstop-increment; col <= cstop; col++)
X mvaddch (row, col, BORDERCHAR);
X }
X else
X {
X mvaddch (row, cstart, BORDERCHAR);
X mvaddch (row, cstop, BORDERCHAR);
X }
X }
X refresh ();
X }
X
X#ifdef BSD
X standout ();
X#else
X attrset (A_REVERSE);
X#endif
X for (row = 0; ulc > 0; row++, ulc--)
X mvprintw (row+4, COLS/2-strlen(tophalf[row])/2-1, "%s", tophalf[row]);
X for (row = 0; llc > 0; row++, llc--)
X mvprintw (row+17, COLS/2-strlen(lower[row])/2-1, "%s", lower[row]);
X
X mvprintw (23, 27, "Press return to continue");
X move (23,0);
X getch ();
X refresh ();
X#ifdef BSD
X standend ();
X#else
X attrset (A_NORMAL);
X#endif
X move (0,0); clrtobot ();
X return (0);
X}
SHAR_EOF
chmod 0644 ParseBaner.c || echo "restore of ParseBaner.c fails"
echo "x - extracting ParseTitle.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ParseTitle.c &&
Xstatic char Sccsid[] = "%W% DeltaDate %G% ExtrDate %H%";
X
X/* FUNCTION: ParseTitle()
X** Parses keyword "TITLE".
X** ARGS: keyword the keyword "TITLE"
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#include <curses.h>
X#include "menu.h"
X
X
Xextern int MAILCALL;
Xextern int mailrow;
Xextern int mailcol;
X
X
XParseTitle (keyword, menufile, menu, KeyWord, ParseKey, gnames, gfiles,
X gindex, opnumber)
X
X char keyword[];
X FILE *menufile;
X struct MenuInfo *menu;
X char KeyWord[][MAXKEYLENGTH];
X int (*ParseKey[])();
X char gnames[][15], gfiles[][15];
X int *gindex;
X int *opnumber;
X{
X char *fgets(), line[201];
X char *getenv();
X char *getval();
X char section[3][201]; /* section[0] = left justified */
X /* section[1] = centered */
X /* section[2] = right justified */
X int i = 0; /* index into line */
X int j; /* index into section */
X int k, row, col;
X char *ws;
X int mailsection=999; /* section $MAIL was found */
X /* we set to 999 so sub menus */
X /* that don't have a $MAIL wont */
X /* recalculate mailcol */
X
X
X
X fgets (line, 200, menufile);
X
X/*
X** Get title line
X*/
X fgets (line, 200, menufile);
X line[strlen(line)-1] = '\0';
X
X section[0][0] = section[1][0] = section[2][0] = '\0';
X
X/*
X** Now we break input line into left, center, and right sections
X** Loop through each section.
X*/
X
X for (k = 0; k <= 2; k++)
X {
X /* Loop through each character of line until we find next section */
X for (j = 0; i < strlen (line) && strncmp (line+i, "...", 3) != 0;
X i++, j++)
X {
X if (strncmp (line+i, "$DATE", 5) == 0)
X {
X sysdate (section[k]+j, "mm/dd/yy");
X j += 7;
X i += 4;
X }
X else
X if (strncmp (line+i, "$TIME", 5) == 0)
X {
X systime (section[k]+j, "HH:MM zz");
X j += 7;
X i += 4;
X }
X else
X if (strncmp (line+i, "$MAIL", 5) == 0)
X {
X /*
X ** User wants 2b notified when mail arrives.
X ** The mailfile is located in enviroment $MAIL
X ** if the mailfile exists and size is greater than zero
X ** mailfile = getenv("$MAIL")
X ** We need to process entire line b4 we find mailcol
X */
X MAILCALL = TRUE;
X strcpy (section[k]+j, "mAiL"); /* unique ? */
X mailrow = menu->titlecount;
X mailsection = k;
X i += 4; /* get past $MAIL */
X j += 3; /* for "MAIL" */
X }
X else
X /*
X ** A environment variable
X */
X if (line[i] == '$')
X {
X char *sptr, *b4ptr;
X
X sptr = b4ptr = line+i;
X strcpy (section[k]+j, getval (&sptr, '$'));
X i += (int)(sptr - b4ptr);
X j += strlen (section[k]+j) - 1;
X i--;
X }
X else
X section[k][j] = line[i];
X }
X section[k][j] = '\0';
X i += 3;
X }
X
X if (menu->titlecount >= MAXTITLE)
X {
X BEEP;
X mvprintw (ErrRow, 0, "Number of Title lines exceed the maximim.");
X shutdown ();
X }
X (menu->titlecount)++;
X (menu->wfrow)++; /* reduce window size to center in */
X
X
X/*
X** Now we display the three sections to the screen
X*/
X
X for (k = 0; k <= 2; k++)
X {
X/*
X** First we must find out what column to start displaying on.
X** Taking into account the terminal attribute characters.
X*/
X switch (k)
X {
X case 0:
X /* left justified */
X row = menu->titlecount - 1;
X col = 0;
X break;
X case 1:
X /* center */
X for (i = 0, j = 0; section[k][i] != '\0'; i++)
X if (section[k][i] == '\\') j++;
X col = COLS/2-(strlen(section[k])-j*2)/2;
X col -= (((strlen(section[k])-j*2) % 2) == 0) ? 0 : 1;
X row = menu->titlecount - 1;
X move (menu->titlecount-1, i);
X break;
X case 2:
X /* right justify */
X for (i = 0, j = 0; section[k][i] != '\0'; i++)
X if (section[k][i] == '\\') j++;
X row = menu->titlecount - 1;
X col = COLS-strlen(section[k])+j*2;
X break;
X } /* end switch */
X
X if (MAILCALL && mailsection == k)
X {
X /* find mailcol - remember the attributes */
X for (i = 0, j = 0; section[k][i] != '\0' &&
X strncmp (section[k]+i, "mAiL", 4) != 0; i++)
X if (section[k][i] == '\\') j++;
X mailcol = i - j*2 + col; /* for \R */
X memcpy (section[k]+i, " ", 4); /* get rid of mAiL */
X }
X
X displaytext (stdscr, row, col, section[k]);
X } /* end for loop */
X#ifdef ALARM
X if (MAILCALL)
X checkmail ();
X#endif
X return (0);
X}
SHAR_EOF
chmod 0644 ParseTitle.c || echo "restore of ParseTitle.c fails"
echo "x - extracting ParseBox.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ParseBox.c &&
Xstatic char Sccsid[] = "@(#)ParseBox.c 1.7 DeltaDate 1/22/90 ExtrDate 1/22/90";
X
X/* FUNCTION: ParseBox()
X** Parses keyword ".BOX".
X** ARGS: keyword the keyword "BOX"
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*/
X
X#include <curses.h>
X#include <ctype.h>
X#include "menu.h"
X
X
XParseBox (keyword, menufile, menu, KeyWord, ParseKey, gnames, gfiles,
X gindex, opnumber)
X
X char keyword[];
X FILE *menufile;
X struct MenuInfo *menu;
X char KeyWord[][MAXKEYLENGTH];
X int (*ParseKey[])();
X char gnames[][15], gfiles[][15];
X int *gindex;
X int *opnumber;
X{
X char *fgets(), line[BUFSIZE+1];
X char boxtype[30];
X char *sptr;
X
X /* Default Values */
X menu->boxtype = StandoutLine;
X menu->boxtype = menu->boxtype | (DumbLine << 9);
X
X fgets (line, BUFSIZE, menufile);
X sptr = line;
X SKIPJUNK(sptr);
X
X /* get border type for active menu */
X sscanf (sptr, "%s", boxtype);
X sptr += strlen(boxtype);
X if (strcmp (boxtype, "DumbLine") == 0)
X menu->boxtype = DumbLine;
X else if (strcmp (boxtype, "StandoutLine") == 0)
X menu->boxtype = StandoutLine;
X else if (strcmp (boxtype, "SingleLine") == 0 ||
X strcmp (boxtype, "DrawLine") == 0)
X menu->boxtype = SingleLine;
X else if (strcmp (boxtype, "MosaicLine") == 0)
X menu->boxtype = MosaicLine;
X else if (strcmp (boxtype, "DiamondLine") == 0)
X menu->boxtype = DiamondLine;
X else if (strcmp (boxtype, "DotLine") == 0)
X menu->boxtype = DotLine;
X else if (strcmp (boxtype, "PlusLine") == 0)
X menu->boxtype = PlusLine;
X
X /* get border type for inactive menu - dim (high 8 bits) */
X sscanf (sptr, "%s", boxtype);
X sptr += strlen(boxtype);
X if (strcmp (boxtype, "DumbLine") == 0)
X menu->boxtype = menu->boxtype | (DumbLine << 9);
X else if (strcmp (boxtype, "StandoutLine") == 0)
X menu->boxtype = menu->boxtype | (DumbLine << 9);
X else if (strcmp (boxtype, "SingleLine") == 0 ||
X strcmp (boxtype, "DrawLine") == 0)
X menu->boxtype = menu->boxtype | (SingleLine << 9);
X else if (strcmp (boxtype, "MosaicLine") == 0)
X menu->boxtype = menu->boxtype | (MosaicLine << 9);
X else if (strcmp (boxtype, "DiamondLine") == 0)
X menu->boxtype = menu->boxtype | (DiamondLine << 9);
X else if (strcmp (boxtype, "DotLine") == 0)
X menu->boxtype = menu->boxtype | (DotLine << 9);
X else if (strcmp (boxtype, "PlusLine") == 0)
X menu->boxtype = menu->boxtype | (PlusLine << 9);
X
X drawbox (stdscr, 1,1, LINES-1,COLS, menu->boxtype & 0777, StandoutLine,
X FALSE, FALSE);
X return (0);
X}
SHAR_EOF
chmod 0444 ParseBox.c || echo "restore of ParseBox.c fails"
echo "x - extracting ParseWindo.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ParseWindo.c &&
Xstatic char Sccsid[] = "%W% DeltaDate %G% ExtrDate %H%";
X
X/* FUNCTION: ParseWindow()
X** Parses keyword ".WINDOW".
X** ARGS: keyword the keyword "WINDOW"
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#include <curses.h>
X#include "menu.h"
X
Xextern int swin, ewin, longest;
X
XParseWindow (keyword, menufile, menu, KeyWord, ParseKey, gnames, gfiles,
X gindex, opnumber)
X
X char keyword[];
X FILE *menufile;
X struct MenuInfo *menu;
X char KeyWord[][MAXKEYLENGTH];
X int (*ParseKey[])();
X char gnames[][15], gfiles[][15];
X int *gindex;
X int *opnumber;
X{
X int i, j, row, col;
X char line[BUFSIZE];
X
X
X EndWindow (menu);
X
X fscanf (menufile, "%d", &menu->wfrow);
X if (menu->wfrow < 0) menu->wfrow = 0;
X if (menu->wfrow < menu->titlecount) menu->wfrow = menu->titlecount;
X if (menu->wfrow > LINES-1) menu->wfrow = LINES-1;
X fscanf (menufile, "%d", &menu->wlrow);
X if (menu->wlrow < 0) menu->wlrow = 0;
X if (menu->wlrow > LINES-1) menu->wlrow = LINES-1;
X fscanf (menufile, "%d", &menu->wfcol);
X if (menu->wfcol < 0) menu->wfcol = 0;
X if (menu->wfcol > COLS-1) menu->wfcol = COLS-1;
X fscanf (menufile, "%d", &menu->wlcol);
X if (menu->wlcol < 0) menu->wlcol = 0;
X if (menu->wlcol > COLS-1) menu->wlcol = COLS-1;
X
X/*
X** Now lets read in the window heading.
X*/
X fgets (line, BUFSIZE+1, menufile);
X line[strlen(line)-1] = '\0';
X
X/*
X** Determine where to display heading.
X*/
X for (i = 0, j = 0; line[i] != '\0'; i++)
X if (line[i] == '\\') j++;
X row = menu->wfrow - 1;
X col = (menu->wlcol - menu->wfcol)/2-(strlen(line)-1-j*2)/2 + menu->wfcol;
X col -= (((strlen(line)-1-j*2) % 2) == 0) ? 0 : 1;
X if (strlen(line) > 0) displaytext (stdscr, row, col, line+1);
X
X longest = 0;
X swin = ewin;
X return (0);
X}
SHAR_EOF
chmod 0644 ParseWindo.c || echo "restore of ParseWindo.c fails"
echo "x - extracting ParseLine.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ParseLine.c &&
Xstatic char Sccsid[] = "@(#)ParseLine.c 1.6 DeltaDate 1/22/90 ExtrDate 1/22/90";
X
X/* FUNCTION: ParseLine()
X** Parses keyword "LINE".
X** ARGS: keyword the keyword "LINE"
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*/
X
X#include <curses.h>
X#include <ctype.h>
X#include "menu.h"
X
X
X
XParseLine (keyword, menufile, menu, KeyWord, ParseKey, gnames, gfiles,
X gindex, opnumber)
X
X char keyword[];
X FILE *menufile;
X struct MenuInfo *menu;
X char KeyWord[][MAXKEYLENGTH];
X int (*ParseKey[])();
X char gnames[][15], gfiles[][15];
X int *gindex;
X int *opnumber;
X{
X int col;
X char *fgets(), line[BUFSIZE+1];
X char linetype[30];
X char *sptr;
X
X
X /* default values */
X menu->linetype = StandoutLine;
X menu->linetype = menu->linetype | (DumbLine << 9);
X
X fgets (line, BUFSIZE, menufile);
X sptr = line;
X SKIPJUNK(sptr);
X
X /* get border type for active menu */
X sscanf (sptr, "%s", linetype);
X sptr += strlen(linetype);
X if (strcmp (linetype, "DumbLine") == 0)
X menu->linetype = DumbLine;
X else if (strcmp (linetype, "StandoutLine") == 0)
X menu->linetype = StandoutLine;
X else if (strcmp (linetype, "SingleLine") == 0 ||
X strcmp (linetype, "DrawLine") == 0)
X menu->linetype = SingleLine;
X else if (strcmp (linetype, "MosaicLine") == 0)
X menu->linetype = MosaicLine;
X else if (strcmp (linetype, "DiamondLine") == 0)
X menu->linetype = DiamondLine;
X else if (strcmp (linetype, "DotLine") == 0)
X menu->linetype = DotLine;
X else if (strcmp (linetype, "PlusLine") == 0)
X menu->linetype = PlusLine;
X
X /* get border type for inactive menu - dim (high 8 bits) */
X sscanf (sptr, "%s", linetype);
X sptr += strlen(linetype);
X if (strcmp (linetype, "DumbLine") == 0)
X menu->linetype = menu->linetype | (DumbLine << 9);
X else if (strcmp (linetype, "StandoutLine") == 0)
X menu->linetype = menu->linetype | (DumbLine << 9);
X else if (strcmp (linetype, "SingleLine") == 0 ||
X strcmp (linetype, "DrawLine") == 0)
X menu->linetype = menu->linetype | (SingleLine << 9);
X else if (strcmp (linetype, "MosaicLine") == 0)
X menu->linetype = menu->linetype | (MosaicLine << 9);
X else if (strcmp (linetype, "DiamondLine") == 0)
X menu->linetype = menu->linetype | (DiamondLine << 9);
X else if (strcmp (linetype, "DotLine") == 0)
X menu->linetype = menu->linetype | (DotLine << 9);
X else if (strcmp (linetype, "PlusLine") == 0)
X menu->linetype = menu->linetype | (PlusLine << 9);
X
X drawline (stdscr, menu->titlecount, menu->linetype&0777, StandoutLine,
X menu->boxtype);
X
X menu->titlecount++;
X return (0);
X}
SHAR_EOF
chmod 0444 ParseLine.c || echo "restore of ParseLine.c fails"
echo "x - extracting ParseComnt.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ParseComnt.c &&
Xstatic char Sccsid[] = "@(#)ParseComnt.c 1.5 DeltaDate 11/13/88 ExtrDate 1/22/90";
X
X/* FUNCTION: ParseComnt()
X** Parses keyword "###".
X## A comment line.
X** ARGS: keyword the keyword "###"
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*/
X
X#include <curses.h>
X#include "menu.h"
X
X
XParseComnt (keyword, menufile, menu, KeyWord, ParseKey, gnames, gfiles,
X gindex, opnumber)
X
X char keyword[];
X FILE *menufile;
X struct MenuInfo *menu;
X char KeyWord[][MAXKEYLENGTH];
X int (*ParseKey[])();
X char gnames[][15], gfiles[][15];
X int *gindex;
X int *opnumber;
X{
X char *fgets(), line[BUFSIZE+1];
X
X
X fgets (line, BUFSIZE, menufile);
X return (0);
X}
SHAR_EOF
chmod 0444 ParseComnt.c || echo "restore of ParseComnt.c fails"
echo "x - extracting ParseUnix.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ParseUnix.c &&
Xstatic char Sccsid[] = "%W% DeltaDate %G% ExtrDate %H%";
X
X/* FUNCTION: ParseUnix()
X** Parses keyword ".unix".
X** ARGS: keyword the keyword "unix"
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: none
X*/
X
X#include <curses.h>
X#include <ctype.h>
X#include <signal.h>
X#include "menu.h"
X
Xextern int debug;
Xextern int trapsigs;
X
X
X
XParseUnix (keyword, menufile, menu, KeyWord, ParseKey, gnames, gfiles,
X gindex, opnumber)
X
X char keyword[];
X FILE *menufile;
X struct MenuInfo *menu;
X char KeyWord[][MAXKEYLENGTH];
X int (*ParseKey[])();
X char gnames[][15], gfiles[][15];
X int *gindex;
X int *opnumber;
X{
X int shutdown();
X char command[MAXLEN+1];
X int rc;
X char *comptr;
X char tmpstr[80];
X int redrawflag = FALSE;
X
X
X
X /*
X ** Read in option command
X ** strcat continuation lines
X */
X fgets (command, sizeof(command)-1, menufile);
X command[strlen(command)-1] = '\0'; /* get rid of \n */
X while (command[strlen(command)-1] == '\\')
X {
X if (strlen(command) > MAXLEN)
X {
X BEEP;
X mvprintw (ErrRow-2, 0,
X ".UNIX command is too long. Max = %d",MAXLEN);
X shutdown ();
X }
X command[strlen(command)-1] = '\n'; /* replace \ with \n */
X fgets (command+strlen(command), sizeof(command)-1, menufile);
X command[strlen(command)-1] = '\0'; /* get rid of \n */
X }
X
X comptr = command;
X SKIPJUNK(comptr);
X sscanf (comptr, "%s", tmpstr); /* do we have a REDRAW */
X if (strcmp (tmpstr, "REDRAW") == 0)
X {
X redrawflag = TRUE;
X comptr += strlen(tmpstr);
X SKIPJUNK(comptr);
X sscanf (comptr, "%s", tmpstr); /* do we have a GETINPUT */
X }
X
X if (strcmp (tmpstr, "GETINPUT") == 0)
X {
X /* get screen name */
X comptr += strlen(tmpstr);
X SKIPJUNK(comptr);
X sscanf (comptr, "%s", tmpstr); /* screen name */
X comptr += strlen(tmpstr);
X SKIPJUNK(comptr); /* sitting at system(3) */
X rc = runscreen (tmpstr, menu, *opnumber);
X if (rc == KEY_CANCEL)
X return (0);
X }
X
X reset_shell_mode ();
X signal (SIGINT, shutdown);
X signal (SIGQUIT, shutdown);
X rc = system (comptr);
X if (trapsigs)
X {
X signal (SIGINT, SIG_IGN);
X signal (SIGQUIT, SIG_IGN);
X }
X reset_prog_mode ();
X keypad (stdscr, TRUE);
X
X /*
X ** Going from a shell return code (char) to a c return code (int)
X ** the shell return code gets put in the high byte. So we will
X ** shift the int right 8 bytes.
X */
X rc = rc >> 8; /* to get shell rc */
X if (debug)
X {
X fprintf (stderr, "\n[%s] <%s> rc=%d command=%s",
X __FILE__, keyword, rc, comptr);
X fflush (stderr);
X }
X
X /*
X ** Shell can't handle negative return codes so we will convert
X ** the return code to negative so menu can use it.
X ** -1 = QUIT
X ** -2 = MAINMENU
X ** -3 = PREVMENU
X ** -4 = NOWAYJOSE
X ** 100+offset = GNAME
X */
X if (rc < GNAMEOFFSET)
X rc -= rc * 2; /* make negative */
X
X if (redrawflag)
X clearok (stdscr, TRUE);
X
X return (rc);
X}
X/* Paul J. Condie 12/88 */
SHAR_EOF
chmod 0644 ParseUnix.c || echo "restore of ParseUnix.c fails"
echo "x - extracting ParseGname.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ParseGname.c &&
Xstatic char Sccsid[] = "@(#)ParseGname.c 1.5 DeltaDate 11/13/88 ExtrDate 1/22/90";
X
X/* FUNCTION: ParseGname()
X** Parses keyword ".GNAME".
X** ARGS: keyword the keyword "GNAME"
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*/
X
X#include <curses.h>
X#include "menu.h"
X
X
X
XParseGname (keyword, menufile, menu, KeyWord, ParseKey, gnames, gfiles,
X gindex, opnumber)
X
X char keyword[];
X FILE *menufile;
X struct MenuInfo *menu;
X char KeyWord[][MAXKEYLENGTH];
X int (*ParseKey[])();
X char gnames[][15], gfiles[][15];
X int *gindex;
X int *opnumber;
X{
X char name[BUFSIZE+1];
X char file[BUFSIZE+1];
X int i;
X int NameFound;
X
X
X if (*gindex >= MAXGNAME)
X {
X BEEP;
X mvprintw (20, 0,
X "Exceeded maximum (%d) number of goto menu names",
X MAXGNAME-1);
X shutdown ();
X }
X fscanf (menufile, "%s %s", name, file);
X if (strlen(name) >= 15 || strlen(file) >= 15)
X {
X BEEP;
X mvprintw (20, 0,
X "The goto menu name and the goto menu file is limited to 14 characters");
X shutdown ();
X }
X
X /* Check if we already have this menu name */
X NameFound = FALSE;
X for (i = 0; i < *gindex; i++)
X {
X if (strcmp (name, gnames[i]) == 0)
X {
X NameFound = TRUE;
X strcpy (gfiles[i], file); /* new menu file */
X }
X }
X if (!NameFound)
X {
X /* a new name */
X strcpy (gnames[*gindex], name);
X strcpy (gfiles[*gindex], file);
X (*gindex)++;
X strcpy (gnames[*gindex], ""); /* null last one */
X }
X fgets (name, BUFSIZE, menufile); /* junk rest of line */
X return (0);
X}
SHAR_EOF
chmod 0444 ParseGname.c || echo "restore of ParseGname.c fails"
echo "x - extracting ParseAuthr.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ParseAuthr.c &&
Xstatic char Sccsid[] = "%W% DeltaDate %G% ExtrDate %H%";
X
X/* FUNCTION: ParseAuthr()
X** Parses keyword "AUTHORIZE".
X** This function determines whether you are authorized
X** to run this menu or not.
X** ARGS: keyword the keyword "AUTHORIZE"
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 you are authorized
X** NOWAYJOSE nowayjose
X*/
X
X#include <curses.h>
X#include <pwd.h>
X#include "menu.h"
X
X
X
XParseAuthr (keyword, menufile, menu, KeyWord, ParseKey, gnames, gfiles,
X gindex, opnumber)
X
X char keyword[];
X FILE *menufile;
X struct MenuInfo *menu;
X char KeyWord[][MAXKEYLENGTH];
X int (*ParseKey[])();
X char gnames[][15], gfiles[][15];
X int *gindex;
X int *opnumber;
X{
X char *strchr();
X char line[MAXLEN+100], *lptr, word[15];
X char user[15];
X int OKflag;
X struct passwd *getpwuid();
X struct passwd *pw; /* password entry */
X
X
X pw = getpwuid (getuid()); /* get real uid */
X strcpy (user, pw->pw_name);
X
X /*
X ** Read in option command
X ** strcat continuation lines
X */
X fgets (line, sizeof(line)-1, menufile);
X line[strlen(line)-1] = '\0'; /* get rid of \n */
X while (line[strlen(line)-1] == '\\')
X {
X if (strlen(line) >= MAXLEN)
X {
X BEEP;
X mvprintw (ErrRow-2, 0,
X "Option command is too long. Max = %d",MAXLEN);
X shutdown ();
X }
X line[strlen(line)-1] = '\0'; /* junk \ */
X fgets (line+strlen(line), sizeof(line)-1, menufile);
X line[strlen(line)-1] = '\0'; /* get rid of \n */
X }
X
X lptr = line;
X OKflag = FALSE;
X while (lptr && (sscanf (lptr, "%s", word) == 1))
X {
SHAR_EOF
echo "End of part 4"
echo "File ParseAuthr.c is continued in part 5"
echo "5" > s2_seq_.tmp
exit 0
More information about the Alt.sources
mailing list