aboutsummaryrefslogtreecommitdiffstats
path: root/docbook/dfilter2xml.pl
blob: a2e697121508ef5533b7f2788570e36a2c16a24c (plain)
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
#!/usr/bin/perl
#
# Reads the display filter keyword dump produced by 'ethereal -G' and
# formats it for a pod document. The pod document is then used to
# make a manpage
#
# STDIN is the ethereal glossary
# arg1 is the pod template file. The =insert_dfilter_table token
#	will be replaced by the pod-formatted glossary
# STDOUT is the output
#
# $Id$

%ftenum_names = (
	'FT_NONE',		'No value',
	'FT_PROTOCOL',		'Protocol',
	'FT_BOOLEAN',		'Boolean',
	'FT_UINT8',		'Unsigned 8-bit integer',
	'FT_UINT16',		'Unsigned 16-bit integer',
	'FT_UINT24',		'Unsigned 24-bit integer',
	'FT_UINT32',		'Unsigned 32-bit integer',
	'FT_UINT64',		'Unsigned 64-bit integer',
	'FT_INT8',		'Signed 8-bit integer',
	'FT_INT16',		'Signed 16-bit integer',
	'FT_INT24',		'Signed 24-bit integer',
	'FT_INT32',		'Signed 32-bit integer',
	'FT_INT64',		'Signed 64-bit integer',
	'FT_DOUBLE',		'Double-precision floating point',
	'FT_ABSOLUTE_TIME',	'Date/Time stamp',
	'FT_RELATIVE_TIME',	'Time duration',
	'FT_STRING',		'String',
	'FT_STRINGZ',		'String',
	'FT_UINT_STRING',	'String',
	'FT_ETHER',		'6-byte Hardware (MAC) Address',
	'FT_BYTES',		'Byte array',
	'FT_IPv4',		'IPv4 address',
	'FT_IPv6',		'IPv6 address',
	'FT_IPXNET',		'IPX network or server name',
);

# Read all the data into memory
while (<STDIN>) {
	next unless (/^([PF])/);

	$record_type = $1;
	chomp($_);
	$_ =~ s/\&/\&amp\;/g;
	$_ =~ s/\>/\&gt;/g;
	$_ =~ s/\</\&lt\;/g;

	# Store protocol information
	if ($record_type eq 'P') {
		($junk, $name, $abbrev) = split(/\t+/, $_);
		$proto_abbrev{$name} = $abbrev;
	}
	# Store header field information
	else {
		($junk, $name, $abbrev, $type, $parent, $blurb) =
			split(/\t+/, $_);
		push(@{$field_abbrev{$parent}}, $abbrev);
		$field_info{$abbrev} = [ $name, $type, $blurb ];
	}
}

# if there was no input on stdin, bail out
if ($record_type ne 'P' and $record_type ne 'F') {
	exit;
}

$template = shift(@ARGV);

open(TEMPLATE, $template) || die "Can't open $template for reading: $!\n";

while (<TEMPLATE>) {
	if (/=insert_dfilter_table/) {
		&create_dfilter_table;
	}
	else {
		print;
	}
}

close(TEMPLATE) || die "Can't close $template: $!\n";

sub create_dfilter_table {

        print "<appendix id=\"AppFiltFields\"><title>Ethereal Display Filter Fields</title>\n";
	$pn_counter = 1;

	# Print each protocol
	for $proto_name (sort keys %proto_abbrev) {

		$ns_proto_name = $proto_name;
		$ns_proto_name =~ s/\s//g;
		$ns_proto_name =~ s/\)//g;
		$ns_proto_name =~ s/\(//g;
		$ns_proto_name =~ s/_//g;
		$ns_proto_name =~ s/\+/plus/g;
		$ns_proto_name =~ s/\//slash/g;
		$ns_proto_name =~ s/,/comma/g;
		$ns_proto_name =~ s/:/colon/g;
		$ns_proto_name =~ s/'/apos/g;
		
		# The maximum token name length is apparently 44 characters. 
		# That's what NAMELEN is defined as in docbook 4.1, at least.

		if (length ($ns_proto_name) > 41) {  # "SID" and "TID" are prepended below
			$ns_proto_name = sprintf ("%s%04d", substr($ns_proto_name, 0,
				37), $pn_counter);
			$pn_counter++;
		}
			
		print "<section id=\"SID$ns_proto_name\"><title>$proto_name ($proto_abbrev{$proto_name})</title>\n\n";

		print "<table id=\"TID$ns_proto_name\"><title>$proto_name ($proto_abbrev{$proto_name})</title>\n";
		print "<tgroup cols=\"4\">\n";
#		print "<colspec colnum=\"1\" colwidth=\"80pt\">\n";
#		print "<colspec colnum=\"2\" colwidth=\"80pt\"\n>";
		print "<thead>\n  <row>\n    ";
 		print "<entry>Field</>\n    <entry>Field Name</>\n    <entry>Type</>\n    <entry>Description</>\n\n";

		print "  </row>\n</thead>\n<tbody>\n";

		# If this proto has children fields, print those
		if ($field_abbrev{$proto_abbrev{$proto_name}}) {

			for $field_abbrev (sort @{$field_abbrev{$proto_abbrev{$proto_name}}}) {

			    print "  <row>\n";
			    print "    <entry>$field_abbrev</entry>\n";
			    print "    <entry>", $field_info{$field_abbrev}[0], "</entry>\n";
			    print "    <entry>", $ftenum_names{$field_info{$field_abbrev}[1]}, "</entry>\n";
 				print "    <entry>", $field_info{$field_abbrev}[2], "</>\n";
			    print "  </row>\n\n";

			}

		}
		else {

		    print "  <row>\n    <entry></entry>\n    <entry></entry>\n    <entry></entry><entry></entry>\n";
		    print "  </row>\n";

		}

		print "</tbody></tgroup></table>\n";
		print "</section>\n\n";

	}

	print "</appendix>\n";

}