#endif lint
+#include <mit-copyright.h>
#include <sys/types.h>
#include <stdio.h>
#include <signal.h>
#define MIN_INPUT 2 /* Minimum number of lines for input window */
+extern FILE *fdopen();
+extern int getpid();
extern char *calloc();
+extern char *whoami;
+
+FILE *log_file = (FILE *) NULL; /* file stream of log file */
int more_flg = 1;
/* Structure for holding current displayed menu */
(void) raw(); /* We parse & print everything ourselves */
(void) noecho();
cur_ms = make_ms(0); /* So we always have some current */
- /* menu_screen */
- top_menu = m;
+ /* menu_screen */
/* Run the menu */
(void) Do_menu(m, -1, (char **) NULL);
}
Menu *m;
{
cur_ms = NULLMS;
- top_menu = m;
+ COLS = 80;
/* Run the menu */
(void) Do_menu(m, -1, (char **) NULL);
}
struct menu_line *command, *Find_command();
int argc;
int quitflag, is_topmenu = (margc < 0);
+ int toggle_logging();
/* Entry function gets called with old menu_screen still current */
if (m->m_entry != NULLFUNC)
if (cur_ms != NULLMS) {
/* Get a menu_screen */
old_cur_ms = cur_ms;
- cur_ms = my_ms = make_ms(m->m_length + 1 + (is_topmenu?0:1));
+ /* 2 is for the 2 obligatory lines; quit and toggle */
+ cur_ms = my_ms = make_ms(m->m_length + 2 + (is_topmenu ? 0 : 1));
/* Now print the title and the menu */
(void) wclear(my_ms->ms_menu);
if (!is_topmenu) {
(void) waddstr(my_ms->ms_menu,
" r. (return) Return to previous menu.");
- (void) wmove(my_ms->ms_menu, line, 0);
+ (void) wmove(my_ms->ms_menu, line++, 0);
}
+ (void) waddstr(my_ms->ms_menu,
+ " t. (toggle) Toggle logging on and off.");
+ (void) wmove(my_ms->ms_menu, line, 0);
(void) waddstr(my_ms->ms_menu, " q. (quit) Quit.");
+ } else {
+ Put_message(m->m_title);
+ for (line = 0; line < m->m_length; line++) {
+ sprintf(buf, "%2d. (%s)%*s %s.", line + 1,
+ m->m_lines[line].ml_command,
+ 12 - strlen(m->m_lines[line].ml_command), "",
+ m->m_lines[line].ml_doc);
+ Put_message(buf);
+ }
+ if (!is_topmenu)
+ Put_message(" r. (return) Return to previous menu.");
+ Put_message(" t. (toggle) Toggle logging on and off.");
+ Put_message(" q. (quit) Quit.");
+ Put_message(" ?. Print this information.");
}
for (;;) {
command = &m->m_lines[line - 1];
}
else if ((!is_topmenu &&
- (!strcmp(argv[0], "r")
- || !strcmp(argv[0], "return")))
- || !strcmp(argv[0], "q")
- || !strcmp(argv[0], "quit")) {
+ (!strcmp(argv[0], "r") || !strcmp(argv[0], "return")))
+ || !strcmp(argv[0], "q") || !strcmp(argv[0], "quit")) {
+
/* here if it's either return or quit */
if (cur_ms != NULLMS) {
cur_ms = old_cur_ms;
if (m->m_exit != NULLFUNC)
m->m_exit(m);
return (*argv[0] == 'r' ? DM_NORMAL : DM_QUIT);
- /* finally, try to find it using Find_command */
}
- else if ((command = Find_command(argvals[0])) ==
+ else if (argv[0][0] == '?') {
+ for (line = 0; line < m->m_length; line++) {
+ sprintf(buf, "%2d. (%s)%*s %s.", line + 1,
+ m->m_lines[line].ml_command,
+ 12 - strlen(m->m_lines[line].ml_command), "",
+ m->m_lines[line].ml_doc);
+ Put_message(buf);
+ }
+ if (!is_topmenu)
+ Put_message(" r. (return) Return to previous menu.");
+ Put_message(" t. (toggle) Toggle logging on and off.");
+ Put_message(" q. (quit) Quit.");
+ continue;
+ }
+ else if (!strcmp(argv[0], "t") || !strcmp(argv[0], "toggle")) {
+ toggle_logging(argc, argv);
+ continue;
+ }
+ /* finally, try to find it using Find_command */
+ else if ((command = Find_command(m, argvals[0])) ==
(struct menu_line *) 0) {
Put_message("Command not recognized");
continue;
p = buf;
while(1) {
(void) wmove(cur_ms->ms_input, y, x);
+ (void) touchwin(cur_ms->ms_screen);
(void) wclrtoeol(cur_ms->ms_input);
refresh_ms(cur_ms);
- c = getchar();
+ c = getchar() & 0x7f;
switch (c) {
case CTL('C'):
+ *p = '\0';
return 0;
case CTL('Z'):
(void) kill(getpid(), SIGTSTP);
(void) waddstr(cur_ms->ms_input, prompt);
(void) touchwin(cur_ms->ms_screen);
#ifdef notdef
- (void) wrefresh(curscr);
+ refresh_ms(cur_ms);
#endif notdef
getyx(cur_ms->ms_input, y, x);
break;
p = buf;
break;
default:
- if (isprint(c) && (p - buf < buflen)) {
+ /* (buflen - 1) leaves room for the \0 */
+ if (isprint(c) && (p - buf < buflen - 1)) {
(void) waddch(cur_ms->ms_input, c);
*p++ = c;
x++;
(void) wmove(cur_ms->ms_input, y, x);
(void) wclrtoeol(cur_ms->ms_input);
refresh_ms(cur_ms);
- c = getchar();
+ c = getchar() & 0x7f;
switch (c) {
case CTL('C'):
return 0;
copy = (char *) malloc((u_int)COLS);
s = line = msg;
+ if (log_file) { /* if we're doing logging; we assume that the */
+ /* file has already been opened. */
+ (void) fprintf(log_file, "%s\n", msg);
+ fflush(log_file);
+ }
+
while(*s++) {
if (s - line >= COLS-1) {
(void) strncpy(copy, line, COLS-1);
(void) wprintw(cur_ms->ms_input, "---More---");
(void) wstandend(cur_ms->ms_input);
refresh_ms(cur_ms);
- chr = getchar();/* We do care what it is */
+ chr = getchar() & 0x7f;/* We do care what it is */
if (chr == 'q' || chr == 'Q') {
more_flg = 0;
return;
}
else {
printf("---More (hit return)---");
- (void) getchar();
+ getchar();
}
Start_paging(); /* Reset lines_left */
}
if (!strcmp(c, m->m_lines[line].ml_command)) {
return (&m->m_lines[line]);
}
- else if (m->m_lines[line].ml_submenu != NULLMENU
- && (maybe =
- find_command_from(c, m->m_lines[line].ml_submenu, d - 1))
- != (struct menu_line *) 0) {
+ }
+ for (line = 0; line < m->m_length; line++) {
+ if (m->m_lines[line].ml_submenu != NULLMENU &&
+ (maybe = find_command_from(c, m->m_lines[line].ml_submenu, d - 1))
+ != (struct menu_line *) 0) {
return (maybe);
}
}
/* And returns a pointer to a menu_line with the specified command name */
/* It returns (struct menu_line *) 0 if none is found */
struct menu_line *
-Find_command(command)
+Find_command(m, command)
+ Menu *m;
char *command;
{
- if (top_menu == NULLMENU) {
+ if (m == NULLMENU) {
return ((struct menu_line *) 0);
}
else {
- return (find_command_from(command, top_menu, MAX_MENU_DEPTH));
+ return (find_command_from(command, m, MAX_MENU_DEPTH));
}
}
-/*
- * Local Variables:
- * mode: c
- * c-indent-level: 4
- * c-continued-statement-offset: 4
- * c-brace-offset: -4
- * c-argdecl-indent: 4
- * c-label-offset: -4
- * End:
- */
+/*ARGSUSED*/
+int
+toggle_logging(argc, argv)
+ int argc;
+ char *argv[];
+{
+ int pid;
+ char buf[BUFSIZ];
+
+ if (log_file == (FILE *) NULL) {
+ pid = getpid();
+ if (!whoami) {
+ Put_message("I've lost my SENSE of DIRECTION! I have no IDEA who I AM!");
+ Put_message("My God... You've turned him into a DEMOCRAT!!");
+ Put_message(" -- Doonesbury");
+ Put_message("");
+ Put_message("translation: your log file can be found in \"/usr/tmp/a.out.pid\".");
+ whoami = "a.out";
+ (void) sprintf(buf, "/usr/tmp/%s-log.%d", whoami, pid);
+ }
+ else
+ (void) sprintf(buf, "/usr/tmp/%s-log.%d", whoami, pid);
+
+ /* open the file */
+ log_file = fopen(buf,"a");
+
+ if (log_file == (FILE *) NULL)
+ Put_message("Open of log file failed. Logging is not on.");
+ else
+ Put_message("Log file successfully opened.");
+ }
+ else { /* log_file is a valid pointer; turn off logging. */
+ (void) fflush(log_file);
+ (void) fclose(log_file);
+ log_file = (FILE *) NULL;
+ Put_message("Logging off.");
+ }
+ return(DM_NORMAL);
+}