|
|
1.1 ! root 1: #include "../h/rt.h" ! 2: ! 3: /* ! 4: * reads(f,i) - read i characters on file f. ! 5: */ ! 6: Xreads(nargs, arg2, arg1, arg0) ! 7: int nargs; ! 8: struct descrip arg2, arg1, arg0; ! 9: { ! 10: register int cnt; ! 11: int status; ! 12: FILE *f; ! 13: ! 14: /* ! 15: * f defaults to &input and i defaults to 1 (character). ! 16: */ ! 17: deffile(&arg1, &input); ! 18: defshort(&arg2, 1); ! 19: ! 20: /* ! 21: * Get a pointer to the file and be sure that it's open for reading. ! 22: */ ! 23: f = BLKLOC(arg1)->file.fd; ! 24: status = BLKLOC(arg1)->file.status; ! 25: if ((status & FS_READ) == 0) ! 26: runerr(212, &arg1); ! 27: ! 28: /* ! 29: * Be sure that a positive number of bytes is to be read. ! 30: */ ! 31: if ((cnt = INTVAL(arg2)) <= 0) ! 32: runerr(205, &arg2); ! 33: ! 34: /* ! 35: * Ensure that enough space for the string exists and read it directly ! 36: * into the string space. (By reading directly into the string space, ! 37: * no arbitrary restrictions are placed on the size of the string that ! 38: * can be read.) Make arg0 a descriptor for the string and return it. ! 39: */ ! 40: sneed(cnt); ! 41: if (sfree + cnt > estrings) ! 42: runerr(302, NULL); ! 43: STRLOC(arg0) = sfree; ! 44: if ((cnt = fread(STRLOC(arg0), sizeof(char), cnt, f)) <= 0) ! 45: fail(); ! 46: STRLEN(arg0) = cnt; ! 47: sfree += cnt; ! 48: } ! 49: ! 50: Procblock(reads,2)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.