diff --git a/gaboshlib/g_calc.sh b/gaboshlib/g_calc.sh index 34e8fd1..96f1631 100644 --- a/gaboshlib/g_calc.sh +++ b/gaboshlib/g_calc.sh @@ -1,3 +1,34 @@ function g_calc { - echo "scale=8; $@" | bc | sed 's/^\./0./; s/^-\./-0./' -} \ No newline at end of file + + # Use bc in backround for multiple bc's running much faster + if [ -z "${g_bc_running}" ] + then + [ -p ${g_tmp}/bc-in ] || mkfifo ${g_tmp}/bc-in + [ -p ${g_tmp}/bc-out ] || mkfifo ${g_tmp}/bc-out + [ -p ${g_tmp}/bc-sed-in ] || mkfifo ${g_tmp}/bc-sed-in + [ -p ${g_tmp}/bc-sed-out ] || mkfifo ${g_tmp}/bc-sed-out + + # bc stream channel + bc -ql <${g_tmp}/bc-in >${g_tmp}/bc-out & + exec 3>${g_tmp}/bc-in 4<${g_tmp}/bc-out + + # sed stream channel + sed -su 's/^\./0./; s/^-\./-0./' <${g_tmp}/bc-sed-in >${g_tmp}/bc-sed-out & + exec 5>${g_tmp}/bc-sed-in 6<${g_tmp}/bc-sed-out + + g_bc_running="true" + fi 2>/dev/null + + # do bc + echo "scale=8; $@" >&3 + local g_bc_out + read g_bc_out <&4 + + # do sed + echo ${g_bc_out} >&5 + local g_sed_out + read g_sed_out <&6 + + # echo result + echo ${g_sed_out} +}