/* ahnentafel -- Generate an ahnentafel chart */
/* Tom Wetmore        */
/* Version 1, 4/27/95 */

proc main ()
{
        getindimsg(indi, "Whose Ahnentafel do you want?")
        if (not(indi)) { return() }
        "Ahnentafel of " name(indi) "\n\n"
        print("Computing ahnentafel of ", name(indi), "\n",
                "  Dots show persons per generaion\n\n")
        list(ilist)
        list(alist)
        list(glist)
        table(ktab)
        enqueue(ilist,indi)
        enqueue(alist,1)
        enqueue(glist,1)
        set(gen, 0)
        while(indi,dequeue(ilist)) {
                set(ahnen, dequeue(alist))
                set (newgen, dequeue(glist))
                if (ne(gen, newgen)) {
                        "Generation " upper(roman(newgen)) ".\n\n"
                        print("\n", roman(newgen), " ")
                        set(gen, newgen)
                }
                set(before, lookup(ktab, key(indi)))
                if (before) {
                        d(ahnen) ". Same as " d(before) ".\n"
                } else {
                        print(".")
                        insert(ktab, save(key(indi)), ahnen)
                        d(ahnen) ". " name(indi) "\n"
                        if (e, birth(indi)) { "    b. " long(e) "\n" }
                        if (e, death(indi)) { "    d. " long(e) "\n" }
                }
                "\n"
                if (par,father(indi)) {
                        enqueue(ilist, par)
                        enqueue(alist, mul(2,ahnen))
                        enqueue(glist, add(gen, 1))
                }
                if (par,mother(indi)) {
                        enqueue(ilist, par)
                        enqueue(alist, add(1,mul(2,ahnen)))
                        enqueue(glist, add(gen, 1))
                }
        }
}
