scc

A fork of https://git.simple-cc.org/scc/ for Qute

git clone https://git.8pit.net/scc.git

 1#include <errno.h>
 2#include <stdio.h>
 3#include <stdlib.h>
 4
 5#include "../libc.h"
 6
 7#undef setvbuf
 8
 9int
10setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size)
11{
12	int flags;
13	unsigned char *p;
14	size_t l;
15
16	if (_flsbuf(fp) == EOF)
17		return EOF;
18
19	if (buf)
20		p = (unsigned char *) buf, l = size;
21	else
22		p = fp->buf, l = fp->len;
23
24	switch (mode) {
25	case _IONBF:
26		l = sizeof(fp->unbuf);
27		p = fp->unbuf;
28	case _IOLBF:
29	case _IOFBF:
30		fp->rp = fp->wp = p;
31		fp->lp = p + l;
32		break;
33	default:
34		errno = EINVAL;
35		return EOF;
36	}
37
38	flags = fp->flags;
39	if (flags&_IOALLOC && (buf || mode == _IONBF)) {
40		free(fp->buf);
41		flags &= ~_IOALLOC;
42	}
43
44	fp->buf = p;
45	fp->len = l;
46	flags &= ~(_IONBF | _IOLBF | _IOFBF);
47	flags |= mode;
48	fp->flags = flags;
49
50	return 0;
51}