diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /pkg/system/cmdstr.x | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'pkg/system/cmdstr.x')
-rw-r--r-- | pkg/system/cmdstr.x | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/pkg/system/cmdstr.x b/pkg/system/cmdstr.x new file mode 100644 index 00000000..be4e965e --- /dev/null +++ b/pkg/system/cmdstr.x @@ -0,0 +1,157 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +include <ctype.h> + +define SZ_CMDSTR 4096 + +# CMDSTR -- Read the output of LPARAM and format a command string giving +# the values of all parameters. + +procedure t_cmdstr() + +bool hidden, hparam +pointer sp, ltask, pname, ibuf, obuf, ip, op, pp, nl, last +int getline(), gstrcpy(), strncmp() +bool clgetb() + +begin + call smark (sp) + call salloc (ltask, SZ_FNAME, TY_CHAR) + call salloc (pname, SZ_FNAME, TY_CHAR) + call salloc (ibuf, SZ_LINE, TY_CHAR) + call salloc (obuf, SZ_CMDSTR, TY_CHAR) + + # Get the task name and whether to print hidden parameters. + call clgstr ("task", Memc[ltask], SZ_FNAME) + hidden = clgetb ("hidden") + + op = obuf + gstrcpy (Memc[ltask], Memc[obuf], SZ_CMDSTR) + Memc[op] = ' '; op = op + 1 + Memc[op] = '('; op = op + 1 + + last = NULL + nl = NULL + + while (getline (STDIN, Memc[ibuf]) != EOF) { + ip = ibuf + + # Skip white space. + while (IS_WHITE (Memc[ip])) + ip = ip + 1 + + # Check if the parameter is hidden and skip it if desired. + if (Memc[ip] == '(') { + if (!hidden) + next + hparam = true + ip = ip + 1 + } else + hparam = false + + # Check if parameter name is "mode" and skip it. + if (strncmp (Memc[ip], "mode =", 6) == 0) + next + + # Copy or skip parameter name. + pp = pname + while (!IS_WHITE (Memc[ip])) { + if (hparam) { + Memc[op] = Memc[ip] + op = op + 1 + } + Memc[pp] = Memc[ip] + pp = pp + 1 + ip = ip + 1 + } + Memc[pp] = EOS + + # Copy or skip = and skip whitespace. + if (hparam) { + Memc[op] = '=' + op = op + 1 + } + ip = ip + 3 + + # Copy parameter value. It is an error if there is no value. + if (IS_WHITE (Memc[ip]) || (Memc[ip] == ')' && Memc[ip+1] != '_')) { + call sprintf (Memc[obuf], SZ_CMDSTR, + "Undefined parameter value (%s.%s)") + call pargstr (Memc[ltask]) + call pargstr (Memc[pname]) + call error (1, Memc[obuf]) + } + + # If the parameter is a quoted string copy until the closing quote, + # otherwise copy until whitespace or ). + + if (Memc[ip] == '"') { + Memc[op] = Memc[ip] + ip = ip + 1 + op = op + 1 + while (Memc[ip] != '"') { + Memc[op] = Memc[ip] + ip = ip + 1 + op = op + 1 + } + Memc[op] = Memc[ip] + ip = ip + 1 + op = op + 1 + + } else if (Memc[ip] == ')' && Memc[ip+1] == '_') { + # If the value is a redirection, e.g. ")_.foo", add quotes + # around the value and copy as a special case. + Memc[op] = '"' + op = op + 1 + + # Copy the opening paren. + Memc[op] = Memc[ip] + op = op + 1 + ip = ip + 1 + + # Copy the rest of the string. + while (!IS_WHITE(Memc[ip]) && (Memc[ip] != ')')) { + Memc[op] = Memc[ip] + ip = ip + 1 + op = op + 1 + } + + # Add the closing quote. + Memc[op] = '"' + op = op + 1 + + } else { + while (!IS_WHITE(Memc[ip]) && (Memc[ip] != ')')) { + Memc[op] = Memc[ip] + ip = ip + 1 + op = op + 1 + } + } + + # Add a comma and a space. + Memc[op] = ',' + op = op + 1 + Memc[op] = ' ' + op = op + 1 + + # Replace the last break with a new line if the line exceeds max. + if ((op - nl > 80) && (last > 0)) { + Memc[last] = '\n' + nl = last + } + last = op - 1 + } + + # Replace last comma and space by a parenthesis and EOS. + if (Memc[op-2] == ',') + op = op - 2 + + Memc[op] = ')' + op = op + 1 + Memc[op] = EOS + + # Print the command string and finish up. + call putline (STDOUT, Memc[obuf]) + call putci (STDOUT, '\n') + + call sfree (sp) +end |