00001
00011 #ifndef DKUTIL_C_BUFFER_H
00012 #define DKUTIL_C_BUFFER_H
00013
00014 #include "dkcOSIndependent.h"
00015 #include "dkcStdio.h"
00016
00020 typedef struct dkc_Buffer{
00022 BYTE *mBuff;
00024 size_t mSize;
00025 }DKC_BUFFER;
00026
00027
00028
00029
00034
00035 DKC_EXTERN DKC_BUFFER* WINAPI dkcAllocBuffer(const void *data,size_t size);
00041
00042 DKC_EXTERN int WINAPI dkcFreeBuffer(DKC_BUFFER **ptr);
00043
00050 DKC_INLINE void dkcBufferInit(DKC_BUFFER *p,size_t size){
00051 p->mBuff=(BYTE *)dkcAllocate(size);
00052 p->mSize = size;
00053 }
00055 DKC_INLINE void dkcBufferUninit(DKC_BUFFER *p){
00056 if(p->mBuff){
00057 dkcFree((void **)&p->mBuff);
00058 }
00059 p->mSize = 0;
00060 }
00061 DKC_INLINE int dkcBufferCopy(DKC_BUFFER *p,const DKC_BUFFER *src){
00062 void *tp = p->mBuff;
00063 if(tp){
00064 dkcFree(&tp);
00065 }
00066 p->mBuff = (BYTE *)dkcAllocate(src->mSize);
00067 if(NULL==p->mBuff){
00068 return edk_OutOfMemory;
00069 }
00070 p->mSize = src->mSize;
00071 return edk_SUCCEEDED;
00072 }
00073 DKC_INLINE void dkcBufferCopyShared(DKC_BUFFER *p,DKC_BUFFER *src){
00074 p->mBuff = src->mBuff;
00075 p->mSize = src->mSize;
00076 }
00080 DKC_EXTERN int WINAPI dkcBufferSet(DKC_BUFFER *ptr,const void *data,size_t size);
00082 DKC_EXTERN int WINAPI dkcBufferSetOffset(DKC_BUFFER *ptr,
00083 const void *data,size_t size,size_t offset);
00084
00085
00089 DKC_EXTERN int WINAPI dkcBufferGet(DKC_BUFFER *ptr,void *data,size_t size);
00090
00091 DKC_EXTERN int WINAPI dkcBufferGetOffset(DKC_BUFFER *ptr,
00092 void *data,size_t size,size_t offset);
00096 DKC_EXTERN int WINAPI dkcBufferResize(DKC_BUFFER *ptr,size_t size);
00098 DKC_EXTERN DKC_BUFFER* WINAPI dkcAllocBufferCopy(const DKC_BUFFER *);
00099
00101 DKC_EXTERN size_t WINAPI dkcBufferSize(DKC_BUFFER *p);
00102
00103 DKC_EXTERN BYTE *WINAPI dkcBufferPointer(DKC_BUFFER *p);
00104
00105
00106
00107
00108 DKC_INLINE int WINAPI dkcBufferSet_INL(DKC_BUFFER *ptr,const void *data,size_t size)
00109 {
00110
00111
00112 return dkc_memcpy(ptr->mBuff,ptr->mSize,data,size);
00113 }
00114
00115
00116 DKC_INLINE int WINAPI dkcBufferSetOffset_INL(DKC_BUFFER *ptr,
00117 const void *data,size_t size,size_t offset){
00118 if(ptr->mSize < offset + size){
00119 return edk_BufferOverFlow;
00120 }
00121 return dkc_memcpy(
00122 ptr->mBuff + offset,
00123 ptr->mSize - offset
00124 ,data,size);
00125 }
00126
00127
00128
00129
00130 DKC_INLINE int WINAPI dkcBufferGet_INL(DKC_BUFFER *ptr,void *data,size_t size){
00131
00132 return dkc_memcpy(data,size,ptr->mBuff,ptr->mSize);
00133 }
00134
00135 DKC_INLINE int WINAPI dkcBufferGetOffset_INL(DKC_BUFFER *ptr,
00136 void *data,size_t size,size_t offset){
00137 if(ptr->mSize < offset + size){
00138 return edk_BufferOverFlow;
00139 }
00140 return dkc_memcpy(
00141 data,size,
00142 ptr->mBuff + offset,
00143 size
00144 );
00145
00146 }
00147
00148 DKC_INLINE int WINAPI dkcBufferResize_INL(DKC_BUFFER *ptr,size_t size)
00149 {
00150 void *NewPtr;
00151 if(NULL==ptr || 0==size || NULL==ptr->mBuff) return edk_ArgumentException;
00152 if(DKUTIL_FAILED(dkcReallocate(&NewPtr,size,(void **)&(ptr->mBuff)))){
00153 return edk_FAILED;
00154 }
00155
00156 ptr->mBuff = (BYTE *)NewPtr;
00157 ptr->mSize = size;
00158
00159 return edk_SUCCEEDED;
00160 }
00161
00162
00163
00164 DKC_INLINE DKC_BUFFER* WINAPI dkcAllocBufferCopy_INL(const DKC_BUFFER *ptr){
00165 dkcmNOT_ASSERT(NULL==ptr || NULL==ptr->mBuff);
00166
00167 return dkcAllocBuffer(ptr->mBuff,ptr->mSize);
00168 }
00169
00170 DKC_INLINE size_t WINAPI dkcBufferSize_INL(DKC_BUFFER *p){
00171 return p->mSize;
00172 }
00173 DKC_INLINE BYTE *WINAPI dkcBufferPointer_INL(DKC_BUFFER *p){
00174 return p->mBuff;
00175 }
00176
00177 #if !defined( DKUTIL_C_BUFFER_C ) && defined(USE_DKC_INDEPENDENT_INCLUDE)
00178 # include "dkcBuffer.c"
00179 #endif
00180
00181
00182 #endif //end of include once