def run(fname): macrosesUnroll(fname) # изготовит файл исходного кода import mFu # Обрабатываем файл с кодом ifile = fname # читаем string = IOOperations.getFileContent(ifile) commFree = delCom(string) # чистый от комментариев код - плоховато, но пусть пока commFreeList = commFree.split("\n") # замена в файлах i = 0 f = io.open(fname, "w", encoding="utf-8") f.write(u"#include P18F8722.inc\n") for item in commFreeList: fini, type = testMacro(item, mFu.macDictFu) if fini: itemSplit = item.split() # просто дробим args = getArgs(item, i) # print type unrollCode = mFu.macDictFu[type](args) unrollCode = unrollCode.replace("THIS", "_v2_HOT") f.write(unicode(unrollCode + "\n")) i += 1 else: # просто пишем f.write(unicode(item) + u"\n") f.close() i = 0
def getDefsList( dirForFound, cbFindCond, cbGetFileList, typeInFile, ofile ): # Создаем список найденных файлов fileList = cbGetFileList( dirForFound, typeInFile ) # читаем файл и выбираем из него директивы f = io.open( ofile+'.h', 'w', encoding='utf-8') f.write(u'#-*- coding: utf-8 -*-\n') definedList = list('') # сюда складываем все for at in fileList: # содержимое string = IOOperations.getFileContent( at ) # удаляем закомменченное strPure = PreProc.delCom( string ) # Дробим на строки stringSplit = strPure.split('\n') for item in stringSplit: if cbFindCond( item ): f.write(item+'\n') newItem = item.split()[1] definedList.append( newItem ) f.close() # сохраняем результаты поиска f = io.open( ofile+'.py', 'w', encoding='utf-8') f.write(u'#-*- coding: utf-8 -*-\n') f.write( ofile.split('/')[-1]+'List'+u' = [\n' ) for at in definedList: f.write(u'\''+at+u'\','+u'\n') f.write(u']\n') f.close()
def getMacroFile(listFiles): # контейнеры macDict = {} macContent = {} macArgsDict = {} for ifile in listFiles: # читаем string = IOOperations.getFileContent(ifile) commFree = delCom(string) # дробим на отдельные строки (по \n) # и каждую анализируем отдельно listStr = commFree.split("\n") mustWrite = False # начался ли макрос currentName = "" # имя текущего макроса, в который пишем contentMacro = "'" for item in listStr: if "#v(i)" in item: item = item.replace("#v(i)", "'+i+'") # Проверка того, заполняем ли мы содержимое макроса if mustWrite and not "endm" in item: # удаляем увеличение переменной item = item.split(";")[0] # .replace('\'', 'VvV')# '\\\'') # if '#v(i)' in item: # item = item.replace('#v(i)', '\'+i+\'') # сцепляем contentMacro += "\n" + item # если есть совпадение по macro - выделяем строку и анализируем # еще не факт, что это то, что нужно if "macro" in item: # удаляем запятые item = item.replace(",", " ") # дробим listItemSplit = item.split() # Проверка на неслучайтость if "macro" in listItemSplit[1]: # Сигнатрура макроса, теперь нужно найти его содержимое currentName = listItemSplit[0] # оставляем только параметры itemListSplit = item.split(";")[0].split() macArgsDict[currentName] = itemListSplit[2:] mustWrite = True # если макрос закончился if "endm" in item: listItemSplit = item.split() for at in listItemSplit: if "endm" in at: # с большой вер. это конец макроса mustWrite = False # проверка контента на важность # добавление контента в словарь macDict[currentName] = "\treturn " + contentMacro + "'" contentMacro = "'" # Пишем в файл. Он собирается со всех. f = io.open("mFu.py", "w", encoding="utf-8") f.write(u"#-*- coding: utf-8 -*-\n") for at in macDict.keys(): # нужно сделать параметры макроса переменными # Gap! name_labelXX тоже заменит!! нужно подумать pins = "" i = 0 for argi in macArgsDict[at]: macDict[at] = macDict[at].replace(argi, "'+" + argi + "+'") # распиновка pins += "\t" + argi + " = " + "args[" + str(i) + "]\n" i += 1 pins += "\ti = " + " args[" + str(i) + "]\n" # Перенос строки macDict[at] = macDict[at].replace("\n", "\\n\\\n") macDict[at] = macDict[at].replace("i++", "") # Заголовок функции и распиновка macDict[at] = "def " + at.replace("?", "") + "( args ): " + "\n" + pins + macDict[at] # Смотрим что вышло f.write(macDict[at] + "\n") # Пишем формирователь словаря для доступа f.write(u"macDictFu = {\n") for it in macDict.keys(): f.write("'" + it + "' : " + it.replace("?", "") + ",\n") f.write(u"}\nprint len(macDictFu)\n") f.close()
files = os.listdir( dir ) # И обрабатываем его fileList = list() for p in files : if p.find('.inc') != -1: fileList.append( dirForFound[0]+p ) import PreProc PreProc.getMacroFile( fileList ) import mFu # Обрабатываем файл с кодом ifile = '../src/_v1_IRQ.asm' # читаем string = IOOperations.getFileContent( ifile ) commFree = PreProc.delCom( string ) commFreeList = commFree.split('\n') # замена в файлах i = 0 f = io.open('mFu.asm', 'w', encoding='utf-8') f.write(u'#-*- coding: utf-8 -*-\n') for item in commFreeList: itemSplit = item.split() if len( itemSplit ) > 0: args = list('') if itemSplit[0] in mFu.macDictFu: # поиск имени макроса # получаем аргументы args = PreProc.getArgs( item, i )