#include #include #include #include #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); }