#!/bin/bash
# -------------------------------------------------------------------
# ~/.bash_fn.rc: Useful shell functions
#                NOTE: these assume [ `uname -s` == 'Linux' ]
# vim: set filetype=sh : (vim modeline for syntax of this file)
# (c) Copyright 2008 _m (http://eccentrix.com/misc/mammon)
# -------------------------------------------------------------------

# -------------------------------------------------------------------
# calc : calculate an expression (wrapper for bc)
function calc () {
	bc -l << EOF
		$*
EOF
}

# -------------------------------------------------------------------
# plot : plot arbitrary list of numbers with gnuplot
#        Example:
# wc -l  * 2>/dev/null | awk '{print $1}' | sort -n | plot with lines
function plot () {
	( echo plot \'-\' "$*"; cat -) | `which gnuplot` -persist
}

# -------------------------------------------------------------------
# ifind : case insensitive find from the current directory
function ifind () {
        if [ -z "$1" ]
        then
		echo Usage: ifind pattern
		return 1
	fi

	find . -iname \*$*\*
}


# -------------------------------------------------------------------
# rv_color : set console color based on return value of last command
#            This sets the color to GREEN if the last command
#            succeeded, RED otherwise.
function rv_color () {
        if [ $? -eq 0 ]
        then
                color='\033[32m' # GREEN
        else
                color='\033[31m' # RED
        fi

        echo -e $color
}

# -------------------------------------------------------------------
# chmod-arx : RecursIVELY chmod a+rx all directories in path
chmod-arx () {
        if [ -z "$1" ]
        then
                echo Usage: chmod-arx path
                return 1
        fi

        find $1 -type d -exec chmod a+rx \{\} \;
        return $?
}

# -------------------------------------------------------------------
# cpx : 'Expert' cp : uses tar to preserve ownership and permissions
cpx () {
        if [ -z "$1" -o -z "$2" ]
        then
                echo Usage: cpx src dest
                return 1
        fi

        tar cpf - $1 | (cd $2 && tar xvpBf -)
        return $?
}

# -------------------------------------------------------------------
# zomb_ps : list zombie processes
zomb_ps () {
        ps hr -Nos | awk '$1=="Z" {print $1}'
}

# -------------------------------------------------------------------
# trunc: truncate string $1 to length $2, prefixed with '...'
trunc () {
        if [ -z "$1" -o -z "$2" ]
        then
                echo Usage: trunc string length
                return 1
        fi

        if [ ${#1} -le $2 ]
        then
                echo $1
        else
                local offset=$(( ${#1} - $2 + 3 ))
                echo "...${1:$offset:$2}"
        fi

}

# -------------------------------------------------------------------
# xtitle: Set caption of terminal-emulator title bar to args
xtitle () {
        echo -e "\033]0;$*\007"
}

# -------------------------------------------------------------------
# xtrun: Invoke xtitle on args, then execute args
xtrun () {
        xtitle $*
        $*
}

# -------------------------------------------------------------------
# xrun: run a window manager (or any X app) in a new XServer session.
xrun () {
        if [ -z "$1" ]
        then
                echo Usage: xrun path [screen]
                return 1
        fi

        SCREEN_NUM=$2
        [ -z "$SCREEN_NUM" ] && SCREEN_NUM="1"

        xinit $1 -- :${SCREEN_NUM}
}

# -------------------------------------------------------------------
# battery_life : Echo the percentage of battery life remaining
battery_life () {
	life=$(acpi -b | cut -d , -f 2)
	# NOTE: the trailing % is stripped
	echo ${life%\%}
}

# -------------------------------------------------------------------
# battery_color: Change console font based on battery life
battery_color () {
	num=$(battery_life)

	if [ $num -gt 25 ]
	then
		# 26-100% remaining : GREEN
		color='\033[32m'
	elif [ $num -gt 10 ]
	then
		# 11-25% remaining : YELLOW
		color='\033[1;33m'
	else
		# 0-10% remaining : RED
		color='\033[31m'
	fi

	echo -e "${color}"
}

# -------------------------------------------------------------------
# uprompt: Build and echo (NOT return!) a user prompt.
#          This echoes "user@host:path", where path is truncated to 
#          1/3 of the screen size (using the trunc() function).
#          The entire string is colored RED if UID is 0.
uprompt () {
        local prompt='\u@\h:`trunc $PWD $((COLUMNS/3))`'
        if [ $UID -eq 0 ]
        then
                prompt="${RED}${prompt}${NC}"
        fi

        echo $prompt
}

# -------------------------------------------------------------------
# fixtty : reset TTY after user cat'ed a binary file
fixtty () {
	stty sane
	reset
}
