mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-01-01 05:16:05 +01:00
31940: zcalc -e uses arguments as input
This commit is contained in:
parent
f77a7a5b18
commit
12251d65ff
3 changed files with 37 additions and 10 deletions
|
@ -1,3 +1,8 @@
|
|||
2013-11-08 Peter Stephenson <p.stephenson@samsung.com>
|
||||
|
||||
* 31940: Doc/Zsh/contrib.yo, Functions/Misc/zcalc: add -e option
|
||||
to zcalc to use input from arguments to command.
|
||||
|
||||
2013-11-07 Peter Stephenson <p.stephenson@samsung.com>
|
||||
|
||||
* 31937: Doc/Zsh/zle.yo, Src/Zle/zle_main.c,
|
||||
|
|
|
@ -3155,7 +3155,7 @@ sect(Mathematical Functions)
|
|||
|
||||
startitem()
|
||||
findex(zcalc)
|
||||
item(tt(zcalc) [ var(expression) ... ])(
|
||||
item(tt(zcalc) [ tt(-ef) ] [ var(expression) ... ])(
|
||||
A reasonably powerful calculator based on zsh's arithmetic evaluation
|
||||
facility. The syntax is similar to that of formulae in most programming
|
||||
languages; see
|
||||
|
@ -3195,6 +3195,10 @@ The output base can be initialised by passing the option `tt(-#)var(base)',
|
|||
for example `tt(zcalc -#16)' (the `tt(#)' may have to be quoted, depending
|
||||
on the globbing options set).
|
||||
|
||||
If the option `tt(-e)' is set, the function runs non-interactively:
|
||||
the arguments are treated as expressions to be evaluated as if entered
|
||||
interactively line by line.
|
||||
|
||||
If the option `tt(-f)' is set, all numbers are treated as floating
|
||||
point, hence for example the expression `tt(3/4)' evaluates to 0.75
|
||||
rather than 0. Options must appear in separate words.
|
||||
|
|
|
@ -85,10 +85,13 @@
|
|||
# similarly -##<base>; they set the default output base, with and without
|
||||
# a base discriminator in front, respectively.
|
||||
#
|
||||
#
|
||||
# To do:
|
||||
# - separate zcalc history from shell history using arrays --- or allow
|
||||
# zsh to switch internally to and from array-based history.
|
||||
# With the option -e, the arguments are evaluated as if entered
|
||||
# interactively. So, for example:
|
||||
# zcalc -e -\#16 -e 1055
|
||||
# prints
|
||||
# 0x41f
|
||||
# Any number of expressions may be given and they are evaluated
|
||||
# sequentially just as if read automatically.
|
||||
|
||||
emulate -L zsh
|
||||
setopt extendedglob
|
||||
|
@ -97,7 +100,8 @@ setopt extendedglob
|
|||
# begin with _.
|
||||
local line ans base defbase forms match mbegin mend psvar optlist opt arg
|
||||
local compcontext="-zcalc-line-"
|
||||
integer num outdigits outform=1
|
||||
integer num outdigits outform=1 expression_mode
|
||||
local -a expressions
|
||||
|
||||
# We use our own history file with an automatic pop on exit.
|
||||
history -ap "${ZDOTDIR:-$HOME}/.zcalc_history"
|
||||
|
@ -114,7 +118,7 @@ float PI E
|
|||
(( PI = 4 * atan(1), E = exp(1) ))
|
||||
|
||||
# Process command line
|
||||
while [[ -n $1 && $1 = -(|[#-]*|f) ]]; do
|
||||
while [[ -n $1 && $1 = -(|[#-]*|f|e) ]]; do
|
||||
optlist=${1[2,-1]}
|
||||
shift
|
||||
[[ $optlist = (|-) ]] && break
|
||||
|
@ -130,11 +134,11 @@ while [[ -n $1 && $1 = -(|[#-]*|f) ]]; do
|
|||
arg=$1
|
||||
shift
|
||||
else
|
||||
print "-# requires an argument" >&2
|
||||
print -- "-# requires an argument" >&2
|
||||
return 1
|
||||
fi
|
||||
if [[ $arg != (|\#)[[:digit:]]## ]]; then
|
||||
print - "-# requires a decimal number as an argument" >&2
|
||||
print -- "-# requires a decimal number as an argument" >&2
|
||||
return 1
|
||||
fi
|
||||
defbase="[#${arg}]"
|
||||
|
@ -142,10 +146,18 @@ while [[ -n $1 && $1 = -(|[#-]*|f) ]]; do
|
|||
(f) # Force floating point operation
|
||||
setopt forcefloat
|
||||
;;
|
||||
(e) # Arguments are expressions
|
||||
(( expression_mode = 1 ));
|
||||
;;
|
||||
esac
|
||||
done
|
||||
done
|
||||
|
||||
if (( expression_mode )); then
|
||||
expressions=("$@")
|
||||
argv=()
|
||||
fi
|
||||
|
||||
for (( num = 1; num <= $#; num++ )); do
|
||||
# Make sure all arguments have been evaluated.
|
||||
# The `$' before the second argv forces string rather than numeric
|
||||
|
@ -156,7 +168,13 @@ done
|
|||
|
||||
psvar[1]=$num
|
||||
local prev_line cont_prompt
|
||||
while vared -cehp "${cont_prompt}${ZCALCPROMPT}" line; do
|
||||
while (( expression_mode )) ||
|
||||
vared -cehp "${cont_prompt}${ZCALCPROMPT}" line; do
|
||||
if (( expression_mode )); then
|
||||
(( ${#expressions} )) || break
|
||||
line=$expressions[1]
|
||||
shift expressions
|
||||
fi
|
||||
if [[ $line = (|*[^\\])('\\')#'\' ]]; then
|
||||
prev_line+=$line[1,-2]
|
||||
cont_prompt="..."
|
||||
|
|
Loading…
Reference in a new issue