4.3BSD/usr/contrib/notes/src/asearch.c
#include "parms.h"
#include "structs.h"
#ifdef RCSIDENT
static char rcsid[] = "$Header: asearch.c,v 1.7 85/01/18 15:04:25 notes Rel $";
#endif RCSIDENT
/*
* asearch(io, notenum, respnum, grabname)
* int *notenum, *respnum; struct io_f *io;
*
* searches for an article by the specified author. The author to
* look for is kept in io->xasys and io->xaname
* The search starts with note # notenum, and the respnum'th
* response of that note.
*
* The search proceeds out to the end of the response chain and
* then goes through the previous note and its responses
* --so it is not strictly backwards, but instead is backwards on
* the notes and forward within a notes responses.
* ---This could be changed later.
*
* Returns: 0 nothing found
* >0 Found something. Correct place is in
* notenum and respnum....
* -1 did not specify a search string!
*
*
* Ray Essick Feb 1982
*/
asearch (io, notenum, respnum, grabname)
struct io_f *io;
int *notenum,
*respnum;
{
struct note_f note;
struct resp_f rsprec;
register int i,
j; /* scratch counters */
int rblock,
roffset;
char buf[SYSSZ + NAMESZ + 5];
char author[SYSSZ + NAMESZ + 2]; /* must hold either */
char checkit[SYSSZ + NAMESZ + 2]; /* built from note */
if (grabname || (io -> xauthor[0] == '\0'))
{ /* get an author */
rekey: /* re-enter */
at (-1, 1);
printf ("Search author: ");
at (-1, 16);
i = gline (buf, NNLEN + SYSSZ + 1); /* grab name */
at (-1, 1);
printf ("%*s", i + 15, " ");
if (i == 1)
return (-1); /* no name */
if (sscanf (buf, "%s", author) == 1)
{
strcpy (io -> xauthor, author); /* load it */
}
else
{
at (0, 1);
printf ("Bad author specification - reenter");
goto rekey;
}
}
at (-1, 1);
printf ("Searching for articles by %s ", io -> xauthor);
fflush (stdout);
if (*notenum > io -> descr.d_nnote) /* check boundaries */
{
*respnum = 0;
*notenum = io -> descr.d_nnote;
}
for (j = 0; io -> xauthor[j]; j++) /* force lower case */
io -> xauthor[j] = tolcase (io -> xauthor[j]);
if (*respnum != 0)
{
getnrec (io, *notenum, ¬e);
goto inloop;
}
intflag = 0; /* for quit signals */
while (*notenum > 0)
{
getnrec (io, *notenum, ¬e);
if (note.n_stat & DELETED)
{
(*notenum)--;
continue; /* dead note */
}
#ifdef USERHOST
sprintf (checkit, "%s@%s", note.n_auth.aname, note.n_id.sys);
#else
sprintf (checkit, "%s!%s", note.n_id.sys, note.n_auth.aname);
#endif USERHOST
for (j = strlen (checkit) - 1; j >= 0; j--) /* use lower case */
checkit[j] = tolcase (checkit[j]);
if (substr (io -> xauthor, checkit))
return (*notenum); /* found him! */
*respnum = 1; /* set it now */
inloop: /* start on a resp */
for (; *respnum <= note.n_nresp; (*respnum)++)
{
if (lrsp (io, *notenum, *respnum, &rsprec, &roffset, &rblock) == -1)
break;
#ifdef USERHOST
sprintf (checkit, "%s@%s", rsprec.r_auth[roffset].aname,
rsprec.r_id[roffset].sys);
#else
sprintf (checkit, "%s!%s", rsprec.r_id[roffset].sys,
rsprec.r_auth[roffset].aname);
#endif USERHOST
if (substr (io -> xauthor, checkit))
return * notenum; /* found him */
if (intflag)
break; /* impatience */
}
*respnum = 0; /* make it a main note */
(*notenum)--; /* and proceed to next note */
if (intflag)
break; /* impatient little boy */
}
at (0, 1);
if (intflag)
{
intflag = 0; /* don't field same one later */
printf ("Search aborted");
}
else
{
printf ("Can't find any articles by %s", io -> xauthor);
}
return 0;
}