|
|
1.1 root 1: /* $Header: ngsrch.c,v 4.3 85/05/01 11:44:51 lwall Exp $
2: *
3: * $Log: ngsrch.c,v $
4: * Revision 4.3 85/05/01 11:44:51 lwall
5: * Baseline for release with 4.3bsd.
6: *
7: */
8:
9: #include "EXTERN.h"
10: #include "common.h"
11: #include "rcstuff.h"
12: #include "final.h"
13: #include "search.h"
14: #include "rn.h"
15: #include "util.h"
16: #include "term.h"
17: #include "rcln.h"
18: #include "INTERN.h"
19: #include "ngsrch.h"
20:
21: #ifdef NGSORONLY
22: COMPEX ngcompex;
23: #endif
24:
25: void
26: ngsrch_init()
27: {
28: #ifdef ZEROGLOB
29: init_compex(&ngcompex);
30: #endif /* ZEROGLOB */
31: ;
32: }
33:
34: #ifdef NGSEARCH
35: int
36: ng_search(patbuf,get_cmd)
37: char *patbuf; /* if patbuf != buf, get_cmd must */
38: int get_cmd; /* be set to FALSE!!! */
39: {
40: char *pattern; /* unparsed pattern */
41: register char cmdchr = *patbuf; /* what kind of search? */
42: register char *s;
43: bool backward = cmdchr == '?'; /* direction of search */
44:
45: int_count = 0;
46: if (get_cmd && buf == patbuf)
47: if (!finish_command(FALSE)) /* get rest of command */
48: return NGS_ABORT;
49: for (pattern = patbuf+1; *pattern == ' '; pattern++) ;
50: if (*pattern) {
51: ng_doread = FALSE;
52: }
53: s = rindex(pattern,cmdchr);
54: if (s != Nullch && *(s-1) != '\\') {
55: *s++ = '\0';
56: if (index(s,'r') != Nullch)
57: ng_doread = TRUE;
58: }
59: if ((s = ng_comp(&ngcompex,pattern,TRUE,TRUE)) != Nullch) {
60: /* compile regular expression */
61: printf("\n%s\n",s) FLUSH;
62: return NGS_ABORT;
63: }
64: fputs("\nSearching...",stdout) FLUSH; /* give them something to read */
65: fflush(stdout);
66: for (;;) {
67: if (int_count) {
68: int_count = 0;
69: return NGS_INTR;
70: }
71: if (backward) {
72: if (ng > 0)
73: --ng;
74: else
75: ng = nextrcline;
76: }
77: else {
78: if (ng >= nextrcline)
79: ng = 0;
80: else
81: ++ng;
82: }
83: if (ng == current_ng)
84: return NGS_NOTFOUND;
85: if (ng == nextrcline || toread[ng] < TR_NONE || !ng_wanted())
86: continue;
87: if (toread[ng] == TR_NONE)
88: set_toread(ng);
89:
90: if (toread[ng] > TR_NONE)
91: return NGS_FOUND;
92: else if (toread[ng] == TR_NONE)
93: if (ng_doread)
94: return NGS_FOUND;
95: else
96: printf("\n[0 unread in %s--skipping]",rcline[ng]) FLUSH;
97: }
98: }
99:
100: bool
101: ng_wanted()
102: {
103: return execute(&ngcompex,rcline[ng]) != Nullch;
104: }
105: #endif
106:
107: #ifdef NGSORONLY
108: char *
109: ng_comp(compex,pattern,RE,fold)
110: COMPEX *compex;
111: char *pattern;
112: bool RE;
113: bool fold;
114: {
115: char ng_pattern[128];
116: register char *s = pattern, *d = ng_pattern;
117:
118: if (!*s)
119: return Nullch; /* reuse old pattern */
120: for (; *s; s++) {
121: if (*s == '.') {
122: *d++ = '\\';
123: *d++ = *s;
124: }
125: else if (*s == '?') {
126: *d++ = '.';
127: }
128: else if (*s == '*') {
129: *d++ = '.';
130: *d++ = *s;
131: }
132: else if (strnEQ(s,"all",3)) {
133: *d++ = '.';
134: *d++ = '*';
135: s += 2;
136: }
137: else
138: *d++ = *s;
139: }
140: *d = '\0';
141: return compile(compex,ng_pattern,RE,fold);
142: }
143: #endif
144:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.