4.3BSD/usr/contrib/notes/src/lrsp.c
#include "parms.h"
#include "structs.h"
#ifdef RCSIDENT
static char rcsid[] = "$Header: lrsp.c,v 1.7 85/01/18 15:16:05 notes Rel $";
#endif RCSIDENT
/*
* this routine takes in a note number, the io descriptors and
* and a LOGICAL response number to look for.
* It the returns the physical response index locations.
* It returns the response index record, and the offset within
* that record for the correct response
*
* Implemented the easy/cheap way. We just scan along the response
* chain, counting up the undeleted responses.
* Once we find the correct number, we return with the current
* set of pointers. What could be easier?
* In the event that we hit the end of responses before we find
* the response we want (e.g. the dummy wanted a nonexistent response)
* we return the index of the last response.
*
* Returns: 0 if all goes well
* -1 if bad logical response number
*
* Ray Essick May 22, 1981.
*
*/
lrsp (io, notenum, resp, rrec, poffset, recnum)
struct io_f *io;
struct resp_f *rrec;
int *recnum,
*poffset;
{
struct note_f nrec; /* note descriptor */
int prec; /* which physical response group we is looking in */
getnrec (io, notenum, &nrec); /* get the note info */
if (resp <= 0)
return (-1); /* that was dumb */
if (resp > nrec.n_nresp)
return (-1); /* this too was dumb of him */
prec = nrec.n_rindx; /* record # of first response */
*poffset = 0;
getrrec (io, prec, rrec); /* first resp block */
while (resp > rrec -> r_last) /* hi-speed along */
{
if ((prec = rrec -> r_next) == -1)
return (-1); /* broken chain */
getrrec (io, prec, rrec); /* passed this buffer */
}
/*
* We should now be in the block that contains the response
*/
{
register int counted;
counted = (-1); /* active in this block */
*poffset = 0; /* start of block */
while (1) /* forever */
{
while (rrec -> r_stat[*poffset] & DELETED) /* skip holes */
{
++*poffset; /* and try next */
x (*poffset == RESPSZ, "lrsp: r_last lied!");
}
counted++; /* a live one */
if (rrec -> r_first + counted == resp) /* got it */
{
break; /* get out */
}
++*poffset; /* on to next */
/*
* this above is legit since we KNOW the resp is in this
* block so we'll never go over the end
*/
}
}
*recnum = prec; /* set up return */
return 0;
}