Files
context/_reports/anc2_ged.ll
T
2019-09-28 10:14:18 -04:00

118 lines
2.9 KiB
LLVM

/*
* @progname anc2_ged.ll
* @version 1.0
* @author Dennis Nicklaus
* @category
* @output GedCom
* @description
* make a gedcom file of the ancestors of a set of individuals
*
*/
proc main ()
{
indiset(a)
monthformat(4)
indiset(b)
getindi(i)
while (i){
addtoset(a, i, 0)
set(i,0)
getindimsg(i,"Enter next person to output GEDCOM ancestors of")
}
set(b,ancestorset(a))
set(b,union(b,a))
call print_header()
gengedcom(b)
call sour_init()
call sour_addset(b)
call sour_ged()
"0 TRLR\n"
}
proc print_header()
{
"0 HEAD\n"
"1 SOUR Lifelines\n"
"1 DATE " stddate(gettoday()) nl()
"0 @SM1@ SUBM\n"
"1 NAME " getproperty("user.fullname") "\n"
"1 ADDR " getproperty("user.address") "\n"
"2 CONT " getproperty("user.email") "\n"
}
global(sour_list)
global(sour_table)
proc sour_init()
{
table(sour_table)
list(sour_list)
}
/* sour_addind() adds the sources referenced for this individual */
proc sour_addind(i)
{
traverse(root(i), m, l) {
if (nestr("SOUR", tag(m))) { continue() }
set(v, value(m))
if (eqstr("", v)) { continue() }
if(reference(v)) {
if (ne(0, lookup(sour_table, v))) { continue() }
set(v, save(v))
insert(sour_table, v, 1)
enqueue(sour_list, v)
}
}
}
proc sour_addset(s)
{
forindiset (s, i, a, n) {
call sour_addind(i)
families(i, f, sp, m) {
call sour_addind(f)
}
}
}
/* sour_ged() outputs the current source list in GEDCOM format */
proc sour_ged()
{
table(other_table)
list(other_list)
forlist(sour_list, k, n) {
set(r, dereference(k))
traverse(r, s, l) {
d(l)
if (xref(s)) { " " xref(s) }
" " tag(s)
if (v, value(s)) {
" " v
if(reference(v)) {
if (ne(0, lookup(other_table, v))) { continue() }
if (ne(0, lookup(sour_table, v))) { continue() }
set(v, save(v))
insert(other_table, v, 1)
enqueue(other_list, v)
}
}
"\n"
}
}
forlist(other_list, k, n) {
set(r, dereference(k))
traverse(r, s, l) {
d(l)
if (xref(s)) { " " xref(s) }
" " tag(s)
if (v, value(s)) { " " v }
"\n"
}
}
}