[Download]


getline.tar.gz




[Demo]





[Usage]


getline version 7.0

Copyright (c) Gilbert Lee All rights reserved


getline [-f <root folder>] <list of files>


example


  getline *.h *.cpp

  getline *.h* *.c*

  getline -f /usr/include *.h




[Source Code]


#include <list>
#include <string>
#include <stdio.h>
#include <boost/regex.hpp>
#include <VDream/File.h>
#include <VDream/URI.h>

using namespace std;
USING_NAMESPACE(vd);

// ----------------------------------------------------------------------------
// usage
// ----------------------------------------------------------------------------
void usage()
{
  printf("getline version 7.0\n");
  printf("Copyright (c) Gilbert Lee All rights reserved\n");
  printf("\n");
  printf("getline [-f <root folder>] <list of files>\n");
  printf("\n");
  printf("example\n");
  printf("\n");
  printf("  getline *.h *.cpp\n");
  printf("  getline *.h* *.c*\n");
  printf("  getline -f /usr/include *.h\n");
}

// ----------------------------------------------------------------------------
// GetLine
// ---------------------------------------------------------------------------
typedef list<string> FileNameList;
class GetLine
{
public:
  static int getLineOfFileName(string fileName);
  static int scan(string folder, FileNameList& filePatternList);
};

int GetLine::getLineOfFileName(std::string fileName)
{
  static const int MAX_STR_SIZE = 65536;
  File file(fileName, "rb");
  if (!file.open()) return 0;

  int res = 0;
  while (true)
  {
    char buf[MAX_STR_SIZE];
    char* p = fgets(buf, MAX_STR_SIZE, file.getFileHandle());
    if (p == NULL) break;
    res++;
  }
  file.close();
  printf("%s\t%d\n", FileURI::extractFileName(fileName).c_str(), res);
  return res;
}

int GetLine::scan(string folder, FileNameList& filePatternList)
{

  bool isFolderWritten = false;
  int res = 0;
  FileList fileList;
  File::getFileList(fileList, folder);

  for (FileList::iterator it = fileList.begin(); it != fileList.end(); it++)
  {
    std::string fullFileName = it->fileName;
    std::string pureFileName = FileURI::extractFileName(fullFileName);
    if (File::isDirectory(fullFileName))
    {
      std::string subFolder = folder + pureFileName + "/";
      res += scan(subFolder, filePatternList);
    } else
    {
      for(FileNameList::iterator it = filePatternList.begin(); it != filePatternList.end(); it++)
      {
        std::string patternStr = *it;
        boost::regex pattern(patternStr);

        if (boost::regex_match(pureFileName, pattern))
        {
          if (!isFolderWritten)
          {
            printf("--------------------------------------------------\n");
            printf("%s\n\n", folder.c_str());
            isFolderWritten = true;
          }
          res += getLineOfFileName(fullFileName);
          break;
        }
      }
    }
  }
  return res;
}

// ----------------------------------------------------------------------------
// Param
// ----------------------------------------------------------------------------
class Param
{
public:
  string       folder;
  list<string> filePatternList;

public:
  Param() { folder = "./"; filePatternList.clear(); }

public:
  bool parse(int argc, char* argv[])
  {
    int index = 1;
    while (index < argc)
    {
      if (strcmp(argv[index], "-f") == 0)
      {
        index++;
        if (index >= argc)
        {
          printf("invalid option\n");
          return false;
        }
        folder = argv[index];
        if (folder[folder.length() - 1] != '\\' && folder[folder.length() - 1] != '/')
          folder += '/';
      } else
      {
        string fileName = argv[index];
        filePatternList.push_back(fileNameToFilePattern(fileName));
      }
      index++;
    }
    return filePatternList.size() > 0;
  }

protected:
  static string fileNameToFilePattern(std::string fileName)
  {
    std::string res;
    for (size_t i = 0; i < fileName.size(); i++)
    {
      char ch = fileName[i];
      if (ch == '*') res += ".*";
      else if (ch == '?') res += ".";
      else if (ch == '.') res += "\\.";
      else res += ch;
    }
    return res;
  }
};

// ----------------------------------------------------------------------------
// main
// ----------------------------------------------------------------------------
int main(int argc, char* argv[])
{
  Param param;
  if (!param.parse(argc, argv))
  {
    usage();
    return 0;
  }

  int res = GetLine::scan(param.folder, param.filePatternList);

  printf("\n");
  printf("==================================================\n");
  printf("Total File Line=%d\n", res);
  printf("==================================================\n");
  printf("totoal = %d\n", res);
}