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: }
Defined functions
Defined variables
rcsid
defined in line
5;
never used