jam/js/com/err.js

169 lines
4.6 KiB
JavaScript

/**
** ==================================
** OOOO OOOO OOOO O O OOOO
** O O O O O O O O O
** O O O O O O O O O
** OOOO OOOO OOOO O OOO OOOO
** O O O O O O O O O
** O O O O O O O O O
** OOOO OOOO OOOO OOOO O O OOOO
** ==================================
** BSSLAB, Dr. Stefan Bosse http://www.bsslab.de
**
** COPYRIGHT: THIS SOFTWARE, EXECUTABLE AND SOURCE CODE IS OWNED
** BY THE AUTHOR.
** THIS SOURCE CODE MAY NOT BE COPIED, EXTRACTED,
** MODIFIED, OR OTHERWISE USED IN A CONTEXT
** OUTSIDE OF THE SOFTWARE SYSTEM.
**
** $AUTHORS: Stefan Bosse
** $INITIAL: (C) 2006-2016 BSSLAB
** $CREATED: sbosse on 9/22/15.
** $VERSION: 1.2.1
**
** $INFO:
**
** Error management
**
** $ENDOFINFO
*
*/
var Io = Require('com/io');
var Comp = Require('com/compat');
var Array = Comp.array;
var Printf = Comp.printf;
var String = Comp.string;
var suppress_warnings = [];
var error_next = 0;
var errors = Array.create (100,['','']);
var silent = false;
var verbose = false;
var verbosity_level = 0;
var errno = 0;
var warn_is_err = false;
var err_notify = function() {};
var warn_next = 0;
var warnings = Array.create (100,['','']);
/** Register a new error from class 'err_class' (string)
** with message 'err_format' containing argument %s place holders.
** Returns unique error #id.
*
* @param err_class
* @param err_format
* @returns {number}
*/
function register_err(err_class,err_format) {
var next = error_next;
error_next = error_next + 1;
if (error_next == Array.length(errors))
errors = Array.append(errors, Array.create(100, ['','']));
errors[next] = [err_class,err_format];
return next;
}
/**
** Register a new warning from class 'warn_class' (string)
** with message 'warn_format' containing argument %s place holders.
** Returns unique warnor #id.
*
* @param warn_class
* @param warn_format
* @returns {number}
*/
function register_warn(warn_class,warn_format) {
var next = warn_next;
warn_next = warn_next + 1;
if (warn_next == Array.length(warnings))
warnings = Array.append(warnings, Array.create(100, ['','']));
warnings[next] = [warn_class,warn_format];
return next;
}
var err_overflow = register_err("ERR","Invalid error number %s");
var warn_overflow = register_err("warn","Invalid warning number %s");
function replace (str,args){
var _str=str;
Array.match(args,function(hd,tl) {
_str = String.replace_first('%s',hd,str);
_str=replace(_str,tl);
},function () {
_str=str;
});
return _str;
}
function err_unsafe(err_num,args) {
var err_cf = errors[err_num];
Io.out(Printf.sprintf('[ERROR %s]: %s.', err_cf[0], replace(err_cf[1], args)));
throw [err_num,args];
}
function err(err_num,args) {
silent = false;
var err_cf;
if (err_num >= error_next || err_num < 0)
err_unsafe(err_overflow,[Printf.sprintf("%d",err_num)]);
else
err_cf=errors[err_num];
var msg = Printf.sprintf('[ERROR %s] %s.',err_cf[0],replace(err_cf[1], args));
if (!silent) Io.out(msg);
err_notify(msg);
errno = err_num;
throw [err_num,args]
}
function err_sprint(err_num,args) {
var err_cf;
if (err_num >= error_next || err_num < 0)
err_cf=err_unsafe(err_overflow,[Printf.sprintf("%d",err_num)]);
else
err_cf=errors[err_num];
var msg = Printf.sprintf('[%s] %s.',err_cf[0],replace(err_cf[1], args));
return msg;
}
function err_raise(err_num,args) {
throw new Error((err_sprint(err_num,args)));
}
function err_warn(err_num,args) {
Io.out(err_sprint(err_num,args));
}
var last_warning = '';
var warning_repeated = 0;
function warn(warn_num,args) {
var warn_cf;
if (warn_num >= warn_next || warn_num < 0)
err_unsafe(warn_overflow,[Printf.sprintf("%d",warn_num)]);
else
warn_cf=warnings[warn_num];
if (!Array.member(suppress_warnings,warn_cf[0])) {
var msg = Printf.sprintf("[WARNING %s] %s.",warn_cf[0], replace(warn_cf[1],args));
if (String.equal(msg,last_warning)) warning_repeated++;
else warning_repeated=0;
if ((warning_repeated % 100)==1)
Io.out ('[More warnings follow]');
else if (warning_repeated==0)
Io.out(msg);
}
if (warn_is_err) throw "Exit"; // Todo ??
}
module.exports = {
err:err,
err_raise:err_raise,
err_warn:err_warn,
raise:err_raise,
err_sprint:err_sprint,
register_warn:register_warn,
register_err:register_err,
warn:warn
};