C/C++のスタブを自動生成するツールを公開しました
どもです。
突然ですが、C/C++の単体テストで使用する「スタブ」を自動で生成するツールを公開しました。
作成したのは5年くらい前で、その後細々使用していましたが、自宅のSVNサーバーが少し前に壊れた、メインのPCを入れ替えたなど、環境の変化がありましたので、保管場所(?)をGitHubに変更することにしました。
それに伴い、公開します。
1.ビルド環境
以下の環境でのビルドを確認しています。
PC本体:
OS:Windows10 Pro (バージョン:1903)
CPU:Intel Core i7-8700
メモリ:16GB
開発環境:
IDE:Eclipse Version 2019-06(4.12.0)
Cygwin:gcc/x86_64-pc-cygwin
2.使い方
2.1.ツールの使い方
下記のような使い方をします。
1 |
./cstubmk.exe -f ev3_brick.txt |
ここで、”ev3_brick.txt”はスタブを作成したい関数の定義が入力されたファイル名です。
具体的な内容は、下記の通りです。
1 2 |
SLONG ev3_brick_initialize(VOID); SLONG ev3_brick_finalize(VOID); |
このファイルを入力とした場合、次のようなスタブのコードが生成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
#include #define EV3_BRICK_BUF_SIZE (10) /*-----------------------------------------*/ /*---- ----*/ /*---- Start ev3_brick_initialize stub ----*/ /*---- ----*/ /*-----------------------------------------*/ int ev3_brick_initialize_stub_called_count; int ev3_brick_initialize_stub_ret_val[EV3_BRICK_BUF_SIZE]; SLONG ev3_brick_initialize_stub() { int ret_val = ev3_brick_initialize_stub_ret_val [ev3_brick_initialize_stub_called_count]; ev3_brick_initialize_stub_called_count++; return (ret_val); } void ev3_brick_initialize_init() { int idx = 0; ev3_brick_initialize_stub_called_count = 0; for (idx = 0; idx < EV3_BRICK_BUF_SIZE; idx++) { ev3_brick_initialize_stub_ret_val[idx] = 0; } } /*---------------------------------------*/ /*---- ----*/ /*---- Start ev3_brick_finalize stub ----*/ /*---- ----*/ /*---------------------------------------*/ int ev3_brick_finalize_stub_called_count; int ev3_brick_finalize_stub_ret_val[EV3_BRICK_BUF_SIZE]; SLONG ev3_brick_finalize_stub() { int ret_val = ev3_brick_finalize_stub_ret_val [ev3_brick_finalize_stub_called_count]; ev3_brick_finalize_stub_called_count++; return (ret_val); } void ev3_brick_finalize_init() { int idx = 0; ev3_brick_finalize_stub_called_count = 0; for (idx = 0; idx < EV3_BRICK_BUF_SIZE; idx++) { ev3_brick_finalize_stub_ret_val[idx] = 0; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#ifndef EV3_BRICK_STUB_H_ #define EV3_BRICK_STUB_H_ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*-----------------------------------------*/ /*---- ----*/ /*---- Start ev3_brick_initialize stub ----*/ /*---- ----*/ /*-----------------------------------------*/ extern void ev3_brick_initialize_init(); extern SLONG ev3_brick_initialize_stub(); extern int ev3_brick_initialize_stub_called_count; extern int ev3_brick_initialize_stub_ret_val[]; #define GET_EV3_BRICK_INITIALIZE_STUB_CALLED_COUNT() \ (ev3_brick_initialize_stub_called_count) #define SET_EV3_BRICK_INITIALIZE_STUB_CALLED_COUNT(value) \ (ev3_brick_initialize_stub_called_count = value) #define GET_EV3_BRICK_INITIALIZE_STUB_RET_VAL(idx) \ (ev3_brick_initialize_stub_ret_val[idx]) #define SET_EV3_BRICK_INITIALIZE_STUB_RET_VAL(idx, value) \ (ev3_brick_initialize_stub_ret_val[idx] = value) /*---------------------------------------*/ /*---- ----*/ /*---- Start ev3_brick_finalize stub ----*/ /*---- ----*/ /*---------------------------------------*/ extern void ev3_brick_finalize_init(); extern SLONG ev3_brick_finalize_stub(); extern int ev3_brick_finalize_stub_called_count; extern int ev3_brick_finalize_stub_ret_val[]; #define GET_EV3_BRICK_FINALIZE_STUB_CALLED_COUNT() \ (ev3_brick_finalize_stub_called_count) #define SET_EV3_BRICK_FINALIZE_STUB_CALLED_COUNT(value) \ (ev3_brick_finalize_stub_called_count = value) #define GET_EV3_BRICK_FINALIZE_STUB_RET_VAL(idx) \ (ev3_brick_finalize_stub_ret_val[idx]) #define SET_EV3_BRICK_FINALIZE_STUB_RET_VAL(idx, value) \ (ev3_brick_finalize_stub_ret_val[idx] = value) #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* EV3_BRICK_STUB_H_ */ |
2.2.生成されたスタブ
- 生成された関数には、末尾に”_stub”が付加されています。
必要に応じて、これは削除して下さい。 - スタブの戻り値を予め設定しておくためのバッファーも、生成されます。
- バッファーも、呼び出された順番ごとに戻り値を設定できます。
- バッファーを初期化するための関数も、同時に生成されます。
- バッファーに関しては、呼び出し回数と引数のバッファーについては、GETマクロ、戻り値のバッファーについてはSETマクロが用意されます。
3.言い訳コーナー
3.1.CMakeじゃないの?
はい。
CMakeではございません。
make/Makefileでのビルドになります。
また、上記Windows環境でのみビルドが確認できています。
3.2.Windows10だけ?
はい。
動作確認ができているのが、Windows10/cygwinのみです。
LinuxとかMacでの確認はできていません。
4.公開しています
GitHubに公開しています。
自宅サーバーが壊れた関係で、開発の途中経過は一切残っていません。
申し訳ありません。
また、設計資料もastahで作成しており、データを救出できなかったので公開を避けました。
5.まとめ
だいぶ昔に作ったモノで、今コードを読み返すと
「ひどい設計、ひどいコードになっているなぁ」
と思ってしまいます。
それでも、自分で使っていた時には
「お。役に立つな」
と感じていました。
「ソフトの造」はよくないのに、「ソフトの効果」は高い…。
それが自分の作ったソフトとなると、だいぶ複雑な気分になりますね。
ではっ!
関連記事
-
-
RaspberryPi起動時にpigpiodがスタートしないようにする
どもです。 これまでpigpioを使用してRaspberryPiからLEDをチカらせる方法など、い
-
-
C言語でEV3開発(26)-EV3で機械学習(1)-QLearningをC#に委譲してみた
どもです。 前回の投稿では、Q-LearningをEV3本体に実装してみたら、メモリが足りなくて動
-
-
Windows/EclipseでRaspberryPiのクロス環境を構築してみた
どもです。 今回は、Windows/EclipseでRaspberry Piのクロス環境を構築した
-
-
フォトレジスタを使ってみた-Arduinoで光検出
どもです。 今回は、タイトル通り「フォトレジスタの使い方」です。 1.フォトレジスタって何?
-
-
QtでRaspberryPi/GUI開発(6):pigpioを使用したチャタリング対策
どもです。 前回のエントリーで、pigpioを使用したボタンを使用したLEDの点灯/消灯について書
-
-
C言語でEV3開発(24)-APIの実行時間を測定してみた。
どもです。 今回、以前から気になっていた、開発環境/プラットフォームであるTOPPERS HRP2
-
-
C言語でEV3開発(11)-opOUTPUT_STEP_POWERコマンド
どもです。 今回のエントリーでは、再びモーターを動かすためのコマンドについて書きます。 コマンド
-
-
QtでRaspberryPi/GUI開発(1):ためしに時計を作ってみた
どもです。 また更新の間隔が空いてしまいました。 久しぶりの更新です。 前回のエントリーで
-
-
EV3開発サポートツール(2)-C#のユーザーコントロール開発(2つ目)
どもです。 前回に引き続き、今回もC#/WPFでの独自UI(ユーザーコントロール)の作成についての
-
-
C言語でEV3開発(25)-Q_Learningを実装してみた…が!?
どもです。 今回の内容は、「失敗しました」という内容です。 最近、流行になっている深層学習/