Example #1
0
/*=================================================================
 * 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);
}
Example #2
0
/*=================================================================
 * 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);
}
Example #3
0
/*=================================================
 * 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;
}
Example #4
0
/*=================================
 * 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);
}
Example #5
0
/*===============================================
 * 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;
}
Example #6
0
/*============================================================
 * 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;
}
Example #7
0
/*===================================================================
 * 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;
	}
}