"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