00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <lestes/msg/logger.hh>
00029 #include <lestes/std/backtrace.hh>
00030 #include <lestes/std/event.hh>
00031 #include <lestes/std/lassert.hh>
00032 #include <lestes/std/lassert.m.hh>
00033 #include <iostream>
00034 #include <cstdlib>
00035 #include <cstring>
00036
00037 package(lestes);
00038 package(std);
00039
00040 initialize_event( lassert_event );
00041
00042 static bool lassert_failing;
00043
00044
00045
00046
00047
00048 void lassert_fail( lstring assertion,
00049 lstring filename, ulint line, lstring function,
00050 lstring message, ptr<source_location> loc )
00051 {
00052 if (loc) {
00053 if (message.empty())
00054 report << lassert_msg_default << loc;
00055 else
00056 report << lassert_msg << message << loc;
00057 }
00058 ::std::cerr << filename << ": In function '" << function << "': " << ::std::endl;
00059 if (!message.empty())
00060 ::std::cerr << filename << ": " << message << ::std::endl;
00061 ::std::cerr << filename << ':' << line << ":"
00062 " lassertion failed: \"" << assertion << "\"." << ::std::endl;
00063
00064 #ifndef NO_BACKTRACE_IN_LASSERT
00065 ::std::cerr << assemble_backtrace() << ::std::endl;
00066 #endif
00067
00068
00069
00070
00071
00072 if (!lassert_failing) {
00073 lassert_failing = true;
00074 lassert_event->trigger();
00075 } else
00076 ::std::cerr << filename << ": Double-fail!" << ::std::endl;
00077
00078 #ifdef CONTINUABLE_ASSERTIONS
00079 const char * lestes_lassert = ::std::getenv("LESTES_LASSERT");
00080 if (lestes_lassert) {
00081 lstring value(lestes_lassert);
00082 if (value == "continue" || value == "0" || value == "nil") {
00083 ::std::cerr << filename << ':' << line <<
00084 ": warning: lassertion continued, i.e. ignored." << ::std::endl;
00085 lassert_failing = false;
00086 } else {
00087
00088 ::lestes::msg::logger::finish();
00089
00090 abort();
00091 }
00092 } else
00093 #endif
00094 {
00095
00096 ::lestes::msg::logger::finish();
00097
00098 abort();
00099 }
00100 }
00101
00102 end_package(std);
00103 end_package(lestes);
00104
00105