#include "assert++.hh" #include #include #include #include #undef assertvar /* This is Bisqwit's generic C++ asserts file. * The same file is used in many different projects. * * assert++.cc version 1.0.5. */ bool assertflag; struct parec { std::string var; std::string::size_type pos; char begin, end; }; namespace assertprivate { std::vector asserttab; autoptr vars; bool vars_used = false; void adder(const char *condition, const char *file, unsigned line, const char *func) { assertflag = true; assertion a; a.data.condition = condition; a.data.file = file; a.data.line = line; a.data.func = func; a.vars = vars; asserttab.push_back(a); } void string_asserter::dump() { std::cerr << '"'; for(unsigned a=0; a > tabtype; tabtype tab; for(unsigned i=0; i varset; varset vars; for(std::string::size_type j=0; jsecond.size(); ++j) { const assertiondata &a = i->second[j]; const std::string &condition = a.condition; std::cerr << a.file << '[' << a.func << "]:" << a.line << ": " << condition << std::endl; parec state; state.var = ""; std::list stack; enum { main, str, strquo, chr, chrquo } op = main; for(std::string::size_type a=0; a::iterator i = stack.begin(); if(i != stack.end() && condition[a] == i->end) { std::string expr = condition.substr(i->pos, a - i->pos); /*if(expr.size()) vars.insert(expr);*/ state = *i; if(state.var.size()) { state.var += state.begin; state.var += expr; state.var += state.end; } stack.erase(stack.begin()); } } } if(state.var.size()) vars.insert(state.var); } /* Dump the vars found in the expressions for(varset::const_iterator k = vars.begin(); k!=vars.end(); ++k) std::cerr << "Var: " << *k << std::endl;*/ bool first=true; const varmapbase *mappi = i->first; for(varmapbase::const_iterator j=mappi->begin(); j!=mappi->end(); ++j) { const std::string &s = j->first; /* Don't display the variable if it isn't * used in any of the expressions */ varset::const_iterator k = vars.find(s); if(k == vars.end())continue; if(first) { first=false; std::cerr << "\t\t(With ";} else std::cerr << ", "; std::cerr << s << '='; j->second->dump(); } if(!first)std::cerr << ")\n"; } std::exit(-1); } } }