放假在家没事,睡过懒觉,看过电影,就想起来写个小程序。 统计php代码的行数,对于phper还是挺实用的。支持单个文件和目录。下面是代码和演示的例子!
/**
* @date 2012-12-1
* @author bright
* @todo 统计php代码行数
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <ftw.h>
#define LINESIZE 300
int fn(const char *file,const struct stat *sb,int flag);
int check_file_type(const char * file_name);
void read_file(const char *file);
int is_file();
void print_error();
int error_id=0;
char *path;
const char *FTYPE=\".php\";
const char *flags[]={\"<?\",\"<?php\"};
const char *rflags=\"?>\";
int line_sum=0;
int file_sum=0;
int show_one_file_line=0; //是否显示每个文件的行数
int main(int argc, char *argv[])
{
if(argc==1){
printf(\"请在命令后面添加目录或文件名!\\n\");
return 0;
}
if(argc==3 && strcmp(argv[2],\"-p\")==0){
show_one_file_line=1;
}
path=argv[1];
if(is_file(path)){
if(check_file_type(path)){
read_file(path);
}
}
else{
ftw(path,fn,1000);
}
if(error_id<=3){
print_error();
}
printf(\"files: %d \\ttotal: %d Lines\\n\",file_sum,line_sum);
return 0;
}
void read_file(const char *file_path)
{
char arr[LINESIZE];
int full_code=0;
int line_num=0;
FILE *fp;
fp=fopen(file_path,\"r+\");
while ((fgets(arr, LINESIZE, fp)) != NULL){
int i=sizeof(flags)/4-1;
if (full_code){
if (strstr(arr,rflags)!=0){
full_code=0;
}
else{
line_num++;
}
}
else{
for (;i>=0;i--){
if (strstr(arr,flags[i])!=0){
full_code=1;
break;
}
}
}
}
line_sum+=line_num;
file_sum++;
if(show_one_file_line)
printf(\"%s\\t Lines:%d\\t\\n\",file_path,line_num);
}
int fn(const char *file,const struct stat *sb,int flag)
{
if(flag==FTW_F){
if(is_file()==0){
if(check_file_type(file)){
read_file(file);
}
}
}
return 0;
}
//return 0: 文件; 1:目录
int is_file()
{
int i=strlen(path);
for (;i>=0;i--){
if (path[i]==\'.\'){//文件
if (access(path,F_OK)!=0){
error_id=1;
}
else if (access(path,R_OK)!=0){
error_id=2;
}
return 1;
}
else if (path[i]==\'/\'){//目录
if (access(path,F_OK)!=0){
error_id=3;
}
return 0;
}
}
return 0;
}
//文件是否为指定格式
int check_file_type(const char * file_name)
{
char *tmp=rindex(file_name,\'.\');
if(tmp==NULL){
return 0;
}
if(strcmp(tmp,FTYPE)!=0){
error_id=4;
return 0;
}
return 1;
}
//打印错误信息
void print_error()
{
switch(error_id){
case 1:
printf(\"该文件不存在!请检查!\\n\");
break;
case 2:
printf(\"您没有对该文件的读权限!请检查!\\n\");
break;
case 3:
printf(\"该目录不存在!请检查!\\n\");
break;
case 4:
printf(\"文件格式格式错误,不是%s格式,请重试!\\n\",FTYPE);
break;
}
}
演示例子:
本文地址:https://www.stayed.cn/item/897
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我