File: ia.debug

package info (click to toggle)
shellia 5.10
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 792 kB
  • sloc: sh: 7,840; makefile: 34
file content (167 lines) | stat: -rw-r--r-- 5,417 bytes parent folder | download
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#!/bin/sh
# vim: set filetype=sh :
#        file: /usr/share/shellia/ia.debug
#   copyright: Bernd Schumacher <bernd.schumacher@hpe.com> (2007-2020)
#     license: GNU General Public License, version 3
# description: ia.debug - debug related functions used by shellia

# Global Variables used:
#   TODO
#   interactive_already_sourced
#
# Functions used:
#   dbcheck
#   dbgoff
#   dbgon
#   dbgtoggle
#   interactive
#   todo_add

#   dbgon = dbgon $dbglevelmax = dbgon $dbglevelmax "empty" => (dbg_run_level=$dbglevelmax dbg_run_names="")
#   dbg "txt"  = dbg 1 "txt" = dbg x "" "txt" (dbglevel, dbgname) => writes dbg
#x  dbgoff => turns dbg off
#x  dbgtoggle => dbgon / dbgoff
#x  dbg writes to stderr
#   dbg output will not be checked by check
#   dbg output (exactly what is turned on) will also go to ia_logfile if defined
#x  dbg can also be used without ia.interactive lib
#   dbg output will be prefixed with "|" and "d" if ia.interactive lib is used
#
#   dbg_run_level=0 means dbg is off
#   dbg_run_level=$dbglevelmax means print all debug information
#   dbg_run_level=x 1<=x<=$dbglevelmax means print only debug information with level<=x

# ia_find_lib <lib>
# example:
#   program "/nfs/host1/usr/local/bin/program" with line "ia_source_lib /usr/share/shellia/ia" called
#   from directory "/tmp" will try "/tmp/ia", ... "/nfs/host1/usr/share/shellia/ia", ... and
#   "/usr/share/shellia/ia" in the listed order.
ia_find_lib()
{
  local i
  local p

  for i in "$@"; do
    [ -f "./$(basename "$i")" ] && /bin/echo "./$(basename "$i")" && return 0
    p="$0"
    while :; do
      [ "$p" != "$(dirname p)" ] || break
      p="$(dirname "$p")"
      [ -f "$p/$i" ] && /bin/echo "$p/$i" && return 0
    done
    [ -f "$i" ] && /bin/echo "$i" && return 0
    return 1
  done
}

if [ "${ia_prefix:=ia}" != "ia" ] || [ "${dbg_prefix:=dbg}" != "dbg" ]; then
  [ -n "$(eval "/bin/echo \${${ia_prefix}_debug_already_sourced:=}")" ] && return
  eval "$(sed -e "s/ia_/${ia_prefix}_/g" -e "s/ia()/${ia_prefix}()/g" \
    -e "s/dbg/${dbg_prefix}/g" "$(ia_find_lib /usr/share/shellia/ia.debug)")"
  return
fi

[ -n "${ia_debug_already_sourced:=}" ] && return || ia_debug_already_sourced=1

dbglevelmax=999

# redefines dbg to do nothing
dbgoff()
{
  dbgtoggle "empty 0"
}

dbgcmd()
{
  [ -n "${ia_interactive_already_sourced:=}" ] && ia_logerr "DEBUG $*" || /bin/echo "DEBUG $*" >&2
}

# SYNTAX: dbgintern <dbglevel> <dbgname> <txt>
# SYNTAX: dbgintern <txt> == dbgintern 1 <txt>
# SYNTAX: dbgintern <dbglevel> <txt> == dbgintern <dbglevel> "-" "txt"
# DESCRIPITON (dbglevel, dbgname)
dbgintern()
{
  local dbglevel
  local dbgname
  if [ $# -ge 3 ]; then
    dbglevel="$1"
    dbgname="$2"
    shift 2
  elif [ $# -eq 2 ]; then
    dbglevel="$1"
    dbgname="none"
    shift
  elif [ $# -eq 1 ]; then
    dbglevel="1"
    dbgname="none"
  else
    /bin/echo "SCRIPT-ERROR dbg: Bad number of arguments=<$#> ($*)" >&2
    return 1
  fi
  #ia_dev_dbg "dbgintern dbgname=<$dbgname> dbglevel=<$dbglevel> dbg_run_level=<$dbg_run_level> dbg_run_names=<$dbg_run_names>"

  [ -n "$(/bin/echo "$dbglevel" | grep -E "^[0-9]+$")" ] || {
    /bin/echo "SCRIPT-ERROR dbg: Bad level=<$dbglevel> topic=<$dbgname> output=<$*>" >&2
    return 2
  }

  [ -n "$dbgname" ] && [ -n "$dbg_run_names" ] && [ -z "$(/bin/echo " $dbg_run_names " | grep -e " $dbgname ")" ] && return
  [ "$dbg_run_level" -lt "$dbglevel" ] && return
  dbgcmd "$@"
}

# SYNTAX: dbgon "[<name> <name> ...] [<level>]"
# DESCRIPTION: dbgon turns debug on
# dbgon redefines function dbg to print debug messages to stderr, sets global
# variable dbg_run_level to <level> and sets global variable dbg_run_names to <names>.
# dbgon is an abbreviation for: dbgon $dbglevelmax ""
# dbgon <level> is an abbreviation for: dbgon <level> ""
dbgon()
{
  dbgtoggle "empty $dbglevelmax $*"
}

# toggles dbg function definition
# SYNTAX: dbgtoggle "[<name> <name> ...] [<level>]"
dbgtoggle()
{
  local i
  #ia_dev_dbg "dbgtoggle 1=<$1> dbg_run_names=<${dbg_run_names:-}> dbg_run_level=<${dbg_run_level:-}>"
  for i in $1; do
    if [ -n "$(/bin/echo "$i" | grep "^[0-9]\+$")" ]; then
      dbg_run_level=$i
      if [ $dbg_run_level -gt 0 ]; then
        eval "dbg() { { set +x; } 2>/dev/null; dbgintern \"\$@\"; }"
      else
        eval "dbg() { { set +x; } 2>/dev/null; }"
      fi
    else
      if [ -z "$(/bin/echo "$i" | grep -e "^[a-zA-Z][a-zA-Z0-9]*$")" ]; then
        /bin/echo "WARNING dbgtoggle: ignoring $i because does not match [0-9]+ or [a-zA-Z][a-zA-Z0-9]*" >&2
        continue
      else
        if [ "$i" = "empty" ]; then
          dbg_run_names=""
        elif [ -n "$(/bin/echo " $dbg_run_names " | grep " $i " )" ]; then
          # delete
          dbg_run_names="$(/bin/echo "$dbg_run_names $i" | xargs -n1 /bin/echo | grep -v -e "^$i$" | xargs)"
        else
          # add
          dbg_run_names="$(/bin/echo "$dbg_run_names $i" | xargs -n1 /bin/echo | sort -u | grep -v -e "^*$" | xargs)"
        fi
      fi
    fi
  done
  #ia_dev_dbg "dbgtoggle dbg_run_names=<$dbg_run_names> dbg_run_level=<$dbg_run_level>"
}

dbg_display()
{
  dbg_run_names="$(/bin/echo "$dbg_run_names" | xargs -n1 /bin/echo | sort -u | xargs)"
  [ -n "$dbg_run_names" ] && /bin/echo "$dbg_run_level $dbg_run_names" || /bin/echo "$dbg_run_level"
}

# initialize dbg
[ -n "${dbg_run_names:=}" ] || :
[ -n "${dbg_run_level:-}" ] && dbgtoggle "${dbg_run_level}" || dbgoff