枚举(遍历)指定C语言头文件的依赖关系

正则表达式、字符编码、字符处理

枚举(遍历)指定C语言头文件的依赖关系

帖子523066680 » 2015-12-11 20:35

示例库文件: "windows.h"
相关目录保存于 @dirs 数组中

备注:如果一个函数库已经出现过,则忽略,避免进入死循环
if ($Lv < 5) { 设定最大递归层,可不设限

Syntax: [ Download ] [ Hide ]
  1. =info 
  2.   523066680@163.com 
  3.   2015-06-09 
  4. =cut 
  5.  
  6. use feature 'state'; 
  7.  
  8. our @dirs = ( 
  9.   "C:/MinGW/lib/gcc/mingw32/4.7.2/include", 
  10.   "C:/MinGW/Include", 
  11. ); 
  12.  
  13. our %name; 
  14. our %hash; 
  15.  
  16. my $headfile = "windows.h"; 
  17. func(0, ".", $headfile); 
  18.  
  19. sub func { 
  20.   our @dirs; 
  21.   our %name; 
  22.   my $fullpath; 
  23.   my ($Lv, $parent, $fname) = @_; 
  24.   my @all; 
  25.  
  26.   foreach (@dirs) { 
  27.     if (-e "$_/$fname") { 
  28.       $fullpath = "$_/$fname"; 
  29.     } 
  30.   } 
  31.  
  32.   return if (exists $name{$fname}); 
  33.   return if (! defined $fullpath); 
  34.  
  35.   $name{$fname} = 1; 
  36.   Xprint($Lv, $parent, $fname); 
  37.   ReadFile(\@all, $fullpath); 
  38.  
  39.   foreach (@all) { 
  40.     if (/#include ["<](.*?)[">]/) { 
  41.       func($Lv+1, $parent.":".$fname, $1); 
  42.     } 
  43.   } 
  44.  
  45. sub Xprint { 
  46.   state $e = -1; 
  47.   my ($Lv, $parent, $fname) = @_; 
  48.   if ( $Lv <= $e) { 
  49.     print "\n"; 
  50.     print " "x(length($parent) + ($Lv)*2 - 1); 
  51.   } 
  52.   print " > " . $fname; 
  53.   $e = $Lv; 
  54.  
  55. sub ReadFile { 
  56.   my ($aref, $fullpath) = (shift, shift); 
  57.   open READ, "<", $fullpath or die "$!\n"; 
  58.   @{$aref} = <READ>; 
  59.   close READ; 


输出:
代码: 全选
> windows.h > _mingw.h > sdkddkver.h
             > winresrc.h > winuser.h
                          > winnt.h > winerror.h
                                    > string.h > stddef.h
                                    > basetsd.h
                                    > pshpack4.h
                                    > poppack.h
                          > winver.h
                          > dde.h
                          > dlgs.h
                          > commctrl.h > prsht.h
             > stdarg.h
             > windef.h
             > wincon.h
             > winbase.h
             > wingdi.h
             > winnls.h
             > winnetwk.h
             > winreg.h > reason.h
             > winsvc.h
             > cderr.h
             > ddeml.h
             > imm.h
             > lzexpand.h
             > mmsystem.h
             > nb30.h
             > rpc.h > rpcdce.h > basetyps.h
                                > rpcdcep.h
                     > rpcnsi.h
                     > rpcnterr.h
                     > excpt.h
             > shellapi.h > pshpack2.h
             > winperf.h
             > commdlg.h > unknwn.h > objfwd.h
                                    > wtypes.h > rpcndr.h > rpcnsip.h
             > winspool.h
             > winsock.h > mswsock.h
             > ole2.h > objbase.h > stdlib.h
                                  > objidl.h
                                  > cguid.h
                      > olectlid.h
                      > oleauto.h > oaidl.h
                      > oleidl.h
论坛已转移 Code-By.Org 群号 322023604
头像
523066680
版主
 
帖子: 1680
注册: 2012-03-06 15:08

回到 文本处理

在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客

cron
Not able to open ./cache/data_global.php