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