'it/python'에 해당되는 글 2건

  1. C 상수 파서
  2. python에서 ctype을 이용한 c library 연동 예제

C 상수 파서

아주 오래전에 만들어 놓은 것을 github에 올리면서 readme 파일을 작성했습니다.

https://github.com/lmk/c_define_parser


개요

c 헤더 파일을 파싱해서 '#define', 'enum' 구문으로 정의된 값, 상수명을 검색합니다.

사용법

error.h 파일의 내용이 아래와 같을 때

#define ERROR_NONE 0x00
#define ERROR_LOGIN 0x01
#define ERROR_FILE 0x02
#define ERROR_DEVICE 0x03
$ find_const.py 1
1 is ERROR_LOGIN

$ find_const.py 0x03
0x03 is ERROR_DEVICE

구현 로직

  1. 모든 파일을 머지한다.
  2. 주석을 제거한다.
  3. enum 구문을 파싱해서 dic_command에 저장한다.
  4. define 구문을 파싱해서 dic_command에 저장한다.
  5. dic_command에 저장된 상수 값을 찾아서 치환 한다.
  6. dic_command의 key, value 값을 바꿔서 dic_command_r에 저장한다.
  7. 값으로 상수를 찾는다.

선행 작업

find_const.py 파일 9번째 줄에 FILE_PATH 배열에 파싱할 헤더파일 목록을 추가합니다.

python에서 ctype을 이용한 c library 연동 예제

python의 ctype 모듈을 이용해서 visual c++로 작성한 동적 dll을 읽는 sample 코드 입니다.

소스 코드 설명

  • /vc/test_dll: 동적 dll 코드 입니다.

    • SET_VALUE: int 형 값을 저장합니다.
    • GET_VALUE: 저장한 int형 값을 읽어 옵니다.
    • SET_CALLBACK: 함수 포인터를 저장합니다. python으로 코딩한 함수를 넘길 것 입니다.
    • RUN_CALLBACK: 저장한 함수 포인터에 정수형 값을 넘겨 실행 합니다. 실행하면 python함수가 실행될 것 입니다.
    • SET_CLASS_CALLBACK: c++ class를 사용해서 함수 포인터를 저정합니다.
    • RUN_CLASS_CALLBACK: c++ class를 사용해서 저장한 함수 포인터를 실행합니다.
    • SET_THREAD_CALLBACK: 함수 포인터를 저장하고, thread 에서 1초 후 함수를 실행합니다.
    • INIT_CLASS: c++ class를 동적으로 생성합니다.
    • SET_D_CLASS_CALLBACK: 동적으로 생성한 class를 사용해서 함수 포인터를 저장합니다.
    • RUN_D_CLASS_CALLBACK: 동적으로 생성한 class를 사용해서 함수 포인터를 실행합니다.
  • /vc/call_dll: test_dll을 LoadLibrary() 해서 순서대로 테스트 하는 c++ 코드 입니다.(test_dll.dll 파일의 경로는 맞게 수정해야 동작합니다)

  • /python: 동적 dll 읽어 순서대로 테스트 하는 python 코드 입니다.(test_dll.dll 파일의 경로는 맞게 수정해야 동작합니다)