18 "headers!",\$opt_headers,
24 my($ref,$missval,$sub)=@_;
26 $$ref=$missval if !defined $$ref;
32 my($slot,$type,$symref)=@_;
34 defmiss(\$slot,{},sub {
36 push(@{$$$typeref{$type}},$symref);
44 $sym{"fn_c"}=~s#^$ENV{PWD}/#./# if defined $sym{"fn_c"};
45 defmiss(\$symtab{$sym{"name"}},{},sub {
47 my($type)=$sym{"type"};
48 addsymtype($$slotref,$type,\%sym);
49 addsymtype($$slotref,$type,\%sym)
50 if ($type!~/nU/ && ($type=~s/(n)[[:upper:]]/$1+/ || $type=~s/(n)[[:lower:]]/$1-/));
54 open(NM,"-|",'find -name "*.o"|xargs -- '.$opt_nm.' -f posix --print-file-name --no-sort --line-numbers')
55 or die "Cannot get nm output: $!";
58 die "Line $. of nm output not recognized: $_"
60 if !/^([^:]*):\s*(\S*) (\w) [^\t]*(?:\t(.*))?$/;
71 open(CTAGS,"-|",'find -name "*.h"|xargs ctags -f - --c-types=xp')
72 or die "Cannot get ctags output: $!";
75 die "Line $. of ctags output not recognized: $_"
77 if !/^([^\t]*)\t([^\t]*)\t.*\t(\S+)$/;
87 print Data::Dumper->Dump([\%symtab],["%symtab"]) if $D;
93 print("$error ".$arr[0]{"name"}.($arr[0]{"type"}=~/cp|n[tT]/ ? "()" : "").":\n");
95 while ($symref=shift(@arr)) {
97 if (defined($$symref{"fn_c"})) {
98 print($$symref{"fn_c"});
99 print("\t(".$$symref{"fn_o"}.")") if defined $$symref{"fn_o"};
102 my($fn)=$$symref{"fn_o"};
114 return [] if !defined($ref);
119 foreach $symname (sort keys %symtab) {
120 my($typesref)=$symtab{$symname};
121 my($ref,$ref1,$ref2);
123 # >=2 n[:upper:]\U symbols => global conflict
124 if (@{refendef($ref=$$typesref{"n+"})}>=2) {
125 dumpsyms("global conflict",@{$ref});
128 # >=1 n[:upper:]\U symbol && >=1 n[:lower:] symbol => local override
129 if (@{refendef($ref1=$$typesref{"n+"})}>=1 && @{refendef($ref2=$$typesref{"n-"})}>=1) {
130 dumpsyms("local override of global",@{$ref1});
131 dumpsyms(" -- with local",@{$ref2});
134 # >=1 n[:upper:]\U symbol && ==0 nU symbol => global singularity
135 if (@{refendef($ref=$$typesref{"n+"})}>=1 && @{refendef($$typesref{"nU"})}==0) {
136 dumpsyms("global singularity",@{$ref});
139 # >=1 cx symbol && ==0 n[:upper:]\U symbol => floating extern data
140 if (@{refendef($ref=$$typesref{"cx"})}>=1 && @{refendef($$typesref{"n+"})}==0) {
141 dumpsyms("floating extern data",@{$ref});
144 # >=1 cp symbol && ==0 n[:upper:]\U symbol => floating extern func
145 if (@{refendef($ref=$$typesref{"cp"})}>=1 && @{refendef($$typesref{"n+"})}==0) {
146 dumpsyms("floating extern func",@{$ref});