Total Articles 35
[Download]
[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); }