|
|
researchv10 Norman
# 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;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.