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 /lib/sysruk.x | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'lib/sysruk.x')
-rw-r--r-- | lib/sysruk.x | 97 |
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 |