Merge from vendor branch CVS:
[dragonfly.git] / tools / tools / vop_table / vop_table.tcl
1 #!/bin/sh
2
3 proc do_file {file} {
4         global names ops op
5         set f [open $file]
6
7         set s 0
8
9         while {[gets $f a] >= 0} {
10                 if {$s == 0} {
11                         if {[regexp {struct[    ]*vnodeopv_entry_desc} "$a"]} {
12                                 regsub {.*vnodeopv_entry_desc[  ]*} $a {} a
13                                 regsub {\[.*} $a {} a
14                                 regsub {_entries} $a {} a
15                                 set name $a
16                                 set names($a) 0
17                                 set s 1
18                         }
19                         continue
20                 }
21                 if {$s == 1} {
22                         if {[regexp {NULL} "$a"]} {
23                                 set s 0
24                                 continue
25                         }
26                         if {![regexp {vop.*_desc} "$a"]} continue
27                         regsub -all {[,&]} $a " " a
28                         set b [lindex $a 0]
29                         #puts "$name>> [lindex $b 0] >> [lindex $b 3]"
30                         set o [lindex $b 0]
31                         regsub {_desc} $o "" o
32                         set ops($o) 0
33                         set op([list $name $o]) [lindex $b 3]
34                         continue
35                 }
36                 puts "$s>> $a"
37         }
38         close $f
39 }
40
41 set fi [open "|find [glob /usr/src/sys/*fs /usr/src/sys/gnu/*fs] /usr/src/sys/kern -type f -name *.c -print | xargs grep VNODEOP_SET" ]
42 while {[gets $fi a] >= 0} {
43         puts stderr $a
44         if {[regexp {#define} $a]} continue
45         if {[regexp {mallocfs} $a]} continue
46         do_file [lindex [split $a :] 0]
47 }
48 close $fi
49
50 puts {<HTML>
51 <HEAD></HEAD><BODY>
52 <TABLE BORDER WIDTH="100%" NOSAVE>
53 }
54
55 set opn [lsort [array names ops]]
56 set a [lsort [array names names]]
57
58 set tbn default_vnodeop
59 foreach i $a {
60         if {$i == "default_vnodeop"} continue
61         lappend tbn $i
62 }
63
64 foreach i $opn {
65         if {$i == "vop_default"} continue
66         regsub "vop_" $i "" i
67         lappend fl [format "%12s" $i]
68 }
69
70 lappend fl [format "%12s" default]
71
72 puts {<TR>}
73 puts {<TD>}
74 puts {</TD>}
75 puts "<TR>"
76         puts "<TD></TD>"
77         foreach j $fl {
78                 puts "<TD>"
79
80                 for {set i 0} {$i < 12} {incr i} {
81                         puts "[string index $j $i]<BR>"
82                 }
83                 puts "</TD>"
84         }
85 puts "</TR>"
86
87 set fnames(vop_defaultop) *
88 set fnames(vop_nolock) nl
89 set fnames(vop_noislocked) ni
90 set fnames(vop_nounlock) nu
91 set fnames(vop_stdlock) sl
92 set fnames(vop_stdislocked) si
93 set fnames(vop_stdunlock) su
94 set fnames(vop_einval) I
95 set fnames(vop_enotty) T
96 set fnames(vop_null) -
97 set fnames(vop_eopnotsupp) S
98 set fnames(ufs_missingop) M
99 set fnames(vop_nopoll) np
100 set fnames(vop_nostrategy) ns
101 set fnames(vop_revoke) vr
102 set fnames(vfs_cache_lookup) cl
103 set fnames(vop_stdpathconf) pc
104 set fnames(vop_stdbwrite) bw
105
106 set fn 0
107 set nop(aa) 0
108 unset nop(aa)
109 foreach i $tbn {
110         puts {<TR>}
111         puts "<TD>$i</TD>"
112         foreach j $opn {
113                 if {$j == "vop_default"} continue
114                 if {![info exists op([list $i $j])]} {
115                         puts "<TD></TD>"
116                         continue
117                 }
118                 set t $op([list $i $j])
119         
120                 set c "#00ddd0"
121                 if {[info exists fnames($t)]} {
122                         set t $fnames($t)
123                 } else {
124                         if {![info exists nop($t)]} {
125                                 incr fn
126                                 set nop($t) $fn
127                                 set nfn($fn) $t
128                                 set use($fn) 0
129                         }
130                         incr use($nop($t))
131                         set t "<FONT SIZE=-1>$nop($t)</FONT>"
132                         set c "#00ffd0"
133                 }
134                 puts "<TD BGCOLOR=\"$c\">$t</TD>"
135         }
136         set j vop_default
137         if {![info exists op([list $i $j])]} {
138                 puts "<TD></TD>"
139                 continue
140         }
141         puts "<TD>$op([list $i $j])</TD>"
142
143         puts "</TR>"
144 }
145 puts "</TABLE>"
146 puts "<HR>"
147 puts {<PRE>}
148 foreach i [lsort [array names fnames]] {
149         puts [format "%-2s %s" $fnames($i)  $i]
150 }
151 puts {
152 </PRE>
153 }
154 puts "<HR>"
155 puts "<HR>"
156 puts {<TABLE BORDER NOSAVE>}
157 set m 8
158 for {set i 1} {$i <= $fn} {incr i $m} {
159         puts "<TR>"
160         for {set j 0} {$j < $m} {incr j} {
161                 set k [expr $i + $j]
162                 if {$k <= $fn} {
163                         #puts "<TD>$k</TD><TD><FONT SIZE=-1>$nfn($k)/$use($k)</FONT></TD>"
164                         puts "<TD>$k</TD><TD><FONT SIZE=-1>$nfn($k)</FONT></TD>"
165                 }
166         }
167         puts "</TR>"
168 }
169 puts "</TABLE>"
170
171 puts "</TABLE>"
172 puts "</BODY>"
173 puts "</HTML>"