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