|
|
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, ¬e);
86: goto inloop;
87: }
88:
89: intflag = 0; /* for quit signals */
90: while (*notenum > 0)
91: {
92: getnrec (io, *notenum, ¬e);
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.