2
* @progname ssdi-import.ll
4
* @author Kurt Baudendistel (baud@research.att.com)
9
* Convert ssdi gedcom to lifelines-standard gedcom
11
* 12 NOV 1994 (3.0.1) baud@research.att.com
12
* Derived from import-igi.
17
getstrmsg (msg, "SSDI Version [default X/1992]?")
18
if (streq (msg, "")) {
19
set (ssdiversion, "X")
20
set (ssdidate, "1992")
22
if (i, index (msg, "/", 1)) {
23
set (ssdiversion, save (trim (msg, sub (i, 1))))
24
set (ssdidate, save (cut (msg, add(i, 1))))
26
set (ssdiversion, save (msg))
34
"2 NAME SSDI-IMPORT REPORT\n"
37
"1 DATE " date (gettoday ()) "\n"
38
"1 COPR Copyright " date (gettoday ()) ". Permission is granted to repro"
39
"duce any subset\n2 CONT of the data contained herein under the condit"
40
"ion that this copyright\n2 CONT notice is preserved, that the origina"
41
"l source citations referenced\n2 CONT in the subset are included, and"
42
" that the submitter of this file is\n2 CONT credited with original au"
43
"thorship as appropriate.\n"
47
"1 NAME Social Security Death Index\n"
48
if (strlen (ssdiversion)) {
49
"1 VER " ssdiversion "\n"
51
if (strlen (ssdidate)) {
52
"1 DATE " ssdidate "\n"
55
print ("Processing nodes ...\n")
64
func ssdiimport (indi)
68
set (root, inode (indi))
69
forlist (subnodes (root, "NOTE"), note, nn) {
70
if (streq (trim (value (note), 24), "Social Security Number: ")) {
71
set (number, save (cut (value (note), 25)))
72
} elsif (streq (value (note), "Death Residence Localities")) {
73
set (residences, localities (note))
78
reformatnames (root, "@S1@")
81
set (ssn, createnode ("SSN", number))
82
if (birthplace, subnode (birth (indi), "PLAC")) {
83
if (streq (value (birthplace), "Not Identified")) {
87
concat (fullname (indi, 0, 1, 999),
88
", but no location of issuance was identified."))))
93
concat (value (birthplace),
95
concat (fullname (indi, 0, 1, 999), "."))))))
97
catnode (ssnsour, createnode ("SOUR", "@S1@"))
98
catnode (ssn, ssnsour)
100
catnode (ssn, createnode ("SOUR", "@S1@"))
102
addnode (ssn, root, subnode (root, "NAME"))
106
if (birthplace, subnode (birth (indi), "PLAC")) {
107
deletenode (birthplace)
109
catnode (birth (indi), createnode ("SOUR", "@S1@"))
113
set (deathplace, subnode (death (indi), "PLAC"))
114
set (zip, "an unknown")
115
if (code, dequeue (residences)) {
116
if (streq (trim (code, 10), "Zip Code: ")) {
117
set (zip, save (concat ("the ", cut (code, 11))))
119
requeue (residences, zip)
122
if (rn, residences) {
123
forlist (residences, res, rn) {
124
catnode (death (indi), createnode ("PLAC", res))
125
if (and (deathplace, index (res, value (deathplace), 1))) {
126
deletenode (deathplace)
131
if (and (deathplace, not (value (deathplace)))) {
132
deletenode (deathplace)
136
set (trailer, " zip code.")
138
set (trailer, " zip code, which encompasses the named localities.")
140
set (sour, createnodes ("SOUR",
141
concat3 ("The residence at the time of death was in ", zip, trailer)))
142
catnode (sour, createnode ("SOUR", "@S1@"))
143
catnode (death (indi), sour)
145
catnode (death (indi), createnode ("SOUR", "@S1@"))
153
func localities (root) {
156
fornodes (root, node) {
157
enqueue (residences, value (node))
163
/* common import/export functions */
165
func cond (x, a, b) {
173
func gedcomnode (root) {
174
traverse (root, node, level) {
176
if (x, xref (node)) { " " x }
177
if (x, tag (node)) { " " x }
178
if (x, value (node)) { " " x }
184
func denull (alist) {
186
forlist (alist, a, an) {
187
if (a) { enqueue (blist, a) }
192
func reformatdates (root) {
193
traverse (root, node, level) {
194
if (streq (tag (node), "DATE")) {
195
if (v, value (node)) {
196
if (and (eq (index (v, "<", 1), 1),
197
eq (index (v, ">", 1), strlen (v)))) {
199
(createnode ("DATE", save (substring (v, 2, sub (strlen (v), 1)))),
200
subnode (node, "DATE"))
208
func reformatnames (root, sourcetext) {
211
list (choppedsurnamelist)
212
list (newchoppedsurnamelist)
213
if (namenode, subnode (root, "NAME")) {
214
extractnames (namenode, namelist, nameN, surnameN)
215
set (lastnamenode, namenode)
216
forlist (namelist, s, sn) {
217
set (s, strremove (s, "."))
218
set (s, strremove (s, "_"))
219
setel (namelist, sn, s)
221
enqueue (surnamelist, getel (namelist, surnameN))
222
while (surname, dequeue (surnamelist)) {
223
set (choppedsurnamelist, strchop (surname, " "))
224
forlist (choppedsurnamelist, s, sn) {
225
if (streq ("VON", s)) {
226
enqueue (newchoppedsurnamelist, s)
227
} elsif (streq ("DER", s)) {
228
enqueue (newchoppedsurnamelist, s)
229
} elsif (and (eq (index (s, "(", 1), 1),
230
eq (index (s, ")", 1), strlen (s)))) {
231
enqueue (surnamelist, save (substring (s, 2, sub (strlen (s), 1))))
233
enqueue (newchoppedsurnamelist, save (capitalize (lower (s))))
236
set (newsurname, strjoin (newchoppedsurnamelist, " "))
237
if (strlen (newsurname)) {
238
if (i, index (newsurname, "Mc ", 1)) {
239
set (newsurname, save (concat (trim (newsurname, add (i, 1)),
240
cut (newsurname, add (i, 3)))))
242
set (newsurname, save (concat3 ("/", newsurname, "/")))
244
setel (namelist, surnameN, newsurname)
245
set (newnamenode, createnode ("NAME", strjoin (namelist, " ")))
246
addnode (newnamenode, parent (lastnamenode), lastnamenode)
248
catnode (newnamenode, createnode ("SOUR", sourcetext))
250
set (lastnamenode, newnamenode)
252
deletenode (namenode)
258
return (not (strcmp (x, y)))
261
func createnodes (tag, text) {
262
set (text, trimspaces (text))
263
if (le (strlen (text), 72)) {
264
return (createnode (tag, text))
267
while (gt (strlen (text), 72)) {
269
if (i, index (text, " ", n)) {
272
set (j, add (strlen (text), 1))
274
while (and (i, lt (i, 73))) {
277
set (i, index (text, " ", n))
279
enqueue (textlist, save (trim (text, sub (j, 1))))
280
set (text, save (cut (text, add (j, 1))))
282
if (gt (strlen (text), 0)) {
283
enqueue (textlist, text)
285
set (root, createnode (tag, dequeue (textlist)))
287
forlist (textlist, text, tn) {
288
set (node, createnode ("CONT", text))
289
addnode (node, root, lastnode)
296
func trimspaces (text) {
299
set (sn, strlen (text))
300
while (and (le (s0, sn), streq (substring (text, s0, s0), " "))) {
304
while (and (le (s0, sn), streq (substring (text, sn, sn), " "))) {
309
return (save (substring (text, s0, sn)))
315
func catnode (root, newnode) {
318
fornodes (root, node) {
321
addnode (newnode, root, lastnode)
326
func strchop (s, d) {
332
while (sn, index (s, d, n)) {
333
enqueue (slist, save (substring (s, s0, sub (sn, 1))))
334
set (s0, add (sn, dn))
337
enqueue (slist, save (cut (s, s0)))
342
func strjoin (slist, d) {
343
forlist (slist, s, sn) {
344
if (not (strlen (str))) {
346
} elsif (strlen (s)) {
347
set (str, save (concat3 (str, d, s)))
353
func subnode (root, tag) {
355
fornodes (root, node) {
356
if (streq (tag (node), tag)) {
364
func subnodes (root, tag) {
367
fornodes (root, node) {
368
if (streq (tag (node), tag)) {
369
enqueue (nodelist, node)
376
func replacenode (newnode, oldnode) {
378
if (root, parent (oldnode)) {
379
addnode (newnode, root, oldnode)
386
func concat3 (x, y, z) {
387
return (concat (x, concat (y, z)))
391
return (substring (s, n, strlen (s)))
396
set (str, value (root))
397
fornodes (root, node) {
399
set (str, value (node))
400
} elsif (strlen (value (node))) {
401
set (str, save (concat3 (str, " ", value (node))))
410
func strremove (s, d) {
412
while (i, index (s, d, 1)) {
413
set (s, save (concat (trim (s, sub (i, 1)), cut (s, add (i, 1)))))