|
|
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.2 (Berkeley) 3/9/86";
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 (iop->_ptr >= base+iop->_bufsiz || c == '\n') {
39: n = write(fileno(iop), base, rn = iop->_ptr - base);
40: iop->_ptr = base;
41: iop->_cnt = 0;
42: } else
43: rn = n = 0;
44: } else if (iop->_flag&_IONBF) {
45: c1 = c;
46: rn = 1;
47: n = write(fileno(iop), &c1, rn);
48: iop->_cnt = 0;
49: } else {
50: if ((base=iop->_base)==NULL) {
51: if (fstat(fileno(iop), &stbuf) < 0 ||
52: stbuf.st_blksize <= NULL)
53: size = BUFSIZ;
54: else
55: size = stbuf.st_blksize;
56: if ((iop->_base=base=malloc(size)) == NULL) {
57: iop->_flag |= _IONBF;
58: goto tryagain;
59: }
60: iop->_flag |= _IOMYBUF;
61: iop->_bufsiz = size;
62: if (iop==stdout && isatty(fileno(stdout))) {
63: iop->_flag |= _IOLBF;
64: iop->_ptr = base;
65: goto tryagain;
66: }
67: rn = n = 0;
68: } else if ((rn = n = iop->_ptr - base) > 0) {
69: iop->_ptr = base;
70: n = write(fileno(iop), base, n);
71: }
72: iop->_cnt = iop->_bufsiz-1;
73: *base++ = c;
74: iop->_ptr = base;
75: }
76: if (rn != n) {
77: iop->_flag |= _IOERR;
78: return(EOF);
79: }
80: return(c);
81: }
82:
83: fflush(iop)
84: register FILE *iop;
85: {
86: register char *base;
87: register n;
88:
89: if ((iop->_flag&(_IONBF|_IOWRT))==_IOWRT
90: && (base=iop->_base)!=NULL && (n=iop->_ptr-base)>0) {
91: iop->_ptr = base;
92: iop->_cnt = (iop->_flag&(_IOLBF|_IONBF)) ? 0 : iop->_bufsiz;
93: if (write(fileno(iop), base, n)!=n) {
94: iop->_flag |= _IOERR;
95: return(EOF);
96: }
97: }
98: return(0);
99: }
100:
101: fclose(iop)
102: register FILE *iop;
103: {
104: register int r;
105:
106: r = EOF;
107: if (iop->_flag&(_IOREAD|_IOWRT|_IORW) && (iop->_flag&_IOSTRG)==0) {
108: r = fflush(iop);
109: if (close(fileno(iop)) < 0)
110: r = EOF;
111: if (iop->_flag&_IOMYBUF)
112: free(iop->_base);
113: }
114: iop->_cnt = 0;
115: iop->_base = (char *)NULL;
116: iop->_ptr = (char *)NULL;
117: iop->_bufsiz = 0;
118: iop->_flag = 0;
119: iop->_file = 0;
120: return(r);
121: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.