/*================================================ * refn_to_record - Get record from user reference * ukey: [IN] refn key found * letr: [IN] possible type of record (0 if any) * eg, refn_to_record("1850.Census", "S") *==============================================*/ NODE refn_to_record (STRING ukey, /* user refn key */ INT letr) /* type of record */ { STRING *keys; INT num; if (!ukey || *ukey == 0) return NULL; get_refns(ukey, &num, &keys, letr); if (!num) return NULL; return nztop(key_possible_to_record(keys[0], *keys[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; }
/*======================================================= * annotate_node -- Alter a node by * expanding refns (eg, "@S25@" to "<1850.Census>") * annotating pointers (eg, "@I1@" to "@I1@ {{ John/SMITH }}") * Used during editing *=====================================================*/ static void annotate_node (NODE node, BOOLEAN expand_refns, BOOLEAN annotate_pointers, RFMT rfmt) { STRING key=0; RECORD rec=0; key = value_to_xref(nval(node)); if (!key) return; rec = key_possible_to_record(key, *key); if (!rec) return; if (expand_refns) { NODE refn = REFN(nztop(rec)); char buffer[60]; /* if there is a REFN, and it fits in our buffer, and it doesn't have any (confusing) > in it */ if (refn && nval(refn) && !strchr(nval(refn), '>') && strlen(nval(refn))<=sizeof(buffer)-3) { /* then replace, eg, @S25@, with, eg, <1850.Census> */ buffer[0]=0; strcpy(buffer, "<"); strcat(buffer, nval(refn)); strcat(buffer, ">"); stdfree(nval(node)); nval(node) = strsave(buffer); } } if (annotate_pointers) { STRING str = generic_to_list_string(nztop(rec), key, 60, ", ", rfmt, FALSE); ZSTR zstr = zs_news(nval(node)); zs_apps(zstr, " {{"); zs_apps(zstr, str); zs_apps(zstr, " }}"); stdfree(nval(node)); nval(node) = strsave(zs_str(zstr)); zs_free(&zstr); } }
/*================================================================= * expand_tree -- Create copy of node tree with additional link info *===============================================================*/ static NODE expand_tree (NODE root0) { NODE copy, node, sub; STRING key; static NODE root; /* root of record being edited */ LIST subs; /* list of contained records */ NODE expd; /* expanded main record - copy - our retval */ root = root0; expd = copy_nodes(root, TRUE, TRUE); subs = create_list(); traverse_nodes(expd, advedit_expand_traverse, subs); /* expand the list of records into the copied record */ FORLIST(subs, el) node = (NODE) el; #ifdef DEBUG llwprintf("in list: %s %s\n", ntag(node), nval(node)); #endif key = rmvat(nval(node)); if ((sub = nztop(key_possible_to_record(key, *key)))) { copy = copy_node_subtree(sub); nxref(node) = nxref(copy); ntag(node) = ntag(copy); nchild(node) = nchild(copy); nparent(node) = nparent(copy); /*MEMORY LEAK; MEMORY LEAK; MEMORY LEAK: node not removed (because its value and possibly xref [probably not] are still being referred to */ } ENDLIST /* Shouldn't we free subs now ? Perry 2001/06/22 */ #ifdef DEBUG show_node(expd); #endif return expd; }