/*====================== * remove_hashtab -- Remove element from table * return old value if found *====================*/ HVALUE remove_hashtab (HASHTAB tab, CNSTRING key) { HVALUE val=0; INT hval=0; HASHENT preve=0, thise=0; ASSERT(tab); ASSERT(tab->magic == hashtab_magic); hval = hash(tab, key); thise = tab->entries[hval]; while (thise && nestr(key, thise->ekey)) { ASSERT(thise->magic == hashent_magic); preve = thise; thise = thise->enext; } if (!thise) return 0; if (preve) preve->enext = thise->enext; else tab->entries[hval] = thise->enext; val = thise->val; strfree((STRING *)&thise->ekey); thise->val = 0; stdfree(thise); --tab->count; return val; }
/*=============================== * valid_fam_tree -- Validate FAM tree * fam1, [IN] family to validate * pmsg: [OUT] error message, if any * fam0: [IN] family to match - may be NULL * Should be replaced by valid_fam(RECORD,...) ? *=============================*/ BOOLEAN valid_fam_tree (NODE fam1, STRING *pmsg, NODE fam0) { NODE refn0, husb0, wife0, chil0, body0; NODE refn1, husb1, wife1, chil1, body1; if (!fam1) { *pmsg = _(qSbademp); return FALSE; } if (nestr("FAM", ntag(fam1))) { *pmsg = _(qSbadfm0); return FALSE; } if (nsibling(fam1)) { *pmsg = _(qSbadmul); return FALSE; } refn0 = husb0 = wife0 = chil0 = body0 = NULL; if (fam0) split_fam(fam0, &refn0, &husb0, &wife0, &chil0, &body0); split_fam(fam1, &refn1, &husb1, &wife1, &chil1, &body1); if (fam0 && !iso_nodes(fam1, fam0, FALSE, TRUE)) { *pmsg = _(qSbadfam); goto bad3; } if (!iso_nodes(husb1, husb0, FALSE, TRUE)) { *pmsg = _(qSbadhsb); goto bad3; } if (!iso_nodes(wife1, wife0, FALSE, TRUE)) { *pmsg = _(qSbadwif); goto bad3; } if (!iso_nodes(chil1, chil0, FALSE, TRUE)) { *pmsg = _(qSbadchl); goto bad3; } if (fam0) join_fam(fam0, refn0, husb0, wife0, chil0, body0); join_fam(fam1, refn1, husb1, wife1, chil1, body1); return TRUE; bad3: if (fam0) join_fam(fam0, refn0, husb0, wife0, chil0, body0); join_fam(fam1, refn1, husb1, wife1, chil1, body1); return FALSE; }
/*====================================== * valid_even_tree -- Validate EVEN tree * node: [IN] source to validate * pmsg, [OUT] error message, if any * orig: [IN] EVEN node to match *====================================*/ BOOLEAN valid_even_tree (NODE node, STRING *pmsg, NODE orig) { orig = NULL; /* keep compiler happy */ *pmsg = NULL; if (!node) { *pmsg = _(qSbademp); return FALSE; } if (nestr("EVEN", ntag(node))) { *pmsg = _(qSbadev0); return FALSE; } return TRUE; }
int main(int argc, char** argv) { if (argc >= 3) { if (argc == 3) { ExecuteOLTM(argv[1], argv[2]); } else { int NofEdge = 0; std::stringstream nestr(argv[3]); nestr >> NofEdge; ExecuteOLEM(argv[1], argv[2], NofEdge); } } else {
/*=================================== * valid_indi_tree -- Validate person tree * indi1: [IN] person to validate * pmsg: [OUT] error message, if any * orig: [IN] person to match - may be NULL * rtn: FALSE for bad * Should be replaced by valid_indi(RECORD,...) ? *=================================*/ BOOLEAN valid_indi_tree (NODE indi1, STRING *pmsg, NODE orig) { NODE name1, refn1, sex1, body1, famc1, fams1, node; NODE name0, refn0, sex0, body0, famc0, fams0; INT isex, num; STRING *keys, ukey; if (!indi1) { *pmsg = _(qSbademp); return FALSE; } if (nestr("INDI", ntag(indi1))) { *pmsg = _(qSbadin0); return FALSE; } if (nsibling(indi1)) { *pmsg = _(qSbadmul); return FALSE; } split_indi_old(indi1, &name1, &refn1, &sex1, &body1, &famc1, &fams1); if (getlloptint("RequireNames", 0) && !name1) { *pmsg = _("This person record does not have a name line."); goto bad2; } for (node = name1; node; node = nsibling(node)) { if (!valid_name(nval(node))) { *pmsg = _(qSbadenm); goto bad2; } } name0 = refn0 = sex0 = body0 = famc0 = fams0 = NULL; if (orig) split_indi_old(orig, &name0, &refn0, &sex0, &body0, &famc0, &fams0); if (orig && !iso_nodes(indi1, orig, FALSE, FALSE)) { *pmsg = _(qSbadind); goto bad1; } if (!iso_nodes(famc1, famc0, FALSE, TRUE)) { *pmsg = _(qSbadfmc); goto bad1; } if (!iso_nodes(fams1, fams0, FALSE, TRUE)) { *pmsg = _(qSbadfms); goto bad1; } isex = val_to_sex(sex0); if (!fams0) isex = SEX_UNKNOWN; if (isex != SEX_UNKNOWN && isex != val_to_sex(sex1)) { *pmsg = _(qSbadparsex); goto bad1; } ukey = (refn1 ? nval(refn1) : NULL); get_refns(ukey, &num, &keys, 'I'); if (num > 1 || (num == 1 && (!orig || nestr(keys[0], rmvat(nxref(indi1)))))) { *pmsg = _(qSbadirefn); goto bad1; } if (orig) join_indi(orig, name0, refn0, sex0, body0, famc0, fams0); join_indi(indi1, name1, refn1, sex1, body1, famc1, fams1); return TRUE; bad1: if (orig) join_indi(orig, name0, refn0, sex0, body0, famc0, fams0); bad2: join_indi(indi1, name1, refn1, sex1, body1, famc1, fams1); return FALSE; }