| 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_headers
 
- extern char *strcpy();
 
- extern FILE *tmpfile();
 
- #else
 
- #undef abs
 
- #undef min
 
- #undef max
 
- #include "stdlib.h"
 
- #include "string.h"
 
- #ifdef __cplusplus
 
- extern "C" {
 
- #endif
 
- #endif
 
- extern char *f__r_mode[], *f__w_mode[];
 
- #ifdef KR_headers
 
- integer f_end(a) alist *a;
 
- #else
 
- integer 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_headers
 
- copy(from, len, to) FILE *from, *to; register long len;
 
- #else
 
- copy(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_headers
 
- t_runc(a) alist *a;
 
- #else
 
- t_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;
 
- 		}
 
- #endif
 
- done1:
 
- 	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
 
 
  |