aboutsummaryrefslogtreecommitdiff
path: root/lib/sysruk.x
diff options
context:
space:
mode:
authorJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
committerJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
commit40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch)
tree4464880c571602d54f6ae114729bf62a89518057 /lib/sysruk.x
downloadiraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'lib/sysruk.x')
-rw-r--r--lib/sysruk.x97
1 files changed, 97 insertions, 0 deletions
diff --git a/lib/sysruk.x b/lib/sysruk.x
new file mode 100644
index 00000000..cf155c0e
--- /dev/null
+++ b/lib/sysruk.x
@@ -0,0 +1,97 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+# SYS_RUNTASK -- Called by the IRAF Main to run one of the tasks in a
+# process. This file is the template for the actual procedure, which
+# is generated by the compiler in processing the TASK statement.
+# The special statements TN$DECL and TN$DICT are replaced, respectively, by
+# the code to declare the task name strings, and the code to search the
+# dictionary and execute a task. The dictionary consists of the string buffer
+# DICT, containing the EOS delimited task name strings, and a array DP
+# containing the indices of the individual strings.
+
+int procedure sys_runtask (task, cmd, ruk_argoff, ruk_interact)
+
+char task[ARB] #I task name
+char cmd[ARB] #I command line
+int ruk_argoff #I offset of argument list in CMD
+int ruk_interact #I we were called interactively
+
+int i, ntasks
+int lmarg, rmarg, maxch, ncol, ruk_eawarn
+int envgeti(), envscan()
+bool streq()
+
+TN$DECL # task name declarations (DP, DICT)
+data lmarg /5/, maxch /0/, ncol /0/, ruk_eawarn /3/
+data ntasks /0/
+
+begin
+ # Upon the first entry, count the number of tasks (the DP array
+ # containing the indices of the strings is NULL delimited).
+
+ if (ntasks == 0) {
+ for (i=1; dp[i] != NULL; i=i+1)
+ ;
+ ntasks = i - 1
+ }
+
+ # Search the dictionary for the named task and execute it. The
+ # special builtin task "?" prints the contents of the dictionary.
+ # CHDIR changes the working directory; SET adds set declarations
+ # to the environment list. If a SET or CHDIR cannot be processed
+ # for some reason when we are run as a connected subprocess (i.e.,
+ # noninteractively), it is a fatal error. This is done because
+ # STDERR is redirected into the nullfile during process startup,
+ # hence any warning messages would not be seen by the parent.
+
+ if (task[1] == '?') { # ?
+ # Print a menu listing all available tasks.
+ iferr (rmarg = envgeti ("ttyncols"))
+ rmarg = 80
+ call strtbl (STDOUT, dict, dp, ntasks, lmarg, rmarg, maxch, ncol)
+ return (OK)
+
+ } else if (streq(task,"chdir") || streq(task,"cd")) { # CHDIR
+ # Change the current working directory.
+ iferr {
+ if (cmd[ruk_argoff] == EOS) {
+ iferr (call fchdir ("home$"))
+ call fchdir ("HOME$")
+ } else
+ call fchdir (cmd[ruk_argoff])
+ } then if (ruk_interact == YES) {
+ call erract (ruk_eawarn)
+ } else
+ ; # call sys_panic (0, "invalid CHDIR in IRAF Main")
+ return (OK)
+
+ } else if (streq(task,"set") || streq(task,"reset")) { # SET
+ # Set the value of an environment variable. If called
+ # with no args print the current environment list.
+
+ iferr {
+ if (cmd[ruk_argoff] == EOS) {
+ call envlist (STDOUT, "\t", YES)
+ call flush (STDOUT)
+ } else if (envscan (cmd) <= 0) {
+ if (ruk_interact == YES) {
+ call eprintf ("invalid set statement: '%s'\n")
+ call pargstr (cmd)
+ } else
+ goto 91
+ }
+ } then if (ruk_interact == YES) {
+ call erract (ruk_eawarn)
+ } else
+ 91 call sys_panic (0, "invalid SET in IRAF Main")
+ return (OK)
+ }
+
+ # The following symbol is expanded into the interpreter code for
+ # the dictionary of user tasks.
+
+ TN$INTERP
+
+ # If we get here the named task could not be found.
+ return (ERR)
+end