aboutsummaryrefslogtreecommitdiff
path: root/noao/digiphot/lib/pttables/ptgnfn.x
diff options
context:
space:
mode:
Diffstat (limited to 'noao/digiphot/lib/pttables/ptgnfn.x')
-rw-r--r--noao/digiphot/lib/pttables/ptgnfn.x239
1 files changed, 239 insertions, 0 deletions
diff --git a/noao/digiphot/lib/pttables/ptgnfn.x b/noao/digiphot/lib/pttables/ptgnfn.x
new file mode 100644
index 00000000..f3d4ddcb
--- /dev/null
+++ b/noao/digiphot/lib/pttables/ptgnfn.x
@@ -0,0 +1,239 @@
+include <syserr.h>
+include <ctype.h>
+include "../ptkeysdef.h"
+
+define MAX_FIELDS 128
+define SZ_SBUF 1024
+define LEN_FNSTRUCT (10 + MAX_FIELDS)
+
+define FN_NENTRIES Memi[$1] # number of field names in list
+define FN_NEXT Memi[$1+1] # next string to be returned
+define FN_SBUF Memi[$1+2] # pointer to string buffer
+define FN_STRP Memi[$1+10+$2-1] # array of str ptrs
+
+define FN_FIELDNAME Memc[FN_STRP($1,$2)] # reference a string
+
+
+# PT_OFNL -- Procedure to decode the template.
+
+pointer procedure pt_ofnl (ap, template)
+
+pointer ap # image descriptor
+char template[ARB] # field name template
+
+int tp, nstr, ch, junk
+pointer sp, ip, op, rop, fn, pattern, patcode, ranges, nextch
+int patmake(), patmatch()
+errchk syserr
+
+begin
+ call smark (sp)
+ call salloc (pattern, SZ_FNAME, TY_CHAR)
+ call salloc (patcode, SZ_LINE, TY_CHAR)
+ call salloc (ranges, SZ_FNAME, TY_CHAR)
+
+ # Allocate field list descriptor and initialize.
+ call calloc (fn, LEN_FNSTRUCT, TY_STRUCT)
+ call malloc (FN_SBUF(fn), SZ_SBUF, TY_CHAR)
+ nextch = FN_SBUF(fn)
+ nstr = 0
+ tp = 1
+
+ # Extract each comma delimited template, expand upon the aphot
+ # database and add strings to list.
+
+ while (template[tp] != EOS && template[tp] != '\n') {
+
+ # Advance to next field.
+ while (IS_WHITE(template[tp]) || template[tp] == ',')
+ tp = tp + 1
+
+ # Extract pattern. Enclose pattern in {} so that the match will
+ # be case insensitive.
+
+ op = pattern
+ Memc[op] = '^'
+ op = op + 1
+ Memc[op] = '{'
+ op = op + 1
+
+ # Fetch the pattern.
+ ch = template[tp]
+ while (! (IS_WHITE(ch) || ch == '\n' || ch == ',' || ch == '[' ||
+ ch == EOS)) {
+
+ # Map "*" into "?*".
+ if (ch == '*') {
+ Memc[op] = '?'
+ op = op + 1
+ }
+
+ # Update.
+ Memc[op] = ch
+ op = op + 1
+ tp = tp + 1
+ ch = template[tp]
+ }
+
+ # Decode ranges.
+ if (ch == '[') {
+ rop = ranges
+ while (! (ch == '\n' || ch == EOS || ch == ']')) {
+ Memc[rop] = ch
+ rop = rop + 1
+ tp = tp + 1
+ ch = template[tp]
+ }
+ Memc[rop] = ']'
+ rop = rop + 1
+ tp = tp + 1
+ ch = template[tp]
+ while (ch != EOS && ch != '\n' && ch != ',' && IS_DIGIT(ch)) {
+ Memc[rop] = ch
+ tp = tp + 1
+ ch = template[tp]
+ rop = rop + 1
+ }
+ Memc[rop] = EOS
+ } else
+ Memc[ranges] = EOS
+
+ # Close off the pattern.
+ Memc[op] = '}'
+ op = op + 1
+ Memc[op] = EOS
+
+ # Encode the pattern.
+ junk = patmake (Memc[pattern], Memc[patcode], SZ_LINE)
+
+ # Scan database and extract all field names matching the
+ # pattern.
+
+ for (ip = KY_WORDS(ap) + 1; Memc[ip] != EOS; ip = ip + 1) {
+
+ # Put key in list if it matches.
+ if (patmatch (Memc[ip], Memc[patcode]) > 0) {
+ call pt_fnputkey (Memc[ip], Memc[ranges], FN_STRP(fn,1),
+ nstr, nextch, FN_SBUF(fn))
+ }
+
+ # Advance to the next record.
+ while (Memc[ip] != ',' && Memc[ip] != EOS)
+ ip = ip + 1
+
+ # Quit if you hit EOS
+ if (Memc[ip] == EOS)
+ break
+ }
+ }
+
+ FN_NENTRIES(fn) = nstr
+ FN_NEXT(fn) = 1
+ call sfree (sp)
+ return (fn)
+end
+
+
+# PT_GNFN -- Get the next field name matching the given template from the
+# apphot data base.
+
+int procedure pt_gnfn (fn, outstr, ranges, maxch)
+
+pointer fn # field name list descriptor
+char outstr[ARB] # output string
+char ranges[ARB] # ranges string
+int maxch # maximum number of characters
+
+char left_bkt
+int strnum, findex, nchars
+int gstrcpy(), stridx()
+data left_bkt /'['/
+
+begin
+ # Initialize.
+ ranges[1] = EOS
+ outstr[1] = EOS
+
+ # Check that there is an entry
+ strnum = FN_NEXT(fn)
+ if (strnum > FN_NENTRIES(fn))
+ return (EOF)
+
+ # Get the next field name.
+ nchars = gstrcpy (FN_FIELDNAME(fn,strnum), outstr, maxch)
+
+ # Get the ranges string.
+ findex = stridx (left_bkt, outstr)
+ if (findex > 0) {
+ call strcpy (outstr[findex], ranges, maxch)
+ outstr[findex] = EOS
+ }
+
+ # Increment counter.
+ FN_NEXT(fn) = strnum + 1
+
+ return (nchars)
+end
+
+
+# PT_CFNL -- Procedure to close the list.
+
+procedure pt_cfnl (fn)
+
+pointer fn # field name list descriptor
+
+begin
+ call mfree (FN_SBUF(fn), TY_CHAR)
+ call mfree (fn, TY_STRUCT)
+end
+
+
+
+# PT_FNPUTKEY -- Put a keyword into the keyword list.
+
+procedure pt_fnputkey (key, ranges, strp, nstr, nextch, sbuf)
+
+char key[ARB] # keyword name (etc.)
+char ranges[ARB] # list of ranges
+pointer strp[ARB] # array of string pointers
+int nstr # current number of strings
+pointer nextch # next available char in string buffer
+pointer sbuf # string buffer
+
+int ch, ip, rip
+errchk syserr
+
+begin
+ # Check size of string buffer.
+ nstr = nstr + 1
+ if (nstr > MAX_FIELDS)
+ call error (0, "There too many fields in the input template")
+
+ # Initialize.
+ strp[nstr] = nextch
+ ip = 1
+ ch = key[ip]
+
+ # Append keyword to the string buffer.
+ while (ch != ',' && ch != ' ' && ch != EOS) {
+ Memc[nextch] = ch
+ nextch = nextch + 1
+ if (nextch >= sbuf + SZ_SBUF)
+ call error (0, "There too many fields in the input template")
+ ip = ip + 1
+ ch = key[ip]
+ }
+
+ # Get the ranges information.
+ rip = 1
+ while (ranges[rip] != EOS) {
+ Memc[nextch] = ranges[rip]
+ nextch = nextch + 1
+ if (nextch >= sbuf + SZ_SBUF)
+ call error (0, "There too many fields in the input template")
+ rip = rip + 1
+ }
+
+ Memc[nextch] = EOS
+ nextch = nextch + 1
+end