/*================================================================= * finish_and_delete_refnset -- check for dups in a set of one refn * soundexseq is sequence of REFNs all in the same block (equivalent * names as far as REFN storage goes) * Created: 2001/01/13, Perry Rapp *===============================================================*/ static void finish_and_delete_refnset (void) { char prevkey[8]; CNSTRING refn=""; CNSTRING skey=""; TABLE table = create_table_int(); prevkey[0]=0; canonkeysort_indiseq(soundexseq); FORINDISEQ(soundexseq, el, num) refn = element_sval(el); skey = element_skey(el); if (!eqstr(skey, prevkey)) { /* new person, start over */ destroy_table(table); table = create_table_int(); } if (in_table(table, refn)) { report_error(ERR_DUPREFN, _("Duplicate refn for %s (%s)") , skey, refn); } else { insert_table_int(table, refn, 1); } strcpy(prevkey, skey); ENDINDISEQ remove_indiseq(soundexseq); soundexseq = NULL; destroy_table(table); }
/*================================================================= * finish_and_delete_nameset -- check for dups in a set of one name * soundexseq is sequence of NAMEs all in the same block (equivalent * names as far as NAME storage goes) * Created: 2001/01/13, Perry Rapp *===============================================================*/ static void finish_and_delete_nameset (void) { char prevkey[8]; CNSTRING name=""; CNSTRING skey=""; TABLE table = create_table_int(); prevkey[0]=0; calc_indiseq_names(soundexseq); keysort_indiseq(soundexseq); /* We go thru the list of equivalent names, sorted by person, and for each person, table all their names, watching for duplicates */ FORINDISEQ(soundexseq, el, num) name = element_sval(el); skey = element_skey(el); if (!eqstr(skey, prevkey)) { /* new person, start over */ destroy_table(table); table = create_table_int(); } if (in_table(table, name)) { report_error(ERR_DUPNAME, _("Duplicate name for %s (%s)") , skey, name); } else { insert_table_int(table, name, 1); } strcpy(prevkey, skey); ENDINDISEQ remove_indiseq(soundexseq); soundexseq = NULL; destroy_table(table); }
/*================================================= * add_children -- add children to tree recursively *===============================================*/ static DISPNODE add_children (NODE indi, INT gen, INT maxgen, INT * count) { DISPNODE tn = alloc_displaynode(); DISPNODE tn0, tn1; int i; tn->keynum = indi_to_keynum(indi); tn->firstchild = 0; tn->nextsib = 0; (*count)++; if (gen < maxgen) { INDISEQ childseq = indi_to_children(indi); if (childseq) { tn0=0; for (i=0; i<length_indiseq(childseq); i++) { NODE child; STRING childkey, childname; element_indiseq(childseq, i, &childkey, &childname); child = key_to_indi(childkey); tn1 = add_children(child, gen+1, maxgen, count); /* link new displaynode into tree we're building */ if (tn0) tn0 = tn0->nextsib = tn1; else /* first child - first time thru loop */ tn0 = tn->firstchild = tn1; } remove_indiseq(childseq); } } return tn; }
/*================================= * check_nodes -- Check all nodes in database * (as selected in struct work) *================================*/ static void check_nodes (void) { seq_indis = create_indiseq_null(); seq_fams = create_indiseq_null(); seq_sours = create_indiseq_null(); seq_evens = create_indiseq_null(); seq_othes = create_indiseq_null(); traverse_db_key_recs(nodes_callback, NULL); /* check what we saw against delete sets */ check_set(seq_indis, 'I'); check_set(seq_fams, 'F'); check_set(seq_sours, 'S'); check_set(seq_evens, 'E'); check_set(seq_othes, 'X'); remove_indiseq(seq_indis); remove_indiseq(seq_fams); remove_indiseq(seq_sours); remove_indiseq(seq_evens); remove_indiseq(seq_othes); }
/*=============================================== * ask_for_record -- Ask user to identify record * lookup by key or by refn (& handle dup refns) * idstr: [IN] question prompt * letr: [IN] letter to possibly prepend to key (ie, I/F/S/E/X) *=============================================*/ RECORD ask_for_record (STRING idstr, INT letr) { RECORD rec; char answer[MAXPATHLEN]; if (!ask_for_string(idstr, _(qSidkyrfn), answer, sizeof(answer)) || !answer[0]) return NULL; rec = key_possible_to_record(answer, letr); if (!rec) { INDISEQ seq; seq = refn_to_indiseq(answer, letr, KEYSORT); if (!seq) return NULL; rec = choose_from_indiseq(seq, NOASK1, _(qSduprfn), _(qSduprfn)); remove_indiseq(seq); } return rec; }
/*============================================================ * ask_for_any_once -- Have user identify sequence and select record * ttl: [IN] title to present * ctype: [IN] type of record (eg, 'I') (0 for any, 'B' for any preferring INDI) * ask1: [IN] whether to present list if only one matches their desc. * prc: [OUT] result (RC_DONE, RC_SELECT, RC_NOSELECT) *==========================================================*/ static RECORD ask_for_any_once (STRING ttl, char ctype, ASK1Q ask1, INT *prc) { RECORD indi = 0; INDISEQ seq = ask_for_indiseq(ttl, ctype, prc); if (*prc == RC_DONE || *prc == RC_NOSELECT) return NULL; ASSERT(*prc == RC_SELECT); /* user chose a set of possible answers */ /* might be a single-entry indiseq, but if so still need to confirm */ ASSERT(*prc == RC_SELECT); if (ctype == 'I') { indi = choose_from_indiseq(seq, ask1, _(qSifonei), _(qSnotonei)); } else { indi = choose_from_indiseq(seq, ask1, _(qSifonex), _(qSnotonex)); } remove_indiseq(seq); *prc = indi ? RC_SELECT : RC_NOSELECT; return indi; }
/*=================================================================== * ask_for_indi_list -- Ask user to identify person sequence * reask if true if we should give them another chance if their search hits nothing * returns null value indiseq * used by both reports & interactive use *=================================================================*/ INDISEQ ask_for_indi_list (STRING ttl, BOOLEAN reask) { while (TRUE) { INT rc = RC_DONE; INDISEQ seq = ask_for_indiseq(ttl, 'I', &rc); if (rc == RC_DONE) return NULL; if (rc == RC_NOSELECT) { if (!reask || !ask_yes_or_no(_(qSentnam))) return NULL; continue; } ASSERT(seq); rc = choose_list_from_indiseq(_(qSnotonei), seq); if (rc == -1) { remove_indiseq(seq); seq = NULL; if (!reask || !ask_yes_or_no(_(qSentnam))) return NULL; } return seq; } }