143 líneas
3.4 KiB
C
143 líneas
3.4 KiB
C
#include "cmPrefix.h"
|
|
#include "cmGlobal.h"
|
|
#include "cmRpt.h"
|
|
#include "cmErr.h"
|
|
|
|
void cmErrSetup( cmErr_t* err, cmRpt_t* rpt, const cmChar_t* label )
|
|
{
|
|
err->rpt = rpt;
|
|
err->label = label;
|
|
err->rc = cmOkRC;
|
|
}
|
|
|
|
void cmErrClone( cmErr_t* dstErr, const cmErr_t* srcErr )
|
|
{ memcpy(dstErr,srcErr,sizeof(*dstErr)); }
|
|
|
|
void _cmErrVMsg(cmErr_t* err, bool warnFl, cmRC_t rc, const cmChar_t* fmt, va_list vl )
|
|
{
|
|
if( err->rpt == NULL )
|
|
return;
|
|
|
|
va_list vl0;
|
|
va_copy(vl0,vl);
|
|
|
|
const cmChar_t* hdrFmt = warnFl ? "%s warning: " : "%s error: ";
|
|
const cmChar_t* codeFmt = " (RC:%i)";
|
|
|
|
int n0 = snprintf( NULL,0,hdrFmt,cmStringNullGuard(err->label));
|
|
int n1 = vsnprintf(NULL,0,fmt,vl);
|
|
int n2 = snprintf( NULL,0,codeFmt,rc);
|
|
int n = n0+n1+n2+1;
|
|
cmChar_t s[n];
|
|
|
|
n0 = snprintf(s,n,hdrFmt,cmStringNullGuard(err->label));
|
|
n0 += vsnprintf(s+n0,n-n0,fmt,vl0);
|
|
n0 += snprintf(s+n0,n-n0,codeFmt,rc);
|
|
assert(n0 <= n );
|
|
cmRptErrorf(err->rpt,"%s\n",s);
|
|
va_end(vl0);
|
|
}
|
|
|
|
void _cmErrMsg( cmErr_t* err, bool warnFl, cmRC_t rc, const cmChar_t* fmt, ... )
|
|
{
|
|
va_list vl;
|
|
va_start(vl,fmt);
|
|
_cmErrVMsg(err,warnFl,rc,fmt,vl);
|
|
va_end(vl);
|
|
}
|
|
|
|
cmRC_t cmErrVMsg(cmErr_t* err, cmRC_t rc, const cmChar_t* fmt, va_list vl )
|
|
{
|
|
cmErrSetRC(err,rc);
|
|
_cmErrVMsg(err,false,rc,fmt,vl);
|
|
return rc;
|
|
}
|
|
|
|
|
|
cmRC_t cmErrMsg( cmErr_t* err, cmRC_t rc, const cmChar_t* fmt, ... )
|
|
{
|
|
va_list vl;
|
|
va_start(vl,fmt);
|
|
rc = cmErrVMsg(err,rc,fmt,vl);
|
|
va_end(vl);
|
|
return rc;
|
|
}
|
|
|
|
|
|
void _cmErrSysVMsg(cmErr_t* err, bool warnFl, cmRC_t rc, cmSysErrCode_t sysErrCode, const cmChar_t* fmt, va_list vl )
|
|
{
|
|
const char* sysFmt = "\n System Error: (code:%i) %s.";
|
|
int n0 = snprintf(NULL,0,sysFmt,sysErrCode,strerror(sysErrCode));
|
|
int n1 = vsnprintf(NULL,0,fmt,vl);
|
|
int n = n0 + n1 + 1;
|
|
cmChar_t s[n0+n1+1];
|
|
|
|
n0 = snprintf(s,n,sysFmt,sysErrCode,strerror(sysErrCode));
|
|
n0 += vsnprintf(s+n0,n-n0,fmt,vl);
|
|
assert( n0 <= n );
|
|
_cmErrMsg(err,warnFl,rc,s);
|
|
}
|
|
|
|
cmRC_t cmErrVSysMsg(cmErr_t* err, cmRC_t rc, cmSysErrCode_t sysErrCode, const cmChar_t* fmt, va_list vl )
|
|
{
|
|
cmErrSetRC(err,rc);
|
|
_cmErrSysVMsg(err,false,rc,sysErrCode,fmt,vl);
|
|
return rc;
|
|
}
|
|
|
|
cmRC_t cmErrSysMsg( cmErr_t* err, cmRC_t rc, cmSysErrCode_t sysErrCode, const cmChar_t* fmt, ... )
|
|
{
|
|
va_list vl;
|
|
va_start(vl,fmt);
|
|
rc = cmErrVSysMsg(err,rc,sysErrCode,fmt,vl);
|
|
va_end(vl);
|
|
return rc;
|
|
}
|
|
|
|
cmRC_t cmErrWarnVMsg(cmErr_t* err, cmRC_t rc, const cmChar_t* fmt, va_list vl )
|
|
{
|
|
_cmErrVMsg(err,true,rc,fmt,vl);
|
|
err->warnRC = rc;
|
|
return rc;
|
|
}
|
|
|
|
cmRC_t cmErrWarnMsg( cmErr_t* err, cmRC_t rc, const cmChar_t* fmt, ... )
|
|
{
|
|
va_list vl;
|
|
va_start(vl,fmt);
|
|
rc = cmErrWarnVMsg(err,rc,fmt,vl);
|
|
va_end(vl);
|
|
return rc;
|
|
}
|
|
|
|
cmRC_t cmErrWarnVSysMsg(cmErr_t* err, cmRC_t rc, cmSysErrCode_t sysErrCode, const cmChar_t* fmt, va_list vl )
|
|
{
|
|
_cmErrSysVMsg(err,true,rc,sysErrCode,fmt,vl);
|
|
err->warnRC = rc;
|
|
return rc;
|
|
}
|
|
|
|
|
|
cmRC_t cmErrWarnSysMsg( cmErr_t* err, cmRC_t rc, cmSysErrCode_t sysErrCode, const cmChar_t* fmt, ... )
|
|
{
|
|
va_list vl;
|
|
va_start(vl,fmt);
|
|
rc = cmErrWarnVSysMsg(err,rc,sysErrCode,fmt,vl);
|
|
va_end(vl);
|
|
return rc;
|
|
}
|
|
|
|
|
|
cmRC_t cmErrLastRC( cmErr_t* err )
|
|
{ return err->rc; }
|
|
|
|
cmRC_t cmErrSetRC( cmErr_t* err, cmRC_t rc )
|
|
{
|
|
cmRC_t retVal = err->rc;
|
|
err->rc = rc;
|
|
return retVal;
|
|
}
|
|
|
|
cmRC_t cmErrClearRC( cmErr_t* err )
|
|
{ return cmErrSetRC(err,cmOkRC); }
|