|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #if defined(LIBC_SCCS) && !defined(lint)
8: static char sccsid[] = "@(#)flsbuf.c 5.5 (Berkeley) 6/18/90";
9: #endif LIBC_SCCS and not lint
10:
11: #include <stdio.h>
12: #include <sys/types.h>
13: #include <sys/stat.h>
14:
15: char *malloc();
16:
17: _flsbuf(c, iop)
18: unsigned char c;
19: register FILE *iop;
20: {
21: register char *base;
22: register n, rn;
23: char c1;
24: int size;
25: struct stat stbuf;
26:
27: if (iop->_flag & _IORW) {
28: iop->_flag |= _IOWRT;
29: iop->_flag &= ~(_IOEOF|_IOREAD);
30: }
31:
32: if ((iop->_flag&_IOWRT)==0)
33: return(EOF);
34: tryagain:
35: if (iop->_flag&_IOLBF) {
36: base = iop->_base;
37: *iop->_ptr++ = c;
38: if ((rn = iop->_ptr - base) >= iop->_bufsiz || c == '\n') {
39: iop->_ptr = base;
40: iop->_cnt = 0;
41: } else {
42: /* we got here because _cnt is wrong, so fix it */
43: iop->_cnt = -rn;
44: rn = n = 0;
45: }
46: } else if (iop->_flag&_IONBF) {
47: c1 = c;
48: rn = 1;
49: base = &c1;
50: iop->_cnt = 0;
51: } else {
52: if ((base=iop->_base)==NULL) {
53: if (fstat(fileno(iop), &stbuf) < 0 ||
54: stbuf.st_blksize <= NULL)
55: size = BUFSIZ;
56: else
57: size = stbuf.st_blksize;
58: if ((iop->_base=base=malloc(size)) == NULL) {
59: iop->_flag |= _IONBF;
60: goto tryagain;
61: }
62: iop->_flag |= _IOMYBUF;
63: iop->_bufsiz = size;
64: if (iop==stdout && isatty(fileno(stdout))) {
65: iop->_flag |= _IOLBF;
66: iop->_ptr = base;
67: goto tryagain;
68: }
69: rn = n = 0;
70: } else
71: rn = iop->_ptr - base;
72: iop->_ptr = base;
73: iop->_cnt = iop->_bufsiz;
74: }
75: while (rn > 0) {
76: if ((n = write(fileno(iop), base, rn)) <= 0) {
77: iop->_flag |= _IOERR;
78: return(EOF);
79: }
80: rn -= n;
81: base += n;
82: }
83: if ((iop->_flag&(_IOLBF|_IONBF)) == 0) {
84: iop->_cnt--;
85: *iop->_ptr++ = c;
86: }
87: return(c);
88: }
89:
90: fpurge(iop)
91: register FILE *iop;
92: {
93: iop->_ptr = iop->_base;
94: iop->_cnt = iop->_flag&(_IOLBF|_IONBF|_IOREAD) ? 0 : iop->_bufsiz;
95: return(0);
96: }
97:
98: fflush(iop)
99: register FILE *iop;
100: {
101: register char *base;
102: register n, rn;
103:
104: if ((iop->_flag&(_IONBF|_IOWRT))==_IOWRT &&
105: (base = iop->_base) != NULL && (rn = n = iop->_ptr - base) > 0) {
106: iop->_ptr = base;
107: iop->_cnt = (iop->_flag&(_IOLBF|_IONBF)) ? 0 : iop->_bufsiz;
108: do {
109: if ((n = write(fileno(iop), base, rn)) <= 0) {
110: iop->_flag |= _IOERR;
111: return(EOF);
112: }
113: rn -= n;
114: base += n;
115: } while (rn > 0);
116: }
117: return(0);
118: }
119:
120: fclose(iop)
121: register FILE *iop;
122: {
123: register int r;
124:
125: r = EOF;
126: if (iop->_flag&(_IOREAD|_IOWRT|_IORW) && (iop->_flag&_IOSTRG)==0) {
127: r = fflush(iop);
128: if (close(fileno(iop)) < 0)
129: r = EOF;
130: if (iop->_flag&_IOMYBUF)
131: free(iop->_base);
132: }
133: iop->_cnt = 0;
134: iop->_base = (char *)NULL;
135: iop->_ptr = (char *)NULL;
136: iop->_bufsiz = 0;
137: iop->_flag = 0;
138: iop->_file = 0;
139: return(r);
140: }
141:
142: _cleanup()
143: {
144: extern int _fwalk();
145:
146: _fwalk(fclose);
147: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.