mirror of
https://github.com/kennethreitz/context.git
synced 2026-06-05 14:50:19 +00:00
79 lines
2.1 KiB
LLVM
79 lines
2.1 KiB
LLVM
/*
|
|
* @progname altern.ll
|
|
* @version 2.0
|
|
* @author Rafal T. Prinke
|
|
* @category
|
|
* @output Text
|
|
* @description
|
|
* find the longest line of alternating male/female links
|
|
*
|
|
v.1.0 Rafal T. Prinke - 14 APR 1997
|
|
v.2.0 Rafal T. Prinke - 16 NOV 1999
|
|
*/
|
|
|
|
global(who)
|
|
global(was)
|
|
global(final)
|
|
|
|
proc main()
|
|
|
|
{
|
|
set(final,0)
|
|
list(who)
|
|
table(was)
|
|
forfam(f, y) {
|
|
if(eq(nchildren,0)) {
|
|
if(husband(f)) {
|
|
call line(husband(f))
|
|
insert(was, key(husband(f)), 1)
|
|
}
|
|
if(wife(f)) {
|
|
call line(wife(f))
|
|
insert(was, key(wife(f)), 1)
|
|
}
|
|
}
|
|
}
|
|
|
|
"The longest alternating ancestral lines are: \n\n"
|
|
|
|
while(not(empty(who))) {
|
|
set(n, dequeue(who))
|
|
set(count, 1)
|
|
d(count) ". " name(n, 0) "\n"
|
|
while(parents(n)) {
|
|
set(count, add(count, 1))
|
|
if (eqstr(sex(n),"M")) {
|
|
set(n, mother(n))
|
|
}
|
|
else { set(n, father(n)) }
|
|
d(count) ". " name(n, 0) "\n"
|
|
}
|
|
"\n"
|
|
}
|
|
}
|
|
|
|
|
|
|
|
proc line (x) {
|
|
if(not(lookup(was,key(x)))) {
|
|
set(p, x)
|
|
set(count,1)
|
|
while(parents(x)) {
|
|
if (eqstr(sex(x),"M")) {
|
|
set(x, mother(x))
|
|
}
|
|
else { set(x, father(x))
|
|
}
|
|
set(count,add(count,1))
|
|
}
|
|
if (eq(count, final)) {
|
|
enqueue(who, p)
|
|
}
|
|
if (gt(count, final)) {
|
|
list(who)
|
|
enqueue(who, p)
|
|
set(final, count)
|
|
}
|
|
}
|
|
}
|