BSD 4_3 development
[unix-history] / usr / contrib / nntp / rrn / ngsrch.c
/* $Header: ngsrch.c,v 4.3 85/05/01 11:44:51 lwall Exp $
*
* $Log: ngsrch.c,v $
* Revision 4.3 85/05/01 11:44:51 lwall
* Baseline for release with 4.3bsd.
*
*/
#include "EXTERN.h"
#include "common.h"
#include "rcstuff.h"
#include "final.h"
#include "search.h"
#include "rn.h"
#include "util.h"
#include "term.h"
#include "rcln.h"
#include "INTERN.h"
#include "ngsrch.h"
#ifdef NGSORONLY
COMPEX ngcompex;
#endif
void
ngsrch_init()
{
#ifdef ZEROGLOB
init_compex(&ngcompex);
#endif /* ZEROGLOB */
;
}
#ifdef NGSEARCH
int
ng_search(patbuf,get_cmd)
char *patbuf; /* if patbuf != buf, get_cmd must */
int get_cmd; /* be set to FALSE!!! */
{
char *pattern; /* unparsed pattern */
register char cmdchr = *patbuf; /* what kind of search? */
register char *s;
bool backward = cmdchr == '?'; /* direction of search */
int_count = 0;
if (get_cmd && buf == patbuf)
if (!finish_command(FALSE)) /* get rest of command */
return NGS_ABORT;
for (pattern = patbuf+1; *pattern == ' '; pattern++) ;
if (*pattern) {
ng_doread = FALSE;
}
s = rindex(pattern,cmdchr);
if (s != Nullch && *(s-1) != '\\') {
*s++ = '\0';
if (index(s,'r') != Nullch)
ng_doread = TRUE;
}
if ((s = ng_comp(&ngcompex,pattern,TRUE,TRUE)) != Nullch) {
/* compile regular expression */
printf("\n%s\n",s) FLUSH;
return NGS_ABORT;
}
fputs("\nSearching...",stdout) FLUSH; /* give them something to read */
fflush(stdout);
for (;;) {
if (int_count) {
int_count = 0;
return NGS_INTR;
}
if (backward) {
if (ng > 0)
--ng;
else
ng = nextrcline;
}
else {
if (ng >= nextrcline)
ng = 0;
else
++ng;
}
if (ng == current_ng)
return NGS_NOTFOUND;
if (ng == nextrcline || toread[ng] < TR_NONE || !ng_wanted())
continue;
if (toread[ng] == TR_NONE)
set_toread(ng);
if (toread[ng] > TR_NONE)
return NGS_FOUND;
else if (toread[ng] == TR_NONE)
if (ng_doread)
return NGS_FOUND;
else
printf("\n[0 unread in %s--skipping]",rcline[ng]) FLUSH;
}
}
bool
ng_wanted()
{
return execute(&ngcompex,rcline[ng]) != Nullch;
}
#endif
#ifdef NGSORONLY
char *
ng_comp(compex,pattern,RE,fold)
COMPEX *compex;
char *pattern;
bool RE;
bool fold;
{
char ng_pattern[128];
register char *s = pattern, *d = ng_pattern;
if (!*s)
return Nullch; /* reuse old pattern */
for (; *s; s++) {
if (*s == '.') {
*d++ = '\\';
*d++ = *s;
}
else if (*s == '?') {
*d++ = '.';
}
else if (*s == '*') {
*d++ = '.';
*d++ = *s;
}
else if (strnEQ(s,"all",3)) {
*d++ = '.';
*d++ = '*';
s += 2;
}
else
*d++ = *s;
}
*d = '\0';
return compile(compex,ng_pattern,RE,fold);
}
#endif