63 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "f2c.h"
 | 
						|
#include "fio.h"
 | 
						|
integer f_back(a) alist *a;
 | 
						|
{	unit *b;
 | 
						|
	int n,i;
 | 
						|
	long x;
 | 
						|
	char buf[32];
 | 
						|
	if(a->aunit >= MXUNIT || a->aunit < 0)
 | 
						|
		err(a->aerr,101,"backspace")
 | 
						|
	b= &units[a->aunit];
 | 
						|
	if(b->useek==0) err(a->aerr,106,"backspace")
 | 
						|
	if(b->ufd==NULL) {
 | 
						|
		fk_open(1, 1, a->aunit);
 | 
						|
		return(0);
 | 
						|
		}
 | 
						|
	if(b->uend==1)
 | 
						|
	{	b->uend=0;
 | 
						|
		return(0);
 | 
						|
	}
 | 
						|
	if(b->uwrt) {
 | 
						|
		(void) t_runc(a);
 | 
						|
		if (nowreading(b))
 | 
						|
			err(a->aerr,errno,"backspace")
 | 
						|
		}
 | 
						|
	if(b->url>0)
 | 
						|
	{	long y;
 | 
						|
		x=ftell(b->ufd);
 | 
						|
		y = x % b->url;
 | 
						|
		if(y == 0) x--;
 | 
						|
		x /= b->url;
 | 
						|
		x *= b->url;
 | 
						|
		(void) fseek(b->ufd,x,SEEK_SET);
 | 
						|
		return(0);
 | 
						|
	}
 | 
						|
 | 
						|
	if(b->ufmt==0)
 | 
						|
	{	(void) fseek(b->ufd,-(long)sizeof(int),SEEK_CUR);
 | 
						|
		(void) fread((char *)&n,sizeof(int),1,b->ufd);
 | 
						|
		(void) fseek(b->ufd,-(long)n-2*sizeof(int),SEEK_CUR);
 | 
						|
		return(0);
 | 
						|
	}
 | 
						|
	for(;;)
 | 
						|
	{	long y;
 | 
						|
		y = x=ftell(b->ufd);
 | 
						|
		if(x<sizeof(buf)) x=0;
 | 
						|
		else x -= sizeof(buf);
 | 
						|
		(void) fseek(b->ufd,x,SEEK_SET);
 | 
						|
		n=fread(buf,1,(int)(y-x), b->ufd);
 | 
						|
		for(i=n-2;i>=0;i--)
 | 
						|
		{
 | 
						|
			if(buf[i]!='\n') continue;
 | 
						|
			(void) fseek(b->ufd,(long)(i+1-n),SEEK_CUR);
 | 
						|
			return(0);
 | 
						|
		}
 | 
						|
		if(x==0)
 | 
						|
			{
 | 
						|
			(void) fseek(b->ufd, 0L, SEEK_SET);
 | 
						|
			return(0);
 | 
						|
			}
 | 
						|
		else if(n<=0) err(a->aerr,(EOF),"backspace")
 | 
						|
		(void) fseek(b->ufd, x, SEEK_SET);
 | 
						|
	}
 | 
						|
}
 |