Add copyright
[unix-history] / usr / src / lib / libc / stdio / wbuf.c
... / ...
CommitLineData
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#ifndef lint
8static char sccsid[] = "@(#)wbuf.c 5.1 (Berkeley) %G%";
9#endif not lint
10
11#include <stdio.h>
12#include <sys/types.h>
13#include <sys/stat.h>
14
15char *malloc();
16
17_flsbuf(c, iop)
18unsigned char c;
19register 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);
34tryagain:
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
83fflush(iop)
84register 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
101fclose(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}