00001
00007 #ifndef DKUTIL_C_CIRCULAR_MEMORYSTREAM_H
00008 #define DKUTIL_C_CIRCULAR_MEMORYSTREAM_H
00009
00010
00011 #include "dkcMemoryStream.h"
00012
00013
00014 enum edkcCirculerMemoryStream{
00016 edkcCirculerMemoryStreamSeekCurrent = edkcSeekCurrent,
00018 edkcCirculerMemoryStreamSeekEnd = edkcSeekEnd,
00020 edkcCirculerMemoryStreamSeekSet = edkcSeekSet,
00021
00022
00023 };
00024
00025
00026
00027
00029
00031
00032
00033
00034
00038 typedef struct dkc_CircularMemoryStream{
00040 BYTE *mBuffer;
00042 size_t mSize ;
00044 size_t mStart,mEnd;
00046 size_t mEnableLength ;
00047
00048 } DKC_CIRCULAR_MEMORYSTREAM;
00049
00050 DKC_EXTERN DKC_CIRCULAR_MEMORYSTREAM * WINAPI dkcAllocCircularMemoryStream(size_t size);
00051
00052 DKC_EXTERN int WINAPI dkcFreeCircularMemoryStream(DKC_CIRCULAR_MEMORYSTREAM **ptr);
00053
00063
00064 DKC_EXTERN int WINAPI dkcCircularMemoryStreamRead(DKC_CIRCULAR_MEMORYSTREAM *ptr,void *buffer,size_t size,size_t *readsize);
00065
00067 DKC_EXTERN int WINAPI dkcCircularMemoryStreamReference(DKC_CIRCULAR_MEMORYSTREAM *ptr,void *buffer,size_t size,size_t *readsize);
00068
00077
00078 DKC_EXTERN int WINAPI dkcCircularMemoryStreamWrite(DKC_CIRCULAR_MEMORYSTREAM *ptr,const void *buffer,size_t size);
00079
00081 DKC_EXTERN int WINAPI dkcCircularMemoryStreamClear(DKC_CIRCULAR_MEMORYSTREAM *ptr);
00082
00087 DKC_EXTERN DKC_CIRCULAR_MEMORYSTREAM *WINAPI
00088 dkcAllocCircularMemoryStreamCopy(const DKC_CIRCULAR_MEMORYSTREAM *ptr);
00089
00090 DKC_INLINE size_t dkcCirculerMemoryStreamTell(DKC_CIRCULAR_MEMORYSTREAM *ptr)
00091 {
00092 return ptr->mStart;
00093 }
00094 DKC_INLINE size_t dkcCirculerMemoryStreamSize(DKC_CIRCULAR_MEMORYSTREAM *ptr)
00095 {
00096 return ptr->mEnableLength;
00097 }
00098 DKC_INLINE size_t dkcCirculerMemoryStreamEOF(DKC_CIRCULAR_MEMORYSTREAM *ptr)
00099 {
00100 return ptr->mSize == ptr->mEnd;
00101 }
00102
00104 DKC_INLINE int dkcCirculerMemoryStreamSeek(DKC_CIRCULAR_MEMORYSTREAM *ptr,long offset,long origin)
00105 {
00106 long point;
00107 size_t change;
00108 switch(origin){
00109 case edkcCirculerMemoryStreamSeekCurrent:
00110 point = ptr->mStart;
00111 break;
00112 case edkcCirculerMemoryStreamSeekEnd:
00113 point = ptr->mEnd;
00114 break;
00115 case edkcCirculerMemoryStreamSeekSet:
00116 point = 0;
00117 break;
00118 default:
00119 return edk_ArgumentException;
00120 }
00121
00122 change = offset % ptr->mEnableLength;
00123 change = (point + change);
00124
00125 if(TRUE==dkcCheckOverflow32(ptr->mStart ,change)){
00126 return edk_FAILED;
00127 }
00128
00129
00130
00131
00132 if( ptr->mStart + change > ptr->mEnd)
00133 {
00134 return edk_FAILED;
00135 }
00136 ptr->mSize += change;
00137 return edk_SUCCEEDED;
00138 }
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150 #endif