This is uisrch.c in view mode; [Download] [Up]
/* Incremental search */
#include "bw.h"
#include "qw.h"
#include "vs.h"
#include "usearch.h"
#include "main.h"
#include "uisrch.h"
char *lastpat=0; /* Previous pattern */
IREC fri={{&fri,&fri}}; /* Free-list of irecs */
IREC *alirec() /* Allocate an IREC */
{
return alitem(&fri,sizeof(IREC));
}
void frirec(i) /* Free an IREC */
IREC *i;
{
enquef(IREC,link,&fri,i);
}
void rmisrch(isrch) /* Eliminate a struct isrch */
struct isrch *isrch;
{
if(isrch)
{
vsrm(isrch->pattern);
frchn(&fri,&isrch->irecs);
free(isrch);
}
}
int iabrt(bw,isrch) /* User hit ^C */
BW *bw;
struct isrch *isrch;
{
rmisrch(isrch);
return -1;
}
void iappend(bw,isrch,s,len) /* Append text and search */
BW *bw;
struct isrch *isrch;
char *s;
{ /* Append char and search */
IREC *i=alirec();
i->what=len;
i->disp=bw->cursor->byte;
isrch->pattern=vsncpy(sv(isrch->pattern),s,len);
if(!qempty(IREC,link,&isrch->irecs)) pgoto(bw->cursor,isrch->irecs.link.prev->start);
i->start=bw->cursor->byte;
if(dopfnext(bw,mksrch(vsncpy(NULL,0,isrch->pattern+isrch->ofst,sLen(isrch->pattern)-isrch->ofst),NULL,0,isrch->dir,-1,0,0),NULL))
ttputc(7);
enqueb(IREC,link,&isrch->irecs,i);
}
int itype(bw,c,isrch,notify) /* Main user interface */
BW *bw;
struct isrch *isrch;
int *notify;
{
IREC *i;
int omid;
if(isrch->quote) goto in;
if(c==8 || c==127)
{ /* Backup */
if((i=isrch->irecs.link.prev)!=&isrch->irecs)
{
pgoto(bw->cursor,i->disp);
omid=mid; mid=1; dofollows(); mid=omid;
isrch->pattern=vstrunc(isrch->pattern,sLEN(isrch->pattern)-i->what);
frirec(deque(IREC,link,i));
}
else ttputc(7);
}
else if(c=='Q'-'@' || c=='`') isrch->quote=1;
else if(c=='S'-'@' || c=='\\'-'@' || c=='L'-'@' || c=='R'-'@')
{ /* Repeat */
if(c=='R'-'@') isrch->dir=1;
else isrch->dir=0;
if(qempty(IREC,link,&isrch->irecs))
{
if(lastpat && lastpat[0]) iappend(bw,isrch,sv(lastpat));
}
else
{
i=alirec();
i->disp=i->start=bw->cursor->byte;
i->what=0;
if(dopfnext(bw,mksrch(vsncpy(NULL,0,isrch->pattern+isrch->ofst,sLen(isrch->pattern)-isrch->ofst),NULL,0,isrch->dir,-1,0,0),NULL))
ttputc(7), frirec(i);
else
enqueb(IREC,link,&isrch->irecs,i);
}
}
else if((c<32 || c>=256) && c!=MAXINT)
{ /* Done */
nungetc(c);
if(notify) *notify=1;
lastpat=vstrunc(lastpat,0);
lastpat=vsncpy(lastpat,0,isrch->pattern+isrch->ofst,sLen(isrch->pattern)-isrch->ofst);
isrch->pattern=0;
rmisrch(isrch);
return 0;
}
else if(c!=MAXINT)
{ /* Search */
unsigned char k;
in: k=c;
isrch->quote=0;
iappend(bw,isrch,&k,1);
}
omid=mid;
mid=1;
bw->cursor->xcol=piscol(bw->cursor);
dofollows();
mid=omid;
if(mkqwnsr(bw,sv(isrch->pattern),itype,iabrt,isrch,notify)) return 0;
else
{
rmisrch(isrch);
return -1;
}
}
int doisrch(bw,dir) /* Create a struct isrch */
BW *bw;
{
struct isrch *isrch=(struct isrch *)malloc(sizeof(struct isrch));
izque(IREC,link,&isrch->irecs);
isrch->pattern=vsncpy(NULL,0,sc("I-find: "));
isrch->ofst=sLen(isrch->pattern);
isrch->dir=dir;
isrch->quote=0;
return itype(bw,MAXINT,isrch,NULL);
}
int uisrch(bw)
BW *bw;
{
return doisrch(bw,0);
}
int ursrch(bw)
BW *bw;
{
return doisrch(bw,1);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.