aboutsummaryrefslogtreecommitdiff
path: root/noao/digiphot/ptools/pconvert/ptconvert.x
diff options
context:
space:
mode:
Diffstat (limited to 'noao/digiphot/ptools/pconvert/ptconvert.x')
-rw-r--r--noao/digiphot/ptools/pconvert/ptconvert.x236
1 files changed, 236 insertions, 0 deletions
diff --git a/noao/digiphot/ptools/pconvert/ptconvert.x b/noao/digiphot/ptools/pconvert/ptconvert.x
new file mode 100644
index 00000000..8ac97ac8
--- /dev/null
+++ b/noao/digiphot/ptools/pconvert/ptconvert.x
@@ -0,0 +1,236 @@
+include <error.h>
+include <evexpr.h>
+include <tbset.h>
+include "../../lib/ptkeysdef.h"
+
+# PT_APCONVERT -- Procedure to select records from a text file in pseudo list
+# format.
+
+procedure pt_convert (fd, td, fields, expr, append)
+
+int fd # text file descriptor
+int td # table file descriptor
+char fields[ARB] # fields to be output
+char expr[ARB] # boolean expression to be evaluated
+int append # append to an existing table
+
+bool oexpr
+int nchars, nunique, uunique, funique, ncontinue, recptr, rownum
+int ntotkeys, first_rec, printall, table_defined
+pointer sp, line, colpoints, key, o
+
+bool streq()
+extern pt_getop ()
+int getline(), strncmp(), tbpsta(), pt_deftable(), pt_apptable()
+pointer evexpr(), locpr()
+real asumi()
+
+begin
+
+ # Allocate temporary working space.
+ call smark (sp)
+ call salloc (line, SZ_LINE, TY_CHAR)
+
+ # Initialize the keys structure.
+ call pt_kyinit (key)
+
+ # Initialize the counters.
+ nunique = 0
+ uunique = 0
+ funique = 0
+
+ # Initalize the record reading code.
+ table_defined = NO
+ first_rec = YES
+ recptr = 1
+ ncontinue = 0
+
+ # Initialize the expression evaluator.
+ o = NULL
+ if (streq (expr, "yes")) {
+ oexpr = true
+ printall = YES
+ } else {
+ oexpr = false
+ printall = NO
+ }
+
+ # Initialize the pointer for writing rows.
+ if (append == YES)
+ rownum = tbpsta (td, TBL_NROWS)
+ else
+ rownum = 0
+
+ # Loop over the text file records.
+ nchars = getline (fd, Memc[line])
+ while (nchars != EOF) {
+
+ # Determine the type of record.
+ if (Memc[line] == KY_CHAR_POUND) {
+ if (strncmp (Memc[line], KY_CHAR_KEYWORD, KY_LEN_STR) == 0) {
+ call pt_kyadd (key, Memc[line], nchars)
+ } else if (strncmp (Memc[line], KY_CHAR_NAME,
+ KY_LEN_STR) == 0) {
+ nunique = nunique + 1
+ call pt_kname (key, Memc[line], nchars, nunique)
+ } else if (strncmp (Memc[line], KY_CHAR_UNITS,
+ KY_LEN_STR) == 0) {
+ uunique = uunique + 1
+ call pt_knunits (key, Memc[line], nchars, uunique)
+ } else if (strncmp (Memc[line], KY_CHAR_FORMAT,
+ KY_LEN_STR) == 0) {
+ funique = funique + 1
+ call pt_knformats (key, Memc[line], nchars, funique)
+ }
+
+ } else if (Memc[line] == KY_CHAR_NEWLINE) {
+ # skip blank lines
+
+ } else {
+
+ # Construct the table record.
+ call pt_mkrec (key, Memc[line], nchars, first_rec, recptr,
+ ncontinue)
+
+ # Construct output record when there is no continuation char.
+ if (Memc[line+nchars-2] != KY_CHAR_CONT) {
+
+ # Construct the output table if not defined.
+ if (table_defined == NO) {
+
+ # Compute the maximum number of keys.
+ ntotkeys = nint (asumi (Memi[KY_NELEMS(key)],
+ KY_NKEYS(key)))
+
+ # Allocate space for the column pointers.
+ call salloc (colpoints, ntotkeys, TY_INT)
+
+ # Initialize the table.
+ if (append == NO) {
+ if (pt_deftable (td, key, fields,
+ Memi[colpoints]) <= 0)
+ break
+ } else if (append == YES) {
+ if (pt_apptable (td, key, fields,
+ Memi[colpoints]) <= 0)
+ break
+ }
+
+ table_defined = YES
+ }
+
+ # Evaluate the expression.
+ iferr {
+ if (printall == NO) {
+ call pt_apset (key)
+ o = evexpr (expr, locpr (pt_getop), 0)
+ if (O_TYPE(o) != TY_BOOL)
+ call error (0, "Expression must be a boolean")
+ oexpr = O_VALB(o)
+ }
+ } then {
+ call erract (EA_WARN)
+ call xev_freeop (o)
+ call mfree (o, TY_STRUCT)
+ break
+ }
+
+ # Construct the output record.
+ if (oexpr) {
+ rownum = rownum + 1
+ call pt_putrec (td, Memi[colpoints], key, rownum)
+ }
+
+ # Get ready for next record.
+ ncontinue = 0
+ recptr = 1
+ first_rec = NO
+ if (o != NULL) {
+ call xev_freeop (o)
+ call mfree (o, TY_STRUCT)
+ }
+ }
+ }
+
+ # Read the next line.
+ nchars = getline (fd, Memc[line])
+ }
+
+ # Free the keys structure.
+ call pt_kyfree (key)
+ call sfree (sp)
+end
+
+
+# PT_PUTREC -- Add a row to the table.
+
+procedure pt_putrec (td, colpoints, key, rownum)
+
+pointer td # table descriptor
+pointer colpoints[ARB] # pointers for columns
+pointer key # key structure
+int rownum # row number
+
+int i, index, elem, kip, maxch, n, nk, ncols
+int number, datatype, lendata, lenfmt, ival
+pointer sp, colname, colunits, colfmt, str
+real rval
+bool streq()
+int ctor(), ctoi()
+
+begin
+ call smark (sp)
+ call salloc (colname, SZ_COLNAME+1, TY_CHAR)
+ call salloc (colunits, SZ_PARREC+1, TY_CHAR)
+ call salloc (colfmt, SZ_PARREC+1, TY_CHAR)
+ call salloc (str, SZ_LINE, TY_CHAR)
+
+ # For each selected field move into the table
+ ncols = 0
+ do i = 1, KY_NSELECT(key) {
+
+ # Get the pointer to the desired value.
+ index = Memi[KY_SELECT(key)+i-1]
+ elem = Memi[KY_ELEM_SELECT(key)+i-1]
+ maxch = Memi[KY_LEN_SELECT(key)+i-1]
+ kip = Memi[KY_PTRS(key)+index-1] + (elem - 1) * maxch
+
+ # Trim leading and trailing whitespace from the value and
+ # copy value to output buffer.
+
+ for (n = 0; Memc[kip] == ' '; n = n + 1)
+ kip = kip + 1
+ for (nk = 0; Memc[kip+nk] != ' ' && n <= maxch; nk = nk + 1)
+ n = n + 1
+ call strcpy (Memc[kip], Memc[str], nk)
+
+ # Find info about this column.
+ ncols = ncols + 1
+ call tbcinf (colpoints[ncols], number, Memc[colname],
+ Memc[colunits], Memc[colfmt], datatype, lendata, lenfmt)
+
+ # Move the selected value into the column.
+ kip = 1
+ switch (datatype) {
+ case TY_INT:
+ if (ctoi (Memc[str], kip, ival) <= 0)
+ call tbrpti (td, colpoints[ncols], INDEFI, 1, rownum)
+ else
+ call tbrpti (td, colpoints[ncols], ival, 1, rownum)
+ case TY_REAL:
+ if (ctor (Memc[str], kip, rval) <= 0)
+ call tbrptr (td, colpoints[ncols], INDEFR, 1, rownum)
+ else
+ call tbrptr (td, colpoints[ncols], rval, 1, rownum)
+ case TY_BOOL:
+ if (streq ("yes", Memc[str]))
+ call tbrptb (td, colpoints[ncols], true, 1, rownum)
+ else
+ call tbrptb (td, colpoints[ncols], false, 1, rownum)
+ default:
+ call tbrptt (td, colpoints[ncols], Memc[str], nk, 1, rownum)
+ }
+ }
+
+ call sfree (sp)
+end