* monaへの提案 -この改変をすれば、EX5やBM5という拡張子のファイルが、圧縮であっても無圧縮であっても機能すると思います。monaの仕組みが全然分かってないので、へぼくてすみません。 --本来なら、memcpyなんてしないでそのまま返すような手法をとるべきなのですが、monaのルールを調べなかったのでわかりませんでした。 --このオーバーヘッドを解消できれば、EX5を廃止してEXEやBMPをstk5形式の拡張子としてもいいと僕は思います。でもmonaにはmonaの流儀や方針があり、圧縮の有無が拡張子で区別できるべきだということであれば、こんな提案はそっくり無視してください。 --このオーバーヘッドを解消できれば、EX5やBM5を廃止してEXEやBMPをstk5形式の拡張子としてもいいと僕は思います。でもmonaにはmonaの流儀や方針があり、圧縮の有無が拡張子で区別できるべきだということであれば、こんな提案はそっくり無視してください。 -http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/mona/Mona/src/servers/file/dtk5s.cpp?rev=1.1&content-type=text/vnd.viewcvs-markup のST5Decompress()関数を次のようにいじくります。 --8行の追加しかしていません。追加した行には+をつけました。 monapi_cmemoryinfo* ST5Decompress(monapi_cmemoryinfo* mi) { int64_t size = GetST5DecompressedSize(mi); + char flag = 1; + if (size == -1) { /* not osacmp */ + size = mi->Size; + flag = 0; + } if (size < 0) return NULL; // if size >= 4GB abort... if ((size >> 32) > 0) return NULL; monapi_cmemoryinfo* ret = new monapi_cmemoryinfo(); if (!monapi_cmemoryinfo_create(ret, (dword)(size + 1), 0)) { monapi_cmemoryinfo_delete(ret); return NULL; } ret->Size--; + if (flag) { if (tek_decode(mi->Size, mi->Data, ret->Data) != 0) { // Decompress failed monapi_cmemoryinfo_dispose(ret); monapi_cmemoryinfo_delete(ret); return NULL; } + } else + memcpy(ret->Data, mi->Data, ret->Size); ret->Data[ret->Size] = 0; return ret; }