#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "writer.h"
void writer_init(Writer *w,
SYS_NETFD fd,
char *buf,
size_t len) {
w->fd = fd;
w->write = (wr_writefunc)net_write;
w->buffer = buf;
w->size = len;
w->pos =
0;
w->error =
0;
}
void writer_init_with_stream(Writer *w,
void *stream, wr_writefunc writefunc,
char *buf,
size_t len) {
w->fd = stream;
w->write = writefunc;
w->buffer = buf;
w->size = len;
w->pos =
0;
w->error =
0;
}
int writer_flush(Writer *w) {
if(w->error) {
return w->error;
}
size_t pos =
0;
size_t len = w->pos;
while(len >
0) {
ssize_t r = w->write(w->fd, w->buffer + pos, len);
if(r <=
0) {
break;
}
len -= r;
pos += r;
}
if(pos != w->pos) {
w->error =
1;
return 1;
}
w->pos =
0;
return 0;
}
int writer_put(Writer *w,
const char *s,
size_t len) {
if(w->error) {
return w->error;
}
size_t a = w->size - w->pos;
if(a ==
0) {
if(writer_flush(w)) {
return 1;
}
}
size_t cplen = len > a ? a : len;
memcpy(w->buffer+w->pos, s, cplen);
w->pos += cplen;
if(cplen < len) {
return writer_put(w, s + cplen, len - cplen);
}
else {
return 0;
}
}
int writer_puts(Writer *w, cxstring s) {
return writer_put(w, s.ptr, s.length);
}
int writer_putc(Writer *w,
char c) {
if(w->pos == w->size) {
if(writer_flush(w)) {
return 1;
}
}
w->buffer[w->pos++] = c;
return 0;
}
int writer_fwrite(
const void *s,
size_t size,
size_t nelem, Writer *out) {
int w = writer_put(out, s, size*nelem);
return w/size;
}