From dc8f1be6f4942d37bb47db731c14916de5af9b08 Mon Sep 17 00:00:00 2001 From: sbosse Date: Mon, 21 Jul 2025 23:14:14 +0200 Subject: [PATCH] Mon 21 Jul 22:43:21 CEST 2025 --- js/com/err.js | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 js/com/err.js diff --git a/js/com/err.js b/js/com/err.js new file mode 100644 index 0000000..77a810b --- /dev/null +++ b/js/com/err.js @@ -0,0 +1,168 @@ +/** + ** ================================== + ** 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 +};