getospace.c - vx32 - Local 9vx git repository for patches.
(HTM) git clone git://r-36.net/vx32
(DIR) Log
(DIR) Files
(DIR) Refs
---
getospace.c (1021B)
---
1
2 #include <unistd.h>
3 #include <errno.h>
4
5 #include "libvxc/private.h"
6 #include "ioprivate.h"
7
8
9 static char stdoutbuf[BUFSIZ];
10 static char stderrbuf[BUFSIZ];
11
12 FILE __stdout = {STDOUT_FILENO, _IOLBF};
13 FILE __stderr = {STDERR_FILENO, _IOLBF};
14
15
16 static void flushstdout()
17 {
18 fflush(stdout);
19 fflush(stderr);
20 }
21
22 // Get some output buffer space,
23 // allocating a new output buffer or flushing the existing one if necessary.
24 int __getospace(FILE *f)
25 {
26 if (f->obuf == NULL) {
27 // No output buffer at all (yet).
28
29 // Give stdout and stderr static buffers,
30 // so that we can get printf without pulling in malloc.
31 if (f == stdout || f == stderr) {
32
33 stdout->obuf = stdoutbuf;
34 stdout->omax = BUFSIZ;
35 stderr->obuf = stderrbuf;
36 stderr->omax = BUFSIZ;
37 __exit_flush = flushstdout;
38
39 } else {
40
41 // File must not be open for writing.
42 errno = EBADF;
43 f->errflag = 1;
44 return EOF;
45 }
46
47 } else {
48
49 // We have an output buffer but it may be full - flush it.
50 if (fflush(f) < 0)
51 return EOF;
52 }
53
54 return 0;
55 }
56