2.9BSD/usr/src/ucb/vsh/options.c

#include "hd.h"
#include "command.h"

#define	MAXLINE	16

/* Print and modify command tables interactively */

options (parm) char **parm; {
	
	int line = 0;		/* Current line number */
	register struct cmdstruct *cmdp;
	register struct classstruct *classp;
	register char **argv;
	struct parmstruct *parmp;

	/* Print command tab in .vshrc format */
	/* If parm present, dump to file and quit */
	erase ();
	if (*parm) {
		close (1);  creat ("vsh.out", 0644);  line= -9999;
	}
	for (;;) {
		for (cmdp = cmdtab; cmdp->cmd_char >= 0; cmdp++) {
			if (cmdp->cmd_proc) {
				for (classp = classtab;
					*classp->cl_name &&
					classp->cl_proc !=
					cmdp->cmd_proc;
					classp++);

				printf ("%c\t%s", cmdp->cmd_char, 
					classp->cl_name);

				for (argv = cmdp->cmd_argv; *argv;)
					printf ("  %s", *argv++);
				
				if (optline (&line) == FAILURE)
					return REPLOT;
			}
		}
		for (parmp = parmtab; parmp->p_name; parmp++) {
			printf ("%s\t%s", parmp->p_name, parmp->p_val);
			if (optline (&line) == FAILURE) return REPLOT;
		}

		if (*parm) leave ();
		if (line != 0 && optcmd () == FAILURE) break;
		erase ();  line = 0;
	}
	return REPLOT;
}
/* Processing for end of each line includes:
	1.  Print the newline.
	2.  If the end of the page, prompt for a command.
*/
optline (line) int *line; {
	int ret;	/* return from optcmd */

	putch (LF);
	if (++*line < MAXLINE) return SUCCESS;

	ret = optcmd (); erase ();  *line = 0;
	return ret;
}

optcmd () {
	char cbuf [STRMAX],	/* Buffer for input parm */
	     *argv [ARGVMAX];	/* Pointers to input parm */
	int argc;		/* Number of parm */
	int ret;		/* Return from readarg */

	int line = 0;		/* Current line num of rcstream */

	printf ("\nType in a new parameter, or\n\
Press ^D to leave.  Press -Return- to display more parameters.\n");
	for (;;) {
		tty_push (COOKEDMODE);
		ret = readarg (stdin, &line, &argc, argv, cbuf);
		tty_pop ();
		if (argc == 0) break;
		if (compe ("quit", argv [0])) {
			ret = FAILURE;  break;
		}
		if (ret != FAILURE) cmdldarg (line, argc, argv);
	}
	return ret;
}