00001
00007 #define DKUTIL_C_BUFFER_C
00008 #include "dkcBuffer.h"
00009
00010
00011
00013 DKC_BUFFER* WINAPI dkcAllocBuffer(const void *data,size_t size){
00014 DKC_BUFFER *p;
00015
00016 if(0==size) return NULL;
00017
00018 p = (DKC_BUFFER *)dkcAllocate(sizeof(DKC_BUFFER));
00019 if(NULL==p) return NULL;
00020
00021
00022 p->mBuff = (BYTE *)dkcAllocate(size);
00023 if(NULL==p->mBuff) goto Error;
00024
00025 p->mSize = size;
00026
00027 if(data){
00028 if(DKUTIL_FAILED(dkcBufferSet(p,data,size))){
00029 goto Error;
00030 }
00031 }else{
00032
00033 }
00034 return p;
00035 Error:
00036 dkcFree((void **)&p);
00037 return NULL;
00038 }
00039
00040 int WINAPI dkcFreeBuffer(DKC_BUFFER **ptr){
00041 if(NULL==ptr || NULL==*ptr) return edk_ArgumentException;
00042 dkcFree((void **)&(*ptr)->mBuff);
00043 dkcFree((void **)ptr);
00044 return edk_SUCCEEDED;
00045 }
00046
00047
00048
00049 int WINAPI dkcBufferSet(DKC_BUFFER *ptr,const void *data,size_t size)
00050 {
00051
00052
00053 return dkc_memcpy(ptr->mBuff,ptr->mSize,data,size);
00054 }
00055
00056
00057 int WINAPI dkcBufferSetOffset(DKC_BUFFER *ptr,
00058 const void *data,size_t size,size_t offset){
00059 if(ptr->mSize < offset + size){
00060 return edk_BufferOverFlow;
00061 }
00062 return dkc_memcpy(
00063 ptr->mBuff + offset,
00064 ptr->mSize - offset
00065 ,data,size);
00066 }
00067
00068
00069
00070
00071 int WINAPI dkcBufferGet(DKC_BUFFER *ptr,void *data,size_t size){
00072
00073 return dkc_memcpy(data,size,ptr->mBuff,ptr->mSize);
00074 }
00075
00076 int WINAPI dkcBufferGetOffset(DKC_BUFFER *ptr,
00077 void *data,size_t size,size_t offset){
00078 if(ptr->mSize < offset + size){
00079 return edk_BufferOverFlow;
00080 }
00081 return dkc_memcpy(
00082 data,size,
00083 ptr->mBuff + offset,
00084 size
00085 );
00086
00087 }
00088
00089 int WINAPI dkcBufferResize(DKC_BUFFER *ptr,size_t size)
00090 {
00091 void *NewPtr;
00092 if(NULL==ptr || 0==size || NULL==ptr->mBuff) return edk_ArgumentException;
00093 if(DKUTIL_FAILED(dkcReallocate(&NewPtr,size,(void **)&(ptr->mBuff)))){
00094 return edk_FAILED;
00095 }
00096
00097 ptr->mBuff = (BYTE *)NewPtr;
00098 ptr->mSize = size;
00099
00100 return edk_SUCCEEDED;
00101 }
00102
00103
00104
00105 DKC_BUFFER* WINAPI dkcAllocBufferCopy(const DKC_BUFFER *ptr){
00106 dkcmNOT_ASSERT(NULL==ptr || NULL==ptr->mBuff);
00107
00108 return dkcAllocBuffer(ptr->mBuff,ptr->mSize);
00109 }
00110
00111 size_t WINAPI dkcBufferSize(DKC_BUFFER *p){
00112 return p->mSize;
00113 }
00114 BYTE *WINAPI dkcBufferPointer(DKC_BUFFER *p){
00115 return p->mBuff;
00116 }