| 14234 | } |
| 14235 | |
| 14236 | int interval_cmp(const intv_t *i1, const intv_t *i2) |
| 14237 | { |
| 14238 | int rc; |
| 14239 | if (i1->type != i2->type && |
| 14240 | ((i1->type == INTV_DS_TYPE && i2->type != INTV_DSUS_TYPE) || |
| 14241 | (i1->type == INTV_DSUS_TYPE && i2->type != INTV_DS_TYPE))) |
| 14242 | bad: |
| 14243 | return i1->sign * memcmp(&i1->u, &i2->u, sizeof(i1->u)); |
| 14244 | if ((rc = i1->sign - i2->sign) != 0) |
| 14245 | return rc < 0 ? -1 : 1; |
| 14246 | switch (i1->type) { |
| 14247 | case INTV_YM_TYPE: |
| 14248 | if (i1->u.ym.years != i2->u.ym.years) |
| 14249 | return i1->sign * (i1->u.ym.years - i2->u.ym.years); |
| 14250 | if (i1->u.ym.months != i2->u.ym.months) |
| 14251 | return i1->sign * (i1->u.ym.months - i2->u.ym.months); |
| 14252 | return 0; |
| 14253 | case INTV_DS_TYPE: |
| 14254 | if (i1->u.ds.days != i2->u.ds.days) |
| 14255 | return i1->sign * (i1->u.ds.days - i2->u.ds.days); |
| 14256 | if (i1->u.ds.hours != i2->u.ds.hours) |
| 14257 | return i1->sign * (i1->u.ds.hours - i2->u.ds.hours); |
| 14258 | if (i1->u.ds.mins != i2->u.ds.mins) |
| 14259 | return i1->sign * (i1->u.ds.mins - i2->u.ds.mins); |
| 14260 | if (i1->u.ds.sec != i2->u.ds.sec) |
| 14261 | return i1->sign * (i1->u.ds.sec - i2->u.ds.sec); |
| 14262 | if (i1->type == i2->type && i1->u.ds.frac != i2->u.ds.frac) |
| 14263 | return i1->sign * (i1->u.ds.frac - i2->u.ds.frac); |
| 14264 | if (i1->type != i2->type && i1->u.ds.frac * 1000 != i2->u.ds.frac) |
| 14265 | return i1->sign * (i1->u.ds.frac * 1000 - i2->u.ds.frac); |
| 14266 | return 0; |
| 14267 | case INTV_DSUS_TYPE: |
| 14268 | if (i1->u.ds.days != i2->u.ds.days) |
| 14269 | return i1->sign * (i1->u.ds.days - i2->u.ds.days); |
| 14270 | if (i1->u.ds.hours != i2->u.ds.hours) |
| 14271 | return i1->sign * (i1->u.ds.hours - i2->u.ds.hours); |
| 14272 | if (i1->u.ds.mins != i2->u.ds.mins) |
| 14273 | return i1->sign * (i1->u.ds.mins - i2->u.ds.mins); |
| 14274 | if (i1->u.ds.sec != i2->u.ds.sec) |
| 14275 | return i1->sign * (i1->u.ds.sec - i2->u.ds.sec); |
| 14276 | if (i1->type == i2->type && i1->u.ds.frac != i2->u.ds.frac) |
| 14277 | return i1->sign * (i1->u.ds.frac - i2->u.ds.frac); |
| 14278 | if (i1->type != i2->type && i1->u.ds.frac != i2->u.ds.frac * 1000) |
| 14279 | return i1->sign * (i1->u.ds.frac - i2->u.ds.frac * 1000); |
| 14280 | return 0; |
| 14281 | default: |
| 14282 | goto bad; |
| 14283 | } |
| 14284 | } |
| 14285 | |
| 14286 | int int_to_interval(int64_t i, uint64_t *n0, uint64_t *n1, int *sign) |
| 14287 | { |
no outgoing calls
no test coverage detected