#include	"ksysdefs.h"
#include	"ksysvtyp.h"
#include	"ksysprot.h"
#include	"ksyskref.h"
#define		SAVE_LAST
#define		NO_DUPE
#ifdef		isbull
#undef		isbull
#endif
/**/
/*EXTERNAL*/
/**/
static	char	*bf;			/* ".bs" */
static	int		bl;				/* length of bf */
static	char	**mm;			/* marker macros */
static	int		nm;				/* number marker macros */
/**/
char	*
setbss(is)		/* set the ".bs" string */
char	*is;
{
	bl = strlen(is);
	bf = free_if(bf);
	bf = strsave(is);
	return(bf);
}
isbull(is)		/* is this a ".bs" string */
char	*is;
{
	if(is[0] == bf[0] && is[1] == bf[1] &&
		strncmp(is,bf,bl) == 0)	return(1);
	else						return(0);
}
setmrk(is)		/* set the marker macros */
char	*is;
{
	auto	unsigned	size;
	if(mm)	free_if( (char *) mm);
	nm = strcnt(is,':') + 1;
	if(nm < 3)	{
		errmsg("setmrk <too few marks> '%s'\n",is);
		terror(FUBAR);
		}
	size = sizeof(char **) * nm;
	mm = (char **) emalloc(size,"setmrk");
	memset( mm, 0, size);
	size = splitc(mm,nm,is,':');
	return(nm);
}
/**/
retfile(fp,fn)		/* insert cards in text */
FILE	*fp;
char	*fn;
{
	static	char		*here = "retfile";
	auto	NOSIGN		ln = 0;
	auto	char		*ft;
	ft = rindex(fn,'/');
	ft = ft ? (ft + 1) : fn;
/**/
	while(fgetls(bufo,bufu,fp))	{
/**/
		if(kenv.report & DC)	{
			if(!(ln % 100))
				fprintf(stderr,"%6u %14.14s\n",ln,ft);
			}
/**/
		ln += 1;
/**/
		if(isbull(bufo))	{
			readdbs(bufo+3,bufu,ln,fn);
			continue;
			}
/**/
		if(source(bufo))	{
			auto	char	sob[FNMSIZ];
			strcnd(bufo+3);
			strcpy(sob,bufo+3);
			fileloop(sob,retfile);
			continue;
			}
/**/
	if(kenv.flags1 & DA)	puts(bufo);
	}
	return(ln);
}
readdbs(os,us,ln,fn)
char	*os;	/* line with .bs */
char	*us;
char	*fn;	/* current file */
NOSIGN	ln;		/* line in file */
{
	static	char	*here = "readdbs";
	REG		BS		*bsx = bso;
	auto	char	*bse;
	auto	char	ws[KEYSIZ];
	auto	char	bs[FNMSIZ];
	auto	int		ix;
	auto	int		cn;
/**/
	bse = strrchr(os,'/');
	if(bse)	*bse = ZERO;
	kpc(ws,ws+KEYSIZ-1,os);
/**/
	while(bsx->bs && bsx < bsu)	{
		if(kpx(ws,bsx->bs))	break;
		bsx += 1;
		}
/**/
	if(isnull(bsx->bs))	{
		errmsg("%s <null pattern> %u in %s\n",here,ln,fn);
		return(1);
		}
	if(bsx >= bsu)	{
		errmsg("%s <pattern error> %d %s\n",here,ln,fn);
		terror(FUBAR);
		}
/**/
	if(kenv.flags1 & DC)	{
		fmtpat(bs,bs+FNMSIZ-1,bsx->bs);
		fprintf(stdout,".mo ");
		if(bsx->nd > 1)		fprintf(stdout,"AMBIGUOUS ");
		else
		if(bsx->nd == 1)	fprintf(stdout,"FOUND ");
		else				fprintf(stdout,"NOT FOUND ");
		fprintf(stdout,"%s\n",bs);
/**/
		if(bsx->nd > 1)			fprintf(stdout,".mo AM LN %d FL %s %s\n",
								ln,fn,bs);
		else
		if(bsx->nd == 0)		fprintf(stdout,".mo NF LN %d FL %s %s\n",
								ln,fn,bs);
/**/
		}
/**/
	if(bsx->nd == 0)		return(0);
/**/
	for(ix = 0; ix < bsx->nd; ix++)	{
		if(bsx->ib == 0)	bsx->ib = second(bsx,bsx->da[ix]);
		cn = (bsx->ib += 1);
/**/
	if(kenv.flags1 & DD)	{
		if(1 			)	fprintf(stdout,"%s %d\n",mm[0],cn);
		else				fprintf(stdout,"%s %d\n",mm[0],cn);
		if(bse)				fprintf(stdout,"%s %s\n",mm[2],bse+1);
		else				fprintf(stdout,"%s\n",mm[2]);
		}
/**/
	if(kenv.flags1 & DB)	{
		fseek(wfp,bsx->da[ix]-1L,0);
		xrdcd(bufo,bufu,wfp);
		xwrcd(bufo,stdout);
		}
/**/
	if(kenv.flags1 & DD)	{
		if(1			)	fprintf(stdout,"%s %d\n",mm[1],cn);
		else				fprintf(stdout,"%s %d\n",mm[1]),cn;
		}
/**/
	if(kenv.flags1 & DE)	break;
	}
/**/
	return(0);
}
second(bsz,da)		/* is this item a second reference */
BS		*bsz;
long	da;
{
	REG		BS		*bsx = bso;
	REG		int		ix;
	auto	int		cnt = 0;
/**/
	while(bsx < bsz)	{
		for(ix = 0; ix < bsx->nd; ix++)	{
			if(bsx->da[ix] == da)	cnt += 1;
			}
		bsx += 1;
		}
/**/
	return(cnt);
}
