メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

# dkcCircularMemoryStream.c

説明を見る。

    00001
    00006 #define DKUTIL_C_CIRCULAR_MEMORYSTREAM_C
    00007 #include "dkcCircularMemoryStream.h"
    00008 #include "dkcStdio.h"
    00009
    00010
    00011 DKC_CIRCULAR_MEMORYSTREAM * WINAPI dkcAllocCircularMemoryStream(size_t size)
    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 }
    00031
    00032 int WINAPI dkcFreeCircularMemoryStream(DKC_CIRCULAR_MEMORYSTREAM **ptr){
    00033     if(NULL==ptr || NULL==*ptr){return edk_ArgumentException;}
    00034     dkcFree((void **)&(*ptr)->mBuffer);
    00035     return dkcFree((void **)ptr);
    00036 }
    00037
    00038
    00039 static DKC_INLINE BOOL isDoubleProcess(size_t start,size_t data_length,size_t border_size)
    00040 {
    00041     return (start + data_length > border_size);
    00042 }
    00043
    00044
    00045
    00046 static int WINAPI dkcCircularMemoryStreamReadLogic(
    00047     DKC_CIRCULAR_MEMORYSTREAM *RingBuf,void *Buf , size_t Len,size_t *readsize,BOOL PeekFlag)
    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     // ２回に別けなければいけないかどうかで処理を分岐
    00068     if( isDoubleProcess(RingBuf->mStart, Len, RingBuf->mSize) /*RingBuf->mStart + Len > RingBuf->mSize*/ )
    00069     {
    00070         // ２回に別ける場合の処理
    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         // １回で格納する場合の処理
    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 }
    00103
    00104 //streamをリードする。freadみたいなもの
    00105 int WINAPI dkcCircularMemoryStreamRead(DKC_CIRCULAR_MEMORYSTREAM *ptr,void *buffer,size_t size,size_t *readsize)
    00106 {
    00107     return dkcCircularMemoryStreamReadLogic(ptr,buffer,size,readsize,FALSE);
    00108 }
    00109 //中を覗き見るだけ。
    00110 int WINAPI dkcCircularMemoryStreamReference(DKC_CIRCULAR_MEMORYSTREAM *ptr,void *buffer,size_t size,size_t *readsize)
    00111 {
    00112     return dkcCircularMemoryStreamReadLogic(ptr,buffer,size,readsize,TRUE);
    00113 }
    00114
    00115
    00116 //streamをライトする。fwriteみたいなもの
    00117 int WINAPI dkcCircularMemoryStreamWrite(DKC_CIRCULAR_MEMORYSTREAM *ptr,const void *buffer,size_t size){
    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     // ２回に分けて格納しなければならないかどうかで処理を分岐
    00125     if(isDoubleProcess(ptr->mEnd,size,ptr->mSize))
    00126     {
    00127         // ２回に別けて格納する場合の処理
    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         // １回で格納する場合の処理
    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 }
    00146
    00147
    00148 int WINAPI dkcCircularMemoryStreamClear(DKC_CIRCULAR_MEMORYSTREAM *ptr){
    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 }
    00160
    00161 //stream内のものをバッファにコピーする。
    00162 int WINAPI dkcCircularMemoryStreamToBuffer(
    00163     const DKC_CIRCULAR_MEMORYSTREAM *ptr,char *buff,size_t size,size_t want_size)
    00164 {
    00165
    00166     return edk_SUCCEEDED;
    00167 }
    00168
    00169 DKC_CIRCULAR_MEMORYSTREAM *WINAPI
    00170     dkcAllocCircularMemoryStreamCopy(const DKC_CIRCULAR_MEMORYSTREAM *ptr)
    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 }
    00192
    00193
    00194