同じ構成で名前の違うソースファイルをテンプレートからバッチで作成する

オブジェクト指向の言語であればクラスや継承などが行えるためそれほどでもないが、非オブジェクト指向の言語の場合は同じ構造だったとしても違うファイル名でいくつもソースファイルを作成しないと行けない場合がある。
(書き方を工夫すればそうでもない場合もあるが。。。)

例えばC言語で以下のような「ProcA.h .c」があったとして、ProcB、ProcC、… と同じ構成で名前の違うソースを作成していく場合にテンプレートを作っておき、バッチでお手軽に作ってみようというのが今回の趣旨。

// ProcA.h
#ifndef _ProcA_H_
#define _ProcA_H_

#define ID_ProcA (0x00000000) // 処理ID

void ProcA_Initialize(void);  // イニシャライズ
void ProcA_Process(void);     // 処理
void ProcA_Finalize(void);    // ファイナライズ

#endif // _ProcA_H_
// ProcA.c
#include "ProcA.h"

// イニシャライズ
void ProcA_Initialize(void)
{
	...
}

// 処理
void ProcA_Process(void)
{
	...
}

// ファイナライズ
void ProcA_Finalize(void)
{
	...
}

他にも方法はいくらでもあると思うがとりあえずやってみた。

環境

Windows10 pro 64bit

テンプレートファイルの用意

「Temp_h.tx」「Temp_c.txt」ファイルを下記内容で用意する。

※注意:空行は改行のみにすること。「スペース」や「タブ」などが入っていると正常に動作しない。

// $NAME.h
#ifndef _$NAME_H_
#define _$NAME_H_

#define ID_$NAME (0x00000000) // 処理ID

void $NAME_Initialize(void);  // イニシャライズ
void $NAME_Process(void);     // 処理
void $NAME_Finalize(void);    // ファイナライズ

#endif // _$NAME_H_
// $NAME.c
#include "$NAME.h"

// イニシャライズ
void $NAME_Initialize(void)
{
	...
}

// 処理
void $NAME_Process(void)
{
	...
}

// ファイナライズ
void $NAME_Finalize(void)
{
	...
}

バッチファイルの用意

Make.bat」 ファイルを下記内容で用意する

echo off
setlocal ENABLEDELAYEDEXPANSION

echo.
echo 処理名を入力してください
echo.
SET /P abc=

if exist %abc%.c goto ERROR
if exist %abc%.h goto ERROR

for /f "tokens=1* delims=:" %%A in ('findstr /n "^" _Temp_c_.txt') do (
	@set LINE=%%B
	if     "%%B"=="" echo;>> %abc%.c
	if not "%%B"=="" echo !LINE:$NAME=%abc%!>> %abc%.c
)

for /f "tokens=1* delims=:" %%A in ('findstr /n "^" _Temp_h_.txt') do (
	@set LINE=%%B
	if     "%%B"=="" echo;>> %abc%.h
	if not "%%B"=="" echo !LINE:$NAME=%abc%!>> %abc%.h
)
goto SUCCESS

:ERROR
echo すでにファイル %abc%.c %abc%.h が存在しています。
exit /b-1

:SUCCESS
echo %abc%.c %abc%.h を生成しました
exit /b0

使い方

「Temp_h.tx」「Temp_c.txt」「Make.bat」を同じディレクトリに配置して 「Make.bat」 をダブルクリックで実行する。

入力待ちになるので処理名を入力。

処理名を入力してください

ProcX
ProcX.c ProcX.h を生成しました

入力した名前.h .c が同ディレクトリに作成される。

その他

このままのバッチファイルだと、1つずつ名前入力が必要ですが名前入力の部分を引数にしたり、ループにしたりなどで1度にたくさんのソースを作成することも可能なので場合に合わせてバッチを書き換えて使えばいい。

文字コードについて

「Temp_h.tx」「Temp_c.txt」「Make.bat」 の文字エンコードの種類は Shift-jis(CR+LF)。

Utf8( CR+LF) BOMなしの場合はバッチファイルの「setlocal ENABLEDELAYEDEXPANSION」の次の行あたりで「chcp 65001」を行いコマンドプロンプトの文字エンコードを utf8 に変更すればとりあえず動作はするようだった。

それ以外のエンコードでは動作するかは未確認。