Appia의 IT세상

파이썬[Python] 정규표현식을 이용한 C 소스 코드에 선언된 함수 출력하기 본문

Python/Python 응용

파이썬[Python] 정규표현식을 이용한 C 소스 코드에 선언된 함수 출력하기

Appia 2021. 7. 27. 06:01
반응형

파이썬[Python]  정규표현식을 이용한 C 소스 코드에 선언된 함수 출력하기

파이썬[Python]  정규표현식을 이용한 C 소스 코드에 선언된 함수 출력하기

최근에 C소스 코드를 가지고 다양한 작업들을 하고 있습니다. 그 중 이번 포스팅에서는 C 소스 코드 또는 헤더에 선언되어 있는 함수를 출력하는 부분들에 대해서 이야기를 해보고자 합니다. 

 

먼저, 참고로 하는 소스코드는 다음 링크에 있는 코드를 활용하여 별도의 파일로 만들어서 활용하였습니다. 

https://c.happycodings.com/sorting-searching/code12.html

 

C | No sort, but reversing a [linked list] Code Example

C Programming Code Examples C > Sorting Searching Code Examples No sort, but reversing a [linked list] No sort, but reversing a [linked list] #include #include #define MAX 10 /* max of 10 elements */ struct lnode { int number; struct lnode *next; }; /* add

c.happycodings.com

 

이번 작업을 하기 위해서, 약간의 정규식 작업을 진행하였습니다. 함수를 도출하기 위해서, 약간의 꼼수를 사용했습니다. 

'(void|int|float)[ ]{1,}[\w]{1,}[(].{0,}[)][;]'

정규식에서 위에 보이는 부분들을 활용하였습니다. 가장 앞선 부분에서 리턴타입으로 올수 있는 부분들에 대해서(void|int|float)형태로 선별하였고, 그 다음 공백에 대해서 표현하고, 그 다음 함수 이름이 들어 올 수 있게, [\w]{1,}부분을 입력하였습니다. 그럼 코드를 한번 살펴보겠습니다. 

import re

def reading_source(path):
    sourcecode = open(path,"r")
    data = sourcecode.readlines()
    number = 0
    notWord = re.compile('(void|int|float)[ ]{1,}[\w]{1,}[(].{0,}[)][;]')

    for i in data:
        val_i = notWord.search(i)

        if val_i != None :
            print(i)

    return number


if __name__ == '__main__':
    file = "D:\Example\Example_C.C"

    countline = reading_source(file)

위의 코드를 실행하면 다음과 같은 화면이 나타납니다. 

void llist_add_begin(struct lnode **n, int val);

void llist_reverse(struct lnode **n);

void llist_display(struct lnode *n);

이와 같이 코드에 선언된 함수들이 표시가 됩니다. 그럼 여기에서 함수의 이름만 출력해보도록 하겠습니다. 위에서 부분을 활용하여 다음과 같은 코드 부분을 작성하였습니다. 가장 먼저, 위에서 '(void|int|float)[ ]{1,}|[(].{0,}[)][;]'부분과 re.sub 부분을 이용하여 함수의 앞 뒤 부분을 정리하였습니다. 그럼 코드에서 살펴보도록 하겠습니다. 

import re

def reading_source(path):
    sourcecode = open(path,"r")
    data = sourcecode.readlines()
    number = 0
    notWord = re.compile('(void|int|float)[ ]{1,}[\w]{1,}[(].{0,}[)][;]')

    for i in data:
        val_i = notWord.search(i)

        if val_i != None :
            functionName = re.sub('(void|int|float)[ ]{1,}|[(].{0,}[)][;]', "",i)
            print(functionName)
            

    return number


if __name__ == '__main__':
    file = "D:\Example\Example_C.C"

    countline = reading_source(file)

위의 코드를 실행하면 다음과 같은 결과가 나타납니다. 

llist_add_begin

llist_reverse

llist_display

이와 같은 방법으로 함수의 이름만 별도로 출력할 수 있습니다. 

 

파이썬[Python] C 소스 코드 공백포함, 공백 미포함 코드라인 수 확인하기

 

파이썬[Python] C 소스 코드 공백포함, 공백 미포함 코드라인 수 확인하기

파이썬[Python] C 소스 코드 공백포함, 공백 미포함 코드라인 수 확인하기 최근에 C언어로 작성된 소스코드를 파싱해야하는 일들이 조금 생겼습니다. C코드 최적화등에 사용하기 위해서 다

appia.tistory.com

이번 포스팅에서는 파이썬[Python]  정규표현식을 이용한 C 소스 코드에 선언된 함수 출력하기라는 주제로 포스팅을 해봤습니다. 이러한 부분들은 향후 소스코드에 정적 분석등에 활용할 수 있습니다. 혹 궁금하신 점이나 문의 사항이 있으시면 언제든지 댓글 및 방명록에 글 남겨주시길 바랍니다. 감사합니다. 

반응형
Comments