Back to library index.
Package std-system (in std.i) - interacting with system
Index of documented functions or symbols:
DOCUMENT after, secs, f
or after, secs, f, arg
of after, -, f, arg
of after, -
Execute yorick statement
F;
or
F, ARG;
when yorick becomes idle, but at least SECS seconds from now.
SECS may be type double to specify fractions of a second.
With SECS = 0.0, this is the same as set_idler, except that
while you may have only a single idler function, you may have
many after functions. F may be either a function (is_func(f)
non-zero), or an oxy object (is_obj(f) non-zero). For example,
after, 0.1, include, ["fma; plg, y, x;"];
can obviously be modified to do anything you want, although you
are probably better off writing a function containing the
executable line, rather than putting it into a string.
As another example,
after, 0.1, object, method;
invokes the object method after a delay of a tenth of a second.
(See help,oxy for more on objects.) If F is an object, and method
is a simple variable reference, the special semantics of object
arguments apply; that is, only the name "method" is significant,
not its value.
In the third form, with the pseudo-index - as the first argument,
cancels the specified after call(s). The ARG, if specified, must
be the same variable, not just the same value. If no ARG is specified,
all pending after callbacks with the given F are cancelled. If
neither ARG nor F is specified, all after callbacks are cancelled.
SEE ALSO: spawn, set_idler, after_error
DOCUMENT after_error = error_handler_func If the variable AFTER_ERROR is set to an interpreted function with no parameters, that function will be invoked after an error, before the next prompt, instead of entering or offering to enter debug mode. The error message will be printed, and also will be stored in the catch_message variable. A fault during the execution of the after_error function will not invoke after_error, but otherwise after_error is persistent (unlike set_idler). An error resets any functions scheduled using after or set_idler, so the after_error function must reschedule these if necessary. The catch function is a more appropriate way to recover from some errors.
DOCUMENT batch, 1
batch, 0
batch()
turns on, turns off, or tests for batch mode, respectively.
If yorick is started with the command line:
yorick -batch batch_include.i ...
then batch mode is turned on, the usual custom.i startup file is
skipped, and the file batch_include.i is parsed and executed. The
-batch and batch_include.i command line arguments are removed from
the list returned by get_argv(). These must be the first two
arguments on the command line.
In batch mode, any error will terminate Yorick (as by the quit
function) rather than entering debug mode. Also, any attempt to
read from the keyboard is an error.
SEE ALSO: process_argv, get_argv, set_idler, after_error
DOCUMENT cd, directory_name
or cd(directory_name)
change current working directory to DIRECTORY_NAME, returning
the expanded path name (i.e.- with leading environment variables,
., .., or ~ replaced by the actual pathname). If called as a
function, returns nil to indicate failure, otherwise failure
causes a Yorick error.
SEE ALSO: lsdir, mkdir, rmdir, get_cwd, get_home, get_env, get_argv
DOCUMENT get_argv() returns string array containing the argv from the command line. The -batch and batch_include.i arguments are removed (not returned).
SEE ALSO: process_argv, cd, get_cwd, get_home, get_env, batch
DOCUMENT get_cwd()
or get_home()
returns the pathname of the current working directory or of your
home directory.
DOCUMENT get_env(environment_variable_name) returns the environment variable (a string) associated with ENVIRONMENT_VARIABLE_NAME (calls ANSI getenv routine).
SEE: get_cwd
DOCUMENT get_path() returns the current include file search path.
SEE ALSO: set_path, get_pkgnames, split_path
DOCUMENT files = lsdir(directory_name)
or files = lsdir(directory_name, subdirs)
List DIRECTORY_NAME. The return value FILES is an array of
strings or nil; the order of the filenames is unspecified;
it does not contain "." or "..". If present, SUBDIRS must be
a simple variable reference, and is set to a list of subdirectory
names (or nil if none). If SUBDIRS is not present (first form),
the return value of lsdir includes both files and subdirectories.
If DIRECTORY_NAME does not exist or is not a directory, the return
value is the integer 0 rather than nil. Hence:
files = lsdir(dirname, subdirs);
if (structof(files) == long) {
directory does not exist
} else {
for (i=1 ; i<=numberof(files) ; ++i) {...use files(i)...}
for (i=1 ; i<=numberof(subdirs) ; ++i) {...use subdirs(i)...}
}
DOCUMENT maybe_prompt Issue prompt for keyboard input if appropriate. This command only makes sense (I think) as the final statement of a function invoked as an idler (via set_idler), when yorick is in a loop with an idler function that continuously re-installs itself. Yorick ordinarily issues a prompt only just before it stops to wait for keyboard input, it will never prompt in this situation, even though it would accept keyboard input if it were typed.
SEE ALSO: set_idler
DOCUMENT mkdir, directory_name
or rmdir, directory_name
Create DIRECTORY_NAME with mkdir, or remove it with rmdir. The rmdir
function only works if the directory is empty. An error is raised if
DIRECTORY_NAME is not a non-nil scalar string. If mkdir or rmdir are
called as subroutines and the operation fails, no error is raised
(so you can use this form even when the directory already exists for
mkdir, or already is missing for rmdir). Otherwise, if
DIRECTORY_NAME is a non-nil scalar string and if mkdir and rmdir are
called as a function, they return an integer: 0 to indicate success and
-1 to indicate failure.
DOCUMENT mkdirp, directory_name Create DIRECTORY_NAME, creating any missing parent directories (like UNIX utility mkdir -p). Unlike mkdir, signals error if the creation is unsuccessful. If DIRECTORY_NAME already exists and is a directory, mkdirp is a no-op.
SEE ALSO: mkdir
DOCUMENT remaining= process_argv()
or remaining= process_argv("your startup message")
Performs standard command line processing. This function is
invoked by the default custom.i file (in $Y_SITE/i); you
can also invoke it from your personal ~/yorick/custom.i file.
The process_argv calls get_argv, removes any arguments of
the form "-ifilename" or "-i filename" (the latter is a pair of
arguments. It returns any arguments not of this form as its
result, after including any filenames it found in the order
they appeared on the command line.
The optional string argument may be an array of strings to print
a multi-line message.
A Yorick package may define the function get_command_line in
order to feed process_argv something other than get_argv.
SEE ALSO: batch
SEE: suspend
SEE: mkdir
DOCUMENT set_idler, idler_function
or set_idler, idler_function, errflags
sets the idler function to IDLER_FUNCTION. Instead of waiting
for keyboard input when all its tasks are finished, the interpreter
will invoke IDLER_FUNCTION with no arguments. The idler function
is normally invoked only once, so input from the keyboard resumes
after one call to the idler. Of course, an idler is free to call
set_idler again before it returns, which will have the effect of
calling that function in a loop.
If present, the ERRFLAGS argument changes the way errors are processed:
0 - default processing, add any combination of:
1 - suppress printing error messages
2 - append [pc] relative program counter to function name in error
message (use disassemble to find corresponding instruction)
4 - call any after_error function in dbug mode (rather than clearing
stack), so it is responsible for calling dbexit
SEE ALSO: batch, maybe_prompt, after, after_error
DOCUMENT set_path, "dir1:dir2:dir3:..."
or set_path
sets the include file search path to the specified list of
directories. The specified directories are searched left to
right for include files specified as relative file names in
#include directives, or to the include or require functions.
If the argument is omitted, restores the default search path,
".:~/yorick:~/Yorick:Y_SITE/i:Y_SITE/contrib:Y_SITE/i0:Y_HOME/lib",
where y_site is the main Yorick directory for this site.
The Y_LAUNCH directory is the directory which contains the
executable; this directory is omitted if it is the same as
Y_SITE.
Only the "end user" should ever call set_path, and then only in
his or her custom.i file, for the purpose of placing a more
elaborate set of personal directories containing Yorick procedures.
For example, if someone else maintains Yorick code you use, you
might put their ~/yorick on your include path.
DOCUMENT process = spawn(argv, on_stdout)
or process = spawn(argv, on_stdout, on_stderr)
starts the process named in ARGV(1) with additional arguments
in any subsequent elements of ARGV (which is a scalar or 1D
array of strings). The ON_STDOUT and optional ON_STDERR
are interpreted functions declared like this:
func ON_STDOUT
commands to process msg on stdout from process
}
Yorick will invoke ON_STDOUT asynchronously if process
emits text to its stdout. Yorick includes the process in
the list of event sources, which it polls whenever it waits
for input. If the optional ON_STDERR is provided, it is
called asynchronously whenever process emits a line to stderr;
with no ON_STDERR, the process will share yorick's stderr,
which generally means the process stderr prints at the terminal.
(Note that you can make the third argument the same as the second
if you want to use the same function to handle stdout and stderr.)
When the process terminates, ON_STDOUT is invoked with
string(0) and the process object becomes inactive. Note that
ON_STDOUT and ON_STDERR are invoked via the name they were
originally defined with (in the func or extern statement for
interpreted and compiled functions, respectively).
The object returned by spawn, process, can be used to send input
or signals to the process:
process, msg;
where msg is a string, sends msg to the process's stdin.
process, signum;
sends process the specified signal (e.g.- signum=2 sends SIGINT,
like hitting control-C, while signum=9 kills the process), if
signum is an integer (as opposed to a string). (Normally you
should not send signals to a process.) If you redefine the
final reference to process, for example by
process = [];
yorick will disconnect from the process, closing its end of
the stdin, stdout, and, optionally, stderr pipes. For many
programs, this will stop the program, but if the program can
continue running without stdin and stdout, it will continue
running. (If yorick were a shell, the process would be running
in the background; if the process would live beyond the shell
which created it, it will also survive its process variable
being freed.)
Note: funcdef may be extremely useful for writing ON_STDOUT.
SEE ALSO: popen, system, suspend, funcdef, after, spawn_callback
DOCUMENT spawn_callback -->
func on_stdout
extern fragment;
lines = spawn_callback(fragment, msg);
for (i=1 ; i<=numberof(lines) ; i++) {
line = lines(i);
if (!line) {
} else {
}
}
}
Here is a template for a callback function to be passed to spawn.
The spawn_callback function buffers any fragmentary lines,
delivering only complete lines as output. Note that FRAGMENT
must somehow be managed between calls to on_stdout; it should
be intialized to [] before calling spawn.
SEE ALSO: spawn
DOCUMENT suspend
resume
Stop execution of the current interpreted program with suspend.
It resumes at the instruction following suspend when yorick
becomes idle after another interpreted task has called resume.
Note that the task which calls resume must be triggered by an
input stream other than stdin, such as the on_stdout or on_stderr
function of a spawned process or the on_elapse of an after.
Use control-c to escape from a hung suspend state.
DOCUMENT system, "shell command line"
Passes the command line string to a shell for execution.
If the string is constant, you may use the special syntax:
$shell command line
(A long command line may be continued by ending the line with \
as usual.) The system function syntax allows Yorick to compute
parts of the command line string, while the simple $ escape
syntax does not. In either case, the only way to get output
back from such a command is to redirect it to a file, then
read the file. Note that Yorick does not regain control
until the subordinate shell finishes. (Yorick will get control
back if the command line backgrounds the job.)
WARNING: If Yorick has grown to a large size, this may crash
your operating system, since the underlying POSIX fork function
first copies all of the running Yorick process before the exec
function can start the shell. See Y_SITE/sysafe.i for a fix.
SEE ALSO: popen
DOCUMENT timer, elapsed
or timer, elapsed, split
updates the ELAPSED and optionally SPLIT timing arrays. These
arrays must each be of type array(double,3); the layout is
[cpu, system, wall], with all three times measured in seconds.
ELAPSED is updated to the total times elapsed since this copy
of Yorick started. SPLIT is incremented by the difference between
the new values of ELAPSED and the values of ELAPSED on entry.
This feature allows for primitive code profiling by keeping
separate accounting of time usage in several categories, e.g.--
elapsed= total= cat1= cat2= cat3= array(double, 3);
timer, elapsed0;
elasped= elapsed0;
... category 1 code ...
timer, elapsed, cat1;
... category 2 code ...
timer, elapsed, cat2;
... category 3 code ...
timer, elapsed, cat3;
... more category 2 code ...
timer, elapsed, cat2;
timer, elapsed0, total;
The wall time is not absolutely reliable, owning to possible
rollover at midnight.
SEE ALSO: timestamp, timer_print
DOCUMENT timer_print, label1, split1, label2, split2, ...
or timer_print
or timer_print, label_total
prints out a timing summary for splits accumulated by timer.
timer_print, "category 1", cat1, "category 2", cat2,
"category 3", cat3, "total", total;
SEE ALSO: timer
DOCUMENT timestamp()
or timestamp(utime)
or timestamp, utime
returns string of the form "Sun Jan 3 15:14:13 1988" -- always
has 24 characters. If a simple variable reference UTIME is supplied,
it will be set to the number of seconds since 1970 Jan 1 0000 UT.
SEE ALSO: timer
