2009年10月14日
exeGCCのVLINK機能の応用(2)
前回はexeGCCのVLINK機能を利用してPARTNERのコマンドウインドウで動く対話的なコンソールアプリケーションを作る例を紹介しました。今回は逆にバッチ処理で便利なようにVLINKでコマンドラインの引数を取得する例を紹介します。
コマンドライン引数は普通にmain関数のargcとargvで取得することができます。
以下のサンプルプログラムはコマンドライン引数で与えられたファイルを連結して画面に表示します。unixのcatコマンドのような動作をします。
main関数のargc, argvの使い方を見てください。
cat.c
#include <stdio.h> #include <stdlib.h> #include <sys/stat.h> void copy_to_stdout(char *filename) { struct stat fst; FILE* file; char* rbuf; char* rbufp; size_t bytes; size_t size; stat(filename, &fst); rbuf = (char *)malloc(fst.st_size); if((file = fopen(filename, "r")) == NULL) { exit(1); } size = fst.st_size; rbufp = rbuf; while (size > 0) { bytes = fread(rbufp, sizeof(char), size, file); if (bytes == 0 && ferror(file)) { exit(1); } size -= bytes; rbufp += bytes; } fclose(file); size = fst.st_size; rbufp = rbuf; while (size > 0) { bytes = fwrite(rbufp, sizeof(char), size, stdout); size -= bytes; rbufp += bytes; } free(rbuf); } int main(int argc, char *argv[]) { int i; for (i = 1; i < argc; i++ ) { copy_to_stdout(argv[i]); } return 0; }
動作確認のため、a.txt と b.txt という短いテキストファイルを作ります。
C:\home\koba\vlink>type a.txt This is a.txt. C:\home\koba\vlink>type b.txt This is b.txt. C:\home\koba\vlink>
コマンドライン引数はPARTNERのl(ロード)コマンドでロードするファイル名の後につけます。
cat.outをロードする時に、a.txtとb.txtの2つのコマンドライン引数を渡して実行したときのスクリーンショットです。
ESCキーでブレークさせるとPARTNERのプロンプトに戻ります。
マクロの中で次々と実行させるときにはgコマンドに /w オプションとブレークポイントを指定するとよいでしょう。
gコマンドは通常はターゲットプログラムの実行と非同期で次のプロンプトを出しますが、/wオプションをつけるとターゲットプログラムがブレークするのを待ってから次のプロンプトを出します。
> g /w _exit
このようにすると、_exitという関数の先頭まで実行してブレークしてから次のプロンプトが出ます。
たくさんの種類のテストプログラムをマクロで一気に実行するのに便利です。
動画のデコーダを開発していた方によると、VLINKのこの方法を使ってPC上に置いてある多数の動画ファイルを読み込んで再生するテストプログラムが簡単に作れたそうです。