Annotation of 43BSD/contrib/notes/src/asearch.c, revision 1.1.1.1

1.1       root        1: #include "parms.h"
                      2: #include "structs.h" 
                      3: 
                      4: #ifdef RCSIDENT
                      5: static char rcsid[] = "$Header: asearch.c,v 1.7 85/01/18 15:04:25 notes Rel $";
                      6: #endif RCSIDENT
                      7: 
                      8: /*
                      9:  *     asearch(io, notenum, respnum, grabname)
                     10:  *     int *notenum, *respnum; struct io_f *io;
                     11:  *
                     12:  *     searches for an article by the specified author. The author to
                     13:  *     look for is kept in io->xasys and io->xaname
                     14:  *     The search starts with note # notenum, and the respnum'th
                     15:  *     response of that note.
                     16:  *
                     17:  *     The search proceeds out to the end of the response chain and
                     18:  *     then goes through the previous note and its responses
                     19:  *     --so it is not strictly backwards, but instead is backwards on
                     20:  *     the notes and forward within a notes responses. 
                     21:  *     ---This could be changed later.
                     22:  *
                     23:  *     Returns:        0 nothing found
                     24:  *                     >0 Found something. Correct place is in
                     25:  *                        notenum and respnum....
                     26:  *                     -1 did not specify a search string!
                     27:  *
                     28:  *
                     29:  *     Ray Essick                      Feb 1982
                     30:  */
                     31: 
                     32: asearch (io, notenum, respnum, grabname)
                     33: struct io_f *io;
                     34: int    *notenum,
                     35:        *respnum;
                     36: {
                     37:     struct note_f   note;
                     38:     struct resp_f   rsprec;
                     39:     register int    i,
                     40:                     j;                                 /* scratch counters */
                     41:     int     rblock,
                     42:             roffset;
                     43:     char    buf[SYSSZ + NAMESZ + 5];
                     44:     char    author[SYSSZ + NAMESZ + 2];                        /* must hold either */
                     45:     char    checkit[SYSSZ + NAMESZ + 2];               /* built from note */
                     46: 
                     47:     if (grabname || (io -> xauthor[0] == '\0'))
                     48:     {                                                  /* get an author */
                     49: rekey:                                                         /* re-enter */
                     50:        at (-1, 1);
                     51:        printf ("Search author:                          ");
                     52:        at (-1, 16);
                     53:        i = gline (buf, NNLEN + SYSSZ + 1);             /* grab name */
                     54:        at (-1, 1);
                     55:        printf ("%*s", i + 15, " ");
                     56:        if (i == 1)
                     57:            return (-1);                                /* no name */
                     58:        if (sscanf (buf, "%s", author) == 1)
                     59:        {
                     60:            strcpy (io -> xauthor, author);             /* load it */
                     61:        }
                     62:        else
                     63:        {
                     64:            at (0, 1);
                     65:            printf ("Bad author specification - reenter");
                     66:            goto rekey;
                     67:        }
                     68:     }
                     69: 
                     70:     at (-1, 1);
                     71:     printf ("Searching for articles by %s    ", io -> xauthor);
                     72:     fflush (stdout);
                     73: 
                     74:     if (*notenum > io -> descr.d_nnote)                        /* check boundaries */
                     75:     {
                     76:        *respnum = 0;
                     77:        *notenum = io -> descr.d_nnote;
                     78:     }
                     79: 
                     80:     for (j = 0; io -> xauthor[j]; j++)                 /* force lower case */
                     81:        io -> xauthor[j] = tolcase (io -> xauthor[j]);
                     82: 
                     83:     if (*respnum != 0)
                     84:     {
                     85:        getnrec (io, *notenum, &note);
                     86:        goto inloop;
                     87:     }
                     88: 
                     89:     intflag = 0;                                       /* for quit signals */
                     90:     while (*notenum > 0)
                     91:     {
                     92:        getnrec (io, *notenum, &note);
                     93:        if (note.n_stat & DELETED)
                     94:        {
                     95:            (*notenum)--;
                     96:            continue;                                   /* dead note */
                     97:        }
                     98: #ifdef USERHOST
                     99:        sprintf (checkit, "%s@%s", note.n_auth.aname, note.n_id.sys);
                    100: #else
                    101:        sprintf (checkit, "%s!%s", note.n_id.sys, note.n_auth.aname);
                    102: #endif USERHOST
                    103:        for (j = strlen (checkit) - 1; j >= 0; j--)     /* use lower case */
                    104:            checkit[j] = tolcase (checkit[j]);
                    105:        if (substr (io -> xauthor, checkit))
                    106:            return (*notenum);                          /* found him! */
                    107:        *respnum = 1;                                   /* set it now */
                    108: inloop:                                                /* start on a resp */
                    109:        for (; *respnum <= note.n_nresp; (*respnum)++)
                    110:        {
                    111:            if (lrsp (io, *notenum, *respnum, &rsprec, &roffset, &rblock) == -1)
                    112:                break;
                    113: #ifdef USERHOST
                    114:            sprintf (checkit, "%s@%s", rsprec.r_auth[roffset].aname,
                    115:                    rsprec.r_id[roffset].sys);
                    116: #else
                    117:            sprintf (checkit, "%s!%s", rsprec.r_id[roffset].sys,
                    118:                    rsprec.r_auth[roffset].aname);
                    119: #endif USERHOST
                    120:            if (substr (io -> xauthor, checkit))
                    121:                return * notenum;                       /* found him */
                    122:            if (intflag)
                    123:                break;                                  /* impatience */
                    124:        }
                    125:        *respnum = 0;                                   /* make it a main note */
                    126:        (*notenum)--;                                   /* and proceed to next note */
                    127:        if (intflag)
                    128:            break;                                      /* impatient little boy */
                    129:     }
                    130:     at (0, 1);
                    131:     if (intflag)
                    132:     {
                    133:        intflag = 0;                                    /* don't field same one later */
                    134:        printf ("Search aborted");
                    135:     }
                    136:     else
                    137:     {
                    138:        printf ("Can't find any articles by %s", io -> xauthor);
                    139:     }
                    140:     return 0;
                    141: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.