libcm is a C development framework with an emphasis on audio signal processing applications.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cmErr.c 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. //| Copyright: (C) 2009-2020 Kevin Larke <contact AT larke DOT org>
  2. //| License: GNU GPL version 3.0 or above. See the accompanying LICENSE file.
  3. #include "cmPrefix.h"
  4. #include "cmGlobal.h"
  5. #include "cmRpt.h"
  6. #include "cmErr.h"
  7. void cmErrSetup( cmErr_t* err, cmRpt_t* rpt, const cmChar_t* label )
  8. {
  9. err->rpt = rpt;
  10. err->label = label;
  11. err->rc = cmOkRC;
  12. }
  13. void cmErrClone( cmErr_t* dstErr, const cmErr_t* srcErr )
  14. { memcpy(dstErr,srcErr,sizeof(*dstErr)); }
  15. void _cmErrVMsg(cmErr_t* err, bool warnFl, cmRC_t rc, const cmChar_t* fmt, va_list vl )
  16. {
  17. if( err->rpt == NULL )
  18. return;
  19. va_list vl0;
  20. va_copy(vl0,vl);
  21. const cmChar_t* hdrFmt = warnFl ? "%s warning: " : "%s error: ";
  22. const cmChar_t* codeFmt = " (RC:%i)";
  23. int n0 = snprintf( NULL,0,hdrFmt,cmStringNullGuard(err->label));
  24. int n1 = vsnprintf(NULL,0,fmt,vl);
  25. int n2 = snprintf( NULL,0,codeFmt,rc);
  26. int n = n0+n1+n2+1;
  27. cmChar_t s[n];
  28. n0 = snprintf(s,n,hdrFmt,cmStringNullGuard(err->label));
  29. n0 += vsnprintf(s+n0,n-n0,fmt,vl0);
  30. n0 += snprintf(s+n0,n-n0,codeFmt,rc);
  31. assert(n0 <= n );
  32. cmRptErrorf(err->rpt,"%s\n",s);
  33. va_end(vl0);
  34. }
  35. void _cmErrMsg( cmErr_t* err, bool warnFl, cmRC_t rc, const cmChar_t* fmt, ... )
  36. {
  37. va_list vl;
  38. va_start(vl,fmt);
  39. _cmErrVMsg(err,warnFl,rc,fmt,vl);
  40. va_end(vl);
  41. }
  42. cmRC_t cmErrVMsg(cmErr_t* err, cmRC_t rc, const cmChar_t* fmt, va_list vl )
  43. {
  44. cmErrSetRC(err,rc);
  45. _cmErrVMsg(err,false,rc,fmt,vl);
  46. return rc;
  47. }
  48. cmRC_t cmErrMsg( cmErr_t* err, cmRC_t rc, const cmChar_t* fmt, ... )
  49. {
  50. va_list vl;
  51. va_start(vl,fmt);
  52. rc = cmErrVMsg(err,rc,fmt,vl);
  53. va_end(vl);
  54. return rc;
  55. }
  56. void _cmErrSysVMsg(cmErr_t* err, bool warnFl, cmRC_t rc, cmSysErrCode_t sysErrCode, const cmChar_t* fmt, va_list vl )
  57. {
  58. const char* sysFmt = "\n System Error: (code:%i) %s.";
  59. int n0 = snprintf(NULL,0,sysFmt,sysErrCode,strerror(sysErrCode));
  60. int n1 = vsnprintf(NULL,0,fmt,vl);
  61. int n = n0 + n1 + 1;
  62. cmChar_t s[n0+n1+1];
  63. n0 = snprintf(s,n,sysFmt,sysErrCode,strerror(sysErrCode));
  64. n0 += vsnprintf(s+n0,n-n0,fmt,vl);
  65. assert( n0 <= n );
  66. _cmErrMsg(err,warnFl,rc,s);
  67. }
  68. cmRC_t cmErrVSysMsg(cmErr_t* err, cmRC_t rc, cmSysErrCode_t sysErrCode, const cmChar_t* fmt, va_list vl )
  69. {
  70. cmErrSetRC(err,rc);
  71. _cmErrSysVMsg(err,false,rc,sysErrCode,fmt,vl);
  72. return rc;
  73. }
  74. cmRC_t cmErrSysMsg( cmErr_t* err, cmRC_t rc, cmSysErrCode_t sysErrCode, const cmChar_t* fmt, ... )
  75. {
  76. va_list vl;
  77. va_start(vl,fmt);
  78. rc = cmErrVSysMsg(err,rc,sysErrCode,fmt,vl);
  79. va_end(vl);
  80. return rc;
  81. }
  82. cmRC_t cmErrWarnVMsg(cmErr_t* err, cmRC_t rc, const cmChar_t* fmt, va_list vl )
  83. {
  84. _cmErrVMsg(err,true,rc,fmt,vl);
  85. err->warnRC = rc;
  86. return rc;
  87. }
  88. cmRC_t cmErrWarnMsg( cmErr_t* err, cmRC_t rc, const cmChar_t* fmt, ... )
  89. {
  90. va_list vl;
  91. va_start(vl,fmt);
  92. rc = cmErrWarnVMsg(err,rc,fmt,vl);
  93. va_end(vl);
  94. return rc;
  95. }
  96. cmRC_t cmErrWarnVSysMsg(cmErr_t* err, cmRC_t rc, cmSysErrCode_t sysErrCode, const cmChar_t* fmt, va_list vl )
  97. {
  98. _cmErrSysVMsg(err,true,rc,sysErrCode,fmt,vl);
  99. err->warnRC = rc;
  100. return rc;
  101. }
  102. cmRC_t cmErrWarnSysMsg( cmErr_t* err, cmRC_t rc, cmSysErrCode_t sysErrCode, const cmChar_t* fmt, ... )
  103. {
  104. va_list vl;
  105. va_start(vl,fmt);
  106. rc = cmErrWarnVSysMsg(err,rc,sysErrCode,fmt,vl);
  107. va_end(vl);
  108. return rc;
  109. }
  110. cmRC_t cmErrLastRC( cmErr_t* err )
  111. { return err->rc; }
  112. cmRC_t cmErrSetRC( cmErr_t* err, cmRC_t rc )
  113. {
  114. cmRC_t retVal = err->rc;
  115. err->rc = rc;
  116. return retVal;
  117. }
  118. cmRC_t cmErrClearRC( cmErr_t* err )
  119. { return cmErrSetRC(err,cmOkRC); }