C言語、java 、{}系ソース整形

たまにプログラムソースでインデントがぐちゃぐちゃのソースにあたったりします。
javaとかcとか
IDE使ってれば
javaだったらeclipseでなんとかなったりするんでしょうが
C言語とかをサクラエディタでメンテナンスとかどうにもならず、せめて{}だけでも
インデント整形できないものかと思いまして
vbscriptでなんちゃって整形プログラム作りました。
すべてに対応してるわけではありませんが、簡易版としてある程度使えます

field_max=0

'-------------------------------------------------
Set objRegExp = new RegExp
'クリップボード取得
tblText = GetClipBoardText()
'改行統一
	objRegExp.Pattern = "\r\n"
	row = objRegExp.Replace(row,vbLf)


lines = split(trim(tblText),vbLf)

outtext =""

'行処理
indent = ""
indentOn =false
for i = 0 to UBound(lines) : Do
	
	row = lines(i)
	'前方スペース除去
	objRegExp.Pattern = "^[\t ]+"
	row = objRegExp.Replace(row,"")
	'チェック用
	'コメント除去
	checkrow=row
	objRegExp.Pattern = "\/\/.*$"
	checkrow = objRegExp.Replace(checkrow,"")
	objRegExp.Pattern = "\/\*.*\*\/"
	checkrow = objRegExp.Replace(checkrow,"")
	
	

	'--------------------------------------------------------コメントスキップ
	if mid(checkrow,1,2)="//" then
		'コメント行スキップ
		row = indent & row
		outtext = outtext & vbCrLf  & row
		exit do
	end if
	objRegExp.Pattern = "\/\*"
	Set objMatch = objRegExp.Execute(checkrow)
	if objMatch.Count>0 then
		row = indent & row
		outtext = outtext & vbCrLf  & row
		indentOn =true
		objRegExp.Pattern = "\*\/"
		Set objMatch = objRegExp.Execute(checkrow)
		if objMatch.Count>0 then
			indentOn = false
		end if
		exit do
	end if
	objRegExp.Pattern = "\*\/"
	Set objMatch = objRegExp.Execute(checkrow)
	if objMatch.Count>0 then
		row = indent & row
		outtext = outtext & vbCrLf  & row
		indentOn =false

		objRegExp.Pattern = "\/\*"
		Set objMatch = objRegExp.Execute(checkrow)
		if objMatch.Count>0 then
			indentOn = true
		end if
		exit do
	end if

	'--------------------------------------------------------{}チェック
	objRegExp.Pattern = "\{.*\}"
	Set objMatch = objRegExp.Execute(checkrow)
	if objMatch.Count>0 then
		'何もせずに行追加
		row = indent & row
		outtext = outtext & vbCrLf  & row
		exit do
	end if
	'--------------------------------------------------------}{チェック
	objRegExp.Pattern = "\}.*\{"
	Set objMatch = objRegExp.Execute(checkrow)
	if objMatch.Count>0 then
		'インデント戻して行追加
		if len(indent)> 0 then
			indent = mid(indent,1,len(indent)-1)
		end if
		row = indent & row
		outtext = outtext & vbCrLf  & row
		'インデント加算
		indent = indent & vbTab
		exit do
	end if
	'--------------------------------------------------------}チェック
	objRegExp.Pattern = "\}"
	Set objMatch = objRegExp.Execute(checkrow)
	if objMatch.Count>0 then
		if len(indent)> 0 then
			indent = mid(indent,1,len(indent)-1)
		end if
		'もどしたインデントで行追加
		row = indent & row
		outtext = outtext & vbCrLf  & row
		'}else{
		
		objRegExp.Pattern = "\{"
		Set objMatch = objRegExp.Execute(checkrow)
		if objMatch.Count>0  then
			'インデント加算
			indent = indent & vbTab
		end if
		exit do
	end if
	'--------------------------------------------------------{チェック
	objRegExp.Pattern = "\{"
	Set objMatch = objRegExp.Execute(checkrow)
	if objMatch.Count>0  then
		'行追加してインデント加算
		row = indent & row
		outtext = outtext & vbCrLf  & row
		indent = indent & vbTab
		exit do
	end if

	row = indent & row
	outtext = outtext & vbCrLf  & row
	
loop until 1 :next


SetClipboardText(outtext)
MsgBox("クリップボードにコピーしました")

'-----------------------------------------------------------------
'半角換算文字数
'-----------------------------------------------------------------
Function LengthByHankaku(str)
	Set RegExp = New RegExp
	RegExp.Global = true
	'半角文字数
	RegExp.Pattern ="[^\x01-\x7E]+"
	'半角以外をリプレース 半角が残る
	hankaku = RegExp.Replace(str,"")
	'全角文字数
	RegExp.Pattern ="[\x01-\x7E]+"
	'半角をリプレース 全角が残る
	zenkaku = RegExp.Replace(str,"")
	'換算文字数
	colLen = Len(zenkaku)*2 +Len(hankaku)
	LengthByHankaku = colLen
End Function

'------------------------------------------------------------------
'クリップボード取得
'------------------------------------------------------------------
Function GetClipBoardText()
	dim objHTML
	Set objHTML = CreateObject("htmlfile")
	GetClipBoardText = Trim(objHTML.ParentWindow.ClipboardData.GetData("Text"))
End Function

'------------------------------------------------------------------
'クリップボードコピー
'------------------------------------------------------------------
Function SetClipboardText(text)
	set WshShell = CreateObject("WScript.Shell")
	wshShell.Exec("clip").stdIn.write text
	Set wshShell = nothing
End Function

コメントを残す