レベルアップを目指して
Mingに物足りなさを感じたり、うまく動かなかったりしとき、
なにをしていますか。私の場合、何もできないので、次期バージョン
を待ち望んでいます。
でも本当はMingに手を加えれるようでないといけません。
Mingはソースが公開されていますし、win32の環境でmakeすることもできるのです。
そこで、遠い未来、Mingを改造できるようになるために、
ソースを読んで見ることにしました
実態を探す
src以下にある、名前を見れば、私たちがPHPで使っている機能がどこにあるかは一目瞭然だおといます。
今日は movie.c の
SWFMovie_toOutput(SWFMovie movie, int level)に注目してもました。
なかでも。
SWFBlockList_writeBlocksToMethod(movie->blockList, SWFOutputMethod, buffer);
をのぞいて見ましょう。
そしてblocklist.cを見てみましょう。
名前のとおりblocklistはblockのlistです。
SWFBlockList_writeBlocksToMethod(SWFBlockList list,SWFByteOutputMethod method, void *data)
のなかの
writeSWFBlockToMethod(SWFBlock block, SWFByteOutputMethod method, void *data)
はblock.cのwriteSWFBlockToMethod(SWFBlock block, SWFByteOutputMethod method, void *data)
のことです。
さらに、実態(データーをbufferに加えている部分)となるものは
writeSWFBlockToMethodの中の
block->writeBlock(block, method, data);
です。
このwriteBlockが、ファイルに書き込む前に
bufferにデーターを加えている場所と思われます。(もちろんmovieてせもoutput.c
をもちいてデーターをbufferに蓄えています。)
C言語でこんな風にプログラムできる?なんて私以前Mingのソースで知りました。入門書には
あまり紹介されていない方法ですね。
text.c text.h や sprite.c sprite.hを を見てみると、
SWFCharacterを必ず保持しています SWFChracterの先頭はがSWFBlockであります。
関数ポインタ
SWFMovieはSWFBlockListさえあつかっていれば、よいつくりになっているのですね。
あとはtextだとかspriteだとか bitmapだとかは
blockを拡張してあげればよいと。
というとで、関数ポインターを使い方。
本当は、animalとか作って お決まりのパターン dogになったりするとワンワンとほえるものとか
がよいと思いましたが、なぜか nuronです。
./nuron.h
typedef struct nuron_s *Nuron;
typedef void (*inputNuron)(void);
typedef void (*outputNuron)(void);
struct nuron_s{
inputNuron input;
outputNuron output;
};
Nuron newNuro();
./nuron.c
#include"nuron.h"
static int _inputNuron()
{
printf("exe input \n");
}
static int _outputNuron()
{
printf("exe output\n");
}
Nuron newNuro()
{
Nuron nuro;
nuro = (Nuron)malloc(sizeof(struct nuron_s));
nuro->input = (inputNuron)_inputNuron;
nuro->output = (outputNuron)_inputNuron;
return nuro;
}
./exe.h
#include"nuron.h"
./exe.c
#include"exe.h"
int main()
{
Nuron nuro;
nuro= newNuro();
nuro->input();
}