使用ffmpeg移植一个音频解码的功能,发现头文件太多了,真正用到的很少,怎么把这些无用的头文件清除呢?
刚开始想使用sed,gwak进行处理,发现自己用的不熟练,一时半会弄不好。
突然想到可以自己用C语言写个程序啊,遍历文件夹处理。
算法思路是这样的:
1.编译程序,依赖文件名都放在.d文件里了,遍历文件夹找到.d文件。
2.读取*.d文件的内容,过滤出来头文件名,把所有头文件名放在一个文件中
3.遍历完所有文件夹后,就得到了包含所有头文件名的一个文件
4.遍历所有文件夹,得到所有头文件
5.所有头文件名 - 使用的头文件,就是无用的头文件
6.把无用的头文件删除
程序使用的C语言知识点:
1.递归函数
2.函数指针
3.回调函数
代码如下:
include <inttypes.h>
include <stdio.h>
include <stdlib.h>
include <unistd.h>
include <string.h>
include <sys/mount.h>
include <sys/statfs.h>
include <dirent.h>
define FILE_DEPDENCY "/tmp/dfile.fedora"
define FILE_DEPDENCY_SORT "/tmp/dfile_sort.fedora"
define FILE_HEADER "/tmp/hfile.fedora"
define FILE_HEADER_SORT "/tmp/hfile_sort.fedora"
define FILE_TO_DELETED "/tmp/delete.fedora"
define USAGE_HELP "Usage:cmd option1 option2 option3 ... "
"descriptions1
"
"descriptions2
"
"descriptions3 ...
"
define STR_LEN 2048
static FILE* sg_fpDep;
static FILE* sg_fpHeader;
static FILE* sg_fpDelete;
static void parse_dep_file(char* filename)
{
FILE* fp=fopen(filename,"r");
char str[STR_LEN];
uint32_t line_cnt=0;
if(NULL==fp)
{
fprintf(stderr,"open dep file error!
");
}
while(NULL!=fgets(str,STR_LEN,fp))
{
char *p;
//fprintf(stdout,"line_cnt=%"PRIu32"--------------
",line_cnt++);
p=strtok(str," ");
while(NULL!=p)
{
if(NULL!=strstr(p,".h"))
{
fprintf(sg_fpDep,"%s
",p);
}
p=strtok(NULL," ");
}
//fprintf(stdout,"%s",str);
}
fclose(fp);
}
typedef int (*DIR_OP)(char name[],int d_type);
static void dir_traverse(char* dirName, char* filter, DIR_OP op)
{
DIR* pDir;
if(0==strcmp(".git",dirName))
{
return;
}
pDir=opendir(dirName);
if(NULL==pDir)
{
fprintf(stderr,"open dir error!
");
return;
}
struct dirent* pEntry;
while(NULL != (pEntry= readdir(pDir)))
{
while((strcmp(pEntry->d_name, ".") == 0) || (strcmp(pEntry->d_name, "..") == 0))
{
pEntry=readdir(pDir);
if(NULL==pEntry)
{
closedir(pDir);
return;
}
}
switch(pEntry->d_type)
{
case DT_REG:
if(NULL != filter)
{
if(NULL ==strstr(pEntry->d_name,filter))
{
break;
}
}
char name[STR_LEN];
if(0!=strcmp(dirName,"."))
{
snprintf(name,STR_LEN,"%s/%s",dirName,pEntry->d_name);
}
else
{
strncpy(name,pEntry->d_name,STR_LEN);
}
if(op)
{
op(name,pEntry->d_type);
}
break;
case DT_DIR:
if(op)
{
op(pEntry->d_name,pEntry->d_type);
}
dir_traverse(pEntry->d_name,filter,op);
break;
}
}
closedir(pDir);
}
static int op_header_files_fun(char name[], int d_type)
{
switch(d_type)
{
case DT_REG:
fprintf(sg_fpHeader,"%s
",name);
break;
case DT_DIR:
//fprintf(stdout,"@%s
",name);
break;
}
return 0;
}
static int op_dep_files_fun(char name[], int d_type)
{
switch(d_type)
{
case DT_REG:
//fprintf(stdout,"$@%s
",name);
parse_dep_file(name);
break;
case DT_DIR:
//fprintf(stdout,"@%s
",name);
break;
}
return 0;
}
static int32_t search_depfile(FILE*fp,char name[])
{
char str[STR_LEN];
int32_t result;
fseek(fp,0,SEEK_SET);
while(NULL!=fgets(str,STR_LEN,fp))
{
if(0==strcmp(name,str))
{
return 1;
}
}
return 0;
}
static void generate_filelist(char dname, char hname, char oname)
{
FILE fpD=fopen(dname,"r");
if(NULL==fpD)
{
fprintf(stderr,"open dep file error!
");
}
FILE* fpH=fopen(hname,"r");
if(NULL==fpH)
{
fprintf(stderr,"open dep file error!
");
}
FILE* fpO=fopen(oname,"w+");
if(NULL==fpO)
{
fprintf(stderr,"open dep file error!
");
}
char str[STR_LEN];
uint32_t line_cnt=0;
while(NULL!=fgets(str,STR_LEN,fpH))
{
if(!search_depfile(fpD,str))
{
fputs(str,fpO);
}
}
fclose(fpD);
fclose(fpH);
fclose(fpO);
}
static void delete_filelist(char oname)
{
FILE fp=fopen(oname,"r");
if(NULL==fp)
{
fprintf(stderr,"open dep file error!
");
}
char str[STR_LEN];
while(NULL!=fgets(str,STR_LEN,fp))
{
str[strlen(str)-1]=0;
unlink(str);
}
fclose(fp);
}
static int dep_sort_empty(void)
{
int empty=1;
FILE* fp=fopen(FILE_DEPDENCY_SORT,"r");
char str[STR_LEN];
while(NULL!=fgets(str,STR_LEN,fp))
{
if(NULL!=strstr(str,".h"))
{
empty=0;
break;
}
}
fclose(fp);
return empty;
}
int main(int argc, char* argv[])
{
/*
if(argc <2)
{
fprintf(stderr,"%s",USAGE_HELP);
return -1;
}
parse_dep_file(argv[1]);
*/
char cmd[STR_LEN];
//dep files
sg_fpDep=fopen(FILE_DEPDENCY,"w+");
dir_traverse(".",".d",op_dep_files_fun);
fclose(sg_fpDep);
snprintf(cmd,STR_LEN,"sort -u %s | sed -e '/^$/d' >%s",FILE_DEPDENCY,FILE_DEPDENCY_SORT);
system(cmd);
if(dep_sort_empty())
{
fprintf(stderr,"dependency files is absent,please compile at first!
");
return -2;
}
//header files
sg_fpHeader=fopen(FILE_HEADER,"w+");
dir_traverse(".",".h",op_header_files_fun);
fclose(sg_fpHeader);
snprintf(cmd,STR_LEN,"sort -u %s | sed -e '/^$/d' >%s",FILE_HEADER,FILE_HEADER_SORT);
system(cmd);
//delete files
generate_filelist(FILE_DEPDENCY_SORT,FILE_HEADER_SORT,FILE_TO_DELETED);
delete_filelist(FILE_TO_DELETED);
//clear workaround
unlink(FILE_DEPDENCY);
unlink(FILE_DEPDENCY_SORT);
unlink(FILE_HEADER);
unlink(FILE_HEADER_SORT);
unlink(FILE_TO_DELETED);
return 0;
}
头有点晕,写个博客吧