+static char *sccsid = "%W%";
+
+/*
+ * INPUT KEY PROCESSING FOR INDEX PHASE
+ *
+ * Process all keystrokes while the index page is on the screen.
+ * invokes director options also (if user qualified)
+ * Returns: >=0 read note with that number ( 0 is policy)
+ * -1 reprint the index page
+ * -2 leave notefiles, update sequencer time
+ * -3 leave notefile, dont update sequencer
+ * -4 Universal leave notefiles
+ * (-2 and -3 leave single notefile, -4 leaves
+ * entire package, aborting rest of notefiles.
+ *
+ * Original Coding: Rob Kolstad Winter 1980
+ * modifications: Ray Essick December 1981
+ * modifications: Lou Salkind March 1983
+ */
+
+#include "parms.h"
+#include "structs.h"
+#include "newsgate.h"
+#include <signal.h>
+#include <sgtty.h>
+
+indx(io, firstdis, lastdis, respnum)
+struct io_f *io;
+int *firstdis, *lastdis, *respnum;
+{
+ struct io_f io2; /* for nested notefiles */
+ struct when_f whendump;
+ char nfname[NNLEN + 1]; /* for nested nfs */
+ char cmdline[CMDLEN];
+ int num; /* note number */
+ int i;
+ int c;
+ int znote, zresp; /* for asearch */
+ int temp;
+ int retstat = -1;
+ struct notesenv oldenv;
+
+ *respnum = 0; /* init response */
+ ignsigs = 0;
+ replot = 1;
+ oldenv = curenv;
+
+ setjmp(jenv);
+ while (1) {
+ if (replot) {
+ replot = 0;
+ prntind(io, firstdis, lastdis);
+ }
+ cmdprompt();
+ c = gchar();
+ switch (c) { /* what to do? */
+ case 'z': /* update sequencer and exit, RLS */
+ retstat = QUITUPD;
+ goto out;
+
+ case 'u': /* unsubscribe from this notesgroup, RLS */
+ if (unsubscribe(io->nf) < 0)
+ continue;
+ retstat = QUITSEQ;
+ goto out;
+
+ case '?':
+ case 'h':
+ help(INDXHLP); /* put the help on screen */
+ replot = 1;
+ continue;
+
+ case 'r': /* replot the index page */
+ case '\014': /* everyone else uses ^L, might as well */
+ replot = 1;
+ continue;
+
+ case 'W': /* this too shall write a note */
+ case 'w': /* write a note */
+ temp = addnote(io, NULL, "Edit Note text:", "Note Title: ");
+ if (temp == -1) {
+ replot = 1;
+ continue;
+ }
+
+#ifdef NEWS
+ /*
+ * fix to allow the user to specify whether
+ * the article should be local or net'ed
+ */
+ if ((io->descr.d_stat & NETWRKD) == 0) {
+ /*
+ prompt("(Not networked)");
+ fflush(stdout);
+ sleep(2);
+ */
+ retstat = temp;
+ goto out;
+ }
+ prompt("Send to news? ");
+ if (askyn() == 'y') {
+#ifdef DEMANDNEWS
+ /* send it to the news */
+ sprintf(cmdline, "%s/%s/newsoutput", MSTDIR, UTILITY);
+ dounix(0, 0, cmdline, io->nf, 0, 0, 0);
+#endif DEMANDNEWS
+ }
+ else {
+ /* don't send it to the network */
+ gettime(&whendump);
+ fixlast(&whendump, io->nf, 1 , NEWSSYS);
+ }
+#endif NEWS
+ retstat = temp;
+ goto out;
+
+ case 'B': /* bitch, bitch, bitch */
+ if (init(&io2, GRIPES) < 0) { /* no gripe file */
+ warn("Gripe file not available");
+ continue;
+ }
+ temp = addnote(&io2, NULL, "Edit Gripe text:", "Gripe Header: ");
+ /* let him put the note in */
+ finish(&io2); /* close up the gripe file */
+ if (temp == -1) {
+ replot = 1;
+ continue;
+ }
+ replot = 1;
+ goto out;
+
+ case '-': /* back up a little */
+ case '\b': /* add backspace also */
+ if (*firstdis != 1) {
+ *firstdis -= nindex - 1;
+ replot = 1;
+ } else
+ warn("On first page");
+ continue;
+
+ case '=': /* back up a lot */
+ if (*firstdis != 1) {
+ *firstdis = 1;
+ replot = 1;
+ } else
+ warn("On first page");
+ continue;
+
+ case '+':
+ case '\r':
+ case '\n':
+ case ' ':
+ if (*lastdis < io->descr.d_nnote) {
+ *firstdis = *lastdis;
+ replot = 1;
+ } else
+ warn("On last page");
+ continue;
+
+ case '*': /* skip to last page */
+ if (*lastdis < io->descr.d_nnote) {
+ *firstdis = io->descr.d_nnote - nindex + 1;
+ replot = 1;
+ } else
+ warn("Already on last page");
+ continue;
+
+ case 'q':
+ case 'k': /* so can use just right hand */
+ retstat = QUITSEQ;
+ goto out;
+
+ case '\04': /* control D */
+ retstat = QUITFAST;
+ goto out;
+
+ case 'Q': /* exit without update of sequencer */
+ case 'K': /* so can use just right hand */
+ retstat = QUITNOSEQ;
+ goto out;
+
+ case 'n': /* nest notesfiles - a stack */
+ prompt("New notesfile: ");
+ if (gline(nfname, NNLEN) == 1)
+ continue;
+ closenf(io); /* save fids */
+ i = control(nfname, NOSEQ);
+ if (opennf(io, io->nf) < 0) {
+ warn("Couldn't reopen notesfile");
+ wfchar();
+ retstat = QUITNOSEQ;
+ goto out;
+ }
+ if (i == QUITNEX || i == QUITBAD) {
+ warn("Can not open notesfile `%s'", nfname);
+ continue;
+ }
+ if (i == QUITFAST || i == QUITUPD) {
+ retstat = i;
+ goto out;
+ }
+ replot = 1;
+ continue;
+
+ case 'p': /* to read note 0 */
+ if (io->descr.d_plcy) {
+ retstat = 0;
+ goto out;
+ } else {
+ warn("There is no policy note");
+ continue; /* grab another key */
+ }
+
+ case 'd': /* to director options */
+ if (allow(io, DRCTOK)) {
+ if ((i = direct(io)) == -1) {
+ replot = 1;
+ continue;
+ }
+ retstat = i;
+ goto out;
+ }
+ /*
+ * fix the allow the user to see things
+ * the director can see
+ */
+ prompt("Anonymous: %s Networked: %s",
+ (io->descr.d_stat & ANONOK) ? "YES" : "NO",
+ (io->descr.d_stat & NETWRKD) ? "YES" : "NO");
+ continue;
+
+ case 'x':
+ case 'X':
+ i = tsearch(io, *lastdis, c == 'x');
+ /* assume lies before here */
+ if (i > 0) {
+ retstat = i;
+ goto out;
+ }
+ continue; /* otherwise get another key */
+
+ case 'a':
+ case 'A': /* author search from current spot */
+ znote = *lastdis;
+ zresp = 0; /* start at the correct place */
+ i = asearch (io, &znote, &zresp, (c == 'a'));
+ /* look */
+ if (i > 0) {
+ *respnum = zresp;/* return correct value */
+ retstat = znote;
+ goto out;
+ }
+ continue; /* get another command */
+
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ prompt("Read note > ");
+ if ((num = getnum (c)) == 0)
+ continue;
+ retstat = num;
+ goto out;
+
+ case 'j':
+ case 'J': /* goto first unread article */
+ case 'l': /* universal seq, RLS */
+ case 'L':
+ i = nxtnote(io, 0, &io->stime);
+ if (i != -1) {
+ retstat = i;
+ goto out;
+ }
+ if (c == 'l' || c == 'L') {
+ retstat = QUITSEQ;
+ goto out;
+ }
+ replot = 1;
+ continue;
+
+ case 'o': /* modify sequencer time */
+ gdate(&io->stime); /* let him hack on the time */
+ continue; /* and go back */
+
+ case 'O': /* set it for today's notes */
+ gettime(&io->stime); /* grab current date */
+ io->stime.w_hours = 0; /* beginning of day */
+ io->stime.w_mins = 0;
+ prompt("Set to read notes since: ");
+ prdate(&io->stime);
+ continue; /* and get the next command */
+
+
+ case '!':
+ gshell();
+ /* give him a shell in right directory */
+ replot = 1;
+ continue;
+
+ default:
+ warn("? for help, q to quit");
+ continue;
+ }
+ }
+out:
+ ignsigs++;
+ curenv = oldenv;
+ ignsigs = 0;
+ return(retstat);
+}