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

 更新时间:2014年08月05日 10:55:33   投稿:junjie  
这篇文章主要介绍了C语言实现的统计php代码行数功能源码,支持文件夹、多级目录的统计,在一些环境中会用到这个功能,需要的朋友可以参考下

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

演示例子:

相关文章

  • C++实现封装的顺序表的操作与实践

    C++实现封装的顺序表的操作与实践

    在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能较低,本文将详细介绍如何用 C++ 语言实现一个封装的顺序表类,深入探讨顺序表的核心操作
    2025-02-02
  • 关于C++内存中字节对齐问题的详细介绍

    关于C++内存中字节对齐问题的详细介绍

    本篇文章是对C++内存中字节对齐的问题进行了详细的分析与总结。需要的朋友参考下
    2013-05-05
  • MFC自定义消息的实现方法

    MFC自定义消息的实现方法

    这篇文章主要介绍了MFC自定义消息的实现方法,通过该示例可以更好的理解MFC的消息封装机制,以便更加灵活的打造个性化的windows应用程序,需要的朋友可以参考下
    2014-07-07
  • C语言错误信息报告strerror函数和perror函数详解

    C语言错误信息报告strerror函数和perror函数详解

    这篇文章主要介绍了C语言错误信息报告strerror函数和perror函数,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • C++内存对象布局小测试

    C++内存对象布局小测试

    这篇文章主要介绍了C++内存对象布局小测试,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • C++实现二维图形的打印

    C++实现二维图形的打印

    大家好,本篇文章主要讲的是C++实现二维图形的打印,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • 关于C++类的成员初始化列表的相关问题

    关于C++类的成员初始化列表的相关问题

    下面小编就为大家带来一篇关于C++类的成员初始化列表的相关问题。小编觉得挺
    2016-05-05
  • OpenCV 2.4.3 C++ 平滑处理分析

    OpenCV 2.4.3 C++ 平滑处理分析

    平滑也称模糊, 是一项简单且使用频率很高的图像处理方法,本文将详细介绍OpenCV 2.4+ C++ 平滑处理,需要了解更多的朋友可以详细参考下
    2012-11-11
  • C++中构造函数与析构函数的详解及其作用介绍

    C++中构造函数与析构函数的详解及其作用介绍

    这篇文章主要介绍了C++中构造函数与析构函数的详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C语言合并排序及实例代码

    C语言合并排序及实例代码

    本篇文章主要介绍C语言合并排序算法,这里对合并排序通过实例代码进行了详细讲解,希望能帮助到大家学习
    2016-07-07

最新评论