"Fossies" - the Fresh Open Source Software Archive

Member "mpr-2.8/mprchain" (3 Nov 2002, 3062 Bytes) of package /linux/misc/old/mpr-2.8.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Bash source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 #!/bin/sh
    2 # NOTE: considers realloc(p, n) == malloc(n)
    3 
    4 MPRAWK=${MPRAWK-awk}
    5 
    6 chainlen=999999     # this may be too low for NT ;^)
    7 chainline=0
    8 width=${COLUMNS-80}
    9 showpct=true
   10 showmax=
   11 
   12 for arg in "$@"; do
   13     case "$1" in
   14     -m) showmax=true;;
   15     -n) showpct=;;
   16     -w )    width=$2; shift;;
   17     -w*)    width=`echo $1 | sed 's/-w//'`;;
   18     -c )    chainlen=$2; shift;;
   19     -c*)    chainlen=`echo $1 | sed 's/-c//'`;;
   20     -C )    chainline=$2; shift;;
   21     -C*)    chainline=`echo $1 | sed 's/-C//'`;;
   22     --) shift; break;;
   23     *)  break;;
   24     esac
   25     shift
   26 done
   27 
   28 case "$#" in
   29 0|1)    ;;
   30 *)  echo "usage: mprchain [-m] [-n] [-c N] [-C N] [-w N] [log]" >&2
   31     exit 1;;
   32 esac
   33 
   34 case "$chainline" in
   35 0)  chainline=$chainlen;;
   36 esac
   37 
   38 MPRFILTER=`mprfilter mprchain "$@"` || exit 1
   39 
   40 trap 'exit 0' 13
   41 
   42 $MPRFILTER |
   43 
   44 $MPRAWK -F: -v chainlen=$chainlen -v showmax=$showmax '
   45     function addchain(n,    chain, addr, size) {
   46         addr = $NF
   47         size = $n
   48         if (!addr || !size) # memory was not allocated
   49             return
   50         if (n == 2)     # no frame pointers => empty chains
   51             chain = "???"
   52         else {
   53             chain = $2
   54             for (i=1; i<chainlen && i<n-2; i++)
   55                 chain = chain":"$(2+i)
   56         }
   57         chainnum[chain]++
   58         if (showmax != "") {
   59             addrsize[addr] = size
   60             addrchain[addr] = chain
   61             chaintotal[chain] += size
   62             if (chaintotal[chain] >= chainmax[chain])
   63                 chainmax[chain] = chaintotal[chain]
   64         }
   65         else
   66             chaintotal[chain] += size
   67     }
   68     function delchain(addr,     chain, size) {
   69         size = addrsize[addr]
   70         chain = addrchain[addr]
   71         if (!size || chain == "???")
   72             return
   73         chaintotal[chain] -= addrsize[addr]
   74         delete addrsize[addr]
   75         delete addrchain[addr]
   76     }
   77     /^m/ {  addchain(NF-1) }
   78     /^r/ {  if (showmax != "") delchain($(NF-1)); addchain(NF-2) }
   79     /^f/ {  if (showmax != "") delchain($NF) }
   80     END  {
   81         total=0
   82         if (showmax != "")
   83             for (chain in chainmax)
   84                 total += chainmax[chain]
   85         else
   86             for (chain in chaintotal)
   87                 total += chaintotal[chain]
   88         print total
   89         if (showmax != "")
   90             for (chain in chainmax)
   91                 printf "%s\t%d\t%f\n", chain, chainnum[chain], chainmax[chain]
   92         else
   93             for (chain in chaintotal)
   94                 printf "%s\t%d\t%f\n", chain, chainnum[chain], chaintotal[chain]
   95     } ' |
   96 
   97 $MPRAWK '
   98     NR==1   { print }
   99     NR>1    { print |"sort -t\" \" -n +2" }' |
  100 
  101 $MPRAWK -F" " -v width=$width -v showpct=$showpct -v chainline=$chainline '
  102     BEGIN {
  103         w=width-22      # 22=11(num)+11(amt)
  104         if (showpct != "")
  105             w=width-29  # 29=22+7(showpct)
  106         getline tot
  107     }
  108     function printchain(chain, first)
  109     {
  110         printf "%-*s", w, chain
  111         if (first) {
  112             printf "%-11d", $2
  113             if ($3 <= 2147483647.0)     # 2^31-1
  114                 printf "%-11d", $3
  115             else
  116                 printf "%-11.5g", $3
  117             if (showpct != "")
  118                 printf "%.02f%%", (100.0*$3)/tot
  119         }
  120         printf "\n"
  121     }
  122     {
  123         n=split($1, arr, /:/)
  124         chain=""; nchain=0
  125         first=1
  126         for (i=1; i<=n; i++) {
  127             if (chain != "") {
  128                 if ((nchain >= chainline) ||
  129                     (length(chain)+length(arr[i]) >= w-2)) {
  130                     printchain(chain":", first)
  131                     chain=""; nchain=0
  132                     first=0
  133                 }
  134             }
  135             if (chain != "")
  136                 chain=chain":"arr[i]
  137             else
  138                 chain=arr[i]
  139             nchain++
  140         }
  141         if (chain != "")
  142             printchain(chain, first)
  143         printf "--\n"
  144     }
  145 '
  146 
  147 exit 0