/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
/*	  All Rights Reserved  	*/

/*	THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T	*/
/*	The copyright notice above does not evidence any   	*/
/*	actual or intended publication of such source code.	*/

#ident	"@(#)file.c	1.4	92/07/14 SMI"       /* SVr4.0 1.10 */
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <table.h>
#include <internal.h>

/* How much to read at a time */
#define	NTIMES	4
#define	TLBSIZE	(TL_MAXLINESZ / NTIMES)

extern tbl_t TLtables[];
extern unsigned char TLgenbuf[];

int
TLfl_getentry( tid, buffer, count )
int tid, count;
unsigned char *buffer;
{
	tbl_t *tptr = TLtables + tid;
	register unsigned char *to = buffer, *from = TLgenbuf, eoe;
	register rc, nchars, nread, ntimes, done = FALSE, escape = FALSE;

	eoe = tptr->description.td_eoe;


	/* Break up reading the entry into NTIMES reads */
	for( ntimes = 0, nread = 0; !done && ntimes < NTIMES; ntimes++ ) {

		if( (rc = Read( tptr->file.fid, from, TLBSIZE ) ) < 0 )
			return( TLFAILED );

		if( rc == 0 ) 
			return( TLEOF );

		nread += rc;

		while( rc-- > 0 && !(done = (*from == eoe && !escape)) ) {

			if (escape)  /*handle pending escape */
				{
				escape=FALSE; /*this char must be copied */
				*to++ = *from++;
				continue;
				}

			if( *from == '\\' ) 
			{
			escape = TRUE;  /*save the escape*/
				/* Is this the last char. read so far? */
				if (rc == 0)
					{
					*to++ = *from++;
					break;
					}  /*end of if rc == 0 */
			
	
			}  /*end of if  from == escape*/

			*to++ = *from++;
		} /*  end of while */

	}

	if( !done ) return( TLTOOLONG );
	
	*to = '\0';

	nchars = to - buffer + 1;

	/* reset fileptr to end of entry */
	if( nchars != nread ) 
		(void) lseek( tptr->file.fid, nchars - nread, 1 );

	return( nchars );
}

TLfl_lock( fid )
int fid;
{
	return( ( Lseek( fid, 0, 0 ) == -1 || lockf( fid, F_LOCK, 0 ) == -1 )?
		TLFAILED: TLOK );
}

int 
TLfl_unlock( fid )
int fid;
{
	return( ( Lseek( fid, 0, 0 ) == -1 || lockf( fid, F_ULOCK, 0 ) == -1 )?
		TLFAILED: TLOK );
}
		
int
TLfl_copy( to, from )
int to, from;
{
	unsigned char buffer[ 2048 ];
	register count = 0;
	(void) Lseek( to, 0, 0 );
	(void) Lseek( from, 0, 0 );
	while( (count != -1) && ((count = Read( from, buffer, 2048 )) > 0) )
		count = Write( to, buffer, count );
	return( count == -1? TLFAILED: TLOK );
}
