1#!/bin/sh
2
3proc 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
41set 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" ]
42while {[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}
48close $fi
49
50puts {<HTML>
51<HEAD></HEAD><BODY>
52<TABLE BORDER WIDTH="100%" NOSAVE>
53}
54
55set opn [lsort [array names ops]]
56set a [lsort [array names names]]
57
58set tbn default_vnodeop
59foreach i $a {
60	if {$i == "default_vnodeop"} continue
61	lappend tbn $i
62}
63
64foreach i $opn {
65	if {$i == "vop_default"} continue
66	regsub "vop_" $i "" i
67        lappend fl [format "%12s" $i]
68}
69
70lappend fl [format "%12s" default]
71
72puts {<TR>}
73puts {<TD>}
74puts {</TD>}
75puts "<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	}
85puts "</TR>"
86
87set fnames(vop_defaultop) *
88set fnames(vop_nolock) nl
89set fnames(vop_noislocked) ni
90set fnames(vop_nounlock) nu
91set fnames(vop_stdlock) sl
92set fnames(vop_stdislocked) si
93set fnames(vop_stdunlock) su
94set fnames(vop_einval) I
95set fnames(vop_enotty) T
96set fnames(vop_null) -
97set fnames(vop_eopnotsupp) S
98set fnames(ufs_missingop) M
99set fnames(vop_nopoll) np
100set fnames(vop_nostrategy) ns
101set fnames(vop_revoke) vr
102set fnames(vfs_cache_lookup) cl
103set fnames(vop_stdpathconf) pc
104set fnames(vop_stdbwrite) bw
105
106set fn 0
107set nop(aa) 0
108unset nop(aa)
109foreach 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}
145puts "</TABLE>"
146puts "<HR>"
147puts {<PRE>}
148foreach i [lsort [array names fnames]] {
149	puts [format "%-2s %s" $fnames($i)  $i]
150}
151puts {
152</PRE>
153}
154puts "<HR>"
155puts "<HR>"
156puts {<TABLE BORDER NOSAVE>}
157set m 8
158for {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}
169puts "</TABLE>"
170
171puts "</TABLE>"
172puts "</BODY>"
173puts "</HTML>"
174