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;
    }
}

演示例子:

(0)

相关推荐

  • C语言编程中统计输入的行数以及单词个数的方法

    统计输入的行数 标准库保证输入文本流以行序列的形式出现,每一行均以换行符结束.因此,统计行数等价于统计换行符的个数. #include <stdio.h> /* count lines in input */ main() { int c, nl; nl = 0; while ((c = getchar()) != EOF) if (c == '\n') ++nl; printf("%d\n", nl); } 在该程序中,while 循环语句的循环体是一个 if 语句,它控

  • C语言实现统计字符串单词数

    字符串单词数.c #include<stdio.h> #define BUFFERSIZE 1024 int main() { char string[BUFFERSIZE]; int i,count=0,word=0; char c; gets(string) ; for(i=0;(c=string[i])!='\0';i++) { if(c==' ') word=0; else if(word==0) { word=1; count++; } } printf("%d \n&qu

  • C语言中使用lex统计文本文件字符数

    我曾经在Linux上写的一个C程序,借助Lex做词法分析来同时统计N个文本文件的字符数,单词数和行数.让我觉得Lex确实挺有意思的.确实Lex的功能非常强大,用来做小巧的词法分析非常适合,也非常好用.这个程序参考了<Lex与Yacc>上的一个例子. %{ unsigned int char_count = 0, word_count = 0, line_count = 0; %} %% [^ /t/n]+ {word_count++; char_count+=yyleng;}; /n {cha

  • C++统计中英文大小写字母、数字、空格及其他字符个数的方法

    本文实例讲述了C++统计中英文大小写字母.数字.空格及其他字符个数的方法.分享给大家供大家参考,具体如下: /* * 作 者: 刘同宾 * 完成日期:2012 年 11 月 28 日 * 版 本 号:v1.0 * 输入描述: * 问题描述: 有一篇文章,共有三行文字,每行有80个字符.要求分别统计出其中英文大写字母.小写字母.数字.空格以及其他字符的个数. * 程序输出: * 问题分析:略 * 算法设计:略 */ #include<iostream> using namespace std;

  • C++统计软件使用时间代码示例

    复制代码 代码如下: // FileName: UseSoftTime.h #pragma once #include <vector> struct UseTime{    // 开始时间    SYSTEMTIME startTime; // 结束时间    SYSTEMTIME endTime; // 时间差    SYSTEMTIME subTime;}; struct UseSoftInfo{    // 软件名    CString SoftName; // 软件启动时间;如果在打

  • C#统计C、C++及C#程序代码行数的方法

    本文实例讲述了C#统计C.C++及C#程序代码行数的方法.分享给大家供大家参考.具体如下: 本文中的两个函数 1)用于统计扩展名为 .h .c .cpp .cs 文件的代码行数 public static int LinesOfCode(string filename) 2)用于递归统计一个文件夹内所有扩展名为 .h .c .cpp .cs 文件的代码行数 public static int LinesOfFolder(string foldername) 一.什么样的情况算一行代码 需要注意如

  • C++实现第K顺序统计量的求解方法

    一个n个元素组成的集合中,第K个顺序统计量(Order Statistic)指的是该集合中第K小的元素,我们这里要讨论的是如何在线性时间(linear time)里找出一个数组的第K个顺序统计量.该问题的算法对于C++程序员来说有一定的借鉴价值.具体如下: 一.问题描述: 问题:给定一个含有n个元素的无序数组,找出第k小的元素. k = 1 :最小值 k = n :最大值 k = ⌊(n+1)/2⌋ or ⌈(n+1)/2⌉ :中位数 找最大值或最小值很简单,只需要遍历一次数组并记录下最大值或最

  • C语言统计字符个数代码分享

    C语言实现统计字符个数 #include<stdio.h> int main() { int sz[10]={0},zm[26]={0},z[26]={0},i,space=0,e=0,t=0; char c; printf("请输入一段字符,统计其中各字符的数量\n"); while((c=getchar())!='\n') { if(c<='z'&&c>='a') zm[c-'a']++; else if(c<='Z'&&

  • C语言实现的统计素数并求和代码分享

    题目来源于PAT平台,此题又是费了一番脑子.题目要求输出给定区间内的素数个数并对他们求和.具体思路是利用循环判断素数,将结果传递给控制变量,由控制变量再来判断是否执行自增以及求和.当然这里必须要注意1既不是素数也不是合数. 下面是代码: 复制代码 代码如下: #include <stdio.h> int main () {  int a=0,b=0;  int n=0,sum=0;  int x=0,i=0;  scanf("%d %d",&a,&b);  

  • Shell脚本实现C语言代码行数统计

    写了一个比较粗糙的C语言代码行数统计脚本,目前还有些bug,而且效率也不高.脚本主要就是去除大部分的注释后统计行数,相当于做了一部分预处理的工作.下面是代码: #!/bin/bash filename=$1 echo "`whoami`" if [ $# -lt 1 ];then echo "usage : ./scripts filename" exit -1 fi if [ ! -f $filename ];then echo "$filename i

  • c++统计文件中字符个数代码汇总

    我们先来看看下面的代码: #include<iostream> #include<fstream> #include<cstdlib> using namespace std; class CntCharacters { private: int cnt; public: CntCharacters():cnt(0){} ~CntCharacters(){} void opentxt(char* p) { ifstream fin; fin.open(p,ios_bas

随机推荐