🤖

WinMergeプラグイン(COBOL行頭番号無視)

2021/03/28に公開

仕事でCOBOLのソースコードを比較したい時があった。
先輩方はdiff等を使っていたが、個人的にWinMergeを使いたかったので作成。

COBOLは行頭に6桁の行番号を振ることが多く、WinMergeで普通に差分を取ると変更行以降すべてが差分になってしまう。この問題を解決するためにプラグインで行先頭6桁目までを除外するようにした。

IgnoreCobolLineNo.sct
<scriptlet>
 
<implements type="Automation" id="dispatcher">
    <property name="PluginEvent">
        <get/>
    </property>
    <property name="PluginDescription">
        <get/>
    </property>
    <property name="PluginFileFilters">
        <get/>
    </property>
    <property name="PluginIsAutomatic">
        <get/>
    </property>
    <method name="UnpackFile"/>
    <method name="PackFile"/>
</implements>
 
<script language="VBS">
 
Option Explicit
 
Function get_PluginEvent()
    get_PluginEvent = "FILE_PACK_UNPACK"
End Function
 
Function get_PluginDescription()
    get_PluginDescription = "COBOLソースコードの行番号を削除する(1-6桁目)"
End Function
 
Function get_PluginFileFilters()
    get_PluginFileFilters = "\.cbl$;\.ecb$"
End Function
 
Function get_PluginIsAutomatic()
    get_PluginIsAutomatic = True
End Function
 
Function UnpackFile(fileSrc, fileDst, pbChanged, pSubcode)
    Dim fso
    Dim foSrc
    Dim foDst
     
    Set fso = CreateObject("Scripting.FileSystemObject")
     
    '読み取り専用モード
    Set foSrc = fso.OpenTextFile(fileSrc, 1, True)
    '上書きモード
    Set foDst = fso.OpenTextFile(fileDst, 2, True)
     
    '1行づつ読み込む
    Dim srcLine
    Dim dstLine
    Do Until foSrc.AtEndOfStream
        srcLine = foSrc.ReadLine
        
        '行先頭の行番号(6桁)を削除する
        If Len(srcLine) - 6 <= 0 Then
            dstLine = ""
        Else
            dstLine = Right(srcLine, Len(srcLine) - 6)
        End If
        
        foDst.WriteLine(dstLine)
    Loop
     
    foSrc.Close
    foDst.Close
     
    Set foSrc = Nothing
    Set foDst = Nothing
    Set fso = Nothing
     
    pbChanged = True
    pSubcode = 0
    UnpackFile = True
End Function
 
Function PackFile(fileSrc, fileDst, pbChanged, pSubcode)
    PackFile = False
End Function
 
</script>
</scriptlet>

Discussion