static int write_iff(struct lyout *out, const struct lys_module *module, struct lys_iffeature *expr, int prefix_kind, int *index_e, int *index_f) { int count = 0, brackets_flag = *index_e; uint8_t op; struct lys_module *mod; op = iff_getop(expr->expr, *index_e); (*index_e)++; switch (op) { case LYS_IFF_F: if (lys_main_module(expr->features[*index_f]->module) != lys_main_module(module)) { if (prefix_kind == 0) { count += ly_print(out, "%s:", transform_module_name2import_prefix(module, lys_main_module(expr->features[*index_f]->module)->name)); } else if (prefix_kind == 1) { count += ly_print(out, "%s:", lys_main_module(expr->features[*index_f]->module)->name); } else if (prefix_kind == 2) { count += ly_print(out, "%s:", lys_main_module(expr->features[*index_f]->module)->prefix); } else if (prefix_kind == 3) { mod = lys_main_module(expr->features[*index_f]->module); count += ly_print(out, "%s%s%s:", mod->name, mod->rev_size ? "@" : "", mod->rev_size ? mod->rev[0].date : ""); } } count += ly_print(out, expr->features[*index_f]->name); (*index_f)++; break; case LYS_IFF_NOT: count += ly_print(out, "not "); count += write_iff(out, module, expr, prefix_kind, index_e, index_f); break; case LYS_IFF_AND: if (brackets_flag) { /* AND need brackets only if previous op was not */ if (*index_e < 2 || iff_getop(expr->expr, *index_e - 2) != LYS_IFF_NOT) { brackets_flag = 0; } } /* falls through */ case LYS_IFF_OR: if (brackets_flag) { count += ly_print(out, "("); } count += write_iff(out, module, expr, prefix_kind, index_e, index_f); count += ly_print(out, " %s ", op == LYS_IFF_OR ? "or" : "and"); count += write_iff(out, module, expr, prefix_kind, index_e, index_f); if (brackets_flag) { count += ly_print(out, ")"); } } return count; }
const char * transform_module_name2import_prefix(const struct lys_module *module, const char *module_name) { uint16_t i; if (!strcmp(lys_main_module(module)->name, module_name)) { /* the same for module and submodule */ return module->prefix; } for (i = 0; i < module->imp_size; ++i) { if (!strcmp(module->imp[i].module->name, module_name)) { return module->imp[i].prefix; } } return NULL; }