xref: /csrg-svn/usr.bin/pascal/libpc/READE.c (revision 2309)
1 /* Copyright (c) 1979 Regents of the University of California */
2 
3 static char sccsid[] = "@(#)READE.c 1.3 01/28/81";
4 
5 #include "h00vars.h"
6 #include "h01errs.h"
7 
8 READE(curfile, name)
9 
10 	register struct iorec	*curfile;
11 	char			*name;
12 {
13 	long			data;
14 
15 	register short	*sptr;
16 	register int	len;
17 	register int	nextlen;
18 	register int	cnt;
19 	char		*cp;
20 	char		namebuf[NAMSIZ];
21 	int		retval;
22 
23 	if (curfile->funit & FWRITE) {
24 		ERROR(EREADIT, curfile->pfname);
25 		return;
26 	}
27 	UNSYNC(curfile);
28 	retval = fscanf(curfile->fbuf,
29 	    "%*[ \t\n]%74[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]",
30 	    namebuf);
31 	if (retval == EOF) {
32 		ERROR(EPASTEOF, curfile->pfname);
33 		return;
34 	}
35 	if (retval == 0) {
36 		ERROR(ENUMNTFD, namebuf);
37 		return;
38 	}
39 	curfile->funit &= ~EOLN;
40 	curfile->funit |= SYNC;
41 	for (len = 0; len < NAMSIZ && namebuf[len]; len++)
42 		/* void */;
43 	len++;
44 	sptr = (short *)name;
45 	cnt = *sptr++;
46 	cp = name + sizeof (short) + *sptr;
47 	do	{
48 		nextlen = *sptr++;
49 		nextlen = *sptr - nextlen;
50 		if (nextlen == len && RELEQ(len, namebuf, cp)) {
51 			return *((short *) name) - cnt;
52 		}
53 		cp += nextlen;
54 	} while (--cnt);
55 	ERROR(ENUMNTFD, namebuf);
56 }
57