放假在家没事,睡过懒觉,看过电影,就想起来写个小程序。 统计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;
}
}
演示例子:
您可能感兴趣的文章:PHP实现统计代码行数小工具PHP统计代码行数的小代码