libcm/cmProcObj.c
2013-03-01 17:30:50 -08:00

222 řádky
4.5 KiB
C

#include "cmPrefix.h"
#include "cmGlobal.h"
#include "cmRpt.h"
#include "cmErr.h"
#include "cmCtx.h"
#include "cmMem.h"
#include "cmMallocDebug.h"
#include "cmLinkedHeap.h"
#include "cmSymTbl.h"
#include "cmFloatTypes.h"
#include "cmComplexTypes.h"
#include "cmProcObj.h"
//------------------------------------------------------------------------------------------------------------
void* _cmObjAlloc( void* ap, const char* label, struct cmCtx_str* c, unsigned objByteCnt )
{
unsigned flags = (ap == NULL) ? kDynObjFl : 0;
if( ap == NULL )
ap = cmMemMalloc(objByteCnt);
memset(ap,0,objByteCnt);
assert( objByteCnt >= sizeof(cmObj));
// the first field in the object must be an cmObj field
cmObj* p = (cmObj*)ap;
p->flags = flags;
p->ctx = c;
if( c != NULL )
cmErrSetup(&p->err,c->obj.err.rpt,label);
return ap;
}
// if pp is non-NULL then *pp is set to NULL on return
void _cmObjFree( void** pp, cmObj* op )
{
// pp and op are both NULL or neither is NULL
assert( (pp==NULL) == (op==NULL) );
if( op != NULL )
if( cmIsFlag(op->flags,kDynObjFl) )
cmMemPtrFree( pp );
}
//------------------------------------------------------------------------------------------------------------
cmCtx* cmCtxAlloc( cmCtx* p, cmRpt_t* rpt, cmLHeapH_t lhH, cmSymTblH_t stH )
{
cmRC_t rc;
cmCtx* op = cmObjAlloc( cmCtx, NULL, p );
op->obj.ctx = op;
if( (rc = cmCtxInit( op, rpt, lhH, stH )) != cmOkRC )
cmCtxFree(&op);
return op;
}
cmRC_t cmCtxFree( cmCtx** pp )
{
if( pp != NULL && *pp != NULL )
{
cmCtxFinal(*pp);
cmObjFree(pp);
}
return cmOkRC;
}
cmRC_t cmCtxInit( cmCtx* c, cmRpt_t* rpt, cmLHeapH_t lhH, cmSymTblH_t stH )
{
cmRC_t rc;
if((rc = cmCtxFinal(c)) != cmOkRC )
return rc;
c->obj.err.rpt = rpt;
c->lhH = lhH;
c->stH = stH;
return rc;
}
cmRC_t cmCtxFinal( cmCtx* c )
{ return cmOkRC; }
cmRC_t cmCtxPrint( cmCtx* c, const char* fmt, ... )
{
va_list vl;
va_start(vl,fmt);
cmRptVPrintf(c->obj.err.rpt,fmt,vl);
va_end(vl);
return cmOkRC;
}
cmRC_t cmCtxRtCondition( cmObj* p, unsigned code, const char* fmt, ... )
{
va_list vl;
va_start(vl,fmt);
cmErrVMsg(&p->err,code,fmt,vl);
va_end(vl);
return code;
}
cmRC_t cmCtxRtAssertFailed( cmObj* p, unsigned code, const char* fmt, ... )
{
va_list vl;
va_start(vl,fmt);
cmErrVMsg(&p->err, code,fmt,vl);
va_end(vl);
return code;
}
//------------------------------------------------------------------------------------------------------------
cmMtxFile* cmMtxFileAlloc( cmCtx* c, cmMtxFile* p, const char* fn )
{
cmMtxFile* op = cmObjAlloc( cmMtxFile, c, p );
if( fn != NULL )
if( cmMtxFileCreate( op, fn ) != cmOkRC && p == NULL )
cmMtxFileFree(&op);
return op;
}
cmRC_t cmMtxFileFree( cmMtxFile** pp )
{
cmRC_t rc = cmOkRC;
if( pp != NULL && *pp != NULL)
{
cmLHeapFree((*pp)->obj.ctx->lhH,*pp);
if((rc = cmMtxFileClose(*pp)) == cmOkRC )
cmObjFree(pp);
}
return rc;
}
cmRC_t cmMtxFileCreate(cmMtxFile* p, const char* fn )
{
assert(fn != NULL );
cmRC_t rc;
if((rc = cmMtxFileClose(p)) != cmOkRC )
return rc;
if((p->fp = fopen(fn,"wt")) == NULL )
return cmCtxRtCondition( &p->obj, cmSystemErrorRC, "Unable to create the matrix text file:'%s'.",fn);
unsigned n = strlen(fn)+1;
p->fn = cmLhResizeN(p->obj.ctx->lhH,cmChar_t,p->fn,n);
strncpy(p->fn,fn,n);
return rc;
}
cmRC_t cmMtxFileClose( cmMtxFile* p )
{
if( p != NULL )
{
if( p->fp != NULL )
{
fclose(p->fp);
p->fp = NULL;
}
}
return cmOkRC;
}
cmRC_t cmMtxFileFloatExec( cmMtxFile* p, const float* inPtr, unsigned inCnt, unsigned inStride )
{
const float* ep = inPtr + (inCnt * inStride);
for(; inPtr < ep; inPtr+=inStride )
fprintf(p->fp,"%e ",*inPtr);
fprintf(p->fp,"\n");
return cmOkRC;
}
cmRC_t cmMtxFileDoubleExec( cmMtxFile* p, const double* inPtr, unsigned inCnt, unsigned inStride )
{
const double* ep = inPtr + (inCnt * inStride);
for(; inPtr < ep; inPtr+=inStride )
fprintf(p->fp,"%e ",*inPtr);
fprintf(p->fp,"\n");
return cmOkRC;
}
cmRC_t cmMtxFileComplexExec( cmMtxFile* p, const cmComplexR_t* inPtr, unsigned inCnt, unsigned inStride )
{
const cmComplexR_t* sp = inPtr;
const cmComplexR_t* ep = inPtr + (inCnt * inStride);
for(; sp < ep; sp += inStride )
fprintf(p->fp,"%e ",cmCrealR(*sp));
fprintf(p->fp,"\n");
sp = inPtr;
for(; sp < ep; sp += inStride )
fprintf(p->fp,"%e ",cmCimagR(*sp));
fprintf(p->fp,"\n");
return cmOkRC;
}