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

前端技术 2023/08/31 C++

放假在家没事,睡过懒觉,看过电影,就想起来写个小程序。 统计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

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。