You've already forked Core2forAWS-MicroPython
mirror of
https://github.com/m5stack/Core2forAWS-MicroPython.git
synced 2026-05-20 10:30:31 -07:00
ab5d08280b
Also, add qstr's for string appearing in unix REPL loop, gross effect being less allocations for each command run.
65 lines
2.1 KiB
Python
65 lines
2.1 KiB
Python
import argparse
|
|
import re
|
|
from htmlentitydefs import codepoint2name
|
|
|
|
# this must match the equivalent function in qstr.c
|
|
def compute_hash(qstr):
|
|
hash = 0
|
|
for char in qstr:
|
|
hash += ord(char)
|
|
return hash & 0xffff
|
|
|
|
def do_work(infiles):
|
|
# read the qstrs in from the input files
|
|
qstrs = {}
|
|
for infile in infiles:
|
|
with open(infile, 'rt') as f:
|
|
line_number = 0
|
|
for line in f:
|
|
line_number += 1
|
|
line = line.strip()
|
|
|
|
# ignore blank lines and comments
|
|
if len(line) == 0 or line.startswith('//'):
|
|
continue
|
|
|
|
# verify line is of the correct form
|
|
match = re.match(r'Q\((.+)\)$', line)
|
|
if not match:
|
|
print('({}:{}) bad qstr format, got {}'.format(infile, line_number, line))
|
|
return False
|
|
|
|
# get the qstr value
|
|
qstr = match.group(1)
|
|
ident = re.sub(r'[^A-Za-z0-9_]', lambda s: "_" + codepoint2name[ord(s.group(0))] + "_", qstr)
|
|
|
|
# don't add duplicates
|
|
if ident in qstrs:
|
|
continue
|
|
|
|
# add the qstr to the list
|
|
qstrs[ident] = qstr
|
|
|
|
# process the qstrs, printing out the generated C header file
|
|
print('// This file was automatically generated by makeqstrdata.py')
|
|
print('')
|
|
for ident, qstr in qstrs.items():
|
|
qhash = compute_hash(qstr)
|
|
qlen = len(qstr)
|
|
print('Q({}, (const byte*)"\\x{:02x}\\x{:02x}\\x{:02x}\\x{:02x}" "{}")'.format(ident, qhash & 0xff, (qhash >> 8) & 0xff, qlen & 0xff, (qlen >> 8) & 0xff, qstr))
|
|
|
|
return True
|
|
|
|
def main():
|
|
arg_parser = argparse.ArgumentParser(description='Process raw qstr file and output qstr data with length, hash and data bytes')
|
|
arg_parser.add_argument('files', nargs='+', help='input file(s)')
|
|
args = arg_parser.parse_args()
|
|
|
|
result = do_work(args.files)
|
|
if not result:
|
|
print('exiting with error code')
|
|
exit(1)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|