xref: /original-bsd/usr.bin/pascal/libpc/IOSYNC.c (revision 014fe330)
1 /* Copyright (c) 1979 Regents of the University of California */
2 
3 static char sccsid[] = "@(#)IOSYNC.c 1.5 06/10/81";
4 
5 #include "h00vars.h"
6 
7 /*
8  * insure that a usable image is in the buffer window
9  */
10 IOSYNC(curfile)
11 
12 	register struct iorec	*curfile;
13 {
14 	char			*limit, *ptr;
15 
16 	if (curfile->funit & FWRITE) {
17 		ERROR("%s: Attempt to read, but open for writing\n",
18 			curfile->pfname);
19 		return;
20 	}
21 	if ((curfile->funit & SYNC) == 0) {
22 		return;
23 	}
24 	if (curfile->funit & EOFF) {
25 		ERROR("%s: Tried to read past end of file\n", curfile->pfname);
26 		return;
27 	}
28 	curfile->funit &= ~SYNC;
29 	if (curfile->funit & SPEOLN) {
30 		curfile->funit &= ~(SPEOLN|EOLN);
31 		curfile->funit |= EOFF;
32 		return;
33 	}
34 	fread(curfile->fileptr, (int)curfile->fsize, 1, curfile->fbuf);
35 	if (ferror(curfile->fbuf)) {
36 		ERROR("%s: Tried to read past end of file\n", curfile->pfname);
37 		return;
38 	}
39 	if (feof(curfile->fbuf)) {
40 		if (curfile->funit & FTEXT) {
41 			*curfile->fileptr = ' ';
42 			if (curfile->funit & EOLN) {
43 				curfile->funit &= ~EOLN;
44 				curfile->funit |= EOFF;
45 				return;
46 			}
47 			curfile->funit |= (SPEOLN|EOLN);
48 			return;
49 		}
50 		curfile->funit |= EOFF;
51 		limit = &curfile->fileptr[curfile->fsize];
52 		for (ptr = curfile->fileptr; ptr < limit; )
53 			*ptr++ = 0;
54 		return;
55 	}
56 	if (curfile->funit & FTEXT) {
57 		if (*curfile->fileptr == '\n') {
58 			curfile->funit |= EOLN;
59 			*curfile->fileptr = ' ';
60 			return;
61 		}
62 		curfile->funit &= ~EOLN;
63 	}
64 }
65