summaryrefslogtreecommitdiff
path: root/include/error.sh
blob: dd0ddcef82f4967ca8399b51a8ff8009db2d2a52 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/bin/bash

_E_WIDTH=15
_E_COUNT=0
_E_FLAGS=0
_E_FLAGS_STR=""

_E_FLAG_FAILURE=1
_E_FLAG_EXIT_STANDARD=2
_E_FLAG_EXIT_NONSTANDARD=4
_E_FLAG_EXIT_SIGNALED=8
_E_FLAG_EXIT_PEBKAC=16
_E_FLAG_HALT_AND_CATCH_FIRE=32
_E_FLAG_BAD_ARGUMENT=64
_E_FLAG_BAD_RETVAL=128
_E_FLAG_BAD_PACKAGE=256
_E_FLAG_RES4=512
_E_FLAG_RES5=1024
_E_FLAG_RES6=2048
_E_FLAG_RES7=4096
_E_FLAG_RES8=8192
_E_FLAG_RES9=16384
_E_FLAG_INTERNAL=32768
#_E_FLAG_UNUSED=65536

function error_mask_report
{
    local flags=$1

    for (( i=${_E_WIDTH}; i>=0; i-- ))
    do
        (( mask = flags & ( 1 << i ) ))
        case $mask in
            $_E_FLAG_FAILURE)
                echo "Script failed."
            ;;
            $_E_FLAG_EXIT_STANDARD)
                echo "Normal exit."
            ;;
            $_E_FLAG_EXIT_NONSTANDARD)
                echo "Non-standard exit."
            ;;
            $_E_FLAG_EXIT_SIGNALED)
                echo "Recievied signal."
            ;;
            $_E_FLAG_EXIT_PEBCAC)
                echo "Problem exists between keyboard and chair."
            ;;
            $_E_FLAG_HALT_AND_CATCH_FIRE)
                echo "A fatal error occurred."
            ;;
            $_E_FLAG_BAD_ARGUMENT)
                echo "Bad argument."
            ;;
            $_E_FLAG_BAD_RETVAL)
                echo "An external program exited abnormally."
            ;;
            $_E_FLAG_BAD_PACKAGE)
                echo "A package failed to build."
            ;;
            $_E_FLAG_RES4)
                echo "Reserved"
            ;;
            $_E_FLAG_RES5)
                echo "Reserved"
            ;;
            $_E_FLAG_RES6)
                echo "Reserved"
            ;;
            $_E_FLAG_RES7)
                echo "Reserved"
            ;;
            $_E_FLAG_RES8)
                echo "Reserved"
            ;;
            $_E_FLAG_RES9)
                echo "Reserved"
            ;;
            $_E_FLAG_INTERNAL)
                echo "Error handler experienced an internal error."
            ;;
            *)

            ;;
        esac
    done
}

function error_report
{
    local flags=`error_mask_string`
    printf "Error count: %16s\n" $_E_COUNT
    printf "Error mask:  %16s\n" $_E_FLAGS
    printf "Error flags: %16s\n" $flags
    echo "Error message(s):"
    while read line
    do
        echo "* $line"
    done< <(error_mask_report $_E_FLAGS)
}

function error_set
{
    local flag=$1
    if [[ -z $flag ]]; then
        echo "error.sh: Unable to set error flag: '$flag'"
        flag=$_E_FLAG_INTERNAL
    fi
    (( _E_FLAGS |= $flag ))
    (( _E_COUNT++ ))
    #echo "Error flag modified: $_E_FLAGS_STR"
}

function error_mask_string
{
    declare -a -i bits
    local flags=$_E_FLAGS
    local output=""

    for i in $(seq 0 $_E_WIDTH)
    do
        (( bits[i] = 0 ))
        (( bit = flags >> i ))
        if (( flags & ( 1 << i ) )); then
            (( bits[i] = 1 ))
        fi
    done
    
    for (( x=${_E_WIDTH}; x>=0; x-- ))
    do
        output+=$(( bits[x] ))
    done

    echo $output
}