static dt_ymd_t __ymcw_to_ymd(dt_ymcw_t d) { unsigned int md = __ymcw_get_mday(d); #if defined HAVE_ANON_STRUCTS_INIT return (dt_ymd_t){.y = d.y, .m = d.m, .d = md}; #else /* !HAVE_ANON_STRUCTS_INIT */ dt_ymd_t res; res.y = d.y; res.m = d.m; res.d = md; return res; #endif /* HAVE_ANON_STRUCTS_INIT */ } static dt_ywd_t __ymcw_to_ywd(dt_ymcw_t d) { unsigned int y = d.y; dt_dow_t w = (dt_dow_t)d.w; unsigned int c = __ymcw_get_yday(d); return __make_ywd_c(y, c, w, YWD_ABSWK_CNT); }
static bool dexkv_matches_p(const_dexkv_t dkv, struct dt_dt_s d) { signed int cmp; bool res; if (dkv->sp.spfl == DT_SPFL_N_STD) { if ((cmp = __cmp(d, dkv->d)) == -2) { return false; } switch (dkv->op) { case OP_UNK: case OP_EQ: res = cmp == 0; break; case OP_LT: res = cmp < 0; break; case OP_LE: res = cmp <= 0; break; case OP_GT: res = cmp > 0; break; case OP_GE: res = cmp >= 0; break; case OP_NE: res = cmp != 0; break; case OP_TRUE: res = true; break; default: res = false; break; } return res; } /* otherwise it's stuff that uses the S slot */ switch (dkv->sp.spfl) { case DT_SPFL_N_YEAR: cmp = dt_get_year(d.d); break; case DT_SPFL_N_MON: case DT_SPFL_S_MON: cmp = dt_get_mon(d.d); break; case DT_SPFL_N_DCNT_MON: cmp = dt_get_mday(d.d); break; case DT_SPFL_N_DCNT_WEEK: case DT_SPFL_S_WDAY: cmp = dt_get_wday(d.d); break; case DT_SPFL_N_WCNT_MON: /* exotic function, needs extern'ing */ cmp = /*dt_get_count(d)*/0; break; case DT_SPFL_N_DCNT_YEAR: cmp = dt_get_yday(d.d); break; case DT_SPFL_N_WCNT_YEAR: /* %C/%W week count */ switch (d.d.typ) { case DT_YMD: if (dkv->sp.cnt_weeks_iso) { cmp = __ymd_get_wcnt_iso(d.d.ymd); } else { cmp = __ymd_get_wcnt( d.d.ymd, dkv->sp.cnt_wdays_from); } break; case DT_YMCW: cmp = __ymcw_get_yday(d.d.ymcw); break; default: cmp = 0; break; } break; case DT_SPFL_N_STD: default: return false; } /* now do the actual comparison */ switch (dkv->op) { case OP_EQ: res = dkv->s == cmp; break; case OP_LT: res = dkv->s < cmp; break; case OP_LE: res = dkv->s <= cmp; break; case OP_GT: res = dkv->s > cmp; break; case OP_GE: res = dkv->s >= cmp; break; case OP_NE: res = dkv->s != cmp; break; case OP_TRUE: res = true; break; default: case OP_UNK: res = false; break; } return res; }