static void add_div(struct unit *unit, int type, cfg_t *variant) { int ndiv, n, ntxt; if (!(ndiv = cfg_size(variant, "div"))) return; ntxt = cfg_size(variant, "txt"); if (ntxt != ndiv) quit("Number of elements for div and txt not equal\n"); if (!list_empty(&unit->u_div[type])) { struct fraction *f, *n; list_for_each_entry_safe(f, n, &unit->u_div[type], f_list) fraction_free(f); } for (n = 0; n < ndiv; n++) { char *txt; float div; div = cfg_getnfloat(variant, "div", n); txt = cfg_getnstr(variant, "txt", n); unit_add_div(unit, type, txt, div); } }
fraction_t *fraction_subtract(const fraction_t *x, const fraction_t *y) { fraction_t *minus_y = fraction_negate(y); fraction_t *result = fraction_add(x, minus_y); fraction_free(minus_y); return result; }