You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.4 KiB
Python
90 lines
2.4 KiB
Python
# Copyright 2017 Martin Olejar
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import re
|
|
from string import printable
|
|
|
|
|
|
def is_string(data):
|
|
""" Check property string validity """
|
|
if not len(data):
|
|
return None
|
|
if data[-1] != 0:
|
|
return None
|
|
pos = 0
|
|
while pos < len(data):
|
|
posi = pos
|
|
while pos < len(data) and \
|
|
data[pos] != 0 and \
|
|
data[pos] in printable.encode() and \
|
|
data[pos] not in (ord('\r'), ord('\n')):
|
|
pos += 1
|
|
if data[pos] != 0 or pos == posi:
|
|
return None
|
|
pos += 1
|
|
return True
|
|
|
|
|
|
def extract_string(data, offset=0):
|
|
""" Extract string """
|
|
str_end = offset
|
|
while data[str_end] != 0:
|
|
str_end += 1
|
|
return data[offset:str_end].decode("ascii")
|
|
|
|
|
|
def line_offset(tabsize, offset, string):
|
|
offset = " " * (tabsize * offset)
|
|
return offset + string
|
|
|
|
|
|
def get_version_info(text):
|
|
ret = dict()
|
|
for line in text.split('\n'):
|
|
line = line.rstrip('\0')
|
|
if line and line.startswith('/ {'):
|
|
break
|
|
if line and line.startswith('//'):
|
|
line = line.replace('//', '').replace(':', '')
|
|
line = line.split()
|
|
if line[0] in ('version', 'last_comp_version', 'boot_cpuid_phys'):
|
|
ret[line[0]] = int(line[1], 0)
|
|
return ret
|
|
|
|
|
|
def strip_comments(text):
|
|
text = re.sub('//.*?(\r\n?|\n)|/\*.*?\*/', '\n', text, flags=re.S)
|
|
return text
|
|
|
|
|
|
def split_to_lines(text):
|
|
lines = []
|
|
mline = str()
|
|
for line in text.split('\n'):
|
|
line = line.replace('\t', ' ')
|
|
line = line.rstrip('\0')
|
|
line = line.rstrip(' ')
|
|
line = line.lstrip(' ')
|
|
if not line or line.startswith('/dts-'):
|
|
continue
|
|
if line.endswith('{') or line.endswith(';'):
|
|
line = line.replace(';', '')
|
|
lines.append(mline + line)
|
|
mline = str()
|
|
else:
|
|
mline += line + ' '
|
|
|
|
return lines
|
|
|