mirror of
https://github.com/kennethreitz/context.git
synced 2026-06-05 14:50:19 +00:00
109 lines
3.3 KiB
LLVM
109 lines
3.3 KiB
LLVM
/*
|
|
* @progname relate.ll
|
|
* @version 1.0
|
|
* @author Wetmore
|
|
* @category
|
|
* @output Text
|
|
* @description
|
|
*
|
|
* Finds a shortest path between two persons in a LifeLines database.
|
|
* Inspiration from Jim Eggert's relation program.
|
|
|
|
|
|
relate - Finds a shortest path between two persons in a LifeLines
|
|
database.
|
|
by Tom Wetmore (ttw@petrel.att.com)
|
|
Inspiration from Jim Eggert's relation program
|
|
Version 1, 07 September 1993
|
|
*/
|
|
|
|
proc main ()
|
|
{
|
|
getindimsg(from, "Please identify starting person.")
|
|
getindimsg(to, "Please identify ending person.")
|
|
if (and(from, to)) {
|
|
print("Computing relationship between:\n ")
|
|
print(name(from)) print(" and ")
|
|
print(name(to)) print(".\n\nThis may take awhile -- ")
|
|
print("each dot is a person.\n")
|
|
|
|
set(fkey, save(key(from)))
|
|
set(tkey, save(key(to)))
|
|
call relate(tkey, fkey)
|
|
} else {
|
|
print("We're ready when you are.")
|
|
}
|
|
}
|
|
|
|
global(links)
|
|
global(rels)
|
|
global(klist)
|
|
|
|
proc relate (fkey, tkey)
|
|
{
|
|
table(links) /* table of links back one person */
|
|
table(rels) /* table of relationships back one person */
|
|
list(klist) /* list of persons not linked back to */
|
|
|
|
insert(links, fkey, fkey)
|
|
insert(rels, fkey, ".")
|
|
enqueue(klist, fkey)
|
|
set(again, 1)
|
|
|
|
while (and(again, not(empty(klist)))) {
|
|
set(key, dequeue(klist))
|
|
set(indi, indi(key))
|
|
call include(key, father(indi), ", father of")
|
|
call include(key, mother(indi), ", mother of")
|
|
families(indi, fam, spouse, num1) {
|
|
children(fam, child, num2) {
|
|
call include(key, child, ", child of")
|
|
}
|
|
if (spouse) {
|
|
call include(key, spouse, ", spouse of")
|
|
}
|
|
}
|
|
if (fam, parents(indi)) {
|
|
children(fam, child, num2) {
|
|
call include(key, child, ", sibling of")
|
|
}
|
|
}
|
|
if (key, lookup(links, tkey)) {
|
|
call foundpath(tkey)
|
|
set(again, 0)
|
|
}
|
|
}
|
|
if (again) {
|
|
print("They are not related to one another.")
|
|
}
|
|
}
|
|
|
|
proc include (key, indi, tag)
|
|
{
|
|
if (and(indi, not(lookup(links, key(indi))))) {
|
|
print(".")
|
|
set(new, save(key(indi)))
|
|
insert(links, new, key)
|
|
insert(rels, new, tag)
|
|
enqueue(klist, new)
|
|
}
|
|
}
|
|
|
|
proc foundpath (key)
|
|
{
|
|
print("\n\nA relationship between them was found:\n\n")
|
|
set(again, 1)
|
|
while (again) {
|
|
print(" ")
|
|
print(name(indi(key)))
|
|
print(lookup(rels, key))
|
|
print("\n")
|
|
set(new, lookup(links, key))
|
|
if (eq(0, strcmp(key, new))) {
|
|
set(again, 0)
|
|
} else {
|
|
set(key, new)
|
|
}
|
|
}
|
|
}
|