This file is indexed.

/usr/share/lifelines/longlines.ll is in lifelines-reports 3.0.61-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
/*
 * @progname       longlines.ll
 * @version        2.0
 * @author         Chandler
 * @category       
 * @output         Text
 * @description    

Find the maximal-length male and female lineages in the database.
Optionally, find the maximal-length lineage through a specified ancestor.
 
longlines

Version 1 - 1994 May 19 - John F. Chandler
Version 2 - 2000 May 4 - John F. Chandler

This program works only with LifeLines.

*/
global(len)     /* current lineage length */
global(lenmax)  /* longest lineage found */
global(ends)    /* keys of last persons */
global(linsex)  /* sex of lineage desired */

proc main(){
getindi(indi,"Enter specific ancestor, if any, whose longest line you want:")
if(indi) {
        "Longest descent from " name(indi) " (" key(indi) ")\n\n"
        set(linsex,sex(indi))
        set(len,1)
        call getline(indi)
        call dumplines()
} else {
        "Longest lineages in database\n\n   Male"
        call getall("M")
        call dumplines()
        "\n   Female"
        call getall("F")
        call dumplines()
}
}

/* scan all offspring matching the sex of the input person, and
   return the longest lineage(s) from those -- if no matching
   offspring, just return the input person as a lineage */
proc getline(indi)
{
incr(len)
families(indi,fam,spou,num) {
        children(fam,child,numc) {
                if(eq(0,strcmp(linsex,sex(child)))) {
                        set(found,1)
                        call getline(child)
                }
        }
}
decr(len)
if(and(not(found),ge(len,lenmax))) {
        if(gt(len,lenmax)) {list(ends)}
        enqueue(ends,save(key(indi)))
        set(lenmax,len)
}}

proc getall(this_sex)
{
set(linsex,this_sex)
set(lenmax,0)
print("Starting ", linsex, " ...\n")

/* find all eligible starting points */
/* assume that a nameless person doesn't count */
forindi (indi, num) {
        set(skip,"")
        if(eq(0,strcmp(linsex,"M"))) {set(par,father(indi))}
        else {set(par,mother(indi))}
        if(par) {set(skip,name(par))}
        if(and(eq(0,strcmp(linsex,sex(indi))),eq(0,strcmp("",skip)))) {
                set(len,1)
                call getline(indi)
        }
}}

proc dumplines()
{
/* report results */
"\n   Maximal length " d(lenmax) "\n"
/* dump each lineage, starting with most recent person */
while(end, dequeue(ends)) {
        "\n"
        set(count, lenmax)
        set(line,indi(end))
        while(line) {
                if(eq(count,0)) {"   (extension of the requested line...)\n"}
                decr(count)
                if(eq(0,strcmp(name(line),""))) {"_____"}
                name(line) " (" key(line) ")"
                if(x, birth(line)) {" b. " year(x)}
                if(y, death(line)) {
                        if(x) {","}
                        " d. " year(y)
                }
                "\n"
                if(eq(0,strcmp(linsex,"M"))) {set(line,father(line))}
                else {set(line,mother(line))}
        }
        if(lt(count,0)) {"   (length " d(sub(lenmax,count)) " with extension)\n"}
}}