/*====================================================+ * llrpt_descendentset -- Create descendent set of an INDISEQ * usage: descendantset(SET) -> SET *===================================================*/ PVALUE llrpt_descendentset (PNODE node, SYMTAB stab, BOOLEAN *eflg) { INDISEQ seq=0; PNODE arg1 = builtin_args(node); PVALUE val1 = eval_and_coerce(PSET, arg1, stab, eflg); if (*eflg) { prog_var_error(node, stab, arg1, val1, nonset1, "descendentset"); return NULL; } ASSERT(seq = pvalue_to_seq(val1)); seq = descendent_indiseq(seq); set_pvalue_seq(val1, seq); return val1; }
/*==========================================+ * llrpt_childset -- Create child set of an INDISEQ * usage: childset(SET) -> SET *=========================================*/ PVALUE llrpt_childset (PNODE node, SYMTAB stab, BOOLEAN *eflg) { INDISEQ seq=0; PNODE arg1 = builtin_args(node); PVALUE val1 = eval_and_coerce(PSET, arg1, stab, eflg); if (*eflg) { prog_var_error(node, stab, arg1, val1, nonset1, "childset"); return NULL; } ASSERT(seq = pvalue_to_seq(val1)); /* do actual construction of child set */ seq = child_indiseq(seq); set_pvalue_seq(val1, seq); return val1; }
/*===================================================+ * llrpt_gengedcomstrong -- Generate GEDCOM output from an INDISEQ * usage: gengedcom(SET) -> VOID * Perry 2000/11/03 *==================================================*/ PVALUE llrpt_gengedcomstrong (PNODE node, SYMTAB stab, BOOLEAN *eflg) { INDISEQ seq=0; PNODE arg1 = builtin_args(node); PVALUE val1 = eval_and_coerce(PSET, arg1, stab, eflg); if (*eflg) { prog_var_error(node, stab, arg1, val1, nonset1, "gengedcomstrong"); return NULL; } ASSERT(seq = pvalue_to_seq(val1)); gen_gedcom(seq, GENGEDCOM_STRONG_DUMP, eflg); /* delay to last minute lest it is a temp owning seq, eg, gengedcom(ancestorset(i)) */ delete_pvalue(val1); return NULL; }
/*=========================================+ * llrpt_parentset -- Create parent set of INDISEQ * usage: parentset(SET) -> SET *========================================*/ PVALUE llrpt_parentset (PNODE node, SYMTAB stab, BOOLEAN *eflg) { INDISEQ seq=0; PNODE arg1 = builtin_args(node); PVALUE val1 = eval_and_coerce(PSET, arg1, stab, eflg); if (*eflg) { prog_var_error(node, stab, arg1, val1, nonset1, "parentset"); return NULL; } /* NULL indiseqs are possible, because of getindiset */ seq = pvalue_to_seq(val1); /* do actual construction of parent set */ seq = parent_indiseq(seq); set_pvalue_seq(val1, seq); return val1; }
/*=========================================+ * llrpt_uniqueset -- Eliminate dupes from INDISEQ * usage: uniqueset(SET) -> VOID *========================================*/ PVALUE llrpt_uniqueset (PNODE node, SYMTAB stab, BOOLEAN *eflg) { INDISEQ seq=0; PNODE arg1 = builtin_args(node); PVALUE val1 = eval_and_coerce(PSET, arg1, stab, eflg); if (*eflg) { prog_var_error(node, stab, arg1, val1, nonset1, "uniqueset"); return NULL; } ASSERT(seq = pvalue_to_seq(val1)); unique_indiseq(seq); /* delay to last minute lest it is a temp owning seq, eg, uniqueset(ancestorset(i) */ delete_pvalue(val1); return NULL; }
/*======================================+ * llrpt_indiset -- Declare an INDISEQ variable * usage: indiset(VARB) -> VOID *=====================================*/ PVALUE llrpt_indiset (PNODE node, SYMTAB stab, BOOLEAN *eflg) { INDISEQ newseq=0; PVALUE newval=0; PNODE arg1 = builtin_args(node); if (!iistype(arg1, IIDENT)) { *eflg = TRUE; prog_var_error(node, stab, arg1, NULL, nonvar1, "indiset"); return NULL; } *eflg = FALSE; newseq = create_indiseq_pval(); set_indiseq_value_funcs(newseq, &pvseq_fnctbl); newval = create_pvalue_from_seq(newseq); assign_iden(stab, iident_name(arg1), newval); /* gave val1 to stab, so don't clear it */ return NULL; }
/*=================================== * llrpt_valuesort -- Sort INDISEQ by value * usage: valuesort(SET) -> VOID *=================================*/ PVALUE llrpt_valuesort (PNODE node, SYMTAB stab, BOOLEAN *eflg) { INDISEQ seq; PNODE arg1 = builtin_args(node); PVALUE val1 = eval_and_coerce(PSET, arg1, stab, eflg); if (*eflg) { prog_var_error(node, stab, arg1, val1, nonset1, "valuesort"); return NULL; } ASSERT(seq = pvalue_to_seq(val1)); valuesort_indiseq(seq,eflg); if (*eflg) { prog_error(node, _("missing or incorrect value for sort")); return NULL; } /* delay to last minute lest it is a temp owning seq, eg, valuesort(ancestorset(i) */ delete_pvalue(val1); return NULL; }
/*==================================+ * llrpt_col -- Position output to column * usage: col(INT) -> VOID *=================================*/ PVALUE llrpt_col (PNODE node, SYMTAB stab, BOOLEAN *eflg) { INT newcol=0; PNODE argvar = builtin_args(node); PVALUE val = eval_and_coerce(PINT, argvar, stab, eflg); if (*eflg) { prog_var_error(node, stab, argvar, val, nonint1, "col"); delete_pvalue_ptr(&val); return NULL; } newcol = pvalue_to_int(val); delete_pvalue_ptr(&val); if (newcol < 1) newcol = 1; if (newcol > MAXCOLS) newcol = MAXCOLS; if (newcol == curcol) return NULL; if (newcol < curcol) poutput("\n", eflg); while (curcol < newcol && !(*eflg)) poutput(" ", eflg); return NULL; }
/*======================================= * llrpt_addnode -- Add a node to a GEDCOM tree * usage: addnode(NODE, NODE, NODE) -> VOID * args: (node being added, parent, previous child) *=====================================*/ PVALUE llrpt_addnode (PNODE node, SYMTAB stab, BOOLEAN *eflg) { PNODE arg = iargs(node); NODE newchild, next, prnt, prev; /* first argument, node (must be nonnull) */ PVALUE val = eval_and_coerce(PGNODE, arg, stab, eflg); if (*eflg) { prog_var_error(node, stab, arg, val, nonnodx, "addnode", "1"); delete_pvalue(val); return NULL; } newchild = remove_node_and_delete_pvalue(&val); if (!newchild) { prog_var_error(node, stab, arg, val, nonnodx, "addnode", "1"); return NULL; } /* second argument, parent (must be nonnull) */ val = eval_and_coerce(PGNODE, arg=inext(arg), stab, eflg); if (*eflg) { prog_var_error(node, stab, arg, val, nonnodx, "addnode", "2"); return NULL; } prnt = remove_node_and_delete_pvalue(&val); if (!prnt) { prog_var_error(node, stab, arg, val, nonnodx, "addnode", "2"); return NULL; } /* third argument, prior sibling (may be null) */ val = eval_and_coerce(PGNODE, arg=inext(arg), stab, eflg); if (*eflg) { prog_var_error(node, stab, arg, val, nonnodx, "addnode", "3"); delete_pvalue(val); return NULL; } prev = remove_node_and_delete_pvalue(&val); if (prev) { /* Check that previous sibling actually is child of new parent */ if (prnt != nparent(prev)) { prog_error(node, "2nd arg to addnode must be parent of 3rd arg"); *eflg = 1; return NULL; } } /* reparent node, but ensure its locking is only relative to new parent */ dolock_node_in_cache(newchild, FALSE); nparent(newchild) = prnt; newchild->n_cel = prnt->n_cel; set_temp_node(newchild, is_temp_node(prnt)); dolock_node_in_cache(newchild, TRUE); if (prev == NULL) { next = nchild(prnt); nchild(prnt) = newchild; } else { next = nsibling(prev); nsibling(prev) = newchild; } nsibling(newchild) = next; return NULL; }