#pragma once

#include <buf.h>
#include <orb.h>
#include "util.h"

#define DUC_OUT ((orb_ctx_t *) out)
#define DUC_WRITE(str) { buf_write(DUC_OUT->out, str); }
#define DUC_CLEAR() { buf_free(DUC_OUT->out); }

#define BINARY(bytes, len) { buf_write_len(DUC_OUT->out, bytes, len); }
#define HTML(str) DUC_WRITE(str ? str : "")
#define STRING(str) { \
  buf_t buf = BUF_NULL; \
  buf_write(&buf, str); \
  buf_repall(&buf, "&", "&amp;"); \
  buf_repall(&buf, "<", "&lt;"); \
  buf_repall(&buf, ">", "&gt;"); \
  buf_concat(DUC_OUT->out, buf); \
  buf_free(&buf); \
}
#define PRINTF(fmt, ...) { buf_writef(DUC_OUT->out, fmt, __VA_ARGS__); }
#define NUMBER(num) PRINTF("%d", num)
#define FORMAT_TIME(time, fmt) { \
  struct tm *tm = localtime(time); \
  char buffer[100]; \
  int len = strftime(buffer, 100, fmt, tm); \
  buffer[len] = '\0'; \
  STRING(buffer) \
}

#define MARKDOWN(str) { util_md_html(str, DUC_OUT->out); }
