xref: /aosp_15_r20/external/skia/tools/misc_utils.py (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2014 Google Inc.
2*c8dee2aaSAndroid Build Coastguard Worker#
3*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
4*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file.
5*c8dee2aaSAndroid Build Coastguard Worker
6*c8dee2aaSAndroid Build Coastguard Worker
7*c8dee2aaSAndroid Build Coastguard Worker"""Miscellaneous utilities."""
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard Workerimport re
11*c8dee2aaSAndroid Build Coastguard Worker
12*c8dee2aaSAndroid Build Coastguard Worker
13*c8dee2aaSAndroid Build Coastguard Workerclass ReSearch(object):
14*c8dee2aaSAndroid Build Coastguard Worker  """A collection of static methods for regexing things."""
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard Worker  @staticmethod
17*c8dee2aaSAndroid Build Coastguard Worker  def search_within_stream(input_stream, pattern, default=None):
18*c8dee2aaSAndroid Build Coastguard Worker    """Search for regular expression in a file-like object.
19*c8dee2aaSAndroid Build Coastguard Worker
20*c8dee2aaSAndroid Build Coastguard Worker    Opens a file for reading and searches line by line for a match to
21*c8dee2aaSAndroid Build Coastguard Worker    the regex and returns the parenthesized group named return for the
22*c8dee2aaSAndroid Build Coastguard Worker    first match.  Does not search across newlines.
23*c8dee2aaSAndroid Build Coastguard Worker
24*c8dee2aaSAndroid Build Coastguard Worker    For example:
25*c8dee2aaSAndroid Build Coastguard Worker        pattern = '^root(:[^:]*){4}:(?P<return>[^:]*)'
26*c8dee2aaSAndroid Build Coastguard Worker        with open('/etc/passwd', 'r') as stream:
27*c8dee2aaSAndroid Build Coastguard Worker            return search_within_file(stream, pattern)
28*c8dee2aaSAndroid Build Coastguard Worker    should return root's home directory (/root on my system).
29*c8dee2aaSAndroid Build Coastguard Worker
30*c8dee2aaSAndroid Build Coastguard Worker    Args:
31*c8dee2aaSAndroid Build Coastguard Worker        input_stream: file-like object to be read
32*c8dee2aaSAndroid Build Coastguard Worker        pattern: (string) to be passed to re.compile
33*c8dee2aaSAndroid Build Coastguard Worker        default: what to return if no match
34*c8dee2aaSAndroid Build Coastguard Worker
35*c8dee2aaSAndroid Build Coastguard Worker    Returns:
36*c8dee2aaSAndroid Build Coastguard Worker        A string or whatever default is
37*c8dee2aaSAndroid Build Coastguard Worker    """
38*c8dee2aaSAndroid Build Coastguard Worker    pattern_object = re.compile(pattern)
39*c8dee2aaSAndroid Build Coastguard Worker    for line in input_stream:
40*c8dee2aaSAndroid Build Coastguard Worker      match = pattern_object.search(line)
41*c8dee2aaSAndroid Build Coastguard Worker      if match:
42*c8dee2aaSAndroid Build Coastguard Worker        return match.group('return')
43*c8dee2aaSAndroid Build Coastguard Worker    return default
44*c8dee2aaSAndroid Build Coastguard Worker
45*c8dee2aaSAndroid Build Coastguard Worker  @staticmethod
46*c8dee2aaSAndroid Build Coastguard Worker  def search_within_string(input_string, pattern, default=None):
47*c8dee2aaSAndroid Build Coastguard Worker    """Search for regular expression in a string.
48*c8dee2aaSAndroid Build Coastguard Worker
49*c8dee2aaSAndroid Build Coastguard Worker    Args:
50*c8dee2aaSAndroid Build Coastguard Worker        input_string: (string) to be searched
51*c8dee2aaSAndroid Build Coastguard Worker        pattern: (string) to be passed to re.compile
52*c8dee2aaSAndroid Build Coastguard Worker        default: what to return if no match
53*c8dee2aaSAndroid Build Coastguard Worker
54*c8dee2aaSAndroid Build Coastguard Worker    Returns:
55*c8dee2aaSAndroid Build Coastguard Worker        A string or whatever default is
56*c8dee2aaSAndroid Build Coastguard Worker    """
57*c8dee2aaSAndroid Build Coastguard Worker    match = re.search(pattern, input_string)
58*c8dee2aaSAndroid Build Coastguard Worker    return match.group('return') if match else default
59*c8dee2aaSAndroid Build Coastguard Worker
60