lcc/pylcc/lib/lbcInclude.py (61 lines of code) (raw):
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
File Name: lbcInc
Description :
Author : liaozhaoyan
date: 2022/6/10
-------------------------------------------------
Change Activity:
2022/6/10:
-------------------------------------------------
"""
__author__ = 'liaozhaoyan'
import os
import re
INCLUDE_MAX = 64
class ClbcInclude(object):
def __init__(self, workPath=None, incPath=None):
super(ClbcInclude, self).__init__()
self._reInclude = re.compile(r'^#include *[\<\"].*[\>\"]')
self._reBrackets = re.compile(r'(?<=[\<\"]).+?(?=[\>\"])')
self._loop = 0
if workPath is None:
workPath = os.getcwd()
self._incs = [workPath]
if "LBC_INCLUDE" in os.environ:
incPath = os.environ["LBC_INCLUDE"] + ";" + incPath
if incPath is not None:
paths = incPath.split(';')
for path in paths:
if os.path.exists(path) and os.path.isdir(path):
self._incs.append(os.path.abspath(path))
else:
print("warning: path %s is not exist, skip.", path)
def _loadFile(self, fileName):
workDir = os.getcwd()
strInc = None
for path in self._incs:
os.chdir(path)
if os.path.exists(fileName):
with open(fileName, 'r') as fInc:
strInc = fInc.read()
os.chdir(workDir)
self._loop += 1
if self._loop > INCLUDE_MAX:
raise ValueError("include %s may nested include.", fileName)
if strInc is None:
raise ValueError("include %s is not exist.", fileName)
return self._parse(strInc)
def _parse(self, s):
res = []
lines = s.split('\n')
for line in lines:
r = self._reInclude.search(line)
if r:
fileName = self._reBrackets.search(line).group().strip()
if fileName == "lbc.h":
res.append(line)
else:
res += self._loadFile(fileName)
else:
res.append(line)
return res
def parse(self, bpfStr):
res = []
res += self._parse(bpfStr)
return "\n".join(res)
if __name__ == "__main__":
inc = ClbcInclude(incPath="/Users/liaozhaoyan/work/sh/c")
with open("test.bpf.c", 'r') as f:
s = f.read()
inc.parse(s)
pass