rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
verbose.m
Go to the documentation of this file.
1 function r = verbose( level, message, messageId)
2 % function r = verbose( level, message, messageId )
3 % This function displays messages depending on a message-id and/or a level.
4 % Aditionally you can set/reset the level-filer and add ore remove message-ids
5 % to the include and exclude lists.
6 %
7 % When messages will be displayed?
8 % --------------------------------
9 % A Messages only will be diplayed only then if one of the following situation applies.
10 % 1. The message-id is listet in the include list
11 % 2. The messages level is lower or equal to the previously set and the message-id don't
12 % appear in the exclude list
13 %
14 % Basic examples:
15 % ---------------
16 % To use the basic operation of verbose, only one or two arguments,
17 % the level and the message are necessary.
18 %
19 % three ways to set the verbosity level e.g. to 10
20 % 1. > verbose(10);
21 % 2. > verbose('level',10);
22 % 3. > oldVerbLev = verbose(10); % change level to 10
23 % > one_of_my_functions(); % ... some code ...
24 % > verbose(oldVerbLevel); % reset level to value before changed
25 %
26 % get the current verbosity level
27 % 1. > level = verbose();
28 % 2. > level = verbose('level');
29 %
30 % message output (verbosity level previously set to 10)
31 % > verbose(10, 'Hello World!'); % message will be displayed
32 % > verbose(11, 'Hello World!'); % ... won't ...
33 % > verbose(1, 'Hello World!'); % ... will ...
34 %
35 % Extended examples:
36 % ------------------
37 % The third argument, the message-id enables you to specify more precisely
38 % what should be displayed or not.
39 %
40 % add/remove one or more message-ids to the include-/excludelist
41 % > verbose('addInclude', 'RB:ERROR'); % add 'RB:ERROR' to the include list
42 % > verbose('addInclude', {'RB:WARNING', 'RB:INFO'}); % add 'RB:WARNING' and RB:INFO ...
43 % > verbose('include'); % return includelist
44 % % e.g. {'RB:ERROR', 'RB:WARNING', 'RB:INFO'}
45 % > verbose('addExclude', {'RB:INFO','RB:UNKNOWN'}); % add 'RB:INFO','RB:UNKNOWN' to excludelist
46 % > verbose('delInclude', {'RB:ERROR','RB:INFO'}); % remove 'RB:ERROR' and 'RB:INFO'
47 % > verbose('exclude', {}); % clear exclude list
48 %
49 % print messages
50 % > verbose(10);
51 % > verbose('include', {'RB:SURPRISE1'});
52 % > verbose('exclude', {'RB:SURPRISE2'});
53 % > verbose();
54 % > verbose(1, 'Hello World!', 'RB:INFO');
55 % > verbose(99, 'Hello What Happened', 'RB:SURPRISE1'); % displayed, cause RB:SURPRISE1 is in includelist
56 % > verbose(0, 'Surprise for you?'); % no, you don't get it, it's excluded
57 
58 
59  persistent VERBOSE;
60 
61  % initialize structure VERBOSE
62  if isempty( VERBOSE )
63  VERBOSE.level = 0;
64  VERBOSE.include = {};
65  VERBOSE.exclude = {};
66  VERBOSE.addInclude = @(x) VERBOSE_addInclude(x);
67  VERBOSE.delInclude = @(x) VERBOSE_delInclude(x);
68  VERBOSE.addExclude = @(x) VERBOSE_addExclude(x);
69  VERBOSE.delExclude = @(x) VERBOSE_delExclude(x);
70  end;
71 
72  if (nargin==0)
73  r = VERBOSE.level;
74  elseif (nargin>0)
75  if isnumeric( level )
76  if nargin==2
77  % filter by level
78  if ( level <= VERBOSE.level )
79  disp( message );
80  end;
81  return;
82  elseif nargin==3
83  [st,i] = dbstack;
84  if (length(st)>1)
85  [paths,fileName] = fileparts(st(2).file);
86  funcName = st(2).name;
87  lineNo = num2str(st(2).line);
88  if isempty(messageId)
89  messageId = sprintf('RB:%s:UNKNOWN',fileName);
90  end;
91  message = sprintf('%s file=%s func=%s line=%s\n ==> ''%s''\r\n', ...
92  messageId, fileName, funcName, lineNo, message);
93  else
94  if isempty(messageId)
95  messageId = 'RB:UNKNOWN:UNKNOWN';
96  message = sprintf('RB:UNKNOWN:UNKNOWN\r\n ==> ''%s''\r\n', message);
97  else
98  message = sprintf('%s\r\n ==> ''%s''\r\n', messageId, message);
99  end;
100  end;
101  % filter by messageId and level
102  if (( ~isempty(VERBOSE.include ) && ( any(strcmp(messageId, VERBOSE.include )))) || ...
103  ((level<=VERBOSE.level) && ( isempty(VERBOSE.exclude ) || ( ~any(strcmp(messageId, VERBOSE.exclude ))))))
104  disp( message );
105  end;
106  return;
107  elseif ( nargin == 1 )
108  r = VERBOSE.level;
109  VERBOSE.level = level;
110  return;
111  end;
112  elseif ischar(level)
113  if isfield(VERBOSE, level)
114  if isa(VERBOSE.(level), 'function_handle')
115  % call function field
116  r = VERBOSE.(level)(message);
117  return;
118  else
119  % set value of field
120  r = VERBOSE.(level);
121  if nargin==2
122  VERBOSE.(level) = message;
123  end;
124  end;
125  else
126  verbose( 0, 'first argument is a unknown field.', 'RB:VERBOSE:ARGERR');
127  end;
128  else
129  verbose( 0, 'first argument should be of type numeric or character.', 'RB:VERBOSE:ARGERR');
130  end;
131  end;
132 
133  function r = VERBOSE_addExclude(c)
134  % addExclude
135  r = VERBOSE.exclude;
136  VERBOSE.exclude = union(VERBOSE.exclude, c);
137  end
138 
139  function r = VERBOSE_delExclude(c)
140  % delExclude
141  r = VERBOSE.exclude;
142  VERBOSE.exclude = setdiff(VERBOSE.exclude, c);
143  end
144 
145  function r = VERBOSE_addInclude(c)
146  % addInclude
147  r = VERBOSE.include;
148  VERBOSE.include = union(VERBOSE.include, c);
149  end
150 
151  function r = VERBOSE_delInclude(c)
152  % delInclude
153  r = VERBOSE.include;
154  VERBOSE.include = setdiff(VERBOSE.include, c);
155  end
156 
157 end
158 
function r = verbose(level, message, messageId)
This function displays messages depending on a message-id and/or a level. Aditionally you can set/res...
Definition: verbose.m:17