#ifndef BOKF_UTIL_H #define BOKF_UTIL_H #include #include #include void *xmalloc(size_t n); void *xcalloc(size_t n, size_t sz); void *xrealloc(void *p, size_t n); char *xstrdup(const char *s); struct buf { unsigned char *p; size_t len, cap; }; void buf_init(struct buf *b); void buf_free(struct buf *b); void buf_append(struct buf *b, const void *data, size_t n); void buf_append_u16be(struct buf *b, uint16_t v); void buf_append_u32be(struct buf *b, uint32_t v); void buf_append_u64be(struct buf *b, uint64_t v); void util_sha256(const void *data, size_t n, unsigned char out[32]); void util_hex(const unsigned char *in, size_t n, char *out); char *util_b64url(const unsigned char *in, size_t n); char *util_b64(const unsigned char *in, size_t n); int util_random(void *out, size_t n); char *util_random_id(const char *prefix, size_t nbytes); int util_const_eq(const void *a, const void *b, size_t n); int64_t util_now(void); void util_iso8601(int64_t t, char *buf, size_t n); char *util_str_trim(char *s); int util_parse_iso_date(const char *s); /* base64 (standard alphabet, padding required) */ int util_b64_decode(const char *in, size_t in_len, unsigned char **out, size_t *out_len); /* date helpers, all dates "YYYY-MM-DD" */ int util_date_parse(const char *s, int *y, int *m, int *d); void util_date_fmt(int y, int m, int d, char *buf, size_t n); int util_days_in_month(int y, int m); void util_date_add_months(const char *date, int months, char *out, size_t n); void util_date_add_days(const char *date, int days, char *out, size_t n); int util_date_valid(const char *s); /* encoding conversion for SIE files (IBM PC8 / CP437) */ size_t util_utf8_to_cp437(const char *in, unsigned char *out, size_t out_sz); char *util_cp437_to_utf8(const unsigned char *in, size_t n); #endif