#include "dkcCircularMemoryStream.h"
#include "dkcStdio.h"
dkcCircularMemoryStream.cのインクルード依存関係図
マクロ定義 | |
#define | DKUTIL_C_CIRCULAR_MEMORYSTREAM_C |
関数 | |
DKC_CIRCULAR_MEMORYSTREAM *WINAPI | dkcAllocCircularMemoryStream (size_t size) |
int WINAPI | dkcFreeCircularMemoryStream (DKC_CIRCULAR_MEMORYSTREAM **ptr) |
static DKC_INLINE BOOL | isDoubleProcess (size_t start, size_t data_length, size_t border_size) |
static int WINAPI | dkcCircularMemoryStreamReadLogic (DKC_CIRCULAR_MEMORYSTREAM *RingBuf, void *Buf, size_t Len, size_t *readsize, BOOL PeekFlag) |
int WINAPI | dkcCircularMemoryStreamRead (DKC_CIRCULAR_MEMORYSTREAM *ptr, void *buffer, size_t size, size_t *readsize) |
streamをリードする。freadみたいなもの | |
int WINAPI | dkcCircularMemoryStreamReference (DKC_CIRCULAR_MEMORYSTREAM *ptr, void *buffer, size_t size, size_t *readsize) |
中を覗き見るだけ。引数についてはdkcCircularMemoryStreamRead()を見るべし。 | |
int WINAPI | dkcCircularMemoryStreamWrite (DKC_CIRCULAR_MEMORYSTREAM *ptr, const void *buffer, size_t size) |
streamをライトする。fwriteみたいなもの | |
int WINAPI | dkcCircularMemoryStreamClear (DKC_CIRCULAR_MEMORYSTREAM *ptr) |
stream内のカウンタを0にして事実上すべてクリアーにする。 | |
int WINAPI | dkcCircularMemoryStreamToBuffer (const DKC_CIRCULAR_MEMORYSTREAM *ptr, char *buff, size_t size, size_t want_size) |
DKC_CIRCULAR_MEMORYSTREAM *WINAPI | dkcAllocCircularMemoryStreamCopy (const DKC_CIRCULAR_MEMORYSTREAM *ptr) |
dkcCircularMemoryStream.c で定義されています。
|
dkcCircularMemoryStream.c の 6 行で定義されています。 |
|
dkcCircularMemoryStream.c の 11 行で定義されています。 参照先 dkcAllocate(), dkcFree(), dkc_CircularMemoryStream::mBuffer, dkc_CircularMemoryStream::mEnableLength, dkc_CircularMemoryStream::mEnd, dkc_CircularMemoryStream::mSize, dkc_CircularMemoryStream::mStart, と NULL. 参照元 dkcAllocCircularMemoryStreamCopy(). 00012 { 00013 DKC_CIRCULAR_MEMORYSTREAM *p = NULL; 00014 00015 p = (DKC_CIRCULAR_MEMORYSTREAM *)dkcAllocate(sizeof(DKC_CIRCULAR_MEMORYSTREAM)); 00016 if(NULL==p) return NULL; 00017 00018 p->mBuffer = dkcAllocate(size); 00019 if(NULL==p->mBuffer) goto Error; 00020 00021 p->mStart = 0; 00022 p->mEnd = 0; 00023 p->mEnableLength = 0; 00024 p->mSize = size; 00025 00026 return p; 00027 Error: 00028 dkcFree((void **)&p); 00029 return NULL; 00030 }
|
|
DKC_CIRCULAR_MEMORYSTREAMをコピーする。 C++で言うコピーコンストラクタみたいなもの^^; dkcCircularMemoryStream.c の 170 行で定義されています。 参照先 dkc_memcpy(), dkcAllocCircularMemoryStream(), dkcmNOT_ASSERT, dkc_CircularMemoryStream::mBuffer, dkc_CircularMemoryStream::mEnableLength, dkc_CircularMemoryStream::mEnd, dkc_CircularMemoryStream::mSize, dkc_CircularMemoryStream::mStart, と NULL. 00171 { 00172 DKC_CIRCULAR_MEMORYSTREAM *p; 00173 00174 dkcmNOT_ASSERT(NULL==ptr); 00175 00176 p = dkcAllocCircularMemoryStream(ptr->mSize); 00177 00178 00179 if(NULL==p) return NULL;//強制終了したい気分!! 00180 00181 dkcmNOT_ASSERT(DKUTIL_FAILED( 00182 dkc_memcpy(p->mBuffer,p->mSize,ptr->mBuffer,ptr->mSize) 00183 )); 00184 00185 p->mEnableLength = ptr->mEnableLength; 00186 p->mEnd = p->mEnd; 00187 p->mStart = p->mStart; 00188 00189 00190 return p; 00191 }
|
|
stream内のカウンタを0にして事実上すべてクリアーにする。
dkcCircularMemoryStream.c の 148 行で定義されています。 参照先 dkc_CircularMemoryStream::mBuffer, dkc_CircularMemoryStream::mEnableLength, dkc_CircularMemoryStream::mEnd, dkc_CircularMemoryStream::mStart, と NULL. 00148 { 00149 00150 if(NULL==ptr || NULL==ptr->mBuffer){return edk_ArgumentException;} 00151 00152 ptr->mEnableLength = 0; 00153 ptr->mEnd = 0; 00154 00155 ptr->mStart = 0; 00156 00157 00158 return edk_SUCCEEDED; 00159 }
|
|
streamをリードする。freadみたいなもの
dkcCircularMemoryStream.c の 105 行で定義されています。 参照先 dkcCircularMemoryStreamReadLogic(), と FALSE. 00106 { 00107 return dkcCircularMemoryStreamReadLogic(ptr,buffer,size,readsize,FALSE); 00108 }
|
|
dkcCircularMemoryStream.c の 46 行で定義されています。 参照先 FALSE, isDoubleProcess(), dkc_CircularMemoryStream::mBuffer, dkc_CircularMemoryStream::mEnableLength, dkc_CircularMemoryStream::mSize, dkc_CircularMemoryStream::mStart, と NULL. 参照元 dkcCircularMemoryStreamRead(), と dkcCircularMemoryStreamReference(). 00048 { 00049 if(NULL==RingBuf || NULL==RingBuf->mBuffer || NULL==readsize) 00050 return edk_ArgumentException; 00051 00052 if( RingBuf->mEnableLength==0) return edk_FAILED; 00053 00054 if( RingBuf->mEnableLength < Len ) 00055 { // 存在するデータ量より多かったら 00056 //return edk_FAILED ; 00057 //とりあえず、ありったけのデータをもらおう。 00058 Len = RingBuf->mEnableLength; 00059 00060 }else{ 00061 00062 00063 } 00064 //読み込むデータはこのくらいあるのだ! 00065 *readsize = Len; 00066 00067 // 2回に別けなければいけないかどうかで処理を分岐 00068 if( isDoubleProcess(RingBuf->mStart, Len, RingBuf->mSize) /*RingBuf->mStart + Len > RingBuf->mSize*/ ) 00069 { 00070 // 2回に別ける場合の処理 00071 memcpy( Buf, 00072 (char *)RingBuf->mBuffer + RingBuf->mStart, 00073 RingBuf->mSize - RingBuf->mStart ) ; 00074 memcpy( (char *)Buf + ( RingBuf->mSize - RingBuf->mStart ), 00075 RingBuf->mBuffer, 00076 Len - ( RingBuf->mSize - RingBuf->mStart ) ) ; 00077 00078 //最初からシーク 00079 /*dkcStreamToBuffer(RingBuf->mBuffer,edkcStreamSeekSet, 00080 RingBuf->mStart, RingBuf->mSize - RingBuf->mStart,Buf,Len); 00081 00082 dkcStreamToBuffer(RingBuf->mBuffer,edkcStreamSeekSet, 00083 0 ,Len - ( RingBuf->mSize - RingBuf->mStart ), 00084 (char *)Buf + ( RingBuf->mSize - RingBuf->mStart ),Len); 00085 */ 00086 if( PeekFlag == FALSE ) RingBuf->mStart = Len - ( RingBuf->mSize - RingBuf->mStart ) ; 00087 } 00088 else 00089 { 00090 // 1回で格納する場合の処理 00091 memcpy( Buf, (char *)RingBuf->mBuffer + RingBuf->mStart, Len ) ; 00092 00093 /*dkcStreamToBuffer(RingBuf->mBuffer,edkcStreamSeekSet, 00094 RingBuf->mStart,Len,Buf,Len); 00095 */ 00096 if( PeekFlag == FALSE ) RingBuf->mStart += Len ; 00097 } 00098 00099 // データの量を減らす 00100 if( PeekFlag == FALSE ) RingBuf->mEnableLength -= Len ; 00101 return edk_SUCCEEDED; 00102 }
|
|
中を覗き見るだけ。引数についてはdkcCircularMemoryStreamRead()を見るべし。
dkcCircularMemoryStream.c の 110 行で定義されています。 参照先 dkcCircularMemoryStreamReadLogic(), と TRUE. 00111 { 00112 return dkcCircularMemoryStreamReadLogic(ptr,buffer,size,readsize,TRUE); 00113 }
|
|
dkcCircularMemoryStream.c の 162 行で定義されています。
|
|
streamをライトする。fwriteみたいなもの
dkcCircularMemoryStream.c の 117 行で定義されています。 参照先 isDoubleProcess(), dkc_CircularMemoryStream::mBuffer, dkc_CircularMemoryStream::mEnableLength, dkc_CircularMemoryStream::mEnd, dkc_CircularMemoryStream::mSize, と NULL. 00117 { 00118 if(NULL==ptr || NULL==buffer || 0==size ) return edk_ArgumentException; 00119 //DxLibを参考にしました。この場をお借りしてお礼申し上げます。m(_ _)m 00120 00121 //error check 00122 if(ptr->mSize - ptr->mEnableLength < size) return edk_FAILED; 00123 00124 // 2回に分けて格納しなければならないかどうかで処理を分岐 00125 if(isDoubleProcess(ptr->mEnd,size,ptr->mSize)) 00126 { 00127 // 2回に別けて格納する場合の処理 00128 memcpy( (char *)ptr->mBuffer + ptr->mEnd, buffer, ptr->mSize - ptr->mEnd ) ; 00129 memcpy( ptr->mBuffer, (char *)buffer + ( ptr->mSize - ptr->mEnd ), size - ( ptr->mSize - ptr->mEnd ) ) ; 00130 //dkcStreamWrite(ptr->mBuffer,buffer,ptr->mSize - ptr->mEnd); 00131 //dkcStreamSeek(ptr->mBuffer,0,edkcStreamSeekSet);//オフセットを最初にする。 00132 //dkcStreamWrite(ptr->mBuffer,(char *)buffer + ( ptr->mSize - ptr->mEnd ),size - ( ptr->mSize - ptr->mEnd )); 00133 ptr->mEnd = size - ( ptr->mSize - ptr->mEnd ) ; 00134 }else{ 00135 // 1回で格納する場合の処理 00136 memcpy( (char *)ptr->mBuffer + ptr->mEnd, buffer, size ) ; 00137 //dkcStreamWrite(ptr->mBuffer,buffer,size); 00138 ptr->mEnd += size ; 00139 } 00140 00141 00142 // 格納しているデータの量を増やす 00143 ptr->mEnableLength += size; 00144 return edk_SUCCEEDED; 00145 }
|
|
dkcCircularMemoryStream.c の 32 行で定義されています。 00032 { 00033 if(NULL==ptr){return edk_ArgumentException;} 00034 dkcFree((void **)&(*ptr)->mBuffer); 00035 return dkcFree((void **)ptr); 00036 }
|
|
dkcCircularMemoryStream.c の 39 行で定義されています。 参照元 dkcCircularMemoryStreamReadLogic(), と dkcCircularMemoryStreamWrite().
|