* 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;
  }

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS