xref: /original-bsd/usr.bin/pascal/libpc/READE.c (revision a5a0fb88)
1 /* Copyright (c) 1979 Regents of the University of California */
2 
3 static char sccsid[] = "@(#)READE.c 1.7 01/09/89";
4 
5 #include "h00vars.h"
6 
7 long
8 READE(curfile, name)
9 
10 	register struct iorec	*curfile;
11 	char			*name;
12 {
13 	register short	*sptr;
14 	register int	len;
15 	register int	nextlen;
16 	register int	cnt;
17 	char		*cp;
18 	char		namebuf[NAMSIZ];
19 	int		retval;
20 
21 	if (curfile->funit & FWRITE) {
22 		ERROR("%s: Attempt to read, but open for writing\n",
23 			curfile->pfname);
24 	}
25 	UNSYNC(curfile);
26 	retval = fscanf(curfile->fbuf,
27 	    "%*[ \t\n]%74[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]",
28 	    namebuf);
29 	if (retval == EOF) {
30 		ERROR("%s: Tried to read past end of file\n", curfile->pfname);
31 	}
32 	if (retval == 0)
33 		goto ename;
34 	for (len = 0; len < NAMSIZ && namebuf[len]; len++)
35 		/* void */;
36 	len++;
37 	sptr = (short *)name;
38 	cnt = *sptr++;
39 	cp = name + sizeof (short) + *sptr;
40 	do	{
41 		nextlen = *sptr++;
42 		nextlen = *sptr - nextlen;
43 		if (nextlen == len && RELEQ(len, namebuf, cp)) {
44 			return *((short *) name) - cnt;
45 		}
46 		cp += (int)nextlen;
47 	} while (--cnt);
48 ename:
49 	ERROR("Unknown name \"%s\" found on enumerated type read\n", namebuf);
50 	return 0;
51 }
52