/*===================================== * llrpt_createnode -- Create GEDCOM node * usage: createnode(STRING, STRING) -> NODE * args: (tag, value) *===================================*/ PVALUE llrpt_createnode (PNODE node, SYMTAB stab, BOOLEAN *eflg) { PNODE arg = iargs(node); NODE newnode=0; NODE prnt=NULL; /* parent node for new node */ STRING xref=NULL; /* xref for new node */ PVALUE val1=NULL, val2=NULL; STRING str1=NULL; /* 1st arg, which is tag for new node */ STRING str2=NULL; /* 2nd arg, which is value for new node */ val1 = eval_and_coerce(PSTRING, arg, stab, eflg); if (*eflg) { prog_var_error(node, stab, arg, val1, nonstrx, "createnode", "1"); delete_pvalue(val1); return NULL; } /* 1st arg is tag for new node */ str1 = pvalue_to_string(val1); val2 = eval_and_coerce(PSTRING, arg=inext(arg), stab, eflg); if (*eflg) { prog_var_error(node, stab, arg, val2, nonstrx, "createnode", "2"); delete_pvalue(val2); return NULL; } /* 2nd arg is value for new node */ str2 = pvalue_to_string(val2); newnode = create_temp_node(xref, str1, str2, prnt); return create_pvalue_from_node(newnode); }
/*======================================+ * llrpt_newfile -- Switch output to new file * usage: newfile(STRING, BOOL) -> VOID *=====================================*/ PVALUE llrpt_newfile (PNODE node, SYMTAB stab, BOOLEAN *eflg) { PNODE argvar = builtin_args(node); BOOLEAN aflag=FALSE; STRING name=0; PVALUE val = eval_and_coerce(PSTRING, argvar, stab, eflg); if (*eflg) { prog_var_error(node, stab, argvar, val, nonstrx, "newfile", "1"); delete_pvalue_ptr(&val); return NULL; } name = pvalue_to_string(val); if (!name || !name[0]) { *eflg = TRUE; prog_var_error(node, stab, argvar, val, "1st arg to newfile must be a nonempty string."); delete_pvalue_ptr(&val); return NULL; } strupdate(&outfilename, name); delete_pvalue_ptr(&val); val = eval_and_coerce(PBOOL, argvar=inext(argvar), stab, eflg); if (*eflg) { prog_var_error(node, stab, argvar, val, nonboox, "newfile", "2"); delete_pvalue_ptr(&val); return NULL; } aflag = pvalue_to_bool(val); delete_pvalue_ptr(&val); if (!set_output_file(outfilename, aflag)) { *eflg = TRUE; prog_var_error(node, stab, argvar, NULL, "Failed to open output file: %s", outfilename); } return NULL; }