This file is indexed.

/usr/share/lifelines/sgsgen.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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
/*
 * @progname       sgsgen.ll
 * @version        1
 * @author         Jim Eggert (eggertj@ll.mit.edu)
 * @category       
 * @output         Text
 * @description

A LifeLines report program to aid in the generation of
soc.genealogy.surnames (sgs) submissions.

Given a person, this generates a sgs-like submission for that person and
his/her ancestors.  The output will likely need considerable hand editing,
but that is how it is.  If you need to know what sgs is, I have enclosed
a description at the end of this file.

Here's what you will need to do by hand (you can consider this a list
of desired features for future versions of this report program):

BEFORE YOU RUN THE PROGRAM:

Change the routines write_sgs_entry() and write_sgs_body() to
customize your address and standard message.

AFTER YOU RUN THE PROGRAM:

Eliminate or fix empty or useless surname lines.
Use sgs-standard abbreviations for placenames.
  Get FAMILY ABBREV as per instructions at end of this file.
Combine duplicate surname lines where appropriate.
Check check check.  Note I've put a checklist at the head of the
  report.  Until you edit the report by hand, it cannot be used for
  autosubmission via the telnet command as below.
Send the final product to the sgs maintainer.  To autosubmit,
  telnet your.news.host 119 < checked.sgs.report

Version 1, 13 January 1997, by Jim Eggert, eggertj@ll.mit.edu

*/

global(year_min)
global(year_max)
global(submitter_tag)
global(location)
global(last_location)
global(location_list)
global(location_table)
global(see_surname_table)
global(sgs_entry_count)

proc main() {
    list(ilist)
    table(see_surname_table)

    getindi(person)

    set(sgs_entry_count,0)

    enqueue(ilist,person)

    dayformat(1)  monthformat(4)  dateformat(5)

    "QUIT\n"
    "------------ edit checklist\n"
    "change placenames to rsl-type places in the subject lines\n"
    "ensure countries exist in migration components in the subject lines\n"
    "eliminate / in places in the subject lines\n"
    "fix special characters as needed\n"
    "look for repeated submissions\n"
    "delete sensitive info if desired\n"
    "delete this checklist, including the top QUIT command\n"
    "------------ end of edit checklist\n"

    while (person,dequeue(ilist)) {
        table(location_table)
        list(location_list)

        set(year_min,9999) set(year_max,0)
        call locations_and_years(person)
        set(final_key,save(key(person)))
        set(final_surname,save(surname(person)))

        if (m,mother(person)) { enqueue(ilist,m) }

        while (person,father(person)) {
            if (m,mother(person)) { enqueue(ilist,m) }
            call locations_and_years(person)
            set(this_surname,surname(person))
            if (strcmp(this_surname,final_surname)) {
                set(see_name,0)
                if (other_surname,lookup(see_surname_table,this_surname)) {
                    if (strcmp(final_surname,other_surname)) {
                        set(see_name,1)
                    }
                }
                else {
                    set(see_name,1)
                    set(other_surname,final_surname)
                }
                if (see_name) {
                    insert(see_surname_table,
                                save(this_surname),save(other_surname))
                }
            }
        }
        call write_sgs_entry(final_key)
    }
    if (gt(sgs_entry_count,100)) {
        print("Warning:  Number of lines produced (")
        print(d(sgs_entry_count))
        print(")\nexceeds recommended submission limit (100)\n")
    }
    "QUIT\n"
}


/* write_sgs_entry writes one submission to soc.genealogy.surnames*/

proc write_sgs_entry(key_entry) {
    if (key_entry) {
        set(surname_entry,save(surname(indi(key_entry))))
        if (strlen(surname_entry)) {
            if (strcmp(trim(surname_entry,1),"_")) {
                if (father(indi(key_entry))) {
                    incr(sgs_entry_count)
                    set(not_first,0)
                    "POST\n"
/*---*/             "From: your@email.address\n"
                    "Newsgroups: soc.genealogy.surnames\n"
                    "Subject: " upper(surname_entry) "; "
                    while (loc,dequeue(location_list)) {
                        if (not_first) { ">" } else { set(not_first,1) }
                        loc
                    }
                    "; " d(year_min) "-" d(year_max) "\n"
                    "Message-ID: <sgs" d(sgs_entry_count)
/*---*/             "@your.host.name>\n"
                    "\n"
                    "Organization: none\n"
                    call write_sgs_body(key_entry)
                    ".\n"
                }
            }
        }
    }
}


/* write_sgs_body writes the body of a message */

proc write_sgs_body(key_entry) {
/*---*/
    "I am offering information on the following paternal ancestral line,\n"
    "and am soliciting the sharing of genealogical data with any interested\n"
    "party.  The numbers preceeding the person's name are the generation\n"
    "number, counting from the most recent person.  Further information\n"
    "can be found in my web pages at\n"
    "    <http://your.web.page/>\n"
    "Please direct any communications to your@email.address\n"
/*---*/

    set(person, indi(key_entry))
    set(number,1)
    while (person) {
        call ahnenreport(person,number)
        incr(number)
        set(person,father(person))
    }
}

proc ahnenreport(person,number) {
    "\n" d(number) ". " fullname(person,0,1,80) "\n"
    if (e, birth(person))   { "    born: " long(e) "\n" }
    if (e, baptism(person)) { "baptized: " long(e) "\n" }
    set(nfam,nfamilies(person))
    families(person, fam, spouse, fnum) {
        set(e, marriage(fam))
        if (or(e,spouse)) {
            if (gt(nfam,1)) {
                "married" d(fnum) ": "
            }
            else { " married: " }
        }
        if (e) { long(e) "\n" }
        if (spouse) {         "      to  " fullname(spouse,0,1,80) "\n" }
    }
    if (e, death(person))   { "    died: " long(e) "\n" }
    if (e, burial(person))  { "  buried: " long(e) "\n" }
/*    fornotes(inode(person), note) {
        note "\n"
    }
    fornodes(inode(person),node) {
        if (not(strcmp(tag(node),"REFN"))) {
            "SOURCE: " value(node) "\n"
        }
    }
*/
}


/* locations_and_years figures out unique locations and min/max years
   for a person with respect to other persons already figured.
   Note that the events are processed in reverse chronological order,
   because the ancestry is traced bottom up.  Oh well...
 */

proc locations_and_years(person) {
    list(marriage_list)

    call one_location_and_year(burial(person))
    call one_location_and_year(death(person))
    families(person,family,spouse,fnum) {
        push(marriage_list,marriage(family))
    }
    while (event,pop(marriage_list)) { call one_location_and_year(event) }
    call one_location_and_year(baptism(person))
    call one_location_and_year(birth(person))
}


/* one_location_and_year appends the event location to the global
   location list if it is new, and figures the event year into the
   global min and max values.
 */

proc one_location_and_year(event) {
    if (event) {
        set(loc,place(event))
        if (strlen(loc)) {
            if (not(lookup(location_table,loc))) {
                requeue(location_list,save(loc))
                insert(location_table,save(loc),1)
            }
        }
        if (yr,atoi(year(event))) {
            if (lt(yr,year_min)) { set(year_min,yr) }
            if (gt(yr,year_max)) { set(year_max,yr) }
        }
    }
}

/*

soc.genealogy.surnames


This FAQ is presently in draft form. It may change without notice. Last
modification: 25 Aug 1995.

Other surname-related FAQs available here:

       Commonly Used Abbreviations
       Commonly Used German Abbreviations
       Examples of Queries: Good and Bad
       WWW Surname Archive


Welcome to soc.genealogy.surnames. The intent of this newsgroup is to
help genealogists researching related families to contact each
other. All surname queries are welcome here.

A surname query is in many ways like a classified ad in a
newspaper. You want to attract people who might be interested in
sharing information about your family to read and respond to your
post.  To help readers in finding articles of interest, writers are
requested to follow some simple guidelines in the subject lines of
their articles.

Articles in soc.genealogy.surnames fall into a few basic categories:

    1.general surname queries
    2.tiny tafels
    3.address changes
    4.follow-up articles
    5.Roots Surname List (RSL) articles
    6.moderators' announcements

1. General surname queries

(Style suggestions can be found in a companion FAQ, Surname Queries:
Good and Bad. This document discusses only what is absolutely
necessary for a post to soc.genealogy.surnames.)

General surname queries can be written in plain language, freely
formatted. The body of the article can include any information about a
family that you wish. We recommend including given names, spouses,
children, birth, death, and marriage dates and places, if you know
them. This will make your article more useful to people who might want
to contact you, as well as making it valuable to people who may find
your article in searching the surname archives later. Indicating what
additional information you are seeking is a good idea. Also include
how to contact you: e-mail address, snail-mail address, and phone
number, if you like.

Each surname query should have a subject line that gives one or more
surnames (in all capital letters), at least one place (using an
abbreviation from the RSL list of abbreviations), and an indication of
the time frame of interest. Examples:

  Subject: MILLS; NY,USA; 1800-1915
  Subject: MILLS Samuel D.; Williamsburg,Kings Co,NY,USA; 1796-1863
  Subject: ZAHM/PICARD/STEIS; LOT,FRA; 1680-1840
  Subject: ZAHM / PICARD / STEIS; LOT,FRA; 1680-1840
  Subject: ZAHM; LOT,FRA>IN,USA>IL,USA>KS,USA; 1650-
  Subject: ZAHM; LOT,FRA > IN,USA > KS,USA; 1650-
  Subject: CLOVER John; Lincoln,LIN,ENG>IL,USA; -1860
  Subject: LEGGETT; anywhere; anytime

The "anywhere anytime" indication should only be used by genealogists
who are making a comprehensive one-name study of everyone in the world
who bore that name in all of recorded history. If you are just
starting out in researching your family, do not use this form; please
read the first paragraph of this section on surname queries again, and
use one of the other examples. If you are making a comprehensive
world-wide collection, please tell us about the extent of your
database as a way to encourage people to share their research with
you.

If you find you want to include queries about more names than will fit
in the subject line, you may wish to post several queries.

Some of the abbreviations may seem unfamiliar at first. The advantage
of using standard abbreviations for place names is that it makes
searching the surname archives easier and more reliable. As an
example, consider searching the archives for Coles families in New
York. With standard abbreviations, you can look for subjects that
contain both "COLES" and "NY,USA" and be sure that you are finding all
the relevant archived queries. Without standardization, you'd have to
search for "NY" and "New York", and might miss articles that said
"Albany" or "Buffalo" but left out the state. Abbreviations also make
subject lines shorter, for writers whose software limits subject
length.

The place abbreviations are the same as used for the Roots Surname
List (RSL). They include United States and Canadian two-letter postal
codes, Chapman codes, three-letter ISO codes for nations, some other
standard codes, and a few codes invented for the RSL. The list was
compiled by Karen Isaacson with help from Christian Carey.

You may find more information on abbreviations that may be used in
soc.genealogy.surnames in the Commonly Used Abbreviations FAQ for
soc.genealogy.surnames. The complete list of codes is archived on
mail.eworld.com. To retrieve the file, send e-mail to
listserv@mail.eworld.com containing only the line:

  GET FAMILY ABBREV

The computer will then e-mail you the list of abbreviations (unless
you are using a system that blocks e-mail to and from listservs). You
can also retrieve the file by anonymous ftp to vm1.nodak.edu, in the
ROOTS-L directory; the file is named family.abbrev. The dates should
indicate when you are interested in the family in the area listed in
the subject line. The dates could be the earliest birth and latest
death dates for known ancestors, or periods for which you have
information, or the time for which you want more information. The date
range is approximate; no need to add "circa" or "?" if you are not
sure of dates.

*/