xref: /original-bsd/usr.bin/pascal/libpc/READ8.c (revision fbed46ce)
1 /* Copyright (c) 1979 Regents of the University of California */
2 
3 static char sccsid[] = "@(#)READ8.c 1.5 04/09/82";
4 
5 #include "h00vars.h"
6 #include <errno.h>
7 extern int errno;
8 
9 double
10 READ8(curfile)
11 
12 	register struct iorec	*curfile;
13 {
14 	double			data;
15 	int			retval;
16 
17 	if (curfile->funit & FWRITE) {
18 		ERROR("%s: Attempt to read, but open for writing\n",
19 			curfile->pfname);
20 		return;
21 	}
22 	UNSYNC(curfile);
23 	errno = 0;
24 	retval = fscanf(curfile->fbuf, "%lf", &data);
25 	if (retval == EOF) {
26 		ERROR("%s: Tried to read past end of file\n", curfile->pfname);
27 		return;
28 	}
29 	if (retval == 0) {
30 		ERROR("%s: Bad data found on real read\n", curfile->pfname);
31 		return;
32 	}
33 	if (errno == ERANGE) {
34 		if (data == 0.0)
35 			ERROR("%s: Underflow on real read\n", curfile->pfname);
36 		else
37 			ERROR("%s: Overflow on real read\n", curfile->pfname);
38 		return;
39 	}
40 	if (errno != 0) {
41 		PERROR(curfile->pfname);
42 		return;
43 	}
44 	curfile->funit &= ~EOLN;
45 	curfile->funit |= SYNC;
46 	return data;
47 }
48