merge in onyx changes
[unix-history] / usr / src / usr.bin / pascal / libpc / READE.c
CommitLineData
0148435a
KM
1/* Copyright (c) 1979 Regents of the University of California */
2
492cc5d3 3static char sccsid[] = "@(#)READE.c 1.4 %G%";
0148435a
KM
4
5#include "h00vars.h"
6#include "h01errs.h"
7
492cc5d3 8long
0148435a
KM
9READE(curfile, name)
10
11 register struct iorec *curfile;
12 char *name;
13{
0148435a
KM
14 register short *sptr;
15 register int len;
16 register int nextlen;
17 register int cnt;
18 char *cp;
19 char namebuf[NAMSIZ];
53909d1e 20 int retval;
0148435a
KM
21
22 if (curfile->funit & FWRITE) {
23 ERROR(EREADIT, curfile->pfname);
24 return;
25 }
26 UNSYNC(curfile);
53909d1e 27 retval = fscanf(curfile->fbuf,
0148435a 28 "%*[ \t\n]%74[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]",
53909d1e
KM
29 namebuf);
30 if (retval == EOF) {
31 ERROR(EPASTEOF, curfile->pfname);
32 return;
33 }
34 if (retval == 0) {
0148435a
KM
35 ERROR(ENUMNTFD, namebuf);
36 return;
37 }
e5053b93 38 curfile->funit &= ~EOLN;
0148435a
KM
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 }
492cc5d3 52 cp += (int)nextlen;
0148435a
KM
53 } while (--cnt);
54 ERROR(ENUMNTFD, namebuf);
55}