Something went wrong. Try again.
Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148#!/usr/bin/env python3# SPDX-License-Identifier: GPL-2.0# Copyright(c) 2025: Mauro Carvalho Chehab <mchehab@kernel.org>.
"""Regular expression ancillary classes.
Those help caching regular expressions and do matching for kernel-doc."""
import re
# Local cache for regular expressionsre_cache = {}
class KernRe: """ Helper class to simplify regex declaration and usage.
It calls re.compile for a given pattern. It also allows adding regular expressions and define sub at class init time.
Regular expressions can be cached via an argument, helping to speedup searches. """
def _add_regex(self, string, flags): """ Adds a new regex or reuses it from the cache. """ self.regex = re_cache.get(string, None) if not self.regex: self.regex = re.compile(string, flags=flags) if self.cache: re_cache[string] = self.regex
def __init__(self, string, cache=True, flags=0): """ Compile a regular expression and initialize internal vars. """
self.cache = cache self.last_match = None
self._add_regex(string, flags)
def __str__(self): """ Return the regular expression pattern. """ return self.regex.pattern
def __repr__(self): """ Returns a displayable version of the class init. """
flag_map = { re.IGNORECASE: "re.I", re.MULTILINE: "re.M", re.DOTALL: "re.S", re.VERBOSE: "re.X", }
flags = [] for flag, name in flag_map.items(): if self.regex.flags & flag: flags.append(name)
flags_name = " | ".join(flags)
max_len = 60 pattern = "" for pos in range(0, len(self.regex.pattern), max_len): pattern += '"' + self.regex.pattern[pos:max_len + pos] + '" '
if flags_name: return f'KernRe({pattern}, {flags_name})' else: return f'KernRe({pattern})'
def __add__(self, other): """ Allows adding two regular expressions into one. """
return KernRe(str(self) + str(other), cache=self.cache or other.cache, flags=self.regex.flags | other.regex.flags)
def match(self, string): """ Handles a re.match storing its results. """
self.last_match = self.regex.match(string) return self.last_match
def search(self, string): """ Handles a re.search storing its results. """
self.last_match = self.regex.search(string) return self.last_match
def finditer(self, string): """ Alias to re.finditer. """
return self.regex.finditer(string)
def findall(self, string): """ Alias to re.findall. """
return self.regex.findall(string)
def split(self, string): """ Alias to re.split. """
return self.regex.split(string)
def sub(self, sub, string, count=0): """ Alias to re.sub. """
return self.regex.sub(sub, string, count=count)
def group(self, num): """ Returns the group results of the last match. """
return self.last_match.group(num)
def groups(self): """ Returns the group results of the last match """
return self.last_match.groups()