2022-05-23 09:30:13 -04:00
|
|
|
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
|
|
|
# SPDX-License-Identifier: Apache-2.0
|
2021-02-01 05:40:03 -05:00
|
|
|
|
|
|
|
import re
|
|
|
|
|
|
|
|
|
|
|
|
class LineMatcher(object):
|
|
|
|
"""
|
|
|
|
Assembles a dictionary of filtering rules based on the --print_filter
|
|
|
|
argument of idf_monitor. Then later it is used to match lines and
|
|
|
|
determine whether they should be shown on screen or not.
|
|
|
|
"""
|
|
|
|
LEVEL_N = 0
|
|
|
|
LEVEL_E = 1
|
|
|
|
LEVEL_W = 2
|
|
|
|
LEVEL_I = 3
|
|
|
|
LEVEL_D = 4
|
|
|
|
LEVEL_V = 5
|
|
|
|
|
|
|
|
level = {'N': LEVEL_N, 'E': LEVEL_E, 'W': LEVEL_W, 'I': LEVEL_I, 'D': LEVEL_D,
|
|
|
|
'V': LEVEL_V, '*': LEVEL_V, '': LEVEL_V}
|
|
|
|
|
|
|
|
def __init__(self, print_filter):
|
|
|
|
# type: (str) -> None
|
|
|
|
self._dict = dict()
|
|
|
|
self._re = re.compile(r'^(?:\033\[[01];?[0-9]+m?)?([EWIDV]) \([0-9]+\) ([^:]+): ')
|
|
|
|
items = print_filter.split()
|
|
|
|
if len(items) == 0:
|
|
|
|
self._dict['*'] = self.LEVEL_V # default is to print everything
|
|
|
|
for f in items:
|
|
|
|
s = f.split(r':')
|
|
|
|
if len(s) == 1:
|
|
|
|
# specifying no warning level defaults to verbose level
|
|
|
|
lev = self.LEVEL_V
|
|
|
|
elif len(s) == 2:
|
|
|
|
if len(s[0]) == 0:
|
|
|
|
raise ValueError('No tag specified in filter ' + f)
|
|
|
|
try:
|
|
|
|
lev = self.level[s[1].upper()]
|
|
|
|
except KeyError:
|
|
|
|
raise ValueError('Unknown warning level in filter ' + f)
|
|
|
|
else:
|
|
|
|
raise ValueError('Missing ":" in filter ' + f)
|
|
|
|
self._dict[s[0]] = lev
|
|
|
|
|
|
|
|
def match(self, line):
|
|
|
|
# type: (str) -> bool
|
|
|
|
try:
|
|
|
|
m = self._re.search(line)
|
|
|
|
if m:
|
|
|
|
lev = self.level[m.group(1)]
|
|
|
|
if m.group(2) in self._dict:
|
|
|
|
return self._dict[m.group(2)] >= lev
|
|
|
|
return self._dict.get('*', self.LEVEL_N) >= lev
|
|
|
|
except (KeyError, IndexError):
|
|
|
|
# Regular line written with something else than ESP_LOG*
|
|
|
|
# or an empty line.
|
|
|
|
pass
|
|
|
|
# We need something more than "*.N" for printing.
|
|
|
|
return self._dict.get('*', self.LEVEL_N) > self.LEVEL_N
|