| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 | #include "f2c.h"#include "fio.h"/* Compile this with -DNO_TRUNCATE if unistd.h does not exist or *//* if it does not define int truncate(const char *name, off_t). */#ifdef MSDOS#undef NO_TRUNCATE#define NO_TRUNCATE#endif#ifndef NO_TRUNCATE#include "unistd.h"#endif#ifdef KR_headersextern char *strcpy();extern FILE *tmpfile();#else#undef abs#undef min#undef max#include "stdlib.h"#include "string.h"#ifdef __cplusplusextern "C" {#endif#endifextern char *f__r_mode[], *f__w_mode[];#ifdef KR_headersinteger f_end(a) alist *a;#elseinteger f_end(alist *a)#endif{	unit *b;	FILE *tf;	if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"endfile");	b = &f__units[a->aunit];	if(b->ufd==NULL) {		char nbuf[10];		sprintf(nbuf,"fort.%ld",(long)a->aunit);		if (tf = FOPEN(nbuf, f__w_mode[0]))			fclose(tf);		return(0);		}	b->uend=1;	return(b->useek ? t_runc(a) : 0);}#ifdef NO_TRUNCATE static int#ifdef KR_headerscopy(from, len, to) FILE *from, *to; register long len;#elsecopy(FILE *from, register long len, FILE *to)#endif{	int len1;	char buf[BUFSIZ];	while(fread(buf, len1 = len > BUFSIZ ? BUFSIZ : (int)len, 1, from)) {		if (!fwrite(buf, len1, 1, to))			return 1;		if ((len -= len1) <= 0)			break;		}	return 0;	}#endif /* NO_TRUNCATE */ int#ifdef KR_headerst_runc(a) alist *a;#elset_runc(alist *a)#endif{	OFF_T loc, len;	unit *b;	int rc;	FILE *bf;#ifdef NO_TRUNCATE	FILE *tf;#endif	b = &f__units[a->aunit];	if(b->url)		return(0);	/*don't truncate direct files*/	loc=FTELL(bf = b->ufd);	FSEEK(bf,(OFF_T)0,SEEK_END);	len=FTELL(bf);	if (loc >= len || b->useek == 0)		return(0);#ifdef NO_TRUNCATE	if (b->ufnm == NULL)		return 0;	rc = 0;	fclose(b->ufd);	if (!loc) {		if (!(bf = FOPEN(b->ufnm, f__w_mode[b->ufmt])))			rc = 1;		if (b->uwrt)			b->uwrt = 1;		goto done;		}	if (!(bf = FOPEN(b->ufnm, f__r_mode[0]))	 || !(tf = tmpfile())) {#ifdef NON_UNIX_STDIO bad:#endif		rc = 1;		goto done;		}	if (copy(bf, (long)loc, tf)) { bad1:		rc = 1;		goto done1;		}	if (!(bf = FREOPEN(b->ufnm, f__w_mode[0], bf)))		goto bad1;	rewind(tf);	if (copy(tf, (long)loc, bf))		goto bad1;	b->uwrt = 1;	b->urw = 2;#ifdef NON_UNIX_STDIO	if (b->ufmt) {		fclose(bf);		if (!(bf = FOPEN(b->ufnm, f__w_mode[3])))			goto bad;		FSEEK(bf,(OFF_T)0,SEEK_END);		b->urw = 3;		}#endifdone1:	fclose(tf);done:	f__cf = b->ufd = bf;#else /* NO_TRUNCATE */	if (b->urw & 2)		fflush(b->ufd); /* necessary on some Linux systems */#ifndef FTRUNCATE#define FTRUNCATE ftruncate#endif	rc = FTRUNCATE(fileno(b->ufd), loc);	/* The following FSEEK is unnecessary on some systems, */	/* but should be harmless. */	FSEEK(b->ufd, (OFF_T)0, SEEK_END);#endif /* NO_TRUNCATE */	if (rc)		err(a->aerr,111,"endfile");	return 0;	}#ifdef __cplusplus}#endif
 |