zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C语言实现的统计php代码行数功能源码(支持文件夹、多目录)

C语言PHP统计源码代码 实现 功能 支持
2023-06-13 09:15:40 时间

放假在家没事,睡过懒觉,看过电影,就想起来写个小程序。统计php代码的行数,对于phper还是挺实用的。支持单个文件和目录。下面是代码和演示的例子!

/**
 *@date   2012-12-1
 *@authorbright
 *@todo   统计php代码行数
 */

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<dirent.h> 
#include<sys/stat.h>
#include<ftw.h>
#defineLINESIZE300

intfn(constchar*file,conststructstat*sb,intflag);
intcheck_file_type(constchar*file_name);
voidread_file(constchar*file);
intis_file();
voidprint_error();

interror_id=0;
char*path;
constchar*FTYPE=".php";
constchar*flags[]={"<?","<?php"};
constchar*rflags="?>";
intline_sum=0;
intfile_sum=0;
intshow_one_file_line=0;//是否显示每个文件的行数

intmain(intargc,char*argv[])
{
   if(argc==1){
      printf("请在命令后面添加目录或文件名!\n");
      return0;
   }
   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:%dLines\n",file_sum,line_sum);
   return0;
}

voidread_file(constchar*file_path)
{
   chararr[LINESIZE];
   intfull_code=0;
   intline_num=0;
   
   FILE*fp;
   fp=fopen(file_path,"r+");
   
   while((fgets(arr,LINESIZE,fp))!=NULL){
      inti=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\tLines:%d\t\n",file_path,line_num);
}

intfn(constchar*file,conststructstat*sb,intflag)
{
   if(flag==FTW_F){
      if(is_file()==0){
         if(check_file_type(file)){
            read_file(file);
         }
      }
   }
   
   return0;
}


//return0:文件;1:目录
intis_file()
{
   inti=strlen(path);
   for(;i>=0;i--){
      if(path[i]=="."){//文件
         if(access(path,F_OK)!=0){
            error_id=1;
         }
         elseif(access(path,R_OK)!=0){
            error_id=2;
         }
      
         return1;
      }
      elseif(path[i]=="/"){//目录
         if(access(path,F_OK)!=0){
            error_id=3;
         }
         return0;
      }
   }
   return0;
}

//文件是否为指定格式
intcheck_file_type(constchar*file_name)
{
   char*tmp=rindex(file_name,".");
   if(tmp==NULL){
      return0;
   }
   if(strcmp(tmp,FTYPE)!=0){
      error_id=4;
      return0;
   }
   return1;
}

//打印错误信息
voidprint_error()
{
   switch(error_id){
   case1:
      printf("该文件不存在!请检查!\n");
   break;
   case2:
      printf("您没有对该文件的读权限!请检查!\n");
   break;
   case3:
      printf("该目录不存在!请检查!\n");
   break;
   case4:
      printf("文件格式格式错误,不是%s格式,请重试!\n",FTYPE);
   break;
   }
}

演示例子: