169 lines
4.6 KiB
JavaScript
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
|
|
};
|