2023-10-31 17:28:30 +01:00
|
|
|
function g_calc {
|
2023-11-03 14:46:14 +01:00
|
|
|
|
2023-11-26 16:24:30 +01:00
|
|
|
unset g_calc_result
|
|
|
|
|
2023-11-03 14:46:14 +01:00
|
|
|
# Use bc in backround for multiple bc's running much faster
|
|
|
|
if [ -z "${g_bc_running}" ]
|
|
|
|
then
|
2023-11-07 16:33:37 +01:00
|
|
|
g_rnd=$$
|
2023-11-06 17:59:12 +01:00
|
|
|
mkdir -p ${g_tmp}/${g_rnd}
|
|
|
|
[ -p ${g_tmp}/${g_rnd}/bc-in ] || mkfifo ${g_tmp}/${g_rnd}/bc-in
|
|
|
|
[ -p ${g_tmp}/${g_rnd}/bc-out ] || mkfifo ${g_tmp}/${g_rnd}/bc-out
|
|
|
|
[ -p ${g_tmp}/${g_rnd}/bc-sed-in ] || mkfifo ${g_tmp}/${g_rnd}/bc-sed-in
|
|
|
|
[ -p ${g_tmp}/${g_rnd}/bc-sed-out ] || mkfifo ${g_tmp}/${g_rnd}/bc-sed-out
|
|
|
|
|
2023-11-03 14:46:14 +01:00
|
|
|
# bc stream channel
|
2023-11-07 13:18:32 +01:00
|
|
|
{ bc -ql <${g_tmp}/${g_rnd}/bc-in 2>&1 >${g_tmp}/${g_rnd}/bc-out & } 2>/dev/null
|
2023-11-06 17:59:12 +01:00
|
|
|
exec 3>${g_tmp}/${g_rnd}/bc-in 4<${g_tmp}/${g_rnd}/bc-out
|
|
|
|
|
2023-11-03 14:46:14 +01:00
|
|
|
# sed stream channel
|
2023-11-07 13:18:32 +01:00
|
|
|
{ sed -su 's/^\./0./; s/^-\./-0./' <${g_tmp}/${g_rnd}/bc-sed-in >${g_tmp}/${g_rnd}/bc-sed-out & } 2>/dev/null
|
2023-11-06 17:59:12 +01:00
|
|
|
exec 5>${g_tmp}/${g_rnd}/bc-sed-in 6<${g_tmp}/${g_rnd}/bc-sed-out
|
|
|
|
|
2023-11-03 14:46:14 +01:00
|
|
|
g_bc_running="true"
|
2023-11-07 13:18:32 +01:00
|
|
|
fi
|
2023-11-06 17:59:12 +01:00
|
|
|
|
2023-11-03 14:46:14 +01:00
|
|
|
# do bc
|
|
|
|
echo "scale=8; $@" >&3
|
|
|
|
local g_bc_out
|
2023-11-07 13:18:32 +01:00
|
|
|
if ! read -t 0.1 g_bc_out <&4
|
2023-11-07 11:03:01 +01:00
|
|
|
then
|
2023-11-07 13:18:32 +01:00
|
|
|
g_traceback "$@"
|
|
|
|
( exec 3<&- ) 2>/dev/null
|
|
|
|
( exec 4<&- ) 2>/dev/null
|
|
|
|
( exec 5<&- ) 2>/dev/null
|
|
|
|
( exec 6<&- ) 2>/dev/null
|
|
|
|
unset g_bc_running
|
2023-11-07 11:03:01 +01:00
|
|
|
return 1
|
2023-11-07 13:18:32 +01:00
|
|
|
fi
|
2023-11-06 17:59:12 +01:00
|
|
|
|
2023-11-03 14:46:14 +01:00
|
|
|
# do sed
|
|
|
|
echo ${g_bc_out} >&5
|
|
|
|
local g_sed_out
|
2023-11-07 13:18:32 +01:00
|
|
|
if ! read -t 0.1 g_sed_out <&6
|
2023-11-07 12:22:09 +01:00
|
|
|
then
|
2023-11-07 13:18:32 +01:00
|
|
|
g_traceback "$@"
|
|
|
|
( exec 3<&- ) 2>/dev/null
|
|
|
|
( exec 4<&- ) 2>/dev/null
|
|
|
|
( exec 5<&- ) 2>/dev/null
|
|
|
|
( exec 6<&- ) 2>/dev/null
|
|
|
|
unset g_bc_running
|
2023-11-07 11:03:01 +01:00
|
|
|
return 1
|
|
|
|
fi
|
2023-11-06 17:59:12 +01:00
|
|
|
|
2023-11-26 16:24:30 +01:00
|
|
|
# store result
|
2023-11-24 16:07:21 +01:00
|
|
|
g_calc_result="${g_sed_out}"
|
2023-11-03 14:46:14 +01:00
|
|
|
}
|