aboutsummaryrefslogtreecommitdiffstats
path: root/tools/process-x11-xcb.pl
diff options
context:
space:
mode:
authorJeff Morriss <jeff.morriss@ulticom.com>2012-03-13 00:07:34 +0000
committerJeff Morriss <jeff.morriss@ulticom.com>2012-03-13 00:07:34 +0000
commit9c3bbf44c14a9d2822704c1114b07a2ce8cf4110 (patch)
treefcde4a2027137e06644d97b9f235660578ffe155 /tools/process-x11-xcb.pl
parent20a52095aaf4d007d123547190927048849aaf82 (diff)
From Peter Harris:
An enum name collision was recently added to the upstream XCB/proto. Avoid the collision by putting enum names into their proper namespace. After applying that, regenerate the X11 dissector. svn path=/trunk/; revision=41514
Diffstat (limited to 'tools/process-x11-xcb.pl')
-rwxr-xr-xtools/process-x11-xcb.pl42
1 files changed, 32 insertions, 10 deletions
diff --git a/tools/process-x11-xcb.pl b/tools/process-x11-xcb.pl
index 0ee8ad9e67..78fcff80b7 100755
--- a/tools/process-x11-xcb.pl
+++ b/tools/process-x11-xcb.pl
@@ -130,9 +130,10 @@ my %struct = # Not reset; contains structures already defined.
CountedString8 => 1,
);
my %enum; # Not reset; contains enums already defined.
+my %enum_name;
my $header;
my $extname;
-my $parentclass;
+my @incname;
my %request;
my %event;
my %reply;
@@ -495,7 +496,7 @@ sub register_element($$$;$)
my $enum = $e->att('enum') // $e->att('altenum');
if (defined $enum) {
- my $enumname = dump_enum_values($enum);
+ my $enumname = dump_enum_values($enum_name{$enum});
$vals = "VALS($enumname)";
# Wireshark does not allow FT_BYTES or BASE_NONE to have an enum
@@ -506,7 +507,7 @@ sub register_element($$$;$)
$enum = $e->att('mask');
if (defined $enum) {
# Create subtree items:
- defined($enum{$enum}) or die("Enum $enum not found");
+ defined($enum{$enum_name{$enum}}) or die("Enum $enum not found");
# Wireshark does not allow FT_BYTES or BASE_NONE to have an enum
$ft =~ s/FT_BYTES/FT_UINT8/;
@@ -514,7 +515,7 @@ sub register_element($$$;$)
my $bitsize = $info->{'size'} * 8;
- my $bit = $enum{$enum}{bit};
+ my $bit = $enum{$enum_name{$enum}}{bit};
for my $val (sort { $a <=> $b } keys %$bit) {
my $itemname = $$bit{$val};
my $item = $regname . '_mask_' . $itemname;
@@ -586,7 +587,7 @@ sub dissect_element($$$$;$$)
say $impl $indent." proto_tree *bitmask_tree = proto_item_add_subtree(ti, ett_x11_rectangle);";
my $bytesize = $info->{'size'};
- my $bit = $enum{$e->att('mask')}{bit};
+ my $bit = $enum{$enum_name{$e->att('mask')}}{bit};
for my $val (sort { $a <=> $b } keys %$bit) {
my $item = $regname . '_mask_' . $$bit{$val};
@@ -653,9 +654,9 @@ sub dissect_element($$$$;$$)
my $ref = $case->first_child('enumref');
my $enum_ref = $ref->att('ref');
my $field = $ref->text();
- my $bit = $enum{$enum_ref}{rbit}{$field};
+ my $bit = $enum{$enum_name{$enum_ref}}{rbit}{$field};
if (! defined($bit)) {
- for my $foo (keys %{$enum{$enum_ref}{rbit}}) { say "'$foo'"; }
+ for my $foo (keys %{$enum{$enum_name{$enum_ref}}{rbit}}) { say "'$foo'"; }
die ("Field '$field' not found in '$enum_ref'");
}
$bit = "(1 << $bit)";
@@ -934,8 +935,12 @@ eot
sub enum {
my ($t, $elt) = @_;
my $name = $elt->att('name');
+ my $fullname = $incname[0].'_'.$name;
- if (defined $enum{$name}) {
+ $enum_name{$name} = $fullname;
+ $enum_name{$incname[0].':'.$name} = $fullname;
+
+ if (defined $enum{$fullname}) {
$t->purge;
return;
}
@@ -947,7 +952,7 @@ sub enum {
my $value = {};
my $bit = {};
my $rbit = {};
- $enum{$name} = { value => $value, bit => $bit, rbit => $rbit };
+ $enum{$fullname} = { value => $value, bit => $bit, rbit => $rbit };
my $nextvalue = 0;
@@ -1165,6 +1170,16 @@ eot
$t->purge;
}
+sub include_start {
+ my ($t, $elt) = @_;
+ my $header = $elt->att('header');
+ unshift @incname, $header;
+}
+
+sub include_end {
+ shift @incname;
+}
+
sub include
{
my ($t, $elt) = @_;
@@ -1172,6 +1187,9 @@ sub include
print " - Import $include\n";
my $xml = XML::Twig->new(
+ start_tag_handlers => {
+ 'xcb' => \&include_start,
+ },
twig_roots => {
'import' => \&include,
'struct' => \&struct,
@@ -1179,6 +1197,9 @@ sub include
'xidunion' => \&xidtype,
'typedef' => \&typedef,
'enum' => \&enum,
+ },
+ end_tag_handlers => {
+ 'xcb' => \&include_end,
});
$xml->parsefile("xcbproto/src/$include.xml") or die ("Cannot open $include.xml\n");
@@ -1190,15 +1211,16 @@ sub xcb_start {
my ($t, $elt) = @_;
$header = $elt->att('header');
$extname = ($elt->att('extension-name') or $header);
+ unshift @incname, $header;
print("Extension $extname\n");
- $parentclass = 'XProto';
undef %request;
undef %event;
undef %reply;
%simpletype = ();
+ %enum_name = ();
print $error "const char *$header"."_errors[] = {\n";
}