Files
2019-09-28 10:14:18 -04:00

454 lines
14 KiB
LLVM

/*
* @progname famrep.ll
* @version 6.3
* @author James P. Jones (jjones@nas.nasa.gov)
* @category
* @output nroff
* @description
*
* This report program produces a Family Group Sheet for the selected
* individual, with options for generating sheets for married children
* of the individual, and their children, etc.
*
* This report works only with the LifeLines Genealogy program
*
* version two: 1 Nov 1992
* version three: 28 Mar 1993 bug fixes
* version four: 25 Apr 1993 added sources
* version five: 26 Sep 1993 added multiple indi's, bug fix
* version six: 3 Oct 1993 bug fixes
*
* This report program produces a Family Group Sheet for the selected
* individual. User is given the choice of having sheets generated for
* married children of individual, and the children of the children, etc.
* Sources of information are indicated with end-note style
* references. The report produces 'roff output, which I suggest you
* convert to postscript for the highest quality report. Following are
* several examples how to process and print the report (assuming the
* output file name is "fam.out":
*
* tbl fam.out | xroff -me -tstdout | ipr -Pim7 -D"jobheader off"
* tbl fam.out | xroff -me -PprinterName
* tbl fam.out | groff -me | your_postscript_printer
* tbl fam.out | troff -me | dpost | lp -dps
*
* The data in "compiler" table in main() is initialized with property's
* obtained from the lifelines config file (~/.linesrc on unix else
* lines.cfg) with values from
* user.fullname
* user.email
* user.address
* user.phone
*/
global(sourcelist) /* list of all sources used */
global(sourcestr)
global(compiler)
global(TRUE)
global(FALSE)
global(ONCE)
proc main ()
{
monthformat(4)
dateformat(0)
set(TRUE, 1)
set(FALSE, 0)
set(ONCE, TRUE)
list(sourcelist)
table(compiler)
insert(compiler, "name", getproperty("user.fullname"))
insert(compiler, "addr", getproperty("user.address"))
insert(compiler, "phone", getproperty("user.phone"))
insert(compiler, "email", getproperty("user.email"))
set(indi, NULL)
while (eq(strcmp(name(indi), NULL), 0)) {
getindi(indi) /* select individual for report */
if (eq(strcmp(name(indi), NULL), 0)) {
print("Individual not found in database.")
print(nl())
}
}
while (or(lt(ionly,1), gt(ionly,2))) {
getintmsg(ionly,"Choose (1) Individual only, (2) + Married Descendents: ")
}
if (eq(ionly, 2)) {
set(sonly,0)
while (or(lt(sonly,1), gt(sonly,2))) {
getintmsg(sonly,"Choose (1) Select Spouse, (2) All Spouses: ")
}
}
else {
set(sonly, 1)
}
call FGsheet(indi, ionly, sonly)
print("Report Done, ")
}
/* Select the individual's spouse for the Family Group Sheet.
*/
proc FGsheet(indi, ionly, sonly)
{
if (eq(sonly, 1)) {
set(i, nspouses(indi))
spouses(indi, svar, fvar, no) { /* display spouses */
if (gt(i, 1)) {
if (gt(no, 7)) { /* leave space for prompt */
print(nl())
print(nl())
print(nl())
print(nl())
}
print(d(no))
print(". ")
print(fullname(svar,TRUE,FALSE,50))
print(nl())
}
}
if (gt(i, 1)) { /* select a spouse */
getintmsg(num, "Choose which spouse for Family Report: ")
}
else {
set(num, 1)
}
if (lt(i, 1)) {
print(name(indi))
print(" has no spouse in database...")
print(nl())
}
else {
if (eq(ONCE, TRUE)) {
".po 0.8i" nl()
".ll 6.8i" nl()
".pl +1.5i" nl()
".nf" nl()
set(ONCE, FALSE)
}
}
}
spouses(indi, svar, fvar, no) {
if (or(and(eq(sonly,1), eq(no, num)), eq(sonly,2))) {
if (eq(strcmp(sex(indi), "F"), 0)) {
set(tmp, indi) /* Check sex of individual,*/
set(tindi, svar) /* if Female, replace with */
set(tsvar, tmp) /* information on husband. */
set(i, nspouses(tindi)) /* Easier if assume head- */
set(num, 1) /* of-household is male... */
if (gt(i, 1)) {
spouses(tindi, tmps, tmpf, no) {
if (eq(name(tsvar), name(tmps))) {
set(num, no)
}
}
}
call doform(tindi, tsvar, fvar, i, num)
}
else {
call doform(indi, svar, fvar, i, num)
}
call printsources(sourcelist)
while (not(empty(sourcelist))) { /* NULL out sources each time */
set(nil, dequeue(sourcelist))
set(sourcestr, NULL)
}
".bp" nl()
if (eq(ionly, 2)) {
children(fvar, kid, j) {
if(or(ge(nspouses(kid),1), ge(nfamilies(kid),1))) {
call FGsheet(kid, ionly, 2)
}
}
}
}
}
}
/* Produce the Family Group Sheet form.
*/
proc doform(indi, svar, fvar, numsp, cursp)
{
".ps 16" nl()
".(b C" nl()
if (e, surname(indi)) { upper(surname(indi)) }
"\\0FAMILY\\0GROUP\\0SHEET" nl()
".ps 10" nl()
"Compiled by: \\fI" lookup(compiler, "name") "\\fR\\0on\\0\\fI"
stddate(gettoday())
"\\fR" nl()
".vs 10" nl()
"\\fI" lookup(compiler, "addr") "\\fR" nl()
"\\fIPhone:\\0" lookup(compiler, "phone") "\\0\\0\\0E-mail:\\0"
lookup(compiler, "email") "\\fR" nl()
".)b" nl()
".ps 8" nl()
".TS" nl()
"tab(+) expand box;" nl()
"l s s." nl()
"Husband's Full Name:\\0\\fI"
if (e, name(indi)) { name(indi) "\\fR" nl() }
else { "\\fR" }
"_" nl()
".T&" nl()
"l | l | l." nl()
"Husband's Data+Day Month Year+City,\\0\\0Town or Place\\0\\0County or Province\\0\\0State or Country" nl()
"_" nl()
"\\0Birth+\\fI"
set(aday, birth(indi))
if (e, stddate(aday)) { stddate(aday) }
"+"
if (e, place(aday)) { place(aday) } "\\fR"
if (aday) { call dosource(aday) } nl() /* note: first call to source */
"_" nl()
"\\0Christened+\\fI"
set(aday, baptism(indi))
if (e, stddate(aday)) { stddate(aday) }
"+"
if (e, place(aday)) { place(aday) } "\\fR"
if (aday) { call dosource(aday) } nl()
"_" nl()
"\\0Married+\\fI"
set(aday, marriage(fvar))
if (e, stddate(aday)) { stddate(aday) }
"+"
if (e, place(aday)) { place(aday) } "\\fR"
if (aday) { call dosource(aday) } nl()
"_" nl()
"\\0Death+\\fI"
set(aday, death(indi))
if (e, stddate(aday)) { stddate(aday) }
"+"
if (e, place(aday)) { place(aday) } "\\fR"
if (aday) { call dosource(aday) } nl()
"_" nl()
"\\0Burial+\\fI"
set(aday, burial(indi))
if (e, stddate(aday)) { stddate(aday) }
"+"
if (e, place(aday)) { place(aday) } "\\fR"
if (aday) { call dosource(aday) } nl()
"_" nl()
".T&" nl()
"l | l s." nl()
"\\0Father's Name:+\\fI"
if (e, name(father(indi))) { name(father(indi)) "\\fR" nl() }
else { "\\fR" nl() }
"_" nl()
"\\0Mother's Maiden Name:+\\fI"
if (e, name(mother(indi))) { name(mother(indi)) "\\fR" nl() }
else { "\\fR" nl() }
"_" nl()
"\\0Other Wives:\\fI"
set(f, 0)
set(spstr, save(name(wife(fvar))))
spouses(indi, wifenm, tmpfvar, no) {
set(wstr, save(name(wifenm)))
if (ne(strcmp(spstr, wstr), 0)) {
"\\fI+"
name(wifenm)
"\\fR" nl()
set(f,1)
}
}
if (eq(f, 0)) { "\\fR" nl() }
"_" nl()
".TE" nl()
".TS" nl()
"tab(+) expand box;" nl()
"l s s." nl()
"Wife's Full Maiden Name:\\0\\fI"
if (e, name(svar)) { name(svar) }
"\\fR" nl()
"_" nl()
".T&" nl()
"l | l | l." nl()
"Wife's Data +Day Month Year+City,\\0\\0Town or Place\\0\\0County or Province\\0\\0State or Country" nl()
"_" nl()
"\\0Birth+\\fI"
set(aday, birth(svar))
if (e, stddate(aday)) { stddate(aday) }
"+"
if (e, place(aday)) { place(aday) } "\\fR"
if (aday) { call dosource(aday) } nl()
"_" nl()
"\\0Christened+\\fI"
set(aday, baptism(svar))
if (e, stddate(aday)) { stddate(aday) }
"+"
if (e, place(aday)) { place(aday) } "\\fR"
if (aday) { call dosource(aday) } nl()
"_" nl()
"\\0Death+\\fI"
set(aday, death(svar))
if (e, stddate(aday)) { stddate(aday) }
"+"
if (e, place(aday)) { place(aday) } "\\fR"
if (aday) { call dosource(aday) } nl()
"_" nl()
"\\0Burial+\\fI"
set(aday, burial(svar))
if (e, stddate(aday)) { stddate(aday) }
"+"
if (e, place(aday)) { place(aday) } "\\fR"
if (aday) { call dosource(aday) } nl()
"_" nl()
".T&" nl()
"l | l s." nl()
"\\0Father's Name:+\\fI"
if (e, name(father(svar))) { name(father(svar)) "\\fR" nl() }
else { "\\fR" nl() }
"_" nl()
"\\0Mother's Maiden Name:+\\fI"
if (e, name(mother(svar))) { name(mother(svar)) "\\fR" nl() }
else { "\\fR" nl() }
"_" nl()
"\\0Other Husbands:\\fI"
set(f, 0)
set(spstr, save(name(indi)))
spouses(svar, hubby, tmpfvar, no) {
set(hstr, save(name(hubby)))
if (ne(strcmp(spstr, hstr), 0)) {
"\\fI+"
name(hubby)
"\\fR" nl()
set(f,1)
}
}
if (eq(f, 0)) { "\\fR" nl() }
"_" nl()
".TE" nl()
/* now for the children... */
set(haschild, 1)
children(fvar, cvar, no) {
if (eq(haschild, 1)) {
".TS" nl()
"tab(+) expand box;" nl()
"l |l| l | l | l." nl()
"Complete Names of All Children+Sex+Event+Date+"
"City, Town, County, State or Country" nl()
"_" nl()
set(haschild, 2)
}
if (or(eq(no, 4), eq(no, 12))) { /* If 4th or 12th kid, start */
".TE" nl() /* a new page. There was an */
".bp" nl() /* old woman, who lived in a */
".TS" nl() /* shoe, she had so many kids... */
"tab(+) expand box;" nl()
"l |l| l | l | l." nl()
"Complete Names of All Children+Sex+Event+Date+"
"City, Town, County/Province, State, Country" nl()
"_" nl()
}
"T{" nl()
"\\fI("
d(no)
") "
if (e, name(cvar)) { name(cvar) }
"\\fR" nl()
"T}+\\fI"
sex(cvar)
"\\fR+Birth+\\fI"
set(aday, birth(cvar))
if (e, stddate(aday)) { stddate(aday) }
"+"
if (e, place(aday)) { place(aday) } "\\fR"
if (aday) { call dosource(aday) } nl()
"_" nl()
"\\^+\\^+Death+\\fI"
set(aday, death(cvar))
if (e, stddate(aday)) { stddate(aday) }
"+"
if (e, place(aday)) { place(aday) } "\\fR"
if (aday) { call dosource(aday) } nl()
"_" nl()
"\\^+\\^+Burial+\\fI"
set(aday, burial(cvar))
if (e, stddate(aday)) { stddate(aday) }
"+"
if (e, place(aday)) { place(aday) } "\\fR"
if (aday) { call dosource(aday) } nl()
families(cvar, cfvar, csvar, no) { /* spouses */
"_" nl()
"\\^+\\^+Marriage+\\fI"
set(aday, marriage(cfvar))
if (e, stddate(aday)) { stddate(aday) }
"+"
if (e, name(csvar)) { name(csvar) }
if (aday) { call dosource(aday) }
"\\fR" nl()
}
"=" nl()
}
if (eq(haschild, 2)) {
".TE" nl()
}
}
/* Short macro procedure to combine SOURCE and SOURCENUM calls, to shorten
* above report code.
*/
proc dosource(eventnode)
{
call source(eventnode) /* get source of data */
if (sourcestr) { /* if source not NULL */
call sourcenum() /* print source number */
}
}
/* Retrieve source from a given event (EVENTNODE), and save it in the global
* string SOURCESTR.
*/
proc source(eventnode)
{
set(sourcestr, NULL)
traverse(eventnode, node, lev) {
if (eq(strcmp(tag(node), "SOUR"), 0)) {
set(sourcestr, value(node))
}
}
}
/* Create a "List of Sources" table for the report; in the report itself,
* print only a footnote number, and later the list these number refer to
* can be printed (via PRINTSOURCES).
*/
proc sourcenum()
{
set(found,0)
forlist(sourcelist, item, i) {
set(numsources,i)
if (eq(strcmp(item, sourcestr), 0)) { /* if source in list */
" \\s7(" d(i) ")\\s8" /* print out source index */
set(found, 1)
}
}
if (not(eq(found, 1))) {
push(sourcelist, sourcestr) /* otherwise add it to list */
" \\s7(" d(add(numsources,i,1)) ")\\s8" /* and print source index */
}
}
/* Print a list of all the sources refered to in the document. The numbers
* preceeding each source entry are what the in-line references refer to.
*/
proc printsources(slist)
{
if (not(empty(slist))) {
".(b C" nl()
"LIST OF SOURCES REFERENCED IN THIS REPORT" nl()
".)b" nl()
forlist(slist, item, i) {
"(" d(i) ") " item nl()
}
}
}
/* End of Report
*/