monaへの提案

  • この改変をすれば、EX5やBM5という拡張子のファイルが、圧縮であっても無圧縮であっても機能すると思います。monaの仕組みが全然分かってないので、へぼくてすみません。
    • 本来なら、memcpyなんてしないでそのまま返すような手法をとるべきなのですが、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;
      }

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2006-02-16 (木) 18:00:41 (5974d)