#pragma once #include "allocator.h" #include #define HMD_SEC_SPN (1) #define HMD_MIN_SPN (60) #define HMD_HOUR_SPN (HMD_MIN_SPN * 60) #define HMD_DAY_SPN (HMD_HOUR_SPN * 24) #define HMD_WEEK_SPN (HMD_DAY_SPN * 7) enum hmd_err { HMD_OK = 0, HMD_ERR_OOB, HMD_ERR_FMT, HMD_ERR_SYS, HMD_ERR_ARG, HMD_ERR_INT }; enum hmd_mon { HMD_JAN, HMD_FEB, HMD_MAR, HMD_APR, HMD_MAY, HMD_JUN, HMD_JUL, HMD_AUG, HMD_SEP, HMD_OCT, HMD_NOV, HMD_DEC }; enum hmd_wday { HMD_SUN, HMD_MON, HMD_TUE, HMD_WED, HMD_THU, HMD_FRI, HMD_SAT, }; struct hmd_spn { uint32_t years; uint32_t weeks; uint32_t days; uint32_t hours; uint32_t mins; uint32_t secs; }; struct hmd_date { uint64_t ts; /* unix epoch */ uint64_t spn; }; struct hmd_dd { uint16_t year; uint8_t month; uint8_t day; }; struct hmd_tod { uint8_t hour; uint8_t min; uint8_t sec; uint16_t spn; }; enum hmd_err hmd_spn_parse(struct hmd_spn *spn, const char *arg); enum hmd_err hmd_spn_ival_parse(struct hmd_spn *spn, const char *arg); enum hmd_err hmd_spn_calc(struct hmd_spn *spn, uint64_t start, uint64_t end); uint64_t hmd_spn_secs(struct hmd_spn *spn); char *hmd_spn_str(struct hmd_spn *spn, const struct allocator *allocator, int *rc); char *hmd_spn_ival_str(struct hmd_spn *spn, const struct allocator *allocator, int *rc); enum hmd_err hmd_date_parse_daydate_reltime_weekday( struct hmd_date *date, char *arg); enum hmd_err hmd_date_parse_daydate_reltime_coarse( struct hmd_date *date, char *arg); enum hmd_err hmd_date_parse_daydate_iso8601(struct hmd_date *date, char *arg); enum hmd_err hmd_timeofday_parse(struct hmd_tod *tod, char *arg); enum hmd_err hmd_date_parse(struct hmd_date *date, char *arg); char *hmd_date_str_reltime_exact(struct hmd_date *date, const struct allocator *allocator, int *rc); char *hmd_date_str_reltime_coarse(struct hmd_date *date, const struct allocator *allocator, int *rc); char *hmd_date_str_iso8601(struct hmd_date *date, const struct allocator *allocator, int *rc); char *hmd_date_str(struct hmd_date *date, const struct allocator *allocator, int *rc); extern const char *hmd_wdnames[7]; extern const char *hmd_mnames[12]; extern const int hmd_mdays[12];