Redirect Compilation Notices
By default, Pike prints compilation warnings and errors to stderr. If you're writing a program that compiles code on the fly, it's often useful to "capture" compilation warnings and errors in order to present them in a more useful manner.It is possible to provide the master object with a compiler error handler object that will keep track of errors and warnings. Once passed to the error handler, you can do other things with them, like log them or present a dialog box. object ee = ErrorContainer();
master()->set_inhibit_compile_errors(ee); // we use a catch here because the compile operation could
// throw an error that isn't due to syntax.
mixed err = catch {
res = ((program)"mycode")(); // could be a compile_* instead
}; master()->set_inhibit_compile_errors(0); if(strlen(ee->get())) {
werror("error:n%sn", ee->get());
exit(1);
} else if(err) {
werror(describe_backtrace(err));
exit(1);
}
ee->print_warnings("compilation warnings:");
//!
class ErrorContainer
{
string d;
string errors="", warnings="";
string get()
{
return errors;
}//!
string get_warnings()
{
return warnings;
}//!
void print_warnings(string prefix) {
if(warnings && strlen(warnings))
werror(prefix+"n"+warnings);
}//!
void got_error(string file, int line, string err, int|void is_warning)
{
if (file[..sizeof(d)-1] == d) {
file = file[sizeof(d)..];
} if( is_warning)
warnings+= sprintf("%s:%st%sn", file, line ? (string) line : "-", err);
else
errors += sprintf("%s:%st%sn", file, line ? (string) line : "-", err);
}//!
void compile_error(string file, int line, string err)
{
got_error(file, line, "Error: " + err);
}//!
void compile_warning(string file, int line, string err)
{
got_error(file, line, "Warning: " + err, 1);
}//!
void create()
{
d = getcwd();
if (sizeof(d) && (d[-1] != '/') && (d[-1] != '\'))
d += "/";}
Powered by PikeWiki2 |
|||
| gotpike.org | Copyright © 2004 - 2009 | Pike is a trademark of Department of Computer and Information Science, Linköping University | |||