From 40e5a5811c6ffce9b0974e93cdd927cbcf60c157 Mon Sep 17 00:00:00 2001 From: Joe Hunkeler Date: Tue, 11 Aug 2015 16:51:37 -0400 Subject: Repatch (from linux) of OSX IRAF --- pkg/xtools/catquery/cqsetcat.x | 293 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 293 insertions(+) create mode 100644 pkg/xtools/catquery/cqsetcat.x (limited to 'pkg/xtools/catquery/cqsetcat.x') diff --git a/pkg/xtools/catquery/cqsetcat.x b/pkg/xtools/catquery/cqsetcat.x new file mode 100644 index 00000000..f64ae4c3 --- /dev/null +++ b/pkg/xtools/catquery/cqsetcat.x @@ -0,0 +1,293 @@ +include "cqdef.h" +include "cq.h" + + +# CQ_SETCAT -- Set the current catalog by name. + +int procedure cq_setcat (cq, name) + +pointer cq #I the catalog descriptor +char name[ARB] #I the catalog name + +int i, catno +int cq_ccrquery() +bool streq() + +begin + catno = 0 + do i = 1, CQ_NRECS(cq) { + if (streq (name, CQ_NAME(cq, i))) + catno = i + } + if (catno == 0) + return (0) + + # Free the previous current catalog descriptor if any. + call cq_ccfree (cq) + + # Allocate the new descriptor. + call cq_ccinit (cq, catno) + + # Get the new catalog parameters. + if (cq_ccrquery (cq) == ERR) { + call cq_ccfree (cq) + return (0) + } + + return (catno) +end + + +# CQ_SETCATN -- Set the current catalog by number. + +int procedure cq_setcatn (cq, catno) + +pointer cq #I the catalog descriptor +int catno #I the catalog number + +int cq_ccrquery() + +begin + if (catno < 1 || catno > CQ_NRECS(cq)) + return (0) + + # Free the previous current catalog descriptor if any. + call cq_ccfree (cq) + + # Allocate the new descriptor. + call cq_ccinit (cq, catno) + + # Get the new catalog parameters. + if (cq_ccrquery (cq) == ERR) { + call cq_ccfree (cq) + return (0) + } + + return (catno) +end + + +# CQ_CCINIT -- Initialize the current catalog descriptor. + +procedure cq_ccinit (cq, catno) + +pointer cq #I the catalog database descriptor +int catno #I the current catalog number + +pointer cc + +begin + if (catno < 1 || catno > CQ_NRECS(cq)) + return + CQ_CATNO(cq) = catno + call strcpy (CQ_NAME(cq, catno), CQ_CATNAME(cq), SZ_FNAME) + + call calloc (CQ_CAT(cq), CQ_LEN_CC, TY_STRUCT) + cc = CQ_CAT(cq) + + CQ_NQPARS(cc) = 0 + CQ_HFMT(cc) = CQ_HNONE + + call calloc (CQ_PQPNAMES(cc), SZ_LINE, TY_CHAR) + call calloc (CQ_PQPDVALUES(cc), SZ_LINE, TY_CHAR) + call calloc (CQ_PQPVALUES(cc), SZ_LINE, TY_CHAR) + call calloc (CQ_PQPUNITS(cc), SZ_LINE, TY_CHAR) + call calloc (CQ_PQPFMTS(cc), SZ_LINE, TY_CHAR) + + Memc[CQ_PQPNAMES(cc)] = EOS + Memc[CQ_PQPDVALUES(cc)] = EOS + Memc[CQ_PQPVALUES(cc)] = EOS + Memc[CQ_PQPUNITS(cc)] = EOS + Memc[CQ_PQPFMTS(cc)] = EOS + + CQ_ADDRESS(cc) = EOS + CQ_QUERY(cc) = EOS + +end + + +# CQ_CCRQUERY -- Read in the query related parameters from the catalog +# database. May need to encode the field names at some point. + +int procedure cq_ccrquery (cq) + +pointer cq #I the catalog database descriptor + +pointer cc, sp, str +int i, catno, nqpars, npars, sz1, sz2, sz3, sz4, sz5 +int op1, op2, op3, op4, op5 +int cq_dgeti(), cq_dscan(), nscan(), gstrcpy(), strdic() +errchk cq_dgwrd(), cq_dgeti(), cq_dscan() + +begin + # If the current catalog is not defined then return. + if (CQ_CAT(cq) == NULL) + return (ERR) + if (CQ_CATNO(cq) < 1 || CQ_CATNO(cq) > CQ_NRECS(cq)) + return (ERR) + cc = CQ_CAT(cq) + catno = CQ_CATNO(cq) + + call smark (sp) + call salloc (str, 4 * (SZ_LINE + 1), TY_CHAR) + + iferr { + + # Get the catalog address and query string. + call cq_dgwrd (cq, catno, "address", CQ_ADDRESS(cc), SZ_LINE) + call cq_dgstr (cq, catno, "query", CQ_QUERY(cc), SZ_LINE) + + # Get the protocol. + call cq_dgwrd (cq, catno, "protocol", Memc[str], SZ_LINE) + CQ_HFMT(cc) = strdic (Memc[str], Memc[str], SZ_LINE, + CQ_HFMTSTR) + if (CQ_HFMT(cc) <= 0) + CQ_HFMT(cc) = CQ_HNONE + + # Determine the number of query parameters and position the + # file to the correct place. + nqpars = cq_dgeti (cq, catno, "nquery") + + } then { + + # Reinitialize and return. + CQ_ADDRESS(cc) = EOS + CQ_QUERY(cc) = EOS + call sfree (sp) + return (ERR) + } + + + # Open the query parameter string dictionaries. + sz1 = SZ_LINE; op1 = 2 + sz2 = SZ_LINE; op2 = 2 + sz3 = SZ_LINE; op3 = 2 + sz4 = SZ_LINE; op4 = 2 + sz5 = SZ_LINE; op5 = 2 + call strcpy ("|", Memc[CQ_PQPNAMES(cc)], sz1) + call strcpy ("|", Memc[CQ_PQPDVALUES(cc)], sz2) + call strcpy ("|", Memc[CQ_PQPVALUES(cc)], sz3) + call strcpy ("|", Memc[CQ_PQPUNITS(cc)], sz4) + call strcpy ("|", Memc[CQ_PQPFMTS(cc)], sz5) + + # Scan the query parameter list. + npars = 0 + for (i = 1; i <= nqpars; i = i + 1) { + if (cq_dscan (cq) == EOF) + break + + # Get the query parameter fields. + call gargwrd (Memc[str], SZ_LINE) + call gargwrd (Memc[str+SZ_LINE+1], SZ_LINE) + call gargwrd (Memc[str+2*(SZ_LINE+1)], SZ_LINE) + call gargwrd (Memc[str+3*(SZ_LINE+1)], SZ_LINE) + if (nscan() != 4) + break + + # Get the query parameter name. + if ((sz1 - op1 + 1) < (CQ_SZ_QPNAME + 1)) { + sz1 = sz1 + SZ_LINE + call realloc (CQ_PQPNAMES(cc), sz1, TY_CHAR) + } + op1 = op1 + gstrcpy (Memc[str], Memc[CQ_PQPNAMES(cc)+op1-1], + sz1 - op1 + 1) + op1 = op1 + gstrcpy ("|", Memc[CQ_PQPNAMES(cc)+op1-1], + sz1 - op1 + 1) + + # Get the default query parameter value and initialize the + # user query parameter string. + if ((sz2 - op2 + 1) < (CQ_SZ_QPVALUE + 1)) { + sz2 = sz2 + SZ_LINE + sz3 = sz3 + SZ_LINE + call realloc (CQ_PQPDVALUES(cc), sz2, TY_CHAR) + call realloc (CQ_PQPVALUES(cc), sz3, TY_CHAR) + } + op2 = op2 + gstrcpy (Memc[str+SZ_LINE+1], + Memc[CQ_PQPDVALUES(cc)+op2-1], sz2 - op2 + 1) + op2 = op2 + gstrcpy ("|", Memc[CQ_PQPDVALUES(cc)+op2-1], + sz2 - op2 + 1) + op3 = op3 + gstrcpy (Memc[str+SZ_LINE+1], + Memc[CQ_PQPVALUES(cc)+op3-1], sz3 - op3 + 1) + op3 = op3 + gstrcpy ("|", Memc[CQ_PQPVALUES(cc)+op3-1], + sz3 - op3 + 1) + + # Get the query parameter units. + if ((sz4 - op4 + 1) < (CQ_SZ_QPUNITS + 1)) { + sz4 = sz4 + SZ_LINE + call realloc (CQ_PQPUNITS(cc), sz4, TY_CHAR) + } + op4 = op4 + gstrcpy (Memc[str+2*(SZ_LINE+1)], + Memc[CQ_PQPUNITS(cc)+op4-1], sz4 - op4 + 1) + op4 = op4 + gstrcpy ("|", Memc[CQ_PQPUNITS(cc)+op4-1], + sz4 - op4 + 1) + + # Get the query parameter formats. + if ((sz5 - op5 + 1) < (CQ_SZ_QPFMTS + 1)) { + sz5 = sz5 + SZ_LINE + call realloc (CQ_PQPFMTS(cc), sz5, TY_CHAR) + } + op5 = op5 + gstrcpy (Memc[str+3*(SZ_LINE+1)], + Memc[CQ_PQPFMTS(cc)+op5-1], sz5 - op5 + 1) + op5 = op5 + gstrcpy ("|", Memc[CQ_PQPFMTS(cc)+op5-1], + sz5 - op5 + 1) + + npars = npars + 1 + } + + # Return the appropriate status. + call sfree (sp) + if (npars != nqpars) { + CQ_NQPARS(cc) = 0 + call realloc (CQ_PQPNAMES(cc), SZ_LINE, TY_CHAR) + call realloc (CQ_PQPDVALUES(cc), SZ_LINE, TY_CHAR) + call realloc (CQ_PQPVALUES(cc), SZ_LINE, TY_CHAR) + call realloc (CQ_PQPUNITS(cc), SZ_LINE, TY_CHAR) + call realloc (CQ_PQPFMTS(cc), SZ_LINE, TY_CHAR) + Memc[CQ_PQPNAMES(cc)] = EOS + Memc[CQ_PQPDVALUES(cc)] = EOS + Memc[CQ_PQPVALUES(cc)] = EOS + Memc[CQ_PQPUNITS(cc)] = EOS + Memc[CQ_PQPFMTS(cc)] = EOS + CQ_ADDRESS(cc) = EOS + CQ_QUERY(cc) = EOS + return (ERR) + } else { + CQ_NQPARS(cc) = npars + call realloc (CQ_PQPNAMES(cc), op1, TY_CHAR) + call realloc (CQ_PQPDVALUES(cc), op2, TY_CHAR) + call realloc (CQ_PQPVALUES(cc), op3, TY_CHAR) + call realloc (CQ_PQPUNITS(cc), op4, TY_CHAR) + call realloc (CQ_PQPFMTS(cc), op5, TY_CHAR) + Memc[CQ_PQPNAMES(cc)+op1] = EOS + Memc[CQ_PQPDVALUES(cc)+op2] = EOS + Memc[CQ_PQPVALUES(cc)+op3] = EOS + Memc[CQ_PQPUNITS(cc)+op4] = EOS + Memc[CQ_PQPFMTS(cc)+op5] = EOS + return (OK) + } +end + + +# CQ_CCFREE - Free the current catalog descriptor + +procedure cq_ccfree (cq) + +pointer cq #I the catalog database descriptor + +pointer cc + +begin + CQ_CATNAME(cq) = EOS + CQ_CATNO(cq) = 0 + + if (CQ_CAT(cq) != NULL) { + cc = CQ_CAT(cq) + call mfree (CQ_PQPNAMES(cc), TY_CHAR) + call mfree (CQ_PQPDVALUES(cc), TY_CHAR) + call mfree (CQ_PQPVALUES(cc), TY_CHAR) + call mfree (CQ_PQPUNITS(cc), TY_CHAR) + call mfree (CQ_PQPFMTS(cc), TY_CHAR) + call mfree (CQ_CAT(cq), TY_STRUCT) + } + CQ_CAT(cq) = NULL +end -- cgit