• 整合UMDH结果的一个小工具


    ua.exe使用方法:

    1、将UMDH生成的logcompare.txt改名为1.txt,内容示例:

      1 // Debug library initialized ...
      2 DBGHELP: moxia_d - private symbols & lines 
      3          E:p06
    un_clientBinmoxia_d.pdb
      4 DBGHELP: ntdll - export symbols
      5 DBGHELP: kernel32 - export symbols
      6 DBGHELP: KERNELBASE - export symbols
      7 DBGHELP: dbghelp - public symbols  
      8          D:Symbolsdbghelp.pdb4BC9BC6DED254508BF3551E750E992643dbghelp.pdb
      9 DBGHELP: msvcrt - public symbols  
     10          D:Symbolsmsvcrt.pdbF1D253F9555C46DF8076400A52B3A9292msvcrt.pdb
     11 DBGHELP: ADVAPI32 - export symbols
     12 DBGHELP: sechost - public symbols  
     13          D:Symbolssechost.pdb7AF14D02D41E4CD6942745FE0E6372B11sechost.pdb
     14 DBGHELP: RPCRT4 - export symbols
     15 DBGHELP: WINMM - public symbols  
     16          D:Symbolswinmm.pdb7AFD98FCAAD34F6B8B31A4667C4E2BFC2winmm.pdb
     17 DBGHELP: USER32 - public symbols  
     18          D:Symbolsuser32.pdbDD74D86F12624845A42A6A5BAAB4D7A82user32.pdb
     19 DBGHELP: GDI32 - export symbols
     20 DBGHELP: LPK - export symbols
     21 DBGHELP: USP10 - export symbols
     22 DBGHELP: PSAPI - public symbols  
     23          D:Symbolspsapi.pdbA895A052F325481B9E2DA00A29E8D5DF2psapi.pdb
     24 DBGHELP: wke - private symbols & lines 
     25          E:p06
    un_clientBinwke.pdb
     26 DBGHELP: ole32 - private symbols & lines 
     27          D:Symbolsole32.pdb5061F11A9A57433595EA5EA75A156F4B2ole32.pdb
     28 DBGHELP: iphlpapi - public symbols  
     29          D:Symbolsiphlpapi.pdbF162D2E137ED42978BF38C99AEE2DAAB2iphlpapi.pdb
     30 DBGHELP: NSI - public symbols  
     31          D:Symbols
    si.pdbD15A81679FAE4A7392344B6FD26867942
    si.pdb
     32 DBGHELP: WINNSI - public symbols  
     33          D:Symbolswinnsi.pdbF7A0C25B1B0E4FA6876494D3F6BFD1012winnsi.pdb
     34 DBGHELP: WS2_32 - public symbols  
     35          D:Symbolsws2_32.pdb18C960B958404C4F80F686EE978A33D42ws2_32.pdb
     36 DBGHELP: SHELL32 - export symbols
     37 DBGHELP: SHLWAPI - public symbols  
     38          D:Symbolsshlwapi.pdbE128B1CEE2EB438C8646E6967118F33E2shlwapi.pdb
     39 DBGHELP: VERSION - public symbols  
     40          D:Symbolsversion.pdb52234E5C7EC44646B62D56357B2C94872version.pdb
     41 DBGHELP: MSIMG32 - public symbols  
     42          D:Symbolsmsimg32.pdb13C89B70614E4E7FB1C677D443D15D182msimg32.pdb
     43 DBGHELP: ijl15 - export symbols
     44 DBGHELP: MFC80D - private symbols & lines 
     45          D:SymbolsMFC80D.i386.pdb86AA8DF59ABF432D8650175ACAE12170eMFC80D.i386.pdb
     46 DBGHELP: MSVCR80D - private symbols & lines 
     47          D:Symbolsmsvcr80d.i386.pdb5B7548CDAC834BBCB4600BC0177659C61msvcr80d.i386.pdb
     48 DBGHELP: COMCTL32 - export symbols
     49 DBGHELP: OLEAUT32 - public symbols  
     50          D:Symbolsoleaut32.pdb68047829A4754E789AC1C8035BA168CD2oleaut32.pdb
     51 DBGHELP: MSVCP80D - private symbols & lines 
     52          D:Symbolsmsvcp80d.i386.pdbC9DDCE5461B6402B8832D85B19A8B92F1msvcp80d.i386.pdb
     53 DBGHELP: d3d9 - public symbols  
     54          D:Symbolsd3d9.pdbF55AEB50462B473F9733515DC6532DAF2d3d9.pdb
     55 DBGHELP: d3d8thk - public symbols  
     56          D:Symbolsd3d8thk.pdbD9C3A335615F448EA0B012D76716E6B72d3d8thk.pdb
     57 DBGHELP: dwmapi - public symbols  
     58          D:Symbolsdwmapi.pdbD8D91B3F339A4FDC960FC7121D146DF42dwmapi.pdb
     59 DBGHELP: IMM32 - public symbols  
     60          D:Symbolsimm32.pdb91A0004474E24AA89F185029E31144892imm32.pdb
     61 DBGHELP: MSCTF - public symbols  
     62          D:Symbolsmsctf.pdb173DAEF86B2548DBA6134EB74C4D2F232msctf.pdb
     63 DBGHELP: DSOUND - public symbols  
     64          D:Symbolsdsound.pdbF38F478065E247C68EDA699606F56EED2dsound.pdb
     65 DBGHELP: POWRPROF - public symbols  
     66          D:Symbolspowrprof.pdbB1F8F66CCBAD4869BADFD20C1F24AC832powrprof.pdb
     67 DBGHELP: SETUPAPI - public symbols  
     68          D:Symbolssetupapi.pdbC6B7CC380FCD42C29EDB1B61757DFD922setupapi.pdb
     69 DBGHELP: CFGMGR32 - public symbols  
     70          D:Symbolscfgmgr32.pdb93B1A0A82F114743AF9AABB1A17382462cfgmgr32.pdb
     71 DBGHELP: DEVOBJ - public symbols  
     72          D:Symbolsdevobj.pdb5EC40EC65C5045EB96F4CFDCFC6E19062devobj.pdb
     73 DBGHELP: MFC80CHS - no symbols loaded
     74 DBGHELP: uxtheme - public symbols  
     75          D:SymbolsUxTheme.pdb5BECAB35E7714835A6BF3DADD891BB3A2UxTheme.pdb
     76 DBGHELP: CRYPTBASE - public symbols  
     77          D:Symbolscryptbase.pdbE62FEAE559EE4CD995614215B01AC2102cryptbase.pdb
     78 DBGHELP: CLBCatQ - public symbols  
     79          D:SymbolsCLBCatQ.pdb0A720C79BAC402295B6EBDC147257182CLBCatQ.pdb
     80 DBGHELP: mlang - export symbols
     81 DBGHELP: nvd3dum - export symbols
     82 DBGHELP: MMDevApi - public symbols  
     83          D:SymbolsMMDevAPI.pdb941E45A63E8F457D90CE29CC508C34B92MMDevAPI.pdb
     84 DBGHELP: PROPSYS - public symbols  
     85          D:Symbolspropsys.pdbD0EDA507E53D4579A337F875012D7B482propsys.pdb
     86 DBGHELP: AUDIOSES - public symbols  
     87          D:SymbolsAudioSes.pdbA88FCF91944949A8A1863D1592BB2FD12AudioSes.pdb
     88 DBGHELP: quartz - public symbols  
     89          D:Symbolsquartz.pdb80E345FD1EE54FBAB8211528D99BC28C2quartz.pdb
     90 DBGHELP: dhcpcsvc6 - export symbols
     91 DBGHELP: dhcpcsvc - public symbols  
     92          D:Symbolsdhcpcsvc.pdbD3E01A80603143AC83EA5801BEC674D82dhcpcsvc.pdb
     93 DBGHELP: devenum - public symbols  
     94          D:Symbolsdevenum.pdb728AEF77CC244D8BADC3F6255CE396B31devenum.pdb
     95 DBGHELP: DShowRdpFilter - public symbols  
     96          D:SymbolsDShowRdpFilter.pdb4722ABE2B47D49B994FE311D5B2097BC1DShowRdpFilter.pdb
     97 DBGHELP: WTSAPI32 - public symbols  
     98          D:Symbolswtsapi32.pdb1F1D3CBAE8A447E5BF304735F21CB4132wtsapi32.pdb
     99 DBGHELP: WINSTA - public symbols  
    100          D:Symbolswinsta.pdb2A3148024D094FFEB24C3996E47658312winsta.pdb
    101 DBGHELP: slc - export symbols
    102 DBGHELP: LAVSplitter - export symbols
    103 DBGHELP: COMCTL32 - public symbols  
    104          D:Symbolscomctl32.pdbB4CE90AAB95E4B89A22A7711DFD7E6EF2comctl32.pdb
    105 DBGHELP: avformat-lav-54 - export symbols
    106 DBGHELP: avcodec-lav-54 - export symbols
    107 DBGHELP: avutil-lav-51 - export symbols
    108 DBGHELP: libbluray - export symbols
    109 DBGHELP: VSFilter - export symbols
    110 DBGHELP: COMDLG32 - public symbols  
    111          D:Symbolscomdlg32.pdb96BC483CDFF04D1AAFE462F093B954EC2comdlg32.pdb
    112 DBGHELP: WINSPOOL - public symbols  
    113          D:Symbolswinspool.pdbB165BBE7CD8C4F39BE373C0D9DFCD77B2winspool.pdb
    114 DBGHELP: WININET - export symbols
    115 DBGHELP: urlmon - export symbols
    116 DBGHELP: CRYPT32 - export symbols
    117 DBGHELP: MSASN1 - public symbols  
    118          D:Symbolsmsasn1.pdb03D5F0E24804B20953A7A021B52FC322msasn1.pdb
    119 DBGHELP: iertutil - export symbols
    120 DBGHELP: AviSplitter - export symbols
    121 DBGHELP: OggSplitter - export symbols
    122 DBGHELP: MpegSplitter - export symbols
    123 DBGHELP: MpaSplitter - export symbols
    124 DBGHELP: ffdshow - export symbols
    125 DBGHELP: DINPUT - public symbols  
    126          D:Symbolsdinput.pdbA355C027AC914C65A03AE2C06EBC117C1dinput.pdb
    127 DBGHELP: SspiCli - export symbols
    128 DBGHELP: LAVAudio - export symbols
    129 DBGHELP: msdmo - public symbols  
    130          D:Symbolsmsdmo.pdb7E91458399E34CF99F0C993D9128BB301msdmo.pdb
    131 DBGHELP: qasf - public symbols  
    132          D:Symbolsqasf.pdb9BD26FFA3B5F4FDBA04379D9F92935DD1qasf.pdb
    133 DBGHELP: mp3dmod - public symbols  
    134          D:SymbolsMP3DMOD.pdb54618A168148428DADB4CE0B4628168F2MP3DMOD.pdb
    135 DBGHELP: mfplat - public symbols  
    136          D:SymbolsMFPLAT.pdbF512BAE9BAA14B87A898050CB20C0E3B2MFPLAT.pdb
    137 DBGHELP: AVRT - public symbols  
    138          D:Symbolsavrt.pdbA15E148ACFC74F88A0A6DAF71CC916472avrt.pdb
    139 DBGHELP: ac3filter - export symbols
    140 DBGHELP: ac3filter_intl - export symbols
    141 DBGHELP: wdmaud - public symbols  
    142          D:Symbolswdmaud.pdbF232D0B492574D7992D5805BEF84A01E2wdmaud.pdb
    143 DBGHELP: ksuser - public symbols  
    144          D:Symbolsksuser.pdb7AE6BFAC128C4C57BAAF1C0B79FA95B42ksuser.pdb
    145 DBGHELP: msacm32 - public symbols  
    146          D:Symbolsmsacm32.pdbEB29395AE01743DB8C5DCB7F5A1350F91msacm32.pdb
    147 DBGHELP: MSACM32 - public symbols  
    148          D:Symbolsmsacm32.pdb3D318D5E38C54502B64578F0710A510F2msacm32.pdb
    149 DBGHELP: midimap - public symbols  
    150          D:Symbolsmidimap.pdb49F76FA53B854E54A748A2B4301471B62midimap.pdb
    151 DBGHELP: CRYPTSP - export symbols
    152 DBGHELP: rsaenh - export symbols
    153 //                                                                          
    154 // Each log entry has the following syntax:                                 
    155 //                                                                          
    156 // + BYTES_DELTA (NEW_BYTES - OLD_BYTES) NEW_COUNT allocs BackTrace TRACEID 
    157 // + COUNT_DELTA (NEW_COUNT - OLD_COUNT) BackTrace TRACEID allocations      
    158 //     ... stack trace ...                                                  
    159 //                                                                          
    160 // where:                                                                   
    161 //                                                                          
    162 //     BYTES_DELTA - increase in bytes between before and after log         
    163 //     NEW_BYTES - bytes in after log                                       
    164 //     OLD_BYTES - bytes in before log                                      
    165 //     COUNT_DELTA - increase in allocations between before and after log   
    166 //     NEW_COUNT - number of allocations in after log                       
    167 //     OLD_COUNT - number of allocations in before log                      
    168 //     TRACEID - decimal index of the stack trace in the trace database     
    169 //         (can be used to search for allocation instances in the original  
    170 //         UMDH logs).                                                      
    171 //                                                                          
    172 
    173 
    174 + 80330496 ( 80330496 -      0)   5382 allocs    BackTrace1628EDB8
    175 +    5382 (   5382 -      0)    BackTrace1628EDB8    allocations
    176 
    177     ntdll!EtwSetMark+000023ED
    178     MSVCR80D!_heap_alloc_base+0000005C (f:ddvctoolscrt_bldself_x86crtsrcmalloc.c, 105)
    179     MSVCR80D!_heap_alloc_dbg+000001F5 (f:ddvctoolscrt_bldself_x86crtsrcdbgheap.c, 411)
    180     MSVCR80D!_nh_malloc_dbg+00000019 (f:ddvctoolscrt_bldself_x86crtsrcdbgheap.c, 268)
    181     MSVCR80D!malloc+00000019 (f:ddvctoolscrt_bldself_x86crtsrcdbgheap.c, 154)
    182     moxia_d!stRleFrame::Read+0000012D (e:p06sourcescachestframe.cpp, 1331)
    183     moxia_d!stRleGroup::Load+0000011E (e:p06sourcescachestframe.cpp, 1521)
    184     moxia_d!cResourceRle::LoadAGroup+00000072 (e:p06sourcescachecresourcerle.cpp, 615)
    185     moxia_d!Load+0000007A (e:p06sourcescachecresource.cpp, 89)
    186     moxia_d!PreloadRes+000000C9 (e:p06sourcescachecresource.cpp, 119)
    187     MFC80D!_AfxThreadEntry+000002DC (f:ddvctoolsvc7libsshipatlmfcsrcmfc	hrdcore.cpp, 109)
    188     MSVCR80D!_callthreadstartex+00000051 (f:ddvctoolscrt_bldself_x86crtsrc	hreadex.c, 348)
    189     MSVCR80D!_threadstartex+00000087 (f:ddvctoolscrt_bldself_x86crtsrc	hreadex.c, 331)
    190     kernel32!BaseThreadInitThunk+00000012
    191     ntdll!RtlInitializeExceptionChain+000000EF
    192     ntdll!RtlInitializeExceptionChain+000000C2
    193 
    194 + 15728662 ( 15728662 -      0)      1 allocs    BackTrace849BAB0
    195 +       1 (      1 -      0)    BackTrace849BAB0    allocations
    196 
    197     ntdll!EtwSetMark+000023ED
    198     MSVCR80D!_heap_alloc_base+0000005C (f:ddvctoolscrt_bldself_x86crtsrcmalloc.c, 105)
    199     MSVCR80D!_heap_alloc_dbg+000001F5 (f:ddvctoolscrt_bldself_x86crtsrcdbgheap.c, 411)
    200     MSVCR80D!_nh_malloc_dbg+00000019 (f:ddvctoolscrt_bldself_x86crtsrcdbgheap.c, 268)
    201     MSVCR80D!malloc+00000019 (f:ddvctoolscrt_bldself_x86crtsrcdbgheap.c, 154)
    202     MSVCR80D!operator new+0000000F (f:ddvctoolscrt_bldself_x86crtsrcnew.cpp, 59)
    203     MSVCP80D!std::_Allocate<char>+00000043 (f:ddvctoolscrt_bldself_x86crtsrcxmemory, 44)
    204     MSVCP80D!std::allocator<char>::allocate+00000012 (f:ddvctoolscrt_bldself_x86crtsrcxmemory, 152)
    205     moxia_d!std::vector<char,std::allocator<char> >::_Insert_n+00000139
    206     moxia_d!std::vector<char,std::allocator<char> >::resize+00000075
    207     moxia_d!std::vector<char,std::allocator<char> >::resize+0000001C
    208     moxia_d!cBmp::Load+00000176 (e:p06sourcescachecfont.cpp, 346)
    209     moxia_d!cFont::Load+000001C0 (e:p06sourcescachecfont.cpp, 91)
    210     moxia_d!CMainWnd::OnCreate+000001DE (e:p06sourcesclientmainwnd.cpp, 910)
    211     MFC80D!CWnd::OnWndMsg+000007FE (f:ddvctoolsvc7libsshipatlmfcsrcmfcwincore.cpp, 2000)
    212     MFC80D!CWnd::WindowProc+00000030 (f:ddvctoolsvc7libsshipatlmfcsrcmfcwincore.cpp, 1741)
    213     moxia_d!CMainWnd::WindowProc+000018C0 (e:p06sourcesclientmainwndinput.cpp, 3967)
    214     MFC80D!AfxCallWndProc+000000EE (f:ddvctoolsvc7libsshipatlmfcsrcmfcwincore.cpp, 240)
    215     MFC80D!AfxWndProc+000000A4 (f:ddvctoolsvc7libsshipatlmfcsrcmfcwincore.cpp, 389)
    216     MFC80D!AfxWndProcBase+00000059 (f:ddvctoolsvc7libsshipatlmfcsrcmfcafxstate.cpp, 411)
    217     USER32!InternalCallWinProc+00000023
    218     USER32!UserCallWinProcCheckWow+000000E0
    219     USER32!DispatchClientMessage+000000DA
    220     USER32!__fnINLPCREATESTRUCT+0000008B
    221     ntdll!KiUserCallbackDispatcher+0000002E
    222     USER32!_CreateWindowEx+00000201
    223     USER32!CreateWindowExA+00000033
    224     MFC80D!AfxCtxCreateWindowExA+000000A1 (f:ddvctoolsvc7libsshipatlmfcincludeafxcomctl32.h, 438)
    225     MFC80D!CWnd::CreateEx+0000014A (f:ddvctoolsvc7libsshipatlmfcsrcmfcwincore.cpp, 694)
    226     MFC80D!CWnd::CreateEx+0000005B (f:ddvctoolsvc7libsshipatlmfcsrcmfcwincore.cpp, 659)
    227     moxia_d!CMainWnd::Create+000003B7 (e:p06sourcesclientmainwnd.cpp, 778)
    228     moxia_d!CGameClient::InitInstance+00000984 (e:p06sourcesclientclient.cpp, 558)
    229 
    230 
    231 /////////////////////////////////////////////////////////
    232 // 后面还有很多 ............

    2、使用脚本运行:

     1 ua.exe 1.txt -yes:ScriptMgr::LoadFile
     2 ua.exe 2.txt -yes:cBmp::Load
     3 ua.exe 3.txt -yes:cStatic::RestoreDeviceObjects
     4 ua.exe 4.txt -yes:cBackground::LoadFile
     5 ua.exe 5.txt -yes:cPropertyTable::Load
     6 ua.exe 6.txt -yes:CD3DApplication::Create
     7 ua.exe 7.txt -yes:PreloadRes
     8 ua.exe 8.txt -yes:LeaderBoardCMgr::Init
     9 ua.exe 9.txt -yes:Magic_CreateStatic
    10 ua.exe 10.txt -yes:CMainWnd::CreateGui
    11 ua.exe 11.txt -yes:cDevice::MDDrawPresent
    12 ua.exe 12.txt -yes:cMp3::PlayNext
    13 ua.exe 13.txt -yes:e:p06sources	olualparser.c
    14 ua.exe 14.txt -yes:cWorldClient::CreateTable
    15 ua.exe 15.txt -yes:CMainWnd::CreateSoundManager
    16 ua.exe 16.txt -yes:CMainWnd::OnCreate
    17 ua.exe 17.txt -no:moxia_d!
    18 ua.exe 18.txt -yes:CMainWnd::Draw
    19 ua.exe 19.txt -whatever

    3、生成结果示例:

    生成ua.exe的代码:

      1 #include <stdafx.h>
      2 #include <windows.h>
      3 #include <assert.h>
      4 #include <string>
      5 #include <vector>
      6 #include <Psapi.h>
      7 using namespace std;
      8 
      9 // void string_MakeSurePathExists2( string path )
     10 // {
     11 //     assert(path.find('/') == string::npos);
     12 // 
     13 //     int index = path.find("\", 0);
     14 //     while (index != string::npos)
     15 //     {
     16 //         CreateDirectoryA(path.substr(0, index).c_str(), NULL);
     17 //         index = path.find("\", index + 1);
     18 //     }
     19 // }
     20 #define LINES 64
     21 #define BUFS 1024
     22 
     23 typedef char TBUFF[BUFS];
     24 
     25 bool readline(FILE* fp, TBUFF buf)
     26 {
     27     int index = 0;
     28     while (1)
     29     {
     30         char& ch = buf[index];
     31         if (0 == fread(&ch, 1, 1, fp))
     32         {
     33             if (index > 0)
     34             {
     35                 buf[index + 1] = 0;
     36                 return true;
     37             }
     38 
     39             return false;
     40         }
     41         if (ch == '
    ')
     42         {
     43             buf[index + 1] = 0;
     44             return true;
     45         }
     46         if (++index >= BUFS - 1)
     47             return false;
     48     }
     49     return false;
     50 }
     51 
     52 inline bool isemptychar(char ch)
     53 {
     54     return (ch == ' ' || ch == '
    ' || ch == '
    ' || ch == '	');
     55 }
     56 
     57 bool isemptyline(TBUFF buf)
     58 {
     59     int i = 0;
     60     char ch;
     61     while (ch = buf[i++])
     62     {
     63         if (!isemptychar(ch))
     64             return false;
     65     }
     66     return true;
     67 }
     68 
     69 bool readblock(FILE* fp, TBUFF bufs[LINES], int& lines)
     70 {
     71     bool bPlus = false;
     72     bool bGTH = false;
     73     lines = 0;
     74 
     75     while (1)
     76     {
     77         TBUFF& pLine = bufs[lines];
     78         if (!readline(fp, pLine))
     79         {
     80             return bPlus;
     81         }
     82 
     83         bool bFirst = ((pLine[0] == '+' || pLine[0] == '-') && strstr(pLine, "allocs"));
     84         if (!bPlus)
     85         {
     86             if (bFirst)
     87                 bPlus = true;
     88         }
     89         else
     90         {
     91             if (!bGTH)
     92             {
     93                 if (strstr(pLine, "!"))
     94                     bGTH = true;
     95             }
     96             else 
     97             {
     98                 if (isemptyline(pLine))
     99                 {
    100                     ++lines;
    101                     return true;
    102                 }
    103             }
    104         }
    105 
    106         if (bPlus)
    107             ++lines;
    108     }
    109 }
    110 
    111 int getbytesfromrow(TBUFF buf)
    112 {
    113 //    int positive = (buf[0] == '+');
    114 
    115     char nums[16] = {0};
    116     int N = 0;
    117 
    118     int B = 0;
    119     char ch;
    120 
    121     bool bFound = false;
    122 
    123     while (ch = buf[B++])
    124     {
    125         if (!bFound)
    126         {
    127             if (ch >= '0' && ch <= '9')
    128             {
    129                 bFound = true;
    130                 nums[N++] = ch;
    131             }
    132         }
    133         else
    134         {
    135             if (ch >= '0' && ch <= '9')
    136                 nums[N++] = ch;
    137             else
    138                 break;
    139         }
    140     }
    141 
    142     if (N == 0)
    143         return 0;
    144     return atoi(nums);
    145 }
    146 
    147 void handleinvalidfilename(char* p)
    148 {
    149     static const char invalid_ch[] = { '/','\',':','*','?','<','>','|' };
    150     while (*p)
    151     {
    152         for (int i = 0; i < sizeof(invalid_ch); i++)
    153         {
    154             if (*p == invalid_ch[i])
    155             {
    156                 *p = '_';
    157                 break;
    158             }
    159         }
    160         p++;
    161     }
    162 }
    163 
    164 struct ParamInfo
    165 {
    166     BOOL bWhatever; // 当这个为TRUE,下面2个无效
    167     std::vector<std::string > vecKeyYes;
    168     std::vector<std::string > vecKeyNo;
    169 };
    170 
    171 bool matchparam(TBUFF bufs[LINES], int lines, ParamInfo* param)
    172 {
    173     if (param->bWhatever)
    174         return true;
    175 
    176     bool bHaveNo = param->vecKeyNo.size() > 0;
    177     bool bHaveYes = param->vecKeyYes.size() > 0;
    178 
    179     if (bHaveNo)
    180     {
    181         for (int i = 0; i < lines; i++)
    182         {
    183             TBUFF& buf = bufs[i];
    184             for (int j = 0; j < (int)param->vecKeyNo.size(); j++)
    185             {
    186                 if (strstr(buf, param->vecKeyNo[j].c_str()))
    187                     return false;
    188             }
    189         }
    190     }
    191 
    192     if (bHaveYes)
    193     {
    194         for (int i = 0; i < lines; i++)
    195         {
    196             TBUFF& buf = bufs[i];
    197             for (int j = 0; j < (int)param->vecKeyYes.size(); j++)
    198             {
    199                 if (strstr(buf, param->vecKeyYes[j].c_str()))
    200                     return true;
    201             }
    202         }
    203         return false;
    204     }
    205     else
    206     {
    207         return true;
    208     }
    209 }
    210 
    211 #define KeyWhatever  "-whatever"    // 随便什么都算
    212 #define KeyYes  "-yes:"             // 必须某一行包含这个
    213 #define KeyNo  "-no:"               // 所有行不得包含这个
    214 
    215 void parseparam(char* argv, ParamInfo* param)
    216 {
    217     param->bWhatever = FALSE;
    218     char* p;
    219     if (strstr(argv, KeyWhatever) == argv)
    220     {
    221         param->bWhatever = TRUE;
    222     }
    223     else if (strstr(argv, KeyYes) == argv)
    224     {
    225         p = argv + strlen(KeyYes);
    226         param->vecKeyYes.push_back(p);
    227     }
    228     else if (strstr(argv, KeyNo) == argv)
    229     {
    230         p = argv + strlen(KeyNo);
    231         param->vecKeyNo.push_back(p);
    232     }
    233 }
    234 
    235 // 检查参数
    236 // 返回 true表示可以继续执行
    237 bool checkparam(ParamInfo* param)
    238 {
    239     if (param->bWhatever)
    240     {
    241         if (param->vecKeyYes.size() > 0 || param->vecKeyNo.size() > 0)
    242         {
    243             printf("警告:已指定%s,将忽略其它参数
    ", KeyWhatever);
    244         }
    245         return true;
    246     }
    247     else
    248     {
    249         if (param->vecKeyYes.size() > 0 || param->vecKeyNo.size() > 0)
    250         {
    251             return true;
    252         }
    253         else
    254         {
    255             printf("错误:没有指定任何有效参数
    ");
    256             return false;
    257         }
    258     }
    259 }
    260 
    261 void printusage()
    262 {
    263     printf("用法: this.exe TARGETFILE [%s] | [[%sxxx] * N] [[%syyy] * N]"
    264         "
    TARGETFILE 请从 1.txt 开始"
    265         "
    %s表示所有都匹配"
    266         "
    %s表示任何一行带有这个就行"
    267         "
    %s表示任何一行都不得带这个"
    268         "
    例如:this.exe 1.txt %s"
    269         "
    例如:this.exe 1.txt %sScriptMgr::LoadFile %scBmp::Load"
    270         "
    例如:this.exe 1.txt %smoxia_d!"
    271         "
    ",
    272         KeyWhatever, KeyYes, KeyNo, 
    273         KeyWhatever, 
    274         KeyYes, 
    275         KeyNo, 
    276         KeyWhatever, 
    277         KeyYes, KeyYes, 
    278         KeyNo
    279         );
    280 
    281     getchar();
    282 }
    283 
    284 void main(int argc, char* argv[])
    285 {   
    286     if (argc < 3)
    287     {
    288         printusage();
    289         return;
    290     }
    291 
    292     FILE* fpSrc = 0;
    293     FILE* fpDst = 0;
    294     std::string t1, t2;
    295     FILE* fpT1 = 0;
    296     FILE* fpT2 = 0;
    297 
    298     int bytesSum = 0;
    299     char outputFolderName[MAX_PATH];
    300     char outputFolderNameR[MAX_PATH];
    301 
    302     do
    303     {
    304         // src file
    305         const char* fileName = argv[1];
    306         fpSrc = fopen(fileName, "r");
    307         if (NULL == fpSrc) 
    308         {
    309             printf("open %s error.
    ", fileName);
    310             break;
    311         }
    312 
    313         // dst file
    314         char RfileName[MAX_PATH];
    315         sprintf(RfileName, "%d.txt", atoi(fileName) + 1);
    316         fpDst = fopen(RfileName, "w");
    317         if (NULL == fpDst) 
    318         {
    319             printf("open %s error.
    ", RfileName);
    320             break;
    321         }
    322 
    323         // parameters
    324         ParamInfo param;
    325         for (int i = 2; i < argc; i++)
    326         {
    327             parseparam(argv[i], &param);
    328         }
    329         if (!checkparam(&param))
    330         {
    331             printusage();
    332             break;
    333         }
    334 
    335         // dst folder
    336         memset(outputFolderName, 0, MAX_PATH);
    337         if (param.bWhatever)
    338             sprintf(outputFolderName, "%d %s", atoi(fileName), KeyWhatever);
    339         else if (param.vecKeyYes.size() > 0)
    340             sprintf(outputFolderName, "%d %s", atoi(fileName), param.vecKeyYes[0].c_str());
    341         else if (param.vecKeyNo.size() > 0)
    342             sprintf(outputFolderName, "%d no %s", atoi(fileName), param.vecKeyNo[0].c_str());
    343         else
    344             sprintf(outputFolderName, "%d", atoi(fileName));
    345         handleinvalidfilename(outputFolderName);
    346         if (!CreateDirectory(outputFolderName, NULL))
    347         {
    348             printf("CreateDirectory %s error.
    ", outputFolderName);
    349             break;
    350         }
    351         t1 = std::string(outputFolderName) + "\1.txt";
    352         t2 = std::string(outputFolderName) + "\2.txt";
    353         fpT1 = fopen(t1.c_str(), "w");
    354         fpT2 = fopen(t2.c_str(), "w");
    355 
    356         TBUFF bufs[LINES];
    357         int lines;
    358         while (1)
    359         {
    360             if (!readblock(fpSrc, bufs, lines))
    361             {
    362                 break;
    363             }
    364 
    365             // 是否 match
    366             bool bMatch = matchparam(bufs, lines, &param);
    367             if (!bMatch)
    368             {
    369                 // 不匹配就输出到下一个文本中
    370                 for (int i = 0; i < lines; i++)
    371                     fprintf(fpDst, bufs[i]);
    372             }
    373             else
    374             {
    375                 // 匹配就输出到对应的文件夹内
    376                 int bytes = getbytesfromrow(bufs[0]);
    377                 if (bufs[0][0] == '-')
    378                     bytes = -bytes;
    379                 fprintf(fpT1, "%d
    ", bytes);
    380                 bytesSum += bytes;
    381                 for (int i = 0; i < lines; i++)
    382                     fprintf(fpT2, bufs[i]);
    383             }
    384         }
    385 
    386         fprintf(fpT1, "Total %d
    ", bytesSum);
    387 
    388     } while(false);
    389 
    390     if (fpSrc) fclose(fpSrc);
    391     if (fpDst) fclose(fpDst);
    392     if (fpT1) fclose(fpT1);
    393     if (fpT2) fclose(fpT2);   
    394 
    395     if (abs(bytesSum) >= 1024 * 1024)
    396         sprintf(outputFolderNameR, "%s (%.1f MB)", outputFolderName, (float)bytesSum/1024/1024);
    397     else if (abs(bytesSum) >= 1024)
    398         sprintf(outputFolderNameR, "%s (%d KB)", outputFolderName, bytesSum/1024);
    399     else
    400         sprintf(outputFolderNameR, "%s (%d Bytes)", outputFolderName, bytesSum);
    401     rename(outputFolderName, outputFolderNameR);
    402 }
  • 相关阅读:
    eclipse中集成python开发环境
    取消eclipse英文单词拼写验证
    exe所在路径
    [转]关于Megatops BinCalc RPN计算器的说明
    WinDbg 蓝屏dump分析教程
    Delphi与Windows 7下的用户账户控制(UAC)机制 及 禁用兼容性助手
    【Delphi7】 解决“程序第一次可以正常编译,但再次编译的时候会报错,必须重新打开Delphi”的问题
    解决xftp远程连接中文乱码
    创建用资源管理器打开FTP位置
    收藏夹里的js
  • 原文地址:https://www.cnblogs.com/answerwinner/p/3741025.html
Copyright © 2020-2023  润新知