mirror of
https://github.com/kennethreitz/context.git
synced 2026-06-05 14:50:19 +00:00
158 lines
3.5 KiB
LLVM
158 lines
3.5 KiB
LLVM
/*
|
|
* @progname find.ll
|
|
* @version 2.1
|
|
* @author Prinke, Perry Rapp
|
|
* @category
|
|
* @output GUI
|
|
* @description Display menu of persons with TAG having matching VALUE
|
|
|
|
This utility finds all persons whose records contain a specified
|
|
TAG and VALUE and displays the resulting list as a menu.
|
|
|
|
find.ll - Rafal Prinke, rafalp@plpuam11.amu.edu.pl, 7 OCT 1995
|
|
|
|
The options allow to:
|
|
|
|
- find all occurrences of a given TAG when no VALUE is given
|
|
- find all occurrences of a given VALUE when no TAG is given
|
|
- find all occurrences of a given VALUE under a given TAG when
|
|
both are given (the CONT|CONC|TYPE tags are also searched)
|
|
|
|
The displayed VALUE is a 25 characters long substring of the field
|
|
value starting from the first occurence of the input value.
|
|
|
|
The results are displayed in a menuchoice list.
|
|
The first choice is to print the remaining choices to a file.
|
|
*/
|
|
option(explicit)
|
|
|
|
proc main()
|
|
{
|
|
list(mnu)
|
|
|
|
getstr(tg, "TAG (enter=ANY)")
|
|
set(tg, upper(tg))
|
|
|
|
getstr(vl, "VALUE (enter=ANY)")
|
|
set(vl, upper(vl))
|
|
|
|
while (1)
|
|
{
|
|
getstr(rtype, "Records to search (I, F, S, E, X, or <enter> for any)")
|
|
set(rtype, upper(rtype))
|
|
if (or(eq(rtype, ""), index("IFSEX", rtype, 1)))
|
|
{
|
|
break()
|
|
}
|
|
}
|
|
|
|
set(outputChoice, "Print to output file")
|
|
enqueue(mnu, outputChoice)
|
|
|
|
/* people */
|
|
if (or(eq(rtype, ""), eq(rtype, "I")))
|
|
{
|
|
forindi (rec, n)
|
|
{
|
|
call search(rec, tg, vl, mnu)
|
|
}
|
|
}
|
|
/* families */
|
|
if (or(eq(rtype, ""), eq(rtype, "F")))
|
|
{
|
|
forfam (rec, n)
|
|
{
|
|
call search(rec, tg, vl, mnu)
|
|
}
|
|
}
|
|
/* sources */
|
|
if (or(eq(rtype, ""), eq(rtype, "S")))
|
|
{
|
|
forsour (rec, n)
|
|
{
|
|
call search(rec, tg, vl, mnu)
|
|
}
|
|
}
|
|
/* events */
|
|
if (or(eq(rtype, ""), eq(rtype, "E")))
|
|
{
|
|
foreven (rec, n)
|
|
{
|
|
call search(rec, tg, vl, mnu)
|
|
}
|
|
}
|
|
/* others */
|
|
if (or(eq(rtype, ""), eq(rtype, "X")))
|
|
{
|
|
forothr (rec, n)
|
|
{
|
|
call search(rec, tg, vl, mnu)
|
|
}
|
|
}
|
|
|
|
if (eq(length(mnu), 1))
|
|
{
|
|
print("No matches found")
|
|
}
|
|
else
|
|
{
|
|
set(chc, menuchoose(mnu, "Use record keys as below to browse to desired record"))
|
|
if (eq(chc, 1))
|
|
{
|
|
"Search for tag <" tg "> and value <" vl ">"
|
|
if (eq(rtype, "")) { " in all records" }
|
|
else { " in " rtype " records" }
|
|
" yielded " d(sub(length(mnu), 1)) " hits:\n"
|
|
forlist(mnu,s,c) {
|
|
if (ne(s, outputChoice))
|
|
{
|
|
s nl()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
Search rec (an INDI or FAM or ...)
|
|
for occurrences of tag tg with value vl
|
|
(Either may be empty as wildcards)
|
|
*/
|
|
proc search(rec, tg, vl, mnu)
|
|
{
|
|
set(rnod, root(rec))
|
|
set(nodtyp, tag(rnod))
|
|
traverse (rnod, n, x)
|
|
{
|
|
set(xtag, upper(tag(n)))
|
|
set(xval, upper(value(n)))
|
|
if (eq(strlen(vl), 0))
|
|
{
|
|
set(ofst, 1)
|
|
}
|
|
else
|
|
{
|
|
set(ofst, index(xval, vl, 1))
|
|
}
|
|
if (or(or(and(eqstr(tg, xtag), or(index(xval, vl, 1),
|
|
eq(strlen(vl), 0))), and(eq(strlen(tg), 0), index(xval, vl, 1))),
|
|
and(index("CONTYPECONC", xtag, 1), index(xval, vl, 1))))
|
|
{
|
|
set(z, substring(value(n), ofst, strlen(xval)))
|
|
if (gt(strlen(z), 25))
|
|
{
|
|
set(z, substring(z, 1, 25))
|
|
}
|
|
set(result, concat(rjustify(key(rec), 6), " - "))
|
|
if (eq(nodtyp, "INDI"))
|
|
{
|
|
set(result, concat(result,
|
|
rjustify(fullname(rec, 1, 1, 18), 18)))
|
|
}
|
|
set(result, concat(result,
|
|
" - ", tag(parent(n)), ":", d(x), "_", tag(n), ":", z))
|
|
enqueue(mnu, result)
|
|
}
|
|
} /* traverse */
|
|
}
|