39 lines
		
	
	
	
		
			814 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
	
		
			814 B
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdio.h>
 | |
| 
 | |
| 
 | |
| fseek(iop, offset, where)
 | |
| FILE *iop;
 | |
| long offset;
 | |
| {
 | |
| 	int  count;
 | |
| 	long lseek();
 | |
| 	long pos;
 | |
| 
 | |
| 	iop->_flags &= ~(IO_EOF | IO_ERR);
 | |
| 	/* Clear both the end of file and error flags */
 | |
| 
 | |
| 	if ( io_testflag(iop,IO_READMODE) ) {
 | |
| 		if ( where < 2 && iop->_buf && !io_testflag(iop,IO_UNBUFF) ) {
 | |
| 			count = iop->_count;
 | |
| 			pos = offset;
 | |
| 
 | |
| 			if ( where == 0 )
 | |
| 				pos += count - lseek(fileno(iop), 0L,1);
 | |
| 			else
 | |
| 				offset -= count;
 | |
| 
 | |
| 			if ( count > 0 && pos <= count 
 | |
| 			     && pos >= iop->_buf - iop->_ptr ) {
 | |
| 		        	iop->_ptr += (int) pos;
 | |
| 				iop->_count -= (int) pos;
 | |
| 				return(0);
 | |
| 			}
 | |
| 		}
 | |
| 		pos = lseek(fileno(iop), offset, where);
 | |
| 		iop->_count = 0;
 | |
| 	} else if ( io_testflag(iop,IO_WRITEMODE) ) {
 | |
| 		fflush(iop);
 | |
| 		pos = lseek(fileno(iop), offset, where);
 | |
| 	}
 | |
| 	return((pos == -1) ? -1 : 0 );
 | |
| }
 |