mirror of https://github.com/arendst/Tasmota.git
105 lines
2.9 KiB
Plaintext
Executable File
105 lines
2.9 KiB
Plaintext
Executable File
#!/usr/bin/env -S ../berry/berry -s -g
|
|
#
|
|
# Berry solidify files
|
|
|
|
import os
|
|
import global
|
|
import solidify
|
|
import string as string2
|
|
import re
|
|
|
|
import sys
|
|
sys.path().push('src/embedded') # allow to import from src/embedded
|
|
|
|
# globals that need to exist to make compilation succeed
|
|
var globs = "path,ctypes_bytes_dyn,tasmota,ccronexpr,gpio,light,webclient,load,MD5,lv,light_state,udp,tcpclientasync,"
|
|
"lv_clock,lv_clock_icon,lv_signal_arcs,lv_signal_bars,lv_wifi_arcs_icon,lv_wifi_arcs,"
|
|
"lv_wifi_bars_icon,lv_wifi_bars,"
|
|
"_lvgl,"
|
|
"int64"
|
|
|
|
for g:string2.split(globs, ",")
|
|
global.(g) = nil
|
|
end
|
|
|
|
var prefix_dir = "src/embedded/"
|
|
var prefix_out = "src/solidify/"
|
|
|
|
def sort(l)
|
|
# insertion sort
|
|
for i:1..size(l)-1
|
|
var k = l[i]
|
|
var j = i
|
|
while (j > 0) && (l[j-1] > k)
|
|
l[j] = l[j-1]
|
|
j -= 1
|
|
end
|
|
l[j] = k
|
|
end
|
|
return l
|
|
end
|
|
|
|
def clean_directory(dir)
|
|
var file_list = os.listdir(dir)
|
|
for f : file_list
|
|
if f[0] == '.' continue end # ignore files starting with `.`
|
|
os.remove(dir + f)
|
|
end
|
|
end
|
|
|
|
var pattern = "#@\\s*solidify:([A-Za-z0-9_.,]+)"
|
|
|
|
def parse_file(fname, prefix_out)
|
|
print("Parsing: ", fname)
|
|
var f = open(prefix_dir + fname)
|
|
var src = f.read()
|
|
f.close()
|
|
# try to compile
|
|
var compiled = compile(src)
|
|
compiled() # run the compile code to instanciate the classes and modules
|
|
# output solidified
|
|
var fname_h = string2.split(fname, '.be')[0] + '.h' # take whatever is before the first '.be'
|
|
var fout = open(prefix_out + "solidified_" + fname_h, "w")
|
|
fout.write(f"/* Solidification of {fname_h} */\n")
|
|
fout.write("/********************************************************************\\\n")
|
|
fout.write("* Generated code, don't edit *\n")
|
|
fout.write("\\********************************************************************/\n")
|
|
fout.write('#include "be_constobj.h"\n')
|
|
|
|
var directives = re.searchall(pattern, src)
|
|
# print(directives)
|
|
|
|
for directive : directives
|
|
var object_list = string2.split(directive[1], ',')
|
|
var object_name = object_list[0]
|
|
var weak = (object_list.find('weak') != nil) # do we solidify with weak strings?
|
|
var o = global
|
|
var cl_name = nil
|
|
var obj_name = nil
|
|
for subname : string2.split(object_name, '.')
|
|
o = o.(subname)
|
|
cl_name = obj_name
|
|
obj_name = subname
|
|
if (type(o) == 'class')
|
|
obj_name = 'class_' + obj_name
|
|
elif (type(o) == 'module')
|
|
obj_name = 'module_' + obj_name
|
|
end
|
|
end
|
|
solidify.dump(o, weak, fout, cl_name)
|
|
end
|
|
|
|
fout.write("/********************************************************************/\n")
|
|
fout.write("/* End of solidification */\n")
|
|
fout.close()
|
|
end
|
|
|
|
clean_directory(prefix_out)
|
|
|
|
var src_file_list = os.listdir(prefix_dir)
|
|
src_file_list = sort(src_file_list)
|
|
for src_file : src_file_list
|
|
if src_file[0] == '.' continue end
|
|
parse_file(src_file, prefix_out)
|
|
end
|