4.3BSD/usr/contrib/notes/src/limindx.c
#include "parms.h"
#include "structs.h"
#ifdef RCSIDENT
static char rcsid[] = "$Header: limindx.c,v 1.7.0.2 85/09/09 18:32:46 notes Rel $";
#endif RCSIDENT
/*
* limindx(io) struct io_f *io;
* runs a limited form of the index and prntind functions.
* its purpose is to come up with a note number for forwarding
* notes as responses.
*
* Returns the note number picked.
* 0 means no note.
*
* Original coding: Ray Essick January 1982
*
*/
limindx (io)
struct io_f *io;
{
int firstdis,
lastdis;
char c;
int i,
znote,
zresp;
struct note_f note;
char buf[NAMESZ + SYSSZ + 2]; /* for display */
firstdis = io -> descr.d_nnote - Nindex + 1; /* start at the end of the file */
while (1)
{
prntind (io, &firstdis, &lastdis); /* show the page */
at (2, 28);
printf ("---- Limited Index ----");
at (0, 1);
c = gchar ();
printf ("\b \b");
switch (c)
{
case '?':
case 'h':
help (LIMHLP);
break;
case '\r':
case '\n':
case ' ':
case '+': /* advance 1 page */
firstdis = lastdis;
break;
case '-': /* backwards 1 page */
case '\b':
firstdis -= Nindex;
break;
case '=': /* back to the start */
firstdis = 1;
break;
case '*': /* last page of index */
firstdis = io -> descr.d_nnote - Nindex + 1;
break;
case '!': /* give him a shell */
gshell ();
break;
case 'q': /* leave, giving up */
case 'Q': /* and others .. */
#ifdef K_KEY
case 'k':
case 'K':
#endif K_KEY
return 0;
case 'x': /* search for title */
case 'X':
i = tsearch (io, lastdis, c == 'x'); /* assume lies before here */
if (i > 0)
firstdis = i; /* set him on that page */
continue; /* otherwise get another key */
case 'a':
case 'A': /* author search from current spot */
znote = lastdis;
zresp = 0; /* start at the correct place */
do
{
i = asearch (io, &znote, &zresp, (c == 'a'));
/* look */
if (i > 0)
{
if (zresp != 0)
continue; /* not a 'note' */
firstdis = znote; /* go there */
break; /* out of this loop */
}
}
while (i > 0); /* until not found */
continue; /* get another command */
case '0': /* pick a note */
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
printf (" Note number > ");
znote = getnum (c);
if (znote <= io -> descr.d_nnote) /* if range ok */
{
/*
* print the index line for this note...
*/
getnrec (io, znote, ¬e); /* get descriptor */
#define INDEXROW -2
at (INDEXROW, 1);
printf ("%d/%d/%02d", note.n_rcvd.w_month,
note.n_rcvd.w_day, note.n_rcvd.w_year % 100);
at (INDEXROW, 10);
printf ("%3d", znote);
if (note.n_stat & DIRMES)
printf ("*");
else
printf (" ");
clearerr (stdout);
fwrite (note.ntitle, 1, strlen (note.ntitle), stdout);
if (note.n_nresp != 0)
{
at (INDEXROW, 10 + 4 + TITLEN + 1);
printf ("%3d", note.n_nresp);
}
at (INDEXROW, 10 + 4 + TITLEN + 1 + 3 + 1);
if (strcmp (Authsystem, note.n_auth.asystem) != 0 &&
strcmp ("Anonymous", note.n_auth.aname) != 0)
{
#ifdef USERHOST
sprintf (buf, "%s@%s", note.n_auth.aname, note.n_auth.asystem);
#else
sprintf (buf, "%s!%s", note.n_auth.asystem, note.n_auth.aname);
#endif USERHOST
}
else
sprintf (buf, "%s", note.n_auth.aname);
buf[26] = '\0'; /* don't overflow line */
printf ("%s", buf);
at (-1, 1); /* now ask him */
printf ("Do you really want note %d? ", znote);
if (askyn (" (y/n) ") == 'y') /* he wants it */
return znote;
}
else
{
at (0, PROMPTMSGX);
printf ("Note %d doesn't exist");
continue;
}
}
}
}