Анализ Txt файла, чтобы получить список имен файлов .o - PullRequest
0 голосов
/ 14 мая 2009

У меня есть текстовый файл, как:

test.txt

Symbols from __ctype_tab.o:

Name                  Value   Class        Type         Size     Line  Section

__ctype             |00000000|   D  |            OBJECT|00000004|     |.data
__ctype_tab         |00000000|   r  |            OBJECT|00000101|     |.rodata


Symbols from _ashldi3.o:

Name                  Value   Class        Type         Size     Line  Section

__ashldi3           |00000000|   T  |              FUNC|00000050|     |.text


Symbols from _ashrdi3.o:

Name                  Value   Class        Type         Size     Line  Section

__ashrdi3           |00000000|   T  |              FUNC|00000058|     |.text


Symbols from _fixdfdi.o:

Name                  Value   Class        Type         Size     Line  Section

__fixdfdi           |00000000|   T  |              FUNC|0000004c|     |.text
__fixunsdfdi        |        |   U  |            NOTYPE|        |     |*UND*


Symbols from _fixsfdi.o:

Name                  Value   Class        Type         Size     Line  Section

__fixsfdi           |00000000|   T  |              FUNC|0000004c|     |.text
__fixunssfdi        |        |   U  |            NOTYPE|        |     |*UND*


Symbols from _fixunssfdi.o:

Name                  Value   Class        Type         Size     Line  Section

__cmpdi2            |        |   U  |            NOTYPE|        |     |*UND*
__fixunssfdi        |00000000|   T  |              FUNC|00000228|     |.text
__floatdidf         |        |   U  |            NOTYPE|        |     |*UND*

Что я хочу сделать, так это то, что мне дадут функцию, тип которой NOTYPE. Мне нужно найти TXT и найти, под которым он определен (т.е. с типом FUNC). Когда я получаю файл .o, я могу видеть другие функции как NOTYPE. Затем я должен искать, где они определены. Наконец, я хочу вернуть список имен всех файлов .o, которые содержали функции.

Мой кусок кода:

notypeDict , funcDict  = {} , {}
notypeList , funcList = [] , []
currObj , prevObj = '' , ''

fp = open(r'C:\test.txt','r') # file path cms here
fileList = fp.readlines()

for line in fileList:
    if '.o' in line:    # line containg .o
        currObj=line.split()[-1][0:-1]        
    if '|' not in line: # line containg |
        pass
    else:   # other lines
        dataList=[dataItem.strip()  for dataItem in line.strip().split('|')]    # a list of each word in line
        name=dataList[0].strip()    # name of the function
        notypeDict[prevObj] = notypeList    #   notypeDict is a dictionary which contains .o as key and a list of NOTYPE function name 
        funcDict[prevObj] = funcList    # funcDict is a dictionary which contains .o as key and a list of FUNC function names

        if prevObj == currObj :
            pass
        if prevObj != currObj :       
            notypeList , funcList = [] , []

        if dataList[3] == 'NOTYPE' :                
            notypeList.append(name)
        if dataList[3] == 'FUNC' :
            funcList.append(name)

        prevObj = currObj    

print 'notypeDict' , notypeDict
print '\n\nfuncDict' , funcDict

Здесь я получу два словаря, notypeDict и funcDict.

notypeDict имеет .o в качестве ключа и список функций NOTYPE в качестве значения funcDict имеет .o в качестве ключа и список функций FUNC в качестве значения.

Я дошел до здесь.

Но не понимаю, как мне достичь своей цели.

Мне кажется, мой вопрос ясен.

Пожалуйста, помогите мне.

Ответы [ 3 ]

1 голос
/ 14 мая 2009

Как вы думаете, что делает следующее?

   if '.o' in line:    # line containg .o
        currObj=line.split()[-1][0:-1]        
   if '|' not in line: # line containg |
        pass
   else:   # other lines

Находит ли он строки с '.o' или '|' или другое?

Нет. На самом деле это не так.

Находит строки, содержащие '.o'. И что-то с ними делает.

Затем снова проверяет эту строку на «|» или другой". Все ваши строки '.o' обрабатываются два раза.

Один раз как «.o», затем снова как «не |».

Вы могли бы иметь в виду elif вместо if.


Этот код

    if prevObj == currObj :
        pass
    if prevObj != currObj :       
        notypeList , funcList = [] , []

Сложнее, чем нужно. Не вызывает проблем, per se , но выглядит глупо.


Этот код

    if dataList[3] == 'NOTYPE' :                
        notypeList.append(name)
    if dataList[3] == 'FUNC' :
        funcList.append(name)

наверное хорошо. Тем не менее, это выглядит плохо, потому что условия являются исключительными и будут выглядеть лучше как elif.

1 голос
/ 14 мая 2009

А как насчет этого кода? Он основан на ваших двух словарях. Просто позвоните find_dep_for_func(notype_funcname).

def find_ofile(funcname):
    """This will find .o file for given function."""
    for ofile, fns in funcDict.iteritems():
        if funcname in fns:
            return ofile                
    raise Exception("Cannot find function "+funcname)

def find_dependencies(ofile, deps = None):
    """This will find dependent .o files for given .o file."""
    olist = deps if deps else set([])
    for fn in notypeDict[ofile]:
        ofile = find_ofile(fn)
        if not ofile in olist:
            olist.add(ofile)
            olist = find_dependencies(ofile, olist)
    return olist

def find_dep_for_func(notype_funcname):
    return find_dependencies(find_ofile(funcname))
1 голос
/ 14 мая 2009

Я бы использовал регулярные выражения с группами захвата для разных типов интересных строк в вашем файле; Я просматривал файл строка за строкой, и, обнаружив интересную строку (то есть сопоставившую регулярное выражение), я соответствующим образом обработал полученные данные из регулярного выражения.

После создания словарей и т. Д. Отвечать на вопросы, основанные на данных, легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...