다음 문제에 대한 해결책을 찾으려고 합니다.
주어진 디렉토리 구조:
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
파일이 생성됩니다. 내용은 다음과 같습니다(이 예에서는)..h
top-dir
table
table
top-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
이 출력 형식은 예를 들어 원하는 형식을 얻기 위해 쉽게 구문 분석되어야 합니다 .