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

148 lines
4.2 KiB
LLVM

/*
* @progname db_summary.ll
* @version 1
* @author Eggert
* @category
* @output Text
* @description
This program gives you summary statistics on your database. It
calculates the number of birth, baptism, marriage, death, and burial
events, and gives the distribution over centuries of birth/baptisms,
death/burials, and marriages. It tells you how many different names
(given names and surnames separately) there are in the database, and
how many persons have no surname in the database.
db_summary - a LifeLines database summary program
by Jim Eggert (eggertj@ll.mit.edu)
Version 1, 29 March 1995 Initial release
*/
proc main() {
table(surnames)
table(givens)
list(bcents)
list(dcents)
list(mcents)
list(namelist)
set(nsurnames,0)
set(ngivens,0)
set(nnosurnames,0)
set(nnogivens,0)
set(nemptysurnames,0)
set(nbirths,0)
set(nbaptisms,0)
set(nmarrs,0)
set(ndeaths,0)
set(nburials,0)
print("Collecting individual statistics...")
forindi(person,pnum) {
/* Do individual event statistics */
set(by,0)
if (b,birth(person)) {
incr(nbirths)
extractdate(b,bd,bm,by)
}
if (b,baptism(person)) {
incr(nbaptisms)
if (not(by)) { extractdate(b,bd,bm,by) }
}
call increment_century(bcents,by)
set(dy,0)
if (d,death(person)) {
incr(ndeaths)
extractdate(d,dd,dm,dy)
}
if (d,burial(person)) {
incr(nburials)
if (not(dy)) { extractdate(d,dd,dm,dy) }
}
call increment_century(dcents,dy)
/* Do name statistics */
extractnames(inode(person),namelist,nnames,isurname)
if (not(isurname)) { incr(nnosurnames) }
forlist(namelist,name,nnum) {
if (eq(nnum,isurname)) {
if (not(lookup(surnames,name))) {
incr(nsurnames)
insert(surnames,save(name),save(key(person)))
}
if (not(strcmp(name,""))) {
incr(nemptysurnames)
}
if (not(name)) { incr(nnosurnames) }
}
else {
if (not(lookup(givens,name))) {
incr(ngivens)
insert(givens,save(name),save(key(person)))
}
}
}
}
print("done.\nCollecting family statistics...")
forfam(family,fnum) {
set(by,0)
if (m,marriage(family)) {
incr(nmarrs)
extractdate(m,md,mm,my)
call increment_century(mcents,my)
}
}
print("done.\nGenerating report...")
"The database " database() " contains:\n"
d(pnum) " individuals\n"
d(nsurnames) " unique surnames\n"
d(ngivens) " unique given names\n"
d(nemptysurnames) " individuals with empty surnames\n"
d(nnosurnames) " individuals with no surname\n"
d(nbirths) " birth events\n"
d(nbaptisms) " baptism events\n"
"Birth/baptism events distributed by century as\n"
call list_centuries(bcents)
d(ndeaths) " death events\n"
d(nburials) " burial events\n"
"Death/burial events distributed by century as\n"
call list_centuries(dcents)
"\n"
d(fnum) " families\n"
d(nmarrs) " marriage events distributed by century as\n"
call list_centuries(mcents)
print("done.\n")
}
proc increment_century(centuries,year) {
if (year) {
set(century,div(year,100))
if (not(length(centuries))) {
enqueue(centuries,century)
enqueue(centuries,1)
}
else {
set(first_century,dequeue(centuries))
while (lt(century,first_century)) {
requeue(centuries,0)
set(first_century,sub(first_century,1))
}
set(index,add(1,sub(century,first_century)))
setel(centuries,index,add(getel(centuries,index),1))
requeue(centuries,first_century)
}
}
}
proc list_centuries(centuries) {
set(century,dequeue(centuries))
while (count,dequeue(centuries)) {
" " d(century) "00s " d(count) "\n"
incr(century)
}
}