#include "dkcMemoryStream.h"
#include "dkcSJISFileSystem.h"
dkcBit.hのインクルード依存関係図
このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。
構成 | |
union | dkc_NLZ8Byte |
union | dkc_NLZ4Byte |
struct | dkc_BitMemoryStream |
ビットを出力するメモリストリーム [詳細] | |
マクロ定義 | |
#define | DKUTIL_C_USE_BIT_TABLE 0 |
#define | dkcNumOfBits(bits) dkcPOP(bits) |
#define | dkcBitMemoryStreamGetMemoryStreamObj(p) p->pms |
#define | dkcBitMemoryStreamTellByte(ptr) dkcMemoryStreamTell(ptr->pms) |
バイト単位で今のシーク位置(オフセット)を取得する | |
#define | dkcBitMemoryStreamWriteToMemory(ptr, dest, size, flag) dkcMemoryStreamWriteToMemory(ptr->pms,dest,size,flag) |
#define | dkcBitMemoryStreamWriteToMemoryLast(ptr, dest, size, flag) dkcBitMemoryStreamWriteLast(ptr);dkcBitMemoryStreamWriteToMemory(ptr,dest,size,flag) |
dkcBitMemoryStreamWriteLast() をしてからdkcBitMemoryStreamWriteToMemory()をする。 | |
#define | dkcBitMemoryStreamDump(ptr, filename, flag) dkcMemoryStreamDump(ptr->pms,filename,flag) |
#define | dkcBitMemoryStreamLoadFromFile(ptr, filename, permit_size, flag) dkcMemoryStreamLoadFromFile(ptr->pms,filename,permit_size,flag) |
#define | dkcBitMemoryStreamLoadFromMemory(ptr, buffer, buffsize) dkcMemoryStreamLoadFromMemory(ptr->pms,buffer,buffsize) |
型定義 | |
typedef dkc_BitMemoryStream | DKC_BIT_MEMORYSTREAM |
ビットを出力するメモリストリーム | |
列挙型 | |
enum | edkcBitMemoryStream { edkcBitMemoryStreamSeekCurrent = edkcSeekCurrent, edkcBitMemoryStreamSeekEnd = edkcSeekEnd, edkcBitMemoryStreamSeekSet = edkcSeekSet } |
関数 | |
DKC_FORCE_INLINE size_t | dkcNLZ_IEEE (uint32 arg) |
これには驚き [Henry] p.86 | |
DKC_FORCE_INLINE size_t | dkcNLZ (uint32 x) |
[Henry] p.85 | |
DKC_FORCE_INLINE size_t | dkcPOP (uint32 x) |
bitsに入れたビットの数を数える population count | |
DKC_FORCE_INLINE size_t | dkcNTZ (uint32 x) |
number of trailing zeros [Henry] p.90 | |
DKC_INLINE DKC_BIT_MEMORYSTREAM * | dkcAllocBitMemoryStream (size_t def_size) |
DKC_INLINE int | dkcFreeBitMemoryStream (DKC_BIT_MEMORYSTREAM **p) |
DKC_INLINE int | dkcBitMemoryStreamWrite (DKC_BIT_MEMORYSTREAM *p, void *target_arg, int n) |
DKC_INLINE int | dkcBitMemoryStreamWriteLast (DKC_BIT_MEMORYSTREAM *p) |
DKC_INLINE int | dkcBitMemoryStreamReadBase (DKC_BIT_MEMORYSTREAM *p, void *res_arg, int n, BOOL as_possible_as_much, int *pcount) |
DKC_INLINE int | dkcBitMemoryStreamRead (DKC_BIT_MEMORYSTREAM *p, void *res_arg, int n) |
DKC_INLINE int WINAPI | dkcBitMemoryStreamReadLast (DKC_BIT_MEMORYSTREAM *p, uint32 *res, int *ressize) |
バッファ内に最後に残っているビットを出力する | |
DKC_INLINE int WINAPI | dkcBitMemoryStreamSeekByte (DKC_BIT_MEMORYSTREAM *ptr, int offset, int origin) |
バイト単位でシークする シークした場合、構造体内部のステートおよびバッファに蓄えているビットは破棄される | |
DKC_INLINE int WINAPI | dkcBitMemoryStreamTellBitCheck (DKC_BIT_MEMORYSTREAM *ptr) |
DKC_INLINE size_t WINAPI | dkcBitMemoryStreamTellBit (DKC_BIT_MEMORYSTREAM *ptr, size_t *bit) |
ビット単位で今のシーク位置(オフセット)を取得する |
dkcBit.h で定義されています。
|
|
|
|
|
|
|
参照元 dkcLZWDecode(). |
|
バイト単位で今のシーク位置(オフセット)を取得する
参照元 dkcBitMemoryStreamTellBit(), dkcBitMemoryStreamTellBitCheck(), encode_hash(), と encode_tst(). |
|
参照元 encode_hash(), と encode_tst(). |
|
dkcBitMemoryStreamWriteLast() をしてからdkcBitMemoryStreamWriteToMemory()をする。
|
|
|
|
|
|
ビットを出力するメモリストリーム
|
|
00108 { 00110 edkcBitMemoryStreamSeekCurrent = edkcSeekCurrent, 00112 edkcBitMemoryStreamSeekEnd = edkcSeekEnd, 00114 edkcBitMemoryStreamSeekSet = edkcSeekSet, 00115 };
|
|
参照先 dkcAllocate(), dkcAllocMemoryStream(), dkcFree(), NULL, dkc_BitMemoryStream::pms, と dkc_BitMemoryStream::write_count. 参照元 dkcAllocLZW(). 00128 { 00129 DKC_BIT_MEMORYSTREAM *p = (DKC_BIT_MEMORYSTREAM *)dkcAllocate(sizeof(DKC_BIT_MEMORYSTREAM)); 00130 if(NULL==p) return NULL; 00131 p->pms = dkcAllocMemoryStream(def_size); 00132 if(NULL==p->pms) 00133 goto End; 00134 00135 p->write_count = 8; 00136 00137 return p; 00138 End: 00139 dkcFree((void **)&p); 00140 return NULL; 00141 }
|
|
参照先 dkcBitMemoryStreamReadBase(), と FALSE. 参照元 decode_hash(), と decode_tst(). 00305 { 00306 int ressize; 00307 return dkcBitMemoryStreamReadBase(p,res_arg,n,FALSE,&ressize); 00308 }
|
|
参照先 dkcMemoryStreamGet8(), dkcMemoryStreamGetSeekPoint(), dkcMemoryStreamSeek(), edkcMemoryStreamSeekSet, dkc_BitMemoryStream::pms, dkc_BitMemoryStream::read_buff, と dkc_BitMemoryStream::read_count. 参照元 dkcBitMemoryStreamRead(), と dkcBitMemoryStreamReadLast(). 00261 { 00262 int rc = p->read_count; 00263 size_t rb = p->read_buff; 00264 size_t result = 0; 00265 int cc = 0;//counter 00266 // size_t rs = 0; 00267 //save point 00268 size_t sp = dkcMemoryStreamGetSeekPoint(p->pms); 00269 uint32 *res = (uint32 *)res_arg; 00270 if( n <= 0 || n >= 32 ) return edk_FAILED; 00271 { 00272 while( --n >= 0 ){ 00273 cc++; 00274 if( --rc < 0 ){ 00275 00276 //if( DKUTIL_FAILED(dkcMemoryStreamRead(p->pms,&rb,1,&rs)) ){ 00277 if( DKUTIL_FAILED(dkcMemoryStreamGet8(p->pms,(uint8 *)&rb))){ 00278 if(as_possible_as_much)//がんばって出来るだけ読み込んだよ。 00279 goto End; 00280 //元の状態に戻す 00281 dkcMemoryStreamSeek(p->pms,sp,edkcMemoryStreamSeekSet); 00282 return edk_FAILED; 00283 } 00284 rc = 7; 00285 } 00286 #if DKUTIL_C_USE_BIT_TABLE == 1 00287 if( dkccvBitTable8[rc] & rb ){ 00288 result |= dkccvBitTable32[n]; 00289 } 00290 #else 00291 if( (1 << rc) & rb){ 00292 result |= (1 << n); 00293 } 00294 #endif 00295 } 00296 End: 00297 *res = result; 00298 p->read_count = rc; 00299 p->read_buff = rb; 00300 *pcount = cc; 00301 } 00302 return edk_SUCCEEDED; 00303 }
|
|
バッファ内に最後に残っているビットを出力する 出来るだけ読み込む 参照先 dkcBitMemoryStreamReadBase(), dkc_BitMemoryStream::read_buff, dkc_BitMemoryStream::read_count, と TRUE. 00314 { 00315 if(p->read_count <= 0){ 00317 return dkcBitMemoryStreamReadBase(p, 00318 res,32,TRUE,ressize); 00319 } 00320 *res = p->read_buff; 00321 *ressize = p->read_count; 00322 p->read_count = p->read_buff = 0; 00323 return edk_SUCCEEDED; 00324 }
|
|
バイト単位でシークする シークした場合、構造体内部のステートおよびバッファに蓄えているビットは破棄される
参照先 dkcMemoryStreamSeek(), dkc_BitMemoryStream::pms, dkc_BitMemoryStream::read_buff, dkc_BitMemoryStream::read_count, dkc_BitMemoryStream::write_buff, と dkc_BitMemoryStream::write_count. 参照元 init_lzw(). 00331 { 00332 ptr->read_count = ptr->read_buff = ptr->write_buff = 0; 00333 00334 ptr->write_count = 8; 00335 return dkcMemoryStreamSeek(ptr->pms,offset,origin); 00336 }
|
|
ビット単位で今のシーク位置(オフセット)を取得する
参照先 dkcBitMemoryStreamTellByte, と dkcmNOT_ASSERT. 00350 { 00351 size_t t = dkcBitMemoryStreamTellByte(ptr); 00352 dkcmNOT_ASSERT(t > UINT_MAX / 8); 00353 return t * 8; 00354 }
|
|
参照先 dkcBitMemoryStreamTellByte. 00341 { 00342 size_t t = dkcBitMemoryStreamTellByte(ptr); 00343 if(t > UINT_MAX / 8){ 00344 return edk_VariableOverFlow; 00345 } 00346 return edk_SUCCEEDED; 00347 }
|
|
参照先 dkcMemoryStreamDynamicWrite(), dkcMemoryStreamGetSeekPoint(), dkcMemoryStreamSeek(), edkcMemoryStreamSeekSet, dkc_BitMemoryStream::pms, dkc_BitMemoryStream::write_buff, と dkc_BitMemoryStream::write_count. 参照元 encode_hash(), と encode_tst(). 00153 { 00154 int wc = p->write_count; 00155 size_t wb = p->write_buff; 00156 //save point 00157 size_t sp = dkcMemoryStreamGetSeekPoint(p->pms); 00158 uint32 *target =(uint32 *) target_arg; 00159 if( n <= 0 || n >= 32 ) return edk_FAILED; 00160 while( --n >= 0 ){ 00161 --wc; 00162 #if DKUTIL_C_USE_BIT_TABLE == 1 00163 if( dkccvBitTable32[n] & target ){ 00164 wb |= dkccvBitTable8[wc]; 00165 } 00166 #else 00167 if( (1<<n) & (*target) ){ 00168 wb |= (1 << wc);//dkccvBitTable8[wc]; 00169 } 00170 #endif 00171 if( !wc ){ 00172 if( DKUTIL_FAILED(dkcMemoryStreamDynamicWrite(p->pms, &wb,1 )) ) 00173 { 00174 //元の状態に戻す 00175 dkcMemoryStreamSeek(p->pms,sp,edkcMemoryStreamSeekSet); 00176 return edk_FAILED; 00177 } 00178 wc = 8; 00179 wb = 0; 00180 } 00181 } 00182 /*if( !wc ){ 00183 if( DKUTIL_FAILED(dkcMemoryStreamDynamicWrite(p->pms, &wb,1 )) ) 00184 { 00185 //元の状態に戻す 00186 dkcMemoryStreamSeek(p->pms,sp,edkcMemoryStreamSeekSet); 00187 return edk_FAILED; 00188 } 00189 wc = 8; 00190 wb = 0; 00191 }*/ 00192 p->write_count = wc; 00193 p->write_buff = wb; 00194 return edk_SUCCEEDED; 00195 00196 }
|
|
参照先 dkcMemoryStreamDynamicWrite(), dkcMemoryStreamGetSeekPoint(), dkcMemoryStreamSeek(), edkcMemoryStreamSeekSet, dkc_BitMemoryStream::pms, dkc_BitMemoryStream::write_buff, と dkc_BitMemoryStream::write_count. 参照元 encode_hash(), と encode_tst(). 00198 { 00199 //return dkcMemoryStreamWrite(p->pms,&p->write_buff,1); 00200 size_t sp = dkcMemoryStreamGetSeekPoint(p->pms); 00201 int r = dkcMemoryStreamDynamicWrite(p->pms, &p->write_buff,1 ); 00202 if( DKUTIL_FAILED(r) ) 00203 { 00204 //元の状態に戻す 00205 dkcMemoryStreamSeek(p->pms,sp,edkcMemoryStreamSeekSet); 00206 return r; 00207 } 00208 p->write_count = 8; 00209 p->write_buff = 0; 00210 return r; 00211 }
|
|
参照先 dkcFree(), dkcFreeMemoryStream(), dkcmNOT_ASSERT, と NULL. 参照元 dkcFreeLZW(). 00144 { 00145 dkcmNOT_ASSERT(NULL==p || NULL==*p || NULL==(*p)->pms); 00146 dkcFreeMemoryStream(&((*p)->pms)); 00147 return dkcFree((void **)p); 00148 }
|
|
|
これには驚き [Henry] p.86
参照先 dkc_NLZ8Byte::asDouble_, dkc_NLZ8Byte::asINT_, と dkcdLITTLE_ENDIAN. 00036 { 00037 union dkc_NLZ8Byte t; 00038 size_t n; 00039 00040 t.asDouble_ = (double)arg + 0.5; 00041 n = 1054 - (t.asINT_[dkcdLITTLE_ENDIAN] >> 20); 00042 return n; 00043 }
|
|
number of trailing zeros [Henry] p.90
00094 { 00095 return 32 - dkcNTZ(~x&(x-1)); 00096 00097 }
|
|