aboutsummaryrefslogtreecommitdiffstats
path: root/libpatch_fd_diff2_printer__.c
blob: 3267b69265fa0e0274df32f0abc4b70198ddce5d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/* See LICENSE file for copyright and license details. */
#include "common.h"


static void
put(struct libpatch_diff2_printer *this, const char *text, size_t len)
{
	size_t off;
	ssize_t r;
	int fd = ((struct printer_internals *)this->user_data)->f.fd;
	for (off = 0; off < len; off += (size_t)r) {
		r = write(fd, &text[off], len - off);
		if (r < 0) {
			if (errno != EINTR) {
				this->error = errno;
				break;
			}
			r = 0;
		}
	}
}


struct libpatch_diff2_printer *
libpatch_fd_diff2_printer__(int output)
{
	struct libpatch_diff2_printer *printer;
	struct printer_internals *internals;
	printer = calloc(1, sizeof(*printer) + sizeof(struct printer_internals));
	if (!printer)
		return NULL;
	internals = (void *)&((char *)printer)[sizeof(*printer)];
	printer->user_data = internals;
	internals->put = put;
	internals->f.fd = output;
	return printer;
	
}