cmStrStream.h/c, Makefile.am : Added cmStrStream.h/c.
This commit is contained in:
parent
bc7b5a4c09
commit
f21fbb8729
@ -12,8 +12,8 @@ cmSRC += src/libcm/cmSerialize.c src/libcm/cmSymTbl.c src/libcm/cmFileSys.c src/
|
|||||||
cmHDR += src/libcm/cmData.h src/libcm/cmLib.h src/libcm/cmText.h src/libcm/cmTextTemplate.h
|
cmHDR += src/libcm/cmData.h src/libcm/cmLib.h src/libcm/cmText.h src/libcm/cmTextTemplate.h
|
||||||
cmSRC += src/libcm/cmData.c src/libcm/cmLib.c src/libcm/cmText.c src/libcm/cmTextTemplate.c
|
cmSRC += src/libcm/cmData.c src/libcm/cmLib.c src/libcm/cmText.c src/libcm/cmTextTemplate.c
|
||||||
|
|
||||||
cmHDR += src/libcm/cmMath.h src/libcm/cmGnuPlot.h src/libcm/cmKeyboard.h
|
cmHDR += src/libcm/cmMath.h src/libcm/cmGnuPlot.h src/libcm/cmKeyboard.h src/libcm/cmStrStream.h
|
||||||
cmSRC += src/libcm/cmMath.c src/libcm/cmGnuPlot.c src/libcm/cmKeyboard.c
|
cmSRC += src/libcm/cmMath.c src/libcm/cmGnuPlot.c src/libcm/cmKeyboard.c src/libcm/cmStrStream.c
|
||||||
|
|
||||||
cmHDR += src/libcm/cmLinkedHeap.h src/libcm/cmMallocDebug.h src/libcm/cmLex.h src/libcm/cmJson.h src/libcm/cmPrefs.h src/libcm/cmStack.h src/libcm/cmArray.h
|
cmHDR += src/libcm/cmLinkedHeap.h src/libcm/cmMallocDebug.h src/libcm/cmLex.h src/libcm/cmJson.h src/libcm/cmPrefs.h src/libcm/cmStack.h src/libcm/cmArray.h
|
||||||
cmSRC += src/libcm/cmLinkedHeap.c src/libcm/cmMallocDebug.c src/libcm/cmLex.c src/libcm/cmJson.c src/libcm/cmPrefs.c src/libcm/cmStack.c src/libcm/cmArray.c
|
cmSRC += src/libcm/cmLinkedHeap.c src/libcm/cmMallocDebug.c src/libcm/cmLex.c src/libcm/cmJson.c src/libcm/cmPrefs.c src/libcm/cmStack.c src/libcm/cmArray.c
|
||||||
|
219
cmStrStream.c
Normal file
219
cmStrStream.c
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
#include "cmGlobal.h"
|
||||||
|
#include "cmRpt.h"
|
||||||
|
#include "cmErr.h"
|
||||||
|
#include "cmCtx.h"
|
||||||
|
#include "cmMem.h"
|
||||||
|
#include "cmMallocDebug.h"
|
||||||
|
#include "cmLinkedHeap.h"
|
||||||
|
#include "cmStrStream.h"
|
||||||
|
#include "cmText.h"
|
||||||
|
|
||||||
|
typedef struct cmSsBlk_str
|
||||||
|
{
|
||||||
|
char* blk;
|
||||||
|
unsigned i;
|
||||||
|
struct cmSsBlk_str* link;
|
||||||
|
} cmSsBlk_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
cmErr_t err;
|
||||||
|
cmLHeapH_t lhH;
|
||||||
|
unsigned blkByteCnt;
|
||||||
|
cmSsBlk_t* blp;
|
||||||
|
cmSsBlk_t* elp;
|
||||||
|
} cmOss_t;
|
||||||
|
|
||||||
|
cmOss_t* _cmOssHandleToPtr( cmStrStreamH_t h )
|
||||||
|
{
|
||||||
|
cmOss_t* p = (cmOss_t*)h.h;
|
||||||
|
assert(p != NULL );
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmSsRC_t _cmOssDestroy( cmOss_t* p )
|
||||||
|
{
|
||||||
|
cmSsRC_t rc = kOkSsRC;
|
||||||
|
cmLHeapDestroy(&p->lhH);
|
||||||
|
cmMemFree(p);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmSsRC_t cmOStrStreamCreate( cmCtx_t* ctx, cmStrStreamH_t* hp, unsigned dfltBlkByteCnt )
|
||||||
|
{
|
||||||
|
cmSsRC_t rc;
|
||||||
|
if((rc = cmOStrStreamDestroy(hp)) != kOkSsRC )
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
cmOss_t* p = cmMemAllocZ(cmOss_t,1);
|
||||||
|
|
||||||
|
p->blkByteCnt = dfltBlkByteCnt==0 ? 4096 : dfltBlkByteCnt;
|
||||||
|
|
||||||
|
cmErrSetup(&p->err,&ctx->rpt,"OStrStream");
|
||||||
|
|
||||||
|
if( cmLHeapIsValid(p->lhH = cmLHeapCreate(p->blkByteCnt+sizeof(cmSsBlk_t),ctx)) == false )
|
||||||
|
{
|
||||||
|
rc = cmErrMsg(&p->err,kLHeapMemFailSsRC,"Linked heap allocation failed.");
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
hp->h = p;
|
||||||
|
|
||||||
|
errLabel:
|
||||||
|
if(rc != kOkSsRC )
|
||||||
|
_cmOssDestroy(p);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmSsRC_t cmOStrStreamDestroy(cmStrStreamH_t* hp )
|
||||||
|
{
|
||||||
|
cmSsRC_t rc = kOkSsRC;
|
||||||
|
|
||||||
|
if( hp==NULL || cmOStrStreamIsValid(*hp)==false )
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
cmOss_t* p = _cmOssHandleToPtr(*hp);
|
||||||
|
|
||||||
|
if((rc = _cmOssDestroy(p)) != kOkSsRC )
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
hp->h = NULL;
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cmOStrStreamIsValid( cmStrStreamH_t h )
|
||||||
|
{ return h.h != NULL; }
|
||||||
|
|
||||||
|
|
||||||
|
cmSsRC_t cmOStrStreamWrite( cmStrStreamH_t h, const void* vp, unsigned byteCnt )
|
||||||
|
{
|
||||||
|
cmSsRC_t rc = kOkSsRC;
|
||||||
|
cmOss_t* p = _cmOssHandleToPtr(h);
|
||||||
|
char* cp = (char*)vp;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
// if a blk exists
|
||||||
|
if( p->elp != NULL )
|
||||||
|
{
|
||||||
|
// copy as much of vp[] as possible into the current end block
|
||||||
|
unsigned n = cmMin(byteCnt, p->blkByteCnt - p->elp->i);
|
||||||
|
memcpy(p->elp->blk,cp,n);
|
||||||
|
byteCnt -= n;
|
||||||
|
p->elp->i += n;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if all of vp[] has been copied then we are done
|
||||||
|
if( byteCnt == 0 )
|
||||||
|
break;
|
||||||
|
|
||||||
|
assert( p->elp==NULL || p->elp->i == p->blkByteCnt );
|
||||||
|
|
||||||
|
// allocate a new block
|
||||||
|
cmSsBlk_t* nbp = (cmSsBlk_t*)cmLHeapAlloc(p->lhH,p->blkByteCnt+sizeof(cmSsBlk_t));
|
||||||
|
nbp->blk = (char*)(nbp + 1);
|
||||||
|
nbp->i = 0;
|
||||||
|
nbp->link = NULL;
|
||||||
|
|
||||||
|
// end the new blk onto the end of the list
|
||||||
|
if( p->elp == NULL )
|
||||||
|
p->blp = nbp;
|
||||||
|
else
|
||||||
|
p->elp->link = nbp;
|
||||||
|
|
||||||
|
p->elp = nbp;
|
||||||
|
|
||||||
|
}while(1);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmSsRC_t cmOStrStreamWriteStr( cmStrStreamH_t h, const cmChar_t* str )
|
||||||
|
{
|
||||||
|
if( str == NULL )
|
||||||
|
return kOkSsRC;
|
||||||
|
|
||||||
|
return cmOStrStreamWrite(h,str,strlen(str));
|
||||||
|
}
|
||||||
|
|
||||||
|
cmSsRC_t cmOStrStreamVPrintf( cmStrStreamH_t h, const cmChar_t* fmt, va_list vl )
|
||||||
|
{
|
||||||
|
cmChar_t* s = cmTsVPrintfP(NULL,fmt,vl);
|
||||||
|
cmSsRC_t rc = cmOStrStreamWriteStr(h,s);
|
||||||
|
cmMemFree(s);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmSsRC_t cmOStrStreamPrintf( cmStrStreamH_t h, const cmChar_t* fmt, ... )
|
||||||
|
{
|
||||||
|
va_list vl;
|
||||||
|
va_start(vl,fmt);
|
||||||
|
cmSsRC_t rc = cmOStrStreamVPrintf(h,fmt,vl);
|
||||||
|
va_end(vl);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned cmOStrStreamByteCount( cmStrStreamH_t h )
|
||||||
|
{
|
||||||
|
unsigned n = 0;
|
||||||
|
cmOss_t* p = _cmOssHandleToPtr(h);
|
||||||
|
cmSsBlk_t* bp = p->blp;
|
||||||
|
|
||||||
|
for(; bp!=NULL; bp=bp->link)
|
||||||
|
n += bp->i;
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned _cmOssCopyBuf( cmOss_t* p, char* buf, unsigned n )
|
||||||
|
{
|
||||||
|
unsigned i = 0;
|
||||||
|
cmSsBlk_t* bp = p->blp;
|
||||||
|
|
||||||
|
for(; bp!=NULL; bp=bp->link)
|
||||||
|
{
|
||||||
|
assert( i + bp->i <= n );
|
||||||
|
|
||||||
|
memcpy(buf+i,bp->blk,bp->i);
|
||||||
|
i += bp->i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* cmOStrStreamAllocBuf( cmStrStreamH_t h )
|
||||||
|
{
|
||||||
|
unsigned n = cmOStrStreamByteCount(h);
|
||||||
|
cmOss_t* p = _cmOssHandleToPtr(h);
|
||||||
|
|
||||||
|
if( n == 0 )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
char* buf = cmMemAlloc(char,n);
|
||||||
|
|
||||||
|
unsigned i = _cmOssCopyBuf(p,buf,n);
|
||||||
|
|
||||||
|
assert(i==n);
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmChar_t* cmOStrStreamAllocText( cmStrStreamH_t h )
|
||||||
|
{
|
||||||
|
unsigned n = cmOStrStreamByteCount(h);
|
||||||
|
cmOss_t* p = _cmOssHandleToPtr(h);
|
||||||
|
|
||||||
|
if( n == 0 )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
char* buf = cmMemAlloc(char,n+1);
|
||||||
|
|
||||||
|
unsigned i = _cmOssCopyBuf(p,buf,n);
|
||||||
|
|
||||||
|
assert(i==n);
|
||||||
|
|
||||||
|
buf[n] = 0;
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
39
cmStrStream.h
Normal file
39
cmStrStream.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#ifndef cmStrStream_h
|
||||||
|
#define cmStrStream_h
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kOkSsRC = cmOkRC,
|
||||||
|
kLHeapMemFailSsRC
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef cmHandle_t cmStrStreamH_t;
|
||||||
|
typedef cmRC_t cmSsRC_t;
|
||||||
|
|
||||||
|
extern cmStrStreamH_t cmStrStreamNullHandle_t;
|
||||||
|
|
||||||
|
|
||||||
|
cmSsRC_t cmOStrStreamCreate( cmCtx_t* ctx, cmStrStreamH_t* hp, unsigned dfltBlkByteCnt );
|
||||||
|
cmSsRC_t cmOStrStreamDestroy(cmStrStreamH_t* hp );
|
||||||
|
|
||||||
|
bool cmOStrStreamIsValid( cmStrStreamH_t h );
|
||||||
|
|
||||||
|
cmSsRC_t cmOStrStreamWrite( cmStrStreamH_t h, const void* dp, unsigned byteCnt );
|
||||||
|
cmSsRC_t cmOStrStreamWriteStr( cmStrStreamH_t h, const cmChar_t* str );
|
||||||
|
cmSsRC_t cmOStrStreamVPrintf( cmStrStreamH_t h, const cmChar_t* fmt, va_list vl );
|
||||||
|
cmSsRC_t cmOStrStreamPrintf( cmStrStreamH_t h, const cmChar_t* fmt, ... );
|
||||||
|
|
||||||
|
unsigned cmOStrStreamByteCount( cmStrStreamH_t h );
|
||||||
|
void* cmOStrStreamAllocBuf( cmStrStreamH_t h );
|
||||||
|
cmChar_t* cmOStrStreamAllocText( cmStrStreamH_t h );
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user