BSD 3 development
[unix-history] / .ref-BSD-2 / src / libNS / flsbuf.c
CommitLineData
d0391c55
KS
1/* Copyright (c) 1979 Regents of the University of California */
2#include <stdio.h>
3
4_flsbuf(c, iop)
5register struct _iobuf *iop;
6{
7 register n;
8 register char *base;
9 char c1, *malloc();
10 extern char _sobuf[];
11
12 if ((iop->_flag&_IOWRT)==0)
13 _error("writing\n");
14tryagain:
15 if (iop->_flag&_IONBF) {
16 c1 = c;
17 n = write(fileno(iop), &c1, 1);
18 iop->_cnt = 0;
19 } else {
20 if ((base=iop->_base)==NULL) {
21 if (iop==stdout) {
22 iop->_base = _sobuf;
23 iop->_ptr = _sobuf;
24 goto tryagain;
25 }
26 if ((iop->_base=base=malloc(BUFSIZ)) == NULL) {
27 iop->_flag |= _IONBF;
28 goto tryagain;
29 }
30 iop->_flag |= _IOMYBUF;
31 n = 1;
32 } else if ((n = iop->_ptr - base) > 0) {
33 if (iop->_delta && (iop->_flag&_IOREAD)) {
34 if(lseek(iop->_file, (long) -iop->_delta, 1)<0)
35 _error("Seek error in flsbuf\n");
36 iop->_delta = 0;
37 }
38 n = write(fileno(iop), base, n);
39 if ((iop->_flag & _IOREAD) &&
40 (0 >(iop->_delta = read(iop->_file, base, BUFSIZ)))) {
41 iop->_delta = 0;
42 iop->_flag |= _IOERR;
43 }
44 }
45 iop->_cnt = BUFSIZ-1;
46 *base++ = c;
47 iop->_ptr = base;
48 }
49 if (n < 0) {
50 iop->_flag |= _IOERR;
51 return(-1);
52 }
53 return(c);
54}
55
56fflush(iop)
57register struct _iobuf *iop;
58{
59 register char *base;
60 register n;
61
62 if ((iop->_flag&(_IONBF|_IOWRT))==_IOWRT
63 && (base=iop->_base)!=NULL && ((n=iop->_ptr-base)>0)
64 && (iop->_flag & _IODIRT)) {
65 iop->_ptr = base;
66 iop->_cnt = 0;
67 if(iop->_delta) {
68 if(0>lseek(fileno(iop), (long) -iop->_delta, 1)) {
69 _error("Seek error in fflush\n");
70 iop->_flag |= _IOERR;
71 }
72 iop->_delta = 0;
73 }
74 if (write(fileno(iop), base, n)!=n)
75 iop->_flag |= _IOERR;
76 iop->_flag &= ~_IODIRT;
77 }
78}
79
80/*
81 * Flush buffers on exit
82 */
83
84_cleanup()
85{
86 register struct _iobuf *iop;
87 extern struct _iobuf *_lastbuf;
88
89 for (iop = _iob; iop < _lastbuf; iop++)
90 fclose(iop);
91}
92
93fclose(iop)
94register struct _iobuf *iop;
95{
96 if (iop->_flag&(_IOREAD|_IOWRT)) {
97 fflush(iop);
98 close(fileno(iop));
99 if (iop->_flag&_IOMYBUF)
100 free(iop->_base);
101 }
102 iop->_base = NULL;
103 iop->_flag &= ~(_IOREAD|_IOWRT|_IONBF|_IOMYBUF|_IOERR|_IOEOF|_IODIRT|_IOSTRG);
104 iop->_cnt = 0;
105 iop->_delta = 0;
106 return(0);
107}