xref: /csrg-svn/usr.bin/pascal/libpc/PFCLOSE.c (revision 62094)
140865Sbostic /*-
2*62094Sbostic  * Copyright (c) 1982, 1993
3*62094Sbostic  *	The Regents of the University of California.  All rights reserved.
440865Sbostic  *
540865Sbostic  * %sccs.include.redist.c%
640865Sbostic  */
77968Smckusick 
840865Sbostic #ifndef lint
9*62094Sbostic static char sccsid[] = "@(#)PFCLOSE.c	8.1 (Berkeley) 06/06/93";
1040865Sbostic #endif /* not lint */
117968Smckusick 
127968Smckusick /*
137968Smckusick  * Close a Pascal file deallocating resources as appropriate.
147968Smckusick  */
157968Smckusick 
167968Smckusick #include "h00vars.h"
177968Smckusick #include "libpc.h"
187968Smckusick 
197968Smckusick struct iorec *
PFCLOSE(filep,lastuse)2010565Smckusick PFCLOSE(filep, lastuse)
217968Smckusick 	register struct iorec *filep;
2210565Smckusick 	bool lastuse;
237968Smckusick {
247968Smckusick 	if ((filep->funit & FDEF) == 0 && filep->fbuf != NULL) {
257968Smckusick 		/*
267968Smckusick 		 * Have a previous buffer, close associated file.
277968Smckusick 		 */
287968Smckusick 		if (filep->fblk > PREDEF) {
297968Smckusick 			fflush(filep->fbuf);
307968Smckusick 			setbuf(filep->fbuf, NULL);
317968Smckusick 		}
327968Smckusick 		fclose(filep->fbuf);
337968Smckusick 		if (ferror(filep->fbuf)) {
347968Smckusick 			ERROR("%s: Close failed\n", filep->pfname);
357968Smckusick 			return;
367968Smckusick 		}
377968Smckusick 		/*
387968Smckusick 		 * Temporary files are discarded.
397968Smckusick 		 */
4010565Smckusick 		if ((filep->funit & TEMP) != 0 && lastuse &&
4110565Smckusick 		    unlink(filep->pfname)) {
427968Smckusick 			PERROR("Could not remove ", filep->pfname);
437968Smckusick 			return;
447968Smckusick 		}
457968Smckusick 	}
467968Smckusick 	_actfile[filep->fblk] = FILNIL;
477968Smckusick 	return (filep->fchain);
487968Smckusick }
49