aboutsummaryrefslogtreecommitdiff
path: root/pkg/utilities/nttools/tupar/tupar.x
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /pkg/utilities/nttools/tupar/tupar.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'pkg/utilities/nttools/tupar/tupar.x')
-rw-r--r--pkg/utilities/nttools/tupar/tupar.x260
1 files changed, 260 insertions, 0 deletions
diff --git a/pkg/utilities/nttools/tupar/tupar.x b/pkg/utilities/nttools/tupar/tupar.x
new file mode 100644
index 00000000..b4cf35e3
--- /dev/null
+++ b/pkg/utilities/nttools/tupar/tupar.x
@@ -0,0 +1,260 @@
+include <fset.h> # used to check whether I/O is redirected
+include <error.h>
+include <tbset.h>
+include "tupar.h" # defines TUPAR_EXIT, TUPAR_QUIT
+
+# tupar -- edit header parameters
+# This task may be used to list, add to, replace, or delete header
+# parameters in a table or list of tables.
+#
+# Phil Hodge, 22-Jul-1987 Task created
+# Phil Hodge, 11-Aug-1987 Call tbhad[] instead of tbhpt[].
+# Phil Hodge, 18-Mar-1988 Rewrite, allowing a list of tables.
+# Phil Hodge, 7-Sep-1988 Change parameter name for table.
+# Phil Hodge, 23-Aug-1991 Allow quit or exit.
+# Phil Hodge, 9-Jul-1993 Allow quit without verification if nothing changed.
+# Phil Hodge, 29-Jun-1995 Modify for FITS tables; modify tu_open and tu_close.
+# Phil Hodge, 3-Oct-1995 Use tbn instead of fnt.
+# Phil Hodge, 22-May-1996 Use iferr when calling tu_instr.
+
+define LEN_ISBUF 1000 # length or increment for instruction buffer
+
+procedure tupar()
+
+pointer tlist # for list of input table names
+bool same_for_all # same set of instructions for all tables?
+bool verbose # print name of each table?
+bool readonly # open tables readonly?
+#--
+pointer tp # pointer to table descriptor
+pointer sp
+pointer tname # scratch for table name
+pointer tabname # scratch for full name of table (incl [...])
+pointer lbuf # scratch for input buffer
+pointer isbuf # buffer for saving instructions
+int bufsize # allocated size of Memc[isbuf]
+int ibp # index in Memc[isbuf]
+int eq_flag # exit or quit
+int istat # set by tu_ex_instr; > 0 implies error
+bool inplace # open tables inplace?
+bool modified # true if the header was modified
+bool from_stdin # get input from STDIN?
+bool save_instr # save instruction in buffer?
+bool iredir # is input redirected?
+bool oredir # is output redirected?
+bool prompt # prompt user for input?
+bool alldone # done with all tables?
+bool done # done with current table?
+bool quit # true if we should delete temp table
+bool clgetb()
+int fstati()
+pointer tbnopenp()
+int tbnget(), tbnlen()
+
+begin
+ call smark (sp)
+ call salloc (tname, SZ_LINE, TY_CHAR)
+ call salloc (tabname, SZ_LINE, TY_CHAR)
+ call salloc (lbuf, SZ_LINE, TY_CHAR)
+
+ tlist = tbnopenp ("table")
+
+ same_for_all = clgetb ("same")
+ verbose = clgetb ("verbose")
+ readonly = clgetb ("readonly")
+ if (readonly)
+ inplace = true
+ else
+ inplace = clgetb ("inplace")
+
+ from_stdin = true
+
+ # Is input or output redirected?
+ iredir = (fstati (STDIN, F_REDIR) == YES)
+ oredir = (fstati (STDOUT, F_REDIR) == YES)
+ prompt = !iredir # prompt if input is not redirected
+
+ save_instr = (same_for_all && (tbnlen (tlist) > 1))
+ if (save_instr) {
+ bufsize = LEN_ISBUF
+ call malloc (isbuf, bufsize, TY_CHAR)
+ Memc[isbuf] = EOS
+ } else {
+ bufsize = 0
+ isbuf = NULL
+ }
+
+ # Loop over all table names in the file name template.
+ alldone = (tbnget (tlist, Memc[tname], SZ_LINE) == EOF)
+ while (!alldone) {
+
+ iferr {
+ # Open the table (or a copy of it).
+ call tu_open (Memc[tname], "tupar", readonly, inplace,
+ tp, Memc[tabname], SZ_LINE)
+ } then {
+ call eprintf ("can't open %s\n")
+ call pargstr (Memc[tname])
+ alldone = (tbnget (tlist, Memc[tname], SZ_LINE) == EOF)
+ call erract (EA_WARN)
+ next # ignore this table
+ }
+
+ if (verbose) {
+ if (oredir) {
+ call eprintf ("%s\n")
+ call pargstr (Memc[tabname])
+ }
+ call printf ("%s\n")
+ call pargstr (Memc[tabname])
+ }
+
+ # Edit header parameters in current table.
+ ibp = 1 # may be incremented in loop
+ modified = false # may be reset within tu_instr
+ done = false
+ while ( ! done ) {
+ # Get an instruction, execute it, and possibly save it
+ # for use again.
+ iferr {
+ call tu_instr (tp, Memc[lbuf], readonly, prompt, from_stdin,
+ iredir, save_instr, isbuf, bufsize, ibp,
+ modified, eq_flag, done, istat)
+ } then {
+ call erract (EA_WARN)
+ }
+ if (istat > 0)
+ call eprintf ("table was opened readonly\n")
+
+ if (inplace && !readonly &&
+ (eq_flag == TUPAR_QUIT || eq_flag == TUPAR_QUIT_NC)) {
+ call eprintf (
+"can't quit without saving changes because you edited the table inplace\n")
+ done = false
+ } else if (eq_flag == TUPAR_QUIT && modified && !readonly) {
+ # Ask for verification before quitting.
+ call clputb ("go_ahead", clgetb ("quit_default"))
+ call eprintf ("quit without saving changes")
+ call flush (STDERR)
+ if (! clgetb ("go_ahead"))
+ done = false # no, don't quit
+ }
+ }
+
+ # Reset flags after processing first table.
+ if (same_for_all) {
+ prompt = false
+ from_stdin = false
+ }
+ save_instr = false
+
+ # Close the table, renaming the temp table back to the
+ # original if we are saving our changes.
+ quit = (eq_flag == TUPAR_QUIT || eq_flag == TUPAR_QUIT_NC)
+ iferr {
+ call tu_close (tp, inplace, quit, Memc[tabname])
+ } then {
+ alldone = (tbnget (tlist, Memc[tname], SZ_LINE) == EOF)
+ call erract (EA_WARN)
+ next # ignore this table
+ }
+
+ # Get the name of the next file in the list.
+ alldone = (tbnget (tlist, Memc[tname], SZ_LINE) == EOF)
+
+ # If the user modified the table but then decided to quit,
+ # then abort without opening the rest of the tables.
+ if (eq_flag != TUPAR_EXIT && modified && same_for_all)
+ alldone = true
+ }
+ if (isbuf != NULL)
+ call mfree (isbuf, TY_CHAR)
+ call tbnclose (tlist)
+ call sfree (sp)
+end
+
+
+# tu_save_instr -- save edit instruction
+# Save the current instruction in the instruction buffer. The entries
+# are separated by '\n', and the entire set of entries is terminated
+# by EOS.
+# If the buffer would overflow, it will be reallocated.
+
+procedure tu_save_instr (lbuf, isbuf, bufsize, ibp)
+
+char lbuf[ARB] # i: line buffer containing instruction
+pointer isbuf # io: buffer for saving instructions
+int bufsize # io: current allocated size of Memc[isbuf]
+int ibp # io: current index in Memc[isbuf]
+#--
+int k # loop index
+bool done # loop-termination flag
+int leni # length of lbuf
+int strlen()
+
+begin
+ leni = strlen (lbuf)
+ if (ibp + leni >= bufsize) {
+ bufsize = bufsize + LEN_ISBUF
+ call realloc (isbuf, bufsize, TY_CHAR)
+ }
+
+ done = false
+ k = 1
+ while ( ! done ) {
+ if ((lbuf[k] == EOS) || (lbuf[k] == '\n')) {
+ done = true
+ } else {
+ Memc[isbuf+ibp-1] = lbuf[k]
+ ibp = ibp + 1
+ }
+ k = k + 1
+ }
+ Memc[isbuf+ibp-1] = '\n'
+ Memc[isbuf+ibp] = EOS
+ ibp = ibp + 1 # so ibp points to EOS
+end
+
+
+# tu_rd_instr -- read edit instruction
+# Read an instruction from the instruction buffer. When EOS is reached
+# in the buffer, an EOF will be returned; otherwise, the number of char
+# in the current instruction will be returned.
+
+int procedure tu_rd_instr (isbuf, ibp, lbuf)
+
+char isbuf[ARB] # i: buffer containing instructions
+int ibp # io: current index in isbuf
+char lbuf[ARB] # o: buffer to receive instruction
+#--
+int k # loop index
+bool done # loop-termination flag
+
+begin
+ done = false
+ k = 0
+ while ( ! done ) {
+
+ if (isbuf[ibp] == '\n') {
+
+ if (k > 0) # skip past adjacent '\n'
+ done = true
+ ibp = ibp + 1
+
+ } else if (isbuf[ibp] == EOS) {
+
+ done = true # leave ibp pointing to EOS
+
+ } else {
+
+ k = k + 1
+ lbuf[k] = isbuf[ibp]
+ ibp = ibp + 1
+ }
+ }
+ lbuf[k+1] = EOS
+
+ if (k <= 0)
+ k = EOF
+ return (k)
+end