Annotation of 43BSD/contrib/notes/src/find.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: find.c,v 1.7.0.3 85/04/05 15:22:05 notes Rel $";
                      6: #endif RCSIDENT
                      7: 
                      8: /*
                      9:  *     chknote(io, noteid, note)
                     10:  *     see if a copy of the note specified by noteid is in the notefile
                     11:  *     returns the number of the note (0 if no note)
                     12:  *     NOTE: this routine is rather inefficient - since it 
                     13:  *     will go through the entire file to discover that the note is
                     14:  *     not in the notefile... This should be done over so that the
                     15:  *     access is run somewhat better/faster..
                     16:  *
                     17:  *     Original Coding:        Ray Essick      December 1981
                     18:  */
                     19: 
                     20: chknote (io, noteid, note)
                     21: struct io_f *io;
                     22: struct id_f *noteid;
                     23: struct note_f  *note;
                     24: {
                     25:     register int    i;
                     26: #ifdef IDCOMPAT
                     27:     register int    wantlen;                           /* length of wanted */
                     28:     register char  *wantdomain;                                /* has "." */
                     29:     register int    thislen;                           /* current id */
                     30:     register char  *thisdomain;                                /* current id has . */
                     31:     register int    shortlen;                          /* shorter */
                     32: #endif IDCOMPAT
                     33: 
                     34: #ifdef IDCOMPAT
                     35:     wantlen = strlen (noteid -> sys);
                     36:     wantdomain = index (noteid -> sys, '.');
                     37: #endif IDCOMPAT
                     38: 
                     39:     for (i = io -> descr.d_nnote; i > 0; i--)          /* dups likely "new" */
                     40:     {                                                  /* so search backwards */
                     41:        getnrec (io, i, note);
                     42:        if (note -> n_stat & DELETED)
                     43:            continue;                                   /* ignore deleted */
                     44:        if (noteid -> uniqid == note -> n_id.uniqid)    /* cheap to do */
                     45:        {
                     46:            if (strcmp (noteid -> sys, note -> n_id.sys) == 0)/* more costly */
                     47:            {
                     48:                return (i);
                     49:            }
                     50: #ifdef IDCOMPAT
                     51:            /* 
                     52:             * check for truncated or otherwise mangled ids 
                     53:             * THIS CODE IS NOT WELL TESTED AND PROBABLY DOESN'T WORK
                     54:             * QUITE RIGHT.
                     55:             */
                     56:            thislen = strlen (note -> n_id.sys);
                     57:            thisdomain = index (note -> n_id.sys, '.');
                     58:            shortlen = thislen < wantlen ? thislen : wantlen;/* get short */
                     59:            if (thisdomain == (char *) NULL || wantdomain == (char *) NULL)
                     60:            {                                           /* undomained */
                     61:                if (strncmp (note -> n_id.sys, noteid -> sys, shortlen) == 0)
                     62:                    return (i);                         /* found */
                     63:            }
                     64:            if (shortlen == OLDSYSSZ - 1 || shortlen == OLDSYSSZ)
                     65:            {                                           /* old format chop */
                     66:                if (strncmp (note -> n_id.sys, noteid -> sys, shortlen) == 0)
                     67:                    return (i);                         /* found */
                     68:            }
                     69:            if (strncmp (note -> n_id.sys, noteid -> sys, OLDSYSSZ - 1) == 0)
                     70:            {                                           /* match in 1st 10 */
                     71:                return (i);
                     72:            }
                     73: #endif IDCOMPAT
                     74:        }
                     75:     }
                     76:     return (0);                                                /* not found */
                     77: }
                     78: 
                     79: /*
                     80:  *     chkresp(io, respid, note, notenum)
                     81:  *     check the specified response to see if a response exists with
                     82:  *     the specified unique identifier
                     83:  *
                     84:  *     This too can be speeded up similarly to the chknote routine..
                     85:  *     but we shall worry about it later..after it already works.
                     86:  *
                     87:  *     Original Coding:        Ray Essick      December 1981
                     88:  */
                     89: 
                     90: chkresp (io, respid, note, notenum)
                     91: struct io_f *io;
                     92: struct id_f *respid;
                     93: struct note_f  *note;
                     94: {
                     95:     struct resp_f   rrec;
                     96:     int     roffset,
                     97:             rrecnum;
                     98:     register int    i;
                     99:     register int    prec;
                    100:     register int    poffset;
                    101: #ifdef IDCOMPAT
                    102:     register int    wantlen;                           /* length of wanted */
                    103:     register char  *wantdomain;                                /* has "." */
                    104:     register int    thislen;                           /* current id */
                    105:     register char  *thisdomain;                                /* current id has . */
                    106:     register int    shortlen;                          /* shorter */
                    107: #endif IDCOMPAT
                    108: 
                    109:     if (note -> n_nresp <= 0)                          /* no responses */
                    110:        return (0);                                     /* so it can't be there */
                    111: #ifdef IDCOMPAT
                    112:     wantlen = strlen (respid -> sys);                  /* get constants */
                    113:     wantdomain = index (respid -> sys, '.');
                    114: #endif IDCOMPAT
                    115:     prec = note -> n_rindx;                            /* get first block */
                    116:     poffset = 0;
                    117:     getrrec (io, prec, &rrec);
                    118:     for (i = 1; i <= note -> n_nresp; i++)             /* through responses */
                    119:     {
                    120:        while (rrec.r_stat[poffset] & DELETED)
                    121:        {                                               /* skip deleted ones */
                    122:            if (++poffset == RESPSZ)
                    123:            {
                    124:                poffset = 0;
                    125:                if ((prec = rrec.r_next) == -1)
                    126:                    return (0);                         /* broken chain */
                    127:                getrrec (io, prec, &rrec);              /* passed this buffer */
                    128:            }
                    129:        }
                    130:        if (respid -> uniqid == rrec.r_id[poffset].uniqid)
                    131:        {
                    132:            if (strcmp (respid -> sys, rrec.r_id[poffset].sys) == 0)
                    133:            {
                    134:                return (i);                             /* return resp number */
                    135:            }
                    136: #ifdef IDCOMPAT
                    137:            /* 
                    138:             * check for truncated and otherwise mangled id's
                    139:             */
                    140:            thislen = strlen (rrec.r_id[poffset].sys);
                    141:            thisdomain = index (rrec.r_id[poffset].sys, '.');
                    142:            shortlen = thislen < wantlen ? thislen : wantlen;/* shorter */
                    143:            if (thisdomain == (char *) NULL || wantdomain == (char *) NULL)
                    144:            {                                           /* undomained */
                    145:                if (strncmp (respid -> sys, rrec.r_id[poffset].sys, shortlen) == 0)
                    146:                    return (i);
                    147:            }
                    148:            if (shortlen == OLDSYSSZ - 1 || shortlen == OLDSYSSZ)
                    149:            {                                           /* old format chop */
                    150:                if (strncmp (respid -> sys, rrec.r_id[poffset].sys, shortlen) == 0)
                    151:                    return (i);
                    152:            }
                    153:            if (strncmp (respid -> sys, rrec.r_id[poffset].sys, OLDSYSSZ - 1) == 0)
                    154:            {                                           /* match first 10 */
                    155:                return (i);
                    156:            }
                    157: #endif IDCOMPAT
                    158:        }
                    159:        rrec.r_stat[poffset] |= DELETED;                /* force scan above */
                    160:     }
                    161:     return (0);                                                /* is not a response to this note */
                    162: }

unix.superglobalmegacorp.com

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