#include <stdio.h>
#include "dkcOSIndependent.h"
#include "dkcDefined.h"
#include "dkcBuffer.h"
#include "dkcSerialize.h"
dkcMemoryStream.hのインクルード依存関係図
このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。
構成 | |
struct | dkc_MemoryStream |
struct | dkc_MemoryStreamAdapter |
マクロ定義 | |
#define | dkcMemoryStreamTell(tt) dkcMemoryStreamGetSeekPoint(tt) |
#define | dkcMemoryStreamAdapterPushBackMacro(type, p, x) |
バッファオーバーフローする可能性があります。内部構造を知らないと危険です。 | |
#define | dkcMemoryStreamAdapterIsEnd(p) ( (p)->mNowOffset >= (p)->mSize ) |
型定義 | |
typedef dkc_MemoryStream | DKC_MEMORYSTREAM |
typedef dkc_MemoryStreamAdapter | DKC_MEMORYSTREAM_ADAPTER |
列挙型 | |
enum | edkcMemoryStream { edkcMemoryStreamSeekCurrent = SEEK_CUR, edkcMemoryStreamSeekEnd = SEEK_END, edkcMemoryStreamSeekSet = SEEK_SET } |
関数 | |
DKC_EXTERN DKC_MEMORYSTREAM *WINAPI | dkcAllocMemoryStream (size_t size) |
ストリーム領域を得る。 | |
DKC_EXTERN int WINAPI | dkcFreeMemoryStream (DKC_MEMORYSTREAM **ptr) |
dkcAllocNewStream()で確保したストリーム領域を開放する | |
DKC_EXTERN int WINAPI | dkcMemoryStreamSeek (DKC_MEMORYSTREAM *ptr, int offset, int origin) |
streamをシークする。fseekみたいなもの | |
DKC_EXTERN size_t WINAPI | dkcMemoryStreamGetSeekPoint (DKC_MEMORYSTREAM *ptr) |
streamのシークポイントを返す。 | |
DKC_EXTERN int WINAPI | dkcMemoryStreamRead (DKC_MEMORYSTREAM *ptr, void *buffer, size_t size, size_t *readsize) |
streamをリードする。freadみたいなもの | |
DKC_EXTERN int WINAPI | dkcMemoryStreamWrite (DKC_MEMORYSTREAM *ptr, const void *buffer, size_t size) |
streamをライトする。fwriteみたいなもの | |
DKC_EXTERN int WINAPI | dkcMemoryStreamDynamicWrite (DKC_MEMORYSTREAM *ptr, const void *buffer, size_t size) |
streamをライトする。ライト出来なかったら内部で動的拡張する。 | |
DKC_EXTERN int WINAPI | dkcMemoryStreamResize (DKC_MEMORYSTREAM *ptr, size_t want_size) |
streamのバッファを拡張する。 | |
DKC_EXTERN size_t WINAPI | dkcMemoryStreamNowOffset (DKC_MEMORYSTREAM *p) |
今、どこまで書きこんでいるかのサイズを取得 | |
DKC_EXTERN BYTE *WINAPI | dkcMemoryStreamPointer (DKC_MEMORYSTREAM *p) |
内部バッファへのポインタを取得 | |
DKC_EXTERN DKC_MEMORYSTREAM *WINAPI | dkcAllocMemoryStreamDeserialize (DKC_DESERIALIZE *se) |
DKC_SERIALIZEから新しいMemoryStreamを作る。. | |
DKC_EXTERN void | dkcMemoryStreamSerialize (const DKC_MEMORYSTREAM *ptr, DKC_SERIALIZE *se) |
DKC_SERIALIZEにシリアライズデータをぶち込む. | |
DKC_EXTERN int WINAPI | dkcMemoryStreamClear (DKC_MEMORYSTREAM *ptr) |
stream内をmemset(0)する。(seek位置も最初に戻される。 | |
DKC_EXTERN DKC_MEMORYSTREAM *WINAPI | dkcAllocMemoryStreamCopy (const DKC_MEMORYSTREAM *ptr) |
DKC_EXTERN void WINAPI | dkcMemoryStreamAdapterInit (DKC_MEMORYSTREAM_ADAPTER *p, BYTE *buff, size_t size) |
DKC_EXTERN int WINAPI | dkcMemoryStreamAdapterPushBack (DKC_MEMORYSTREAM_ADAPTER *p, const BYTE *buff, size_t size) |
DKC_EXTERN int WINAPI | dkcMemoryStreamAdapterPopBack (DKC_MEMORYSTREAM_ADAPTER *p, size_t size) |
DKC_EXTERN BYTE *WINAPI | dkcMemoryStreamAdapterPointer (DKC_MEMORYSTREAM_ADAPTER *p) |
DKC_EXTERN size_t WINAPI | dkcMemoryStreamAdapterSize (DKC_MEMORYSTREAM_ADAPTER *p) |
DKC_EXTERN int WINAPI | dkcMemoryStreamAdapterSetOffset (DKC_MEMORYSTREAM_ADAPTER *ptr, size_t offset) |
DKC_EXTERN size_t WINAPI | dkcMemoryStreamAdapterGetOffset (DKC_MEMORYSTREAM_ADAPTER *p) |
dkcMemoryStream.h で定義されています。
|
dkcMemoryStream.h の 144 行で定義されています。 |
|
値: {\
*((type *)&( (p)->mBuff[(p)->mNowOffset])) = (type)x;(p)->mNowOffset += sizeof(type);\
}
dkcMemoryStream.h の 141 行で定義されています。 |
|
dkcMemoryStream.h の 77 行で定義されています。 参照元 dkcRLEDecode(), dkcRLEEncode(), dkcStreamTell(), と getRLE(). |
|
|
|
dkcMemoryStream.h の 40 行で定義されています。
00040 { 00042 edkcMemoryStreamSeekCurrent = SEEK_CUR, 00044 edkcMemoryStreamSeekEnd = SEEK_END, 00046 edkcMemoryStreamSeekSet = SEEK_SET, 00047 }; |
|
ストリーム領域を得る。
dkcMemoryStream.c の 16 行で定義されています。 参照先 BYTE, DKC_MEMORYSTREAM, dkcAllocate(), dkcFree(), dkc_MemoryStream::mBuffer, dkc_MemoryStream::mNowOffset, dkc_MemoryStream::mSize, と NULL. 参照元 dkcAllocDeserialize(), dkcAllocMemoryStreamCopy(), dkcAllocMemoryStreamDeserialize(), dkcAllocSerialize(), dkcAllocStream(), dkcAllocString(), と dkcAllocUniqueID().
00016 { 00017 DKC_MEMORYSTREAM *p; 00018 if(0==size) return NULL; 00019 00020 p = (DKC_MEMORYSTREAM *)dkcAllocate(sizeof(DKC_MEMORYSTREAM)); 00021 00022 if(NULL==p) return NULL; 00023 p->mBuffer = (BYTE *)dkcAllocate(size); 00024 if(NULL==p->mBuffer) goto Error; 00025 00026 p->mSize = size; 00027 p->mNowOffset = 0; 00028 return p; 00029 Error: 00030 dkcFree((void **)&p); 00031 return NULL; 00032 00033 } |
|
dkcMemoryStream.c の 274 行で定義されています。 参照先 DKC_MEMORYSTREAM, dkcAllocMemoryStream(), dkcMemoryStreamSeek(), dkcMemoryStreamWrite(), dkcmNOT_ASSERT, edkcMemoryStreamSeekSet, dkc_MemoryStream::mBuffer, dkc_MemoryStream::mNowOffset, と NULL.
00275 { 00276 DKC_MEMORYSTREAM *tp = NULL; 00277 00278 dkcmNOT_ASSERT(NULL==ptr); 00279 00280 tp = dkcAllocMemoryStream(ptr->mSize); 00281 if(NULL==tp) return NULL; 00282 00283 dkcMemoryStreamWrite(tp,ptr->mBuffer,ptr->mSize); 00284 00285 //内部オフセット変更 /* 先頭から */ 00286 dkcMemoryStreamSeek(tp,ptr->mNowOffset,edkcMemoryStreamSeekSet); 00287 return tp; 00288 } |
|
DKC_SERIALIZEから新しいMemoryStreamを作る。.
dkcMemoryStream.c の 293 行で定義されています。 参照先 DKC_DESERIALIZE, DKC_MEMORYSTREAM, dkcAllocMemoryStream(), dkcDeserializeRead(), dkcmNOT_ASSERT, dkc_MemoryStream::mBuffer, dkc_MemoryStream::mNowOffset, と NULL. 参照元 dkcAllocStringDeserialize().
00294 { 00295 DKC_MEMORYSTREAM *p; 00296 DKC_MEMORYSTREAM t; 00297 size_t read; 00298 //dkcmNOT_ASSERT(NULL==se); 00299 00300 00301 dkcDeserializeRead(se,&t,sizeof(t),&read); 00302 00303 p = dkcAllocMemoryStream(t.mSize); 00304 if(NULL==p) return NULL; 00305 00306 /* シリアライズデータと同じにしないと^^; */ 00307 00308 dkcDeserializeRead(se,p->mBuffer,t.mSize,&read); 00309 00310 dkcmNOT_ASSERT(read != t.mSize); 00311 00312 00313 p->mNowOffset = t.mNowOffset; 00314 00315 return p; 00316 } |
|
dkcAllocNewStream()で確保したストリーム領域を開放する
dkcMemoryStream.c の 36 行で定義されています。 参照先 DKC_MEMORYSTREAM, dkcFree(), edk_ArgumentException, edk_FAILED, と NULL. 参照元 dkcAllocDeserialize(), dkcAllocSerialize(), dkcAllocStringDeserialize(), dkcFreeDeserialize(), dkcFreeSerialize(), dkcFreeStream(), dkcFreeString(), と dkcFreeUniqueID().
00036 { 00037 if(NULL==ptr || NULL==*ptr) return edk_ArgumentException; 00038 if(NULL==(*ptr)->mBuffer) return edk_FAILED; 00039 00040 dkcFree((void **)&((*ptr)->mBuffer)); 00041 return dkcFree((void **)ptr); 00042 } |
|
dkcMemoryStream.c の 381 行で定義されています。 参照先 DKC_MEMORYSTREAM_ADAPTER, と dkc_MemoryStreamAdapter::mNowOffset.
00381 { 00382 return p->mNowOffset; 00383 } |
|
dkcMemoryStream.c の 331 行で定義されています。 参照先 BYTE, DKC_MEMORYSTREAM_ADAPTER, dkc_MemoryStreamAdapter::mBuff, dkc_MemoryStreamAdapter::mNowOffset, と dkc_MemoryStreamAdapter::mSize.
00332 { 00333 p->mBuff = buff; 00334 p->mSize = size; 00335 p->mNowOffset = 0; 00336 00337 } |
|
dkcMemoryStream.c の 365 行で定義されています。 参照先 BYTE, DKC_MEMORYSTREAM_ADAPTER, と dkc_MemoryStreamAdapter::mBuff.
00365 { 00366 return p->mBuff; 00367 } |
|
dkcMemoryStream.c の 356 行で定義されています。 参照先 DKC_MEMORYSTREAM_ADAPTER, edk_FAILED, edk_SUCCEEDED, と dkc_MemoryStreamAdapter::mNowOffset.
00357 { 00358 if(size > p->mNowOffset){ 00359 return edk_FAILED; 00360 } 00361 p->mNowOffset -= size; 00362 return edk_SUCCEEDED; 00363 } |
|
dkcMemoryStream.c の 339 行で定義されています。 参照先 BYTE, DKC_MEMORYSTREAM_ADAPTER, dkcCheckOverflowULONG(), edk_BufferOverFlow, edk_FAILED, edk_SUCCEEDED, dkc_MemoryStreamAdapter::mBuff, dkc_MemoryStreamAdapter::mNowOffset, と dkc_MemoryStreamAdapter::mSize.
00340 { 00341 size_t offset = p->mNowOffset; 00342 BYTE *tb = p->mBuff; 00343 if(dkcCheckOverflowULONG(offset,size)){ 00344 return edk_FAILED; 00345 } 00346 if(offset + size >= p->mSize){ 00347 return edk_BufferOverFlow; 00348 } 00349 memcpy(&tb[offset],buff,size); 00350 00351 p->mNowOffset += size; 00352 00353 return edk_SUCCEEDED; 00354 } |
|
dkcMemoryStream.c の 374 行で定義されています。 参照先 DKC_MEMORYSTREAM_ADAPTER, edk_FAILED, edk_SUCCEEDED, dkc_MemoryStreamAdapter::mNowOffset, と dkc_MemoryStreamAdapter::mSize.
00374 { 00375 if(offset > p->mSize){ 00376 return edk_FAILED; 00377 } 00378 p->mNowOffset = offset; 00379 return edk_SUCCEEDED; 00380 } |
|
dkcMemoryStream.c の 369 行で定義されています。 参照先 DKC_MEMORYSTREAM_ADAPTER, と dkc_MemoryStreamAdapter::mSize.
00369 { 00370 return p->mSize; 00371 00372 } |
|
stream内をmemset(0)する。(seek位置も最初に戻される。
dkcMemoryStream.c の 257 行で定義されています。 参照先 DKC_MEMORYSTREAM, dkcmNOT_ASSERT, edk_SUCCEEDED, と NULL. 参照元 dkcStreamClear(), と dkcStringCopy().
00257 { 00258 dkcmNOT_ASSERT(NULL==ptr); 00259 //if(NULL==ptr) return edk_ArgumentException; 00260 memset(ptr->mBuffer,0,ptr->mSize); 00261 ptr->mNowOffset = 0; 00262 return edk_SUCCEEDED; 00263 } |
|
streamをライトする。ライト出来なかったら内部で動的拡張する。
dkcMemoryStream.c の 231 行で定義されています。 参照先 DKC_MEMORYSTREAM, dkcMemoryStreamAutoExpandResize(), dkcMemoryStreamWrite(), DKUTIL_FAILED, edk_ArgumentException, edk_FAILED, dkc_MemoryStream::mNowOffset, dkc_MemoryStream::mSize, と NULL. 参照元 dkcSerializeWrite(), dkcStringConcatenate(), と dkcStringCopy().
00231 { 00232 int result; 00233 size_t want_size; 00234 00235 if(NULL==ptr) return edk_ArgumentException; 00236 00237 want_size = ptr->mNowOffset + size; 00238 00239 if(ptr->mSize < want_size) 00240 { 00241 result = dkcMemoryStreamAutoExpandResize(ptr,size); 00242 //result = dkcMemoryStreamResize(ptr,want_size); 00243 if(DKUTIL_FAILED(result)) return edk_FAILED; 00244 } 00245 00246 return dkcMemoryStreamWrite(ptr,buffer,size); 00247 } |
|
streamのシークポイントを返す。
dkcMemoryStream.c の 92 行で定義されています。 参照先 DKC_MEMORYSTREAM, と dkc_MemoryStream::mNowOffset. 参照元 dkcStringInsert().
00093 { 00094 return ptr->mNowOffset; 00095 } |
|
今、どこまで書きこんでいるかのサイズを取得
dkcMemoryStream.c の 265 行で定義されています。 参照先 DKC_EXTERN, DKC_MEMORYSTREAM, と dkc_MemoryStream::mNowOffset.
00265 { 00266 return p->mNowOffset; 00267 } |
|
内部バッファへのポインタを取得
dkcMemoryStream.c の 269 行で定義されています。 参照先 BYTE, DKC_EXTERN, DKC_MEMORYSTREAM, と dkc_MemoryStream::mBuffer.
00269 { 00270 return p->mBuffer; 00271 00272 } |
|
streamをリードする。freadみたいなもの
dkcMemoryStream.c の 97 行で定義されています。 参照先 dkc_memcpy(), DKC_MEMORYSTREAM, dkcmNOT_ASSERT, edk_ArgumentException, edk_BufferOverFlow, edk_FAILED, edk_SUCCEEDED, dkc_MemoryStream::mBuffer, dkc_MemoryStream::mNowOffset, dkc_MemoryStream::mSize, と NULL. 参照元 dkcDeserializeRead(), と dkcStreamRead().
00097 { 00098 00099 00100 size_t f_read = 0; 00101 //error check 00102 00103 if(NULL==ptr || NULL==readsize) return edk_ArgumentException; 00104 00105 //Read = (int)(ptr->mNowOffset + size); 00106 //Read = (int)(ptr->mSize - Read); 00107 //if(Read < 0) return edk_BufferOverFlow; 00108 00109 //process... 00110 00111 f_read = ptr->mNowOffset + size; 00112 00113 if(ptr->mSize <= f_read){ 00114 f_read = ptr->mSize - ptr->mNowOffset; 00115 if(0==f_read) return edk_BufferOverFlow; 00116 }else{ 00117 f_read = size; 00118 } 00119 00120 00121 00122 dkcmNOT_ASSERT(edk_FAILED==dkc_memcpy(buffer,size, 00123 ptr->mBuffer + ptr->mNowOffset,f_read 00124 )); 00125 00126 00127 //update... 00128 ptr->mNowOffset += f_read; 00129 *readsize = f_read; 00130 00131 return edk_SUCCEEDED; 00132 } |
|
streamのバッファを拡張する。
dkcMemoryStream.c の 135 行で定義されています。 参照先 BYTE, DKC_MEMORYSTREAM, dkcReallocate(), DKUTIL_FAILED, edk_ArgumentException, edk_FAILED, edk_SUCCEEDED, dkc_MemoryStream::mBuffer, dkc_MemoryStream::mSize, と NULL.
00136 { 00137 int ra_r = 0; 00138 void *NewPtr = NULL; 00139 void *OldPtr = NULL; 00140 00141 //error check 00142 if(NULL==ptr) return edk_ArgumentException; 00143 00144 00145 //process 00146 OldPtr = ptr->mBuffer; 00147 00148 ra_r = dkcReallocate(&NewPtr,want_size,&OldPtr); 00149 if(DKUTIL_FAILED(ra_r)){ 00150 return edk_FAILED; 00151 } 00152 00153 //update... 00154 ptr->mBuffer = (BYTE *)NewPtr; 00155 ptr->mSize = want_size; 00156 00157 00158 return edk_SUCCEEDED; 00159 } |
|
|
DKC_SERIALIZEにシリアライズデータをぶち込む.
dkcMemoryStream.c の 320 行で定義されています。 参照先 DKC_MEMORYSTREAM, DKC_SERIALIZE, dkcmNOT_ASSERT, dkcSerializeWrite(), と NULL. 参照元 dkcStringSerialize().
00321 { 00322 dkcmNOT_ASSERT(NULL==ptr); 00323 00324 dkcSerializeWrite(se,ptr,sizeof(*ptr)); 00325 dkcSerializeWrite(se,ptr->mBuffer,ptr->mSize); 00326 00327 } |
|
streamをライトする。fwriteみたいなもの
dkcMemoryStream.c の 210 行で定義されています。 参照先 BYTE, dkc_memcpy(), DKC_MEMORYSTREAM, dkcmNOT_ASSERT, DKUTIL_FAILED, edk_ArgumentException, edk_FAILED, edk_SUCCEEDED, dkc_MemoryStream::mBuffer, dkc_MemoryStream::mNowOffset, dkc_MemoryStream::mSize, と NULL. 参照元 dkcAllocMemoryStreamCopy(), dkcMemoryStreamDynamicWrite(), dkcRLEDecode(), dkcStreamWrite(), getABS(), と getRLE().
00210 { 00211 size_t rest; 00212 00213 if(NULL==ptr) return edk_ArgumentException; 00214 00215 00216 if(ptr->mSize < ptr->mNowOffset + size){return edk_FAILED;} 00217 rest = ptr->mSize - ptr->mNowOffset; 00218 00219 dkcmNOT_ASSERT(DKUTIL_FAILED(dkc_memcpy( 00220 (void *)((BYTE *)ptr->mBuffer + ptr->mNowOffset), 00221 rest, 00222 buffer,size) 00223 )); 00224 00225 ptr->mNowOffset += size; 00226 00227 return edk_SUCCEEDED; 00228 } |