xref: /csrg-svn/usr.bin/f77/libU77/fgetc_.c (revision 3895)
12410Sdlw /*
2*3895Sdlw char id_fgetc[] = "@(#)fgetc_.c	1.3";
32410Sdlw  *
42410Sdlw  * get a character from a logical unit bypassing formatted I/O
52410Sdlw  *
62410Sdlw  * calling sequence:
72410Sdlw  *	integer fgetc
82410Sdlw  *	ierror = fgetc (unit, char)
92410Sdlw  * where:
102410Sdlw  *	char will return a character from logical unit
112410Sdlw  *	ierror will be 0 if successful; a system error code otherwise.
122410Sdlw  */
132410Sdlw 
142410Sdlw #include	"../libI77/fiodefs.h"
152410Sdlw #include	"../libI77/f_errno.h"
162410Sdlw 
172410Sdlw extern unit units[];	/* logical units table from iolib */
182410Sdlw 
192410Sdlw long fgetc_(u, c, clen)
202410Sdlw long *u; char *c; long clen;
212410Sdlw {
22*3895Sdlw 	int	i;
23*3895Sdlw 	unit	*lu;
242410Sdlw 
252410Sdlw 	if (*u < 0 || *u >= MXUNIT)
262576Sdlw 		return((long)(errno=F_ERUNIT));
27*3895Sdlw 	lu = &units[*u];
28*3895Sdlw 	if (!lu->ufd)
292410Sdlw 		return((long)(errno=F_ERNOPEN));
30*3895Sdlw 	if (lu->uwrt)
31*3895Sdlw 		nowreading(lu);
32*3895Sdlw 	if ((i = getc (lu->ufd)) < 0)
332410Sdlw 	{
34*3895Sdlw 		if (feof(lu->ufd))
352410Sdlw 			return(-1L);
362410Sdlw 		i = errno;
37*3895Sdlw 		clearerr(lu->ufd);
382410Sdlw 		return((long)i);
392410Sdlw 	}
402410Sdlw 	*c = i & 0177;
412410Sdlw 	return(0L);
422410Sdlw }
43