From 412b381729250e474c02c2ab04247ff3820c3ce5 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Thu, 1 Mar 2012 16:51:39 +0000 Subject: docs: xen-headers: Annotate typedefs Parse (some) typedef statements. (Make type names links to the underlying struct if there is one, rather than to just the typedef.) Also, exclude the new arch-arm headers. Signed-off-by: Ian Jackson Cc: Ian Campbell Acked-by: Ian Campbell Committed-by: Ian Jackson --- docs/xen-headers | 62 +++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 14 deletions(-) (limited to 'docs/xen-headers') diff --git a/docs/xen-headers b/docs/xen-headers index 08fd7f3462..3fea3e3d7a 100755 --- a/docs/xen-headers +++ b/docs/xen-headers @@ -120,11 +120,12 @@ sub aelem ($$$) { return "$ytext"; } -sub defn ($$$;$) { - my ($text,$type,$name,$hparams) = @_; +sub defn ($$$;$$) { + my ($text,$type,$name,$hparams,$deref) = @_; $hparams='' if !defined $hparams; - debug(2,"DEFN $. $type $name $hparams"); + debug(2,"DEFN $. $type $name $hparams |$text|"); $sdef{$type}{$name}{DefLocs}{"$leaf:$."} = $leaf_opath; + $sdef{$type}{$name}{Derefs}{"$leaf:$."} = $deref; my $xrefs = $sdef{$type}{$name}{Xrefs}; push @pending_xrefs, values %$xrefs if $xrefs; $hparams .= " name=\"${type}_$name\"" if $sdef{$type}{$name}{Used}; @@ -140,7 +141,7 @@ sub norm ($) { } elsif (s/^(struct|union|enum)\s+(\w+)\b//) { $no .= ahref($&, (ucfirst $1), $2); } elsif (s/^\w+\b//) { - $no .= ahref($&, 'Func', $&); + $no .= ahref($&, [qw(Func Typedef)], $&); } else { die "$_ ?"; } @@ -148,18 +149,42 @@ sub norm ($) { return $no; } -sub refhref ($$) { - my ($type,$name) = @_; +sub sdefval ($$$) { + my ($type,$name,$hkey) = @_; $sdef{$type}{$name}{Used} = 1; - my $locs = $sdef{$type}{$name}{DefLocs}; - return '' unless $locs; - if ((scalar keys %$locs) != 1 && !$sdef{$type}{$name}{MultiWarned}) { - warning("multiple definitions of $type $name: $_") - foreach keys %$locs; - $sdef{$type}{$name}{MultiWarned}=1; + my $sdef = $sdef{$type}{$name}; + my $hash = $sdef->{$hkey}; + if ((scalar keys %$hash) > 1 && !$sdef->{MultiWarned}{$hkey}) { + warning("multiple definitions of $type $name: $_") + foreach keys %$hash; + $sdef->{MultiWarned}{$hkey}=1; + } + my ($val) = values %$hash; + return $val; +} + +sub refhref ($$) { + my ($types,$name) = @_; + foreach my $type (ref($types) ? @$types : ($types)) { + my ($ttype,$tname) = ($type,$name); + my $loc = sdefval($ttype,$tname,'DefLocs'); + for (;;) { + my $deref = sdefval($ttype,$tname,'Derefs'); + last unless $deref; + my ($type2,$name2,$loc2); + my @deref = @$deref; + while (@deref) { + ($type2,$name2,@deref) = @deref; + $loc2 = sdefval($type2,$name2,'DefLocs'); + last if defined $loc2; + } + last unless defined $loc2; + ($loc,$ttype,$tname) = ($loc2,$type2,$name2); + } + next unless defined $loc; + return "href=\"$loc#${ttype}_$tname\""; } - my ($loc) = values %$locs; - return "href=\"$loc#${type}_$name\""; + return ''; } sub ahref ($$$) { @@ -259,6 +284,14 @@ sub process_file ($$) { in_enum($1,(ucfirst $2),$3); } } + } elsif (s/^(typedef \s+ )((struct|union|enum) \ (\w+)) + (\s+) (\w+)(\;)$ + / norm($1).norm($2).$5. + defn($6,'Typedef',$6,undef,[(ucfirst $3),$4]). + $7 /xe) { + } elsif (s/^(typedef \s+) (\w+) (\s+) (\w+) (\;)$ + / $1.norm($2).$3. + defn($4,'Typedef',$4,undef,['Typedef',$2]). $5 /xe) { } elsif (s/^( \s* \#define \s+ ) (\w+) ( \s+\S ) / $1.defmacro($2).norm($3) /xe) { } elsif (s/( \`incontents \s+ (\d+) \s+ (\w+) \s+ )(\S .* \S) @@ -315,6 +348,7 @@ END $forkind->('Func','Functions','','()'); $forkind->('Struct','Structs','struct ',''); $forkind->('Enum','Enums and sets of #defines','',''); + $forkind->('Typedef','Typedefs','typedef ',''); $forkind->('EnumVal','Enum values and individual #defines','',''); $o .= "\n

Files

    \n"; foreach my $of (sort { $a->[0] cmp $b->[0] } @outfiles) { -- cgit v1.2.3