62 lines
1.3 KiB
C
62 lines
1.3 KiB
C
|
|
#include <assert.h>
|
||
|
|
#include <stdbool.h>
|
||
|
|
#include <stddef.h>
|
||
|
|
#include <stdio.h>
|
||
|
|
|
||
|
|
#include "apfl.h"
|
||
|
|
|
||
|
|
#include "format.h"
|
||
|
|
|
||
|
|
#define WRITE(w, buf, len) w.write(w.opaque, buf, len)
|
||
|
|
#define TRY(x) if (!(x)) return false;
|
||
|
|
|
||
|
|
static bool
|
||
|
|
write_file(void *opaque, const char *buf, size_t len)
|
||
|
|
{
|
||
|
|
FILE *f = opaque;
|
||
|
|
return fwrite(buf, len, 1, f) == 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
struct apfl_format_writer
|
||
|
|
apfl_format_file_writer(FILE *f)
|
||
|
|
{
|
||
|
|
return (struct apfl_format_writer) {
|
||
|
|
.write = write_file,
|
||
|
|
.opaque = f,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
bool
|
||
|
|
apfl_format_put_string_view(struct apfl_format_writer w, struct apfl_string_view sv)
|
||
|
|
{
|
||
|
|
return WRITE(w, sv.bytes, sv.len);
|
||
|
|
}
|
||
|
|
|
||
|
|
#define PUT_INT_BUFSIZE 21 // ceil(log10(2**64)) + 1
|
||
|
|
|
||
|
|
bool
|
||
|
|
apfl_format_put_int(struct apfl_format_writer w, int i)
|
||
|
|
{
|
||
|
|
char buf[PUT_INT_BUFSIZE];
|
||
|
|
size_t len = snprintf(buf, PUT_INT_BUFSIZE, "%d", i);
|
||
|
|
assert(len < PUT_INT_BUFSIZE);
|
||
|
|
return WRITE(w, buf, len);
|
||
|
|
}
|
||
|
|
|
||
|
|
bool
|
||
|
|
apfl_format_put_char(struct apfl_format_writer w, char c)
|
||
|
|
{
|
||
|
|
return WRITE(w, &c, 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
#define PUT_HEXBYTE_BUFSIZE 3
|
||
|
|
|
||
|
|
bool
|
||
|
|
apfl_format_put_hexbyte(struct apfl_format_writer w, unsigned char c)
|
||
|
|
{
|
||
|
|
char buf[PUT_HEXBYTE_BUFSIZE];
|
||
|
|
size_t len = snprintf(buf, PUT_HEXBYTE_BUFSIZE, "%x", (unsigned) c);
|
||
|
|
assert(len < PUT_HEXBYTE_BUFSIZE);
|
||
|
|
return WRITE(w, buf, len);
|
||
|
|
}
|