C 프로그램에서 함수를 찾는 스크립트

C 프로그램에서 함수를 찾는 스크립트

다음 문제에 대한 해결책을 찾으려고 합니다.

주어진 디렉토리 구조:

project/
bridge/
    mysql_bridge.c
    postgres_bridge.c

내 코드는 .c 파일의 모든 함수와 루트 폴더의 하위 디렉터리에 있는 모든 c 프로그램*을 검색해야 합니다.

  • mysql_bridge.c
  • postgres_bridge.c

소스 파일이 발견되지 않으면 내 스크립트는 "소스 파일을 찾을 수 없습니다."를 출력해야 합니다. 특히 검색해야 할 유일한 소스 파일은 .c 파일입니다(헤더는 무시됩니다).

프로젝트의 루트로 명령줄 매개변수를 사용하고 싶습니다. 시나리오는 다음과 같습니다.

예시 1:

./findfn.sh project_1
project_1/ever/jump.c:
void logical_jump(int loc)
int ngoto()

project_1/indent/handle.c:
FILE* figure_out_this(char* name)
void kill_all()

project_1/mac.c:
void some(void)
int super_function(int xx, int ya)

project_1/test.c:
void this_function()

예 2:잘못된 디렉토리

./findfn.sh file
file is not a directory

예시 3:기능을 찾을 수 없습니다

./findfn.sh project_2
Unable to find any functions

답변1

AC 소스 파일은 다른 구조화된 데이터 파일만큼 구문 분석하기가 어렵습니다. 직접 처리하려고 하기보다는 언어의 구문을 이해하는 파서를 사용하는 것이 더 좋습니다.

당신이 가지고 있다고 가정활기 넘치는 c 태그다음과 같이 설치됨 ectags:

find top-dir -type f -name '*.[ch]' -exec ectags -x --c-kinds=f {} ';' >table

그러면 해당 안이나 그 아래의 모든 파일을 찾아서 .c파일이 생성됩니다. 내용은 다음과 같습니다(이 예에서는)..htop-dirtabletabletop-dir.

GetTimeSeed      function    373 ./src/bayes.c    void GetTimeSeed (void)
InitializeMrBayes function    443 ./src/bayes.c    int InitializeMrBayes (void)
PrintHeader      function    821 ./src/bayes.c    void PrintHeader (void)
ReinitializeMrBayes function    838 ./src/bayes.c    int ReinitializeMrBayes (void)
main             function    101 ./src/bayes.c    int main (int argc, char *argv[])
readline_completion function    359 ./src/bayes.c    char **readline_completion (const char *text, int start, int stop)

(등.)

awk이 출력 형식은 예를 들어 원하는 형식을 얻기 위해 쉽게 구문 분석되어야 합니다 .

관련 정보