aboutsummaryrefslogtreecommitdiff
path: root/ctct.in
diff options
context:
space:
mode:
Diffstat (limited to 'ctct.in')
-rw-r--r--ctct.in71
1 files changed, 51 insertions, 20 deletions
diff --git a/ctct.in b/ctct.in
index e1cad6b..55f926d 100644
--- a/ctct.in
+++ b/ctct.in
@@ -18,15 +18,18 @@
# along with ctct. If not, see <https://www.gnu.org/licenses/>.
#
+typeset -a fallback_editor default_editor
+typeset -a input_program output_program visual_program
+
## DEFAULT SETTINGS:
sysconfdir="@sysconfdir_expanded@"
-user_config_file="@user_config_file@"
+user_config_file="@default_user_config_file@"
datadir="@default_datadir@"
-fallback_editor="@default_fallback_editor@"
-default_editor= # none - use $EDITOR
-input_program="@default_input_program@"
-output_program="@default_output_program@"
-visual_program="@default_visual_program@"
+fallback_editor=("@default_fallback_editor@")
+default_editor=() # none - use $EDITOR
+input_program=("@default_input_program@")
+output_program=("@default_output_program@")
+visual_program=("@default_visual_program@")
confirm_deletion=@default_confirm_deletion@
confirm_default_yes=@default_confirm_default_yes@
@@ -67,6 +70,7 @@ EOF
function cleanup()
{
test -v tmp_file && test -f "$tmp_file" && rm -f "$tmp_file"
+ test -v tmp_dir && test -d "$tmp_dir" && rm -rf "$tmp_dir"
}
trap cleanup EXIT
@@ -168,11 +172,16 @@ function display_exact()
check_syntax "$1" || return $RET_BADSYNTAX
file="$datadir/$(get_filename "$1")" || return $RET_FAILURE
- if test "$visual_program" = "cat"
+ if [ "$visual_program" = "cat" ] && [ ${#visual_program[@]} -eq 1 ]
+ then
+ "${output_program[@]}" < "$file" || return $RET_ERROR
+ elif [ "$output_program" = "cat" ] && [ ${#output_program[@]} -eq 1 ]
then
- $output_program < "$file" || return $RET_ERROR
+ "${visual_program[@]}" < "$file" || return $RET_ERROR
else
- $output_program < "$file" | $visual_program || return $RET_ERROR
+ "${output_program[@]}" < "$file" | "${visual_program[@]}"
+ [[ ${PIPESTATUS[0]} -eq 0 || ${PIPESTATUS[1]} -eq 0 ]] \
+ || return $RET_ERROR
fi
return $RET_SUCCESS
@@ -234,6 +243,21 @@ function search_by_data()
cd "$datadir"
files=( $(list_all || return $RET_ERROR) )
+ if [ "$output_program" = "cat" ] && [ ${#output_program[@]} -eq 1 ]
+ then
+ unset tmp_dir
+ else
+ tmp_dir="$(mktemp -d)"
+
+ for file in ${files[@]}
+ do
+ "${output_program[@]}" < $file > "${tmp_dir}/${file}" \
+ || return $RET_ERROR
+ done
+
+ cd "$tmp_dir"
+ fi
+
for regexp in "${@,,}"
do
files=( $(grep -Eil "$regexp" ${files[@]}) )
@@ -242,6 +266,11 @@ function search_by_data()
[ $ret -gt 1 ] && return $RET_ERROR
done
+ if test -n "$tmp_dir"
+ then
+ rm -rf "$tmp_dir" && unset tmp_dir || return $RET_ERROR
+ fi
+
print_msg "$msg"
printf " %s\n" ${files[@]}
return $RET_SUCCESS
@@ -266,7 +295,8 @@ function list_all()
# $1: contact name
function edit_contact()
{
- local file editor new
+ local file new
+ typeset -a editor
check_syntax "$1" || return $RET_BADSYNTAX
@@ -282,17 +312,18 @@ function edit_contact()
fi
fi
- if test -n "$default_editor"
+ if test -n "${default_editor[*]}"
then
- editor="$default_editor"
- elif test -n "$EDITOR" && which "$EDITOR" >/dev/null 2>&1
+ editor=( "${default_editor[@]}" )
+ elif test -n "$EDITOR" && which "${EDITOR% *}" >/dev/null 2>&1
then
- editor="$EDITOR"
+ editor=( $EDITOR )
else
- editor="$fallback_editor"
+ editor=( "${fallback_editor[@]}" )
fi
- if test "$input_program" = "cat" -a "$output_program" = "cat"
+ if [ "$input_program" = "cat" ] && [ ${#input_program[@]} -eq 1 ] \
+ && [ "$output_program" = "cat" ] && [ ${#output_program[@]} -eq 1 ]
then
if $new
then
@@ -300,18 +331,18 @@ function edit_contact()
touch "$file" || return $RET_ERROR
fi
- $editor "$file" || return $RET_ERROR
+ "${editor[@]}" "$file" || return $RET_ERROR
else
tmp_file="$(mktemp || return $RET_ERROR)"
chmod 600 "$tmp_file" || return $RET_ERROR
if ! $new
then
- $output_program < "$file" > "$tmp_file" || return $RET_ERROR
+ "${output_program[@]}" < "$file" > "$tmp_file" || return $RET_ERROR
fi
- $editor "$tmp_file" || return $RET_ERROR
- $input_program < "$tmp_file" > "$file" || return $RET_ERROR
+ "${editor[@]}" "$tmp_file" || return $RET_ERROR
+ "${input_program[@]}" < "$tmp_file" > "$file" || return $RET_ERROR
rm -f "$tmp_file" && unset tmp_file || return $RET_ERROR
fi