xref: /csrg-svn/usr.bin/pascal/libpc/PFCLOSE.c (revision 10565)
17968Smckusick /* Copyright (c) 1982 Regents of the University of California */
27968Smckusick 
3*10565Smckusick static	char sccsid[] = "@(#)PFCLOSE.c	1.3	(Berkeley)	01/21/83";
47968Smckusick 
57968Smckusick /*
67968Smckusick  * Close a Pascal file deallocating resources as appropriate.
77968Smckusick  */
87968Smckusick 
97968Smckusick #include "h00vars.h"
107968Smckusick #include "libpc.h"
117968Smckusick 
127968Smckusick struct iorec *
13*10565Smckusick PFCLOSE(filep, lastuse)
147968Smckusick 	register struct iorec *filep;
15*10565Smckusick 	bool lastuse;
167968Smckusick {
177968Smckusick 	if ((filep->funit & FDEF) == 0 && filep->fbuf != NULL) {
187968Smckusick 		/*
197968Smckusick 		 * Have a previous buffer, close associated file.
207968Smckusick 		 */
217968Smckusick 		if (filep->fblk > PREDEF) {
227968Smckusick 			fflush(filep->fbuf);
237968Smckusick 			setbuf(filep->fbuf, NULL);
247968Smckusick 		}
257968Smckusick 		fclose(filep->fbuf);
267968Smckusick 		if (ferror(filep->fbuf)) {
277968Smckusick 			ERROR("%s: Close failed\n", filep->pfname);
287968Smckusick 			return;
297968Smckusick 		}
307968Smckusick 		/*
317968Smckusick 		 * Temporary files are discarded.
327968Smckusick 		 */
33*10565Smckusick 		if ((filep->funit & TEMP) != 0 && lastuse &&
34*10565Smckusick 		    unlink(filep->pfname)) {
357968Smckusick 			PERROR("Could not remove ", filep->pfname);
367968Smckusick 			return;
377968Smckusick 		}
387968Smckusick 	}
397968Smckusick 	_actfile[filep->fblk] = FILNIL;
407968Smckusick 	return (filep->fchain);
417968Smckusick }
42