debugprint.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. class DebugPrint
  2. {
  3. static private const int MSG_LOG = 0;
  4. static private const int MSG_WARNING = 1;
  5. static private const int MSG_ERROR = 2;
  6. static private const int MSG_COUNT = 3;
  7. static private string s_MsgPrefix[MSG_COUNT];
  8. static private string s_MsgStackMarkStart;
  9. static private string s_MsgStackMarkEnd;
  10. static private bool s_MsgStackMarked;
  11. static private bool s_TraceAllLogs;
  12. static void OnInit()
  13. {
  14. s_MsgPrefix[MSG_LOG] = "Log";
  15. s_MsgPrefix[MSG_WARNING] = "Warning";
  16. s_MsgPrefix[MSG_ERROR] = "Error";
  17. s_MsgStackMarkStart = "-- Stack trace --";
  18. s_MsgStackMarked = false;
  19. s_MsgStackMarkEnd = "-----------------";
  20. s_TraceAllLogs = false;
  21. }
  22. /**
  23. \brief Prints debug message with normal prio
  24. \param msg \p string Debug message for print
  25. \return \p void None
  26. @code
  27. DebugPrint.Log("Hello World");
  28. >> [Log]: Hello World;
  29. @endcode
  30. */
  31. static void Log(string msg)
  32. {
  33. LogMessage(msg, MSG_LOG, s_TraceAllLogs);
  34. }
  35. /**
  36. \brief Prints debug message as normal message and prints stack trace of calls
  37. \param msg \p string Debug message for print
  38. \return \p void None
  39. @code
  40. DebugPrint.LogAndTrace("Hello World, this is normal log");
  41. >> [Log]: Hello World, this is normal log
  42. >> -- Stack trace --
  43. >> OnKeyPress() Scripts/mission/missionGameplay.c : 230
  44. >> OnKeyPress() Scripts/DayZGame.c : 346
  45. >> -----------------
  46. @endcode
  47. */
  48. static void LogAndTrace(string msg)
  49. {
  50. LogMessage(msg, MSG_LOG, true);
  51. }
  52. /**
  53. \brief Prints debug message as warning message
  54. \param msg \p string Debug message for warning print
  55. \return \p void None
  56. @code
  57. DebugPrint.LogWarning("Hello World, this is warning log");
  58. >> [Warning]: Hello World, this is warning log
  59. @endcode
  60. */
  61. static void LogWarning(string msg)
  62. {
  63. LogMessage(msg, MSG_WARNING, s_TraceAllLogs);
  64. }
  65. /**
  66. \brief Prints debug message as warning message and prints stack trace of calls
  67. \param msg \p string Debug message for warning print
  68. \return \p void None
  69. @code
  70. DebugPrint.LogWarningAndTrace("Hello World, this is warning log");
  71. >> [Warning]: Hello World, this is warning log
  72. >> -- Stack trace --
  73. >> OnKeyPress() Scripts/mission/missionGameplay.c : 230
  74. >> OnKeyPress() Scripts/DayZGame.c : 346
  75. >> -----------------
  76. @endcode
  77. */
  78. static void LogWarningAndTrace(string msg)
  79. {
  80. LogMessage(msg, MSG_WARNING, true);
  81. }
  82. /**
  83. \brief Prints debug message as error message
  84. \param msg \p string Debug message for error print
  85. \return \p void None
  86. @code
  87. DebugPrint.LogError("Hello World, this is error log");
  88. >> [Error]: Hello World, this is error log
  89. @endcode
  90. */
  91. static void LogError(string msg)
  92. {
  93. LogMessage(msg, MSG_ERROR, s_TraceAllLogs);
  94. }
  95. /**
  96. \brief Prints debug message as error message and prints stack trace of calls
  97. \param msg \p string Debug message for error print
  98. \return \p void None
  99. @code
  100. DebugPrint.LogErrorAndTrace("Hello World, this is error log");
  101. >> [Error]: Hello World, this is error log
  102. >> -- Stack trace --
  103. >> OnKeyPress() Scripts/mission/missionGameplay.c : 230
  104. >> OnKeyPress() Scripts/DayZGame.c : 346
  105. >> -----------------
  106. @endcode
  107. */
  108. static void LogErrorAndTrace(string msg)
  109. {
  110. LogMessage(msg, MSG_ERROR, true);
  111. }
  112. /**
  113. \brief Function adjust received message for debug console (Do not use)
  114. \param msg \p string Message for adjust
  115. \return \p string Adjusted Message
  116. @code
  117. string msg = DebugPrint.AdjustDebugLog("s = 'Hello World, this is error log'");
  118. DebugPrint.Log(msg);
  119. >> Hello World, this is error log
  120. @endcode
  121. */
  122. static string AdjustDebugLog(string msg)
  123. {
  124. if ( IsStackTrace(msg) )
  125. {
  126. return TrimStackTrace(msg);
  127. }
  128. if ( IsDebugLog(msg) )
  129. {
  130. return TrimDebugLog(msg);
  131. }
  132. return msg;
  133. }
  134. static void EnableTracingLogs(bool enable)
  135. {
  136. s_TraceAllLogs = enable;
  137. }
  138. static private bool IsDebugLog(string msg)
  139. {
  140. for ( int i = 0; i < MSG_COUNT; ++i )
  141. {
  142. if ( msg.IndexOf(s_MsgPrefix[i]) != -1 )
  143. {
  144. return true;
  145. }
  146. }
  147. return false;
  148. }
  149. static private string TrimDebugLog(string msg)
  150. {
  151. int msg_lenght = msg.Length();
  152. int log_start = msg.IndexOf("'") + 1;
  153. if ( log_start == -1 )
  154. {
  155. return msg;
  156. }
  157. int log_lenght = msg_lenght - log_start - 2;
  158. return msg.Substring(log_start, log_lenght);
  159. }
  160. static private bool IsStackTrace(string msg)
  161. {
  162. if ( s_MsgStackMarked && msg.IndexOf(s_MsgStackMarkEnd) != -1 )
  163. {
  164. s_MsgStackMarked = false;
  165. return false;
  166. }
  167. if ( s_MsgStackMarked )
  168. {
  169. return true;
  170. }
  171. if ( msg.IndexOf(s_MsgStackMarkStart) != -1 )
  172. {
  173. s_MsgStackMarked = true;
  174. return true;
  175. }
  176. return false;
  177. }
  178. static private string TrimStackTrace(string msg)
  179. {
  180. if ( msg.IndexOf("DebugPrint.c") != -1 )
  181. {
  182. return string.Empty;
  183. }
  184. return msg;
  185. }
  186. static private void LogMessage(string msg, int msg_type, bool trace=false)
  187. {
  188. string mesg = "["+s_MsgPrefix[msg_type]+"]: "+msg;
  189. Print(mesg);
  190. if ( trace )
  191. {
  192. DumpStack();
  193. }
  194. }
  195. };