XP(1): evaluate expressions
usage: xp [-DFLYqu] [expr] -D: debug -F: report known functions and exit -L: debug lex -Y: debug yacc -q: do not print values as they are evaluated -u: use unix out
DESCRIPTIONXp evaluates the expression given as an argument, or those in its standard input if none is given. When using standard input, each line is parsed and evaluated as a single expression. The expressions may involve file attributes. Thus, xp replaces the venerable UNIX
The usual arithmetic and logic operators can be used, Values in operations are considered as unsigned integers, integers, floating point numbers, strings, or booleans, depending on the context.
The following functions are known to xp, all operate on floating point numbers:
abs asin atanh cosh floor log2 sqrt trunc acos asinh cbrt exp log sin tan Γ acosh atan cos exp2 log10 sinh tanh
A name that starts with "
%" is considered a
Printf and can be used as a
function to print the argument with such conversion.
Any name that is not a function name and is not a conversion can be
used as a function to ask for the value of a file attribute with such
name. The names
x can be used
as attribute names and evaluate to a boolean value indicating if the
file has any of the read, write, or execute permissions set.
Text enclosed in double quotes is understood always as a name. Also,
after calling a file attribute as a function, the next non-blank word
is understood as a name, including characters like
-, etc., which
would become operators in other places. This is a helper to specify
file paths in a convenient way.
A string in square brackets represents a time. This can be used with the relational operators to compare against attributes that indicate times. The string may use any format understood by the [cmd/opt(2)] package.
If the last computed yields a value of
the command exits with success, and if it is
false with failure. This, along with flag
-q, is useful to evaluate expressions as
shell conditions without printing their value.
See if the length of the file is greater than 3 Mbytes and print
yif it is.
; xp -q size afile '>' 3m && echo y
Print the mtime for a file
; xp mtime afile
See if the file was changed since 2013-01-02 3pm
; xp mtime afile '>' '[2013-01-02 3pm]'
Print 4KiB as a 32bit binary number [
; xp '%064b (4 1024)' 00000000000000000001000000000000