/*
|
/*
|
* file I/O version of forward ref handler
|
* file I/O version of forward ref handler
|
*/
|
*/
|
|
|
#define FILEMODE 0644 /* file creat mode */
|
#define FILEMODE 0644 /* file creat mode */
|
#define UPDATE 2 /* file open mode */
|
#define UPDATE 2 /* file open mode */
|
#define ABS 0 /* absolute seek */
|
#define ABS 0 /* absolute seek */
|
|
|
int Forward =0; /* temp file's file descriptor */
|
int Forward =0; /* temp file's file descriptor */
|
char Fwd_name[] = { "Fwd_refs" } ;
|
char Fwd_name[] = { "Fwd_refs" } ;
|
|
|
/*
|
/*
|
* fwdinit --- initialize forward ref file
|
* fwdinit --- initialize forward ref file
|
*/
|
*/
|
fwdinit()
|
fwdinit()
|
{
|
{
|
Forward = open(Fwd_name,O_CREAT | O_TRUNC | O_WRONLY, FILEMODE); //creat(Fwd_name,FILEMODE);
|
Forward = open(Fwd_name,O_CREAT | O_TRUNC | O_WRONLY, FILEMODE); //creat(Fwd_name,FILEMODE);
|
if(Forward <0)
|
if(Forward <0)
|
fatal("Can't create temp file");
|
fatal("Can't create temp file");
|
close(Forward); /* close and reopen for reads and writes */
|
close(Forward); /* close and reopen for reads and writes */
|
Forward = open(Fwd_name,UPDATE);
|
Forward = open(Fwd_name,UPDATE);
|
if(Forward <0)
|
if(Forward <0)
|
fatal("Forward ref file has gone.");
|
fatal("Forward ref file has gone.");
|
}
|
}
|
|
|
/*
|
/*
|
* fwdreinit --- reinitialize forward ref file
|
* fwdreinit --- reinitialize forward ref file
|
*/
|
*/
|
fwdreinit()
|
fwdreinit()
|
{
|
{
|
F_ref = 0;
|
F_ref = 0;
|
Ffn = 0;
|
Ffn = 0;
|
lseek(Forward,0L,ABS); /* rewind forward refs */
|
lseek(Forward,0L,ABS); /* rewind forward refs */
|
read(Forward,&Ffn,sizeof(Ffn));
|
read(Forward,&Ffn,sizeof(Ffn));
|
read(Forward,&F_ref,sizeof(F_ref)); /* read first forward ref into mem */
|
read(Forward,&F_ref,sizeof(F_ref)); /* read first forward ref into mem */
|
#ifdef DEBUG
|
#ifdef DEBUG
|
printf("First fwd ref: %d,%d\n",Ffn,F_ref);
|
printf("First fwd ref: %d,%d\n",Ffn,F_ref);
|
#endif
|
#endif
|
}
|
}
|
|
|
/*
|
/*
|
* fwdmark --- mark current file/line as containing a forward ref
|
* fwdmark --- mark current file/line as containing a forward ref
|
*/
|
*/
|
fwdmark()
|
fwdmark()
|
{
|
{
|
write(Forward,&Cfn,sizeof(Cfn));
|
write(Forward,&Cfn,sizeof(Cfn));
|
write(Forward,&Line_num,sizeof(Line_num));
|
write(Forward,&Line_num,sizeof(Line_num));
|
}
|
}
|
|
|
/*
|
/*
|
* fwdnext --- get next forward ref
|
* fwdnext --- get next forward ref
|
*/
|
*/
|
fwdnext()
|
fwdnext()
|
{
|
{
|
int stat;
|
int stat;
|
|
|
stat = read(Forward,&Ffn,sizeof(Ffn));
|
stat = read(Forward,&Ffn,sizeof(Ffn));
|
#ifdef DEBUG
|
#ifdef DEBUG
|
printf("Ffn stat=%d ",stat);
|
printf("Ffn stat=%d ",stat);
|
#endif
|
#endif
|
stat = read(Forward,&F_ref,sizeof(F_ref));
|
stat = read(Forward,&F_ref,sizeof(F_ref));
|
#ifdef DEBUG
|
#ifdef DEBUG
|
printf("F_ref stat=%d ",stat);
|
printf("F_ref stat=%d ",stat);
|
#endif
|
#endif
|
if( stat < 2 ){
|
if( stat < 2 ){
|
F_ref=0;Ffn=0;
|
F_ref=0;Ffn=0;
|
}
|
}
|
#ifdef DEBUG
|
#ifdef DEBUG
|
printf("Next Fwd ref: %d,%d\n",Ffn,F_ref);
|
printf("Next Fwd ref: %d,%d\n",Ffn,F_ref);
|
#endif
|
#endif
|
}
|
}
|
|
|
/*
|
/*
|
* fwd_done --- closes & deletes forward reference file
|
* fwd_done --- closes & deletes forward reference file
|
*/
|
*/
|
fwd_done()
|
fwd_done()
|
{
|
{
|
int stat;
|
int stat;
|
|
|
stat = close(Forward); /* Have to close first on MS-DOS or you leave lost clusters. */
|
stat = close(Forward); /* Have to close first on MS-DOS or you leave lost clusters. */
|
#ifndef DEBUG
|
#ifndef DEBUG
|
if( stat == 0 ) /* If close was successful, delete file */
|
if( stat == 0 ) /* If close was successful, delete file */
|
unlink(Fwd_name);
|
unlink(Fwd_name);
|
#endif
|
#endif
|
}
|
}
|
|
|