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