V10/cmd/refer/update/extr.c

Compare this file to the similar file:
Show the results in this format:

# include "stdio.h"
# include "assert.h"
# include "ctype.h"

main(argc,argv)
	char *argv[];
{
/* arguments are keys of a paper */
/* output is file & lines to drop */
	char answer[200], filname[60], outname[60];
	int nuse = 0, i, c, length, line1, line2;
	long l, start;
	FILE *lkin, *lkout, *fin, *fout;
	char buff[2000], *bf = buff;
	char *select = 0;
	extern char *indexes;
lkin = fopen("/dev/null", "w");
lkout = fopen("/dev/null", "r");
_assert (lkin !=NULL); _assert (lkout!=NULL);
while (argc>1 &&argv[1][0]=='-')
	{
	switch(argv[1][1])
		{
		case 'p': /* use private index files */
			indexes = argv[2];
			argv += 2; argc -= 2;
			continue;
		case 'u': /* use the Nth item */
			nuse = atoi(argv[1]+2);
			argv++; argc--;
			continue;
		case 's': /* insist on a particular string */
			select = argv[2];
			argv += 2; argc -= 2;
			continue;
		default:
			fprintf(stderr, "unknown option %s\n",argv[1]);
			argv++; argc--;
			continue;
		}
	}
lookup(lkin, lkout);
if (argc<=1) fprintf(stderr, "No search keys\n");
_assert (argc>1);
for(i=1; i<argc; i++)
	fprintf(lkin, "%s ", argv[i]);
fprintf(lkin, "\n");
fclose(lkin);
/* skip items up to nuse */
for(i=1; i<nuse; i++)
	geta(answer, lkout, select);
/* get the right answer */
i = geta(answer, lkout, select);
if (i==0)
	{
	fprintf(stderr, "No match\n");
	exit(1);
	}
sscanf(answer, "%[^:]:%ld,%d", filname, &start, &length);
if (nuse<=0 && geta(answer, lkout, select)>0)
	{
	fprintf(stderr, "Not unique - use lookbib and either -s or -u\n");
	exit(1);
	}
fclose(lkout);
assert((strlen(filname)>0));
fin = fopen(filname, "r");
_assert (fin!=NULL);
c=0;
for(i=getpid()%990; 1; i++)
	{
	_assert (c++<100);
	sprintf(outname, "bib%03d", i);
	if (access(outname, 06) != 0)
		break;
	}
fout = fopen(outname, "w");
line1 = 1;
printf("Extracting as file %s\n", outname);
for(l=0; l<start; l++)
	{
	c = getc(fin);
	_assert (c!=EOF);
	if (c=='\n')
		line1++;
	}
line2=line1;
for(i=0; i<length; i++)
	{
	c = getc(fin);
	_assert (c != EOF);
	putchar(c);
	*bf++ = c;
	if (c== '\n')
		line2++;
	}
fclose(fin);
fprintf(fout, "%%# %s %d %d change %ld %d\n",
	filname, line1, line2-1, start, length);
*bf=0;
fprintf(fout, "%s", buff);
fclose(fout);
}
geta(answer, f, str)
	char *answer, *str;
	FILE *f;
{
answer[0]=0;
while (answer[0]==0 && feof(f)==0)
	{
	answer[0]=0;
	fgets(answer, 200, f);
	trim(answer);
	if (contain(answer, str)==0)
		answer[0]=0;
	}
return( answer[0]!=0);
}
contain(answer, str)
	char *answer, *str;
{
char filname[100]; long start; int length;
int ft;
char buff[1000], *s, *st;
if (str==0) return(1);
if (answer[0]==0) return(1);
sscanf(answer, "%[^:]:%ld,%d", filname, &start, &length);
assert((strlen(filname)>0));
ft = open(filname, 0);
assert(ft>=0);
lseek(ft, start, 0);
if (length>1000) length=1000;
length = read(ft, buff, length);
close(ft);
buff[length]=0;
st = buff+length;
for(s=buff; s<st; s++)
	if (prefix(str, s))
		return(1);
return(0);
}
prefix(sh,lg)
	char *sh, *lg;
{
int c;
while ( (c= *sh++) == *lg++)
	{
	if (c==0)
		return(1);
	}
return(c==0);
}
trim(s)
	char *s;
{
while (*s)s++;
if (*--s=='\n') *s=0;
}