结果:
1/**//*****************************************************************
2 * 鏂囦欢鍚? 锛? Head.h
3 * 鍒涘缓鏃堕棿 锛?2010锛?锛?9
4 * 浣滆€? 锛?閮緳
5 * 浣滅敤 锛?鍏敤鐨勫ご鏂囦欢
6 ******************************************************************/
7
8#ifndef HEADFILE_H_
9#define HEADFILE_H_
10
11#include <iostream>
12#include <string>
13#include <sstream>
14#include <cstdlib>
15#include "logging.h"
16#include "Error.h"
17using namespace Error;
18
19using namespace std;
20
21enum enType{File = 0, Dir = 1};
22/**////////////////////////////////////////////////////////////////23// 瀛樺偍鍙傛暟鐨勭粨鏋勪綋
24struct tagParameterInfo_t
25{
26 string strInputPath;
27 string strOutPutPath;
28 string strFileType;
29 string bSubDir;
30 string nOutPutView;
31 string strHelp;
32 enType Type;
33 tagParameterInfo_t():strInputPath(""), strOutPutPath(""),
34 strFileType("c:cpp:h"),bSubDir("true"),
35 nOutPutView("3"),strHelp(""), Type(Dir)
36 {
37
38 }
39};
40
41#endif
42
1/**//*****************************************************************
2 * 鏂囦欢鍚? 锛?DirLineInfo.h
3 * 鍒涘缓鏃堕棿 锛?2010锛?锛?9
4 * 浣滆€? 锛?閮緳
5 * 浣滅敤 锛?鐩綍绫荤殑鏋勫缓CDirLineInfo鐨勬瀯閫狅紝缁熻鐩綍鐨勮淇℃伅
6 * 锛?鏋勫缓鏂囦欢瀛愮洰褰曞拰瀛愭枃浠剁殑閾捐〃
7 ******************************************************************/
8#ifndef DIRLINEINFO_H_
9#define DIRLINEINFO_H_
10
11#include "LineInfo.h"
12#include "FileLineInfo.h"
13#include <sys/types.h>
14#include <dirent.h>
15#include <unistd.h>
16#include <pcre++.h>
17#include <pcrecpp.h>
18
19class CFileLineInfo;
20
21class CDirLineInfo: public CLineInfo
22{
23friend ostream& operator<<(ostream&out, CDirLineInfo& Dir);
24public:
25 CDirLineInfo();
26 CDirLineInfo(char *pDirPath);
27 virtual ~CDirLineInfo();
28
29public:
30 CDirLineInfo& operator+ ( const CDirLineInfo& DirLineInfo);
31 CDirLineInfo& operator+ ( const CFileLineInfo& FileLineInfo);
32
33 string GetWriteXmlInfo();
34
35public:
36
37 CFileLineInfo *m_pSubFileListHead;
38 CDirLineInfo *m_pSubDirListHead;
39
40 CDirLineInfo *m_pNext;
41public:
42 string m_strDirName;
43 int m_nFileCount;
44};
45
46#endif /* DIRLINEINFO_H_ */
47
48
49
50
51
52
53
1/**//*****************************************************************
2 * 文件名 : DirLineInfo.cpp
3 * 创建时间 : 2010-9-19
4 * 作者 : 郭龙
5 * 作用 : 目录类的构建CDirLineInfo的构造,统计目录的行信息
6 * : 构建文件子目录和子文件的链表
7 ******************************************************************/
8
9#include "DirLineInfo.h"
10
11extern tagParameterInfo_t ParameterInfo;
12
13CDirLineInfo::CDirLineInfo():m_pSubFileListHead(NULL), m_pSubDirListHead(NULL), m_pNext(NULL),m_nFileCount(0),m_strDirName("")
14{
15 // TODO Auto-generated constructor stub
16
17}
18/**//////////////////////////////////////////////////////////////// 19// 目录类的构建CDirLineInfo的构造,统计目录的行信息
20// 构建文件子目录和子文件的链表
21CDirLineInfo::CDirLineInfo(char* strDirPath):m_pSubFileListHead(NULL), m_pSubDirListHead(NULL), m_pNext(NULL), m_nFileCount(0)
22//CDirLineInfo::CDirLineInfo(char* strDirPath): m_pNext(NULL), m_nFileCount(0)
23{
24 m_strDirName = strDirPath;
25
26 /**//* o. right
27 *
28 * CFileLineInfo* pFileTemp = new CFileLineInfo;
29 * CDirLineInfo* pDirTemp = new CDirLineInfo;
30 * m_pSubFileListHead = pFileTemp;
31 * m_pSubDirListHead = pDirTemp;
32 *
33 *
34 */
35
36 /**//* o. wrong
37 *
38 * CFileLineInfo FileLineHead;
39 * CDirLineInfo DirLineHead;
40 * m_pSubFileListHead = &FileLineHead;
41 * m_pSubDirListHead = &DirLineHead;
42 *
43 * stack or heap
44 */
45
46 /**//*2 */
47 m_pSubFileListHead = new CFileLineInfo;
48 m_pSubDirListHead = new CDirLineInfo;
49 CFileLineInfo *pFileTemp = m_pSubFileListHead;
50 CDirLineInfo *pDirTemp = m_pSubDirListHead;
51
52
53 struct dirent *ptr;
54 DIR *pDir = opendir(strDirPath);
55 while( NULL != (ptr = readdir(pDir)))
56 {
57 string strd_name(ptr->d_name);
58 if((strd_name == string(".")) || (strd_name == string("..")))
59 continue;
60
61 string strPathName(strDirPath);
62 string strDirName(ptr->d_name);
63 strPathName = strPathName + "/" + strDirName;
64
65 if((NULL != (opendir(strPathName.c_str()))) && ("true" == ParameterInfo.bSubDir))
66 {
67 pDirTemp->m_pNext = new CDirLineInfo((char*)strPathName.c_str());
68
69 if(pDirTemp->m_pNext->m_Total != pDirTemp->m_pNext->m_NULL)
70 {
71 pDirTemp = pDirTemp->m_pNext;
72 (*this) = (*this) + *(pDirTemp);
73 }
74 else
75 {
76 delete pDirTemp->m_pNext;
77 pDirTemp->m_pNext = NULL;
78 }
79 }
80 else
81 {
82 Pcre regc(".*\\.c$",PCRE_CASELESS);
83 Pcre regh(".*\\.h$",PCRE_CASELESS);
84 Pcre regcpp(".*\\.cpp$",PCRE_CASELESS);
85
86 Pcre regctype("c",PCRE_CASELESS);
87 Pcre reghtype("h",PCRE_CASELESS);
88 Pcre regcpptype("cpp",PCRE_CASELESS);
89 string strFileType = ParameterInfo.strFileType;
90 string strFileTypeC = ParameterInfo.strFileType;
91 if(strFileType.find("cpp") != string::npos)
92 {
93 strFileTypeC.erase(strFileTypeC.find("cpp"), 3);
94 }
95 if( (true == regc.search(strd_name) && true == regctype.search(strFileTypeC))
96 || (true == regh.search(strd_name) && true == reghtype.search(strFileType))
97 || (true == regcpp.search(strd_name) && true == regcpptype.search(strFileType)))
98 {
99 pFileTemp->m_pNext = new CFileLineInfo((char*)strPathName.c_str());
100 if(pFileTemp->m_pNext->m_Total != pFileTemp->m_pNext->m_NULL)
101 {
102 ++ m_nFileCount;
103 pFileTemp = pFileTemp->m_pNext;
104 (*this) = (*this) + *(pFileTemp);
105 }
106 else
107 {
108 delete pFileTemp->m_pNext;
109 pFileTemp->m_pNext = NULL;
110 }
111 // cout<<*(pFileTemp)<<endl;
112 }
113
114 }
115
116 }
117 // cout<<(*this)<<endl;
118}
119/**////////////////////////////////////////////////////////////////120// 目录类行信息 = 目录类行信息 + 子文件类行信息
121CDirLineInfo& CDirLineInfo::operator+ ( const CDirLineInfo& DirLineInfo)
122{
123
124 this->m_code += DirLineInfo.m_code;
125 this->m_Total += DirLineInfo.m_Total;
126 this->m_comment += DirLineInfo.m_comment;
127 this->m_NULL += DirLineInfo.m_NULL;
128 this->m_nFileCount += DirLineInfo.m_nFileCount;
129
130 return (*this);
131
132}
133/**////////////////////////////////////////////////////////////////134// 目录类行信息 = 目录类行信息 + 子目录类行信息
135CDirLineInfo& CDirLineInfo::operator+ ( const CFileLineInfo& FileLineInfo)
136{
137 this->m_code += FileLineInfo.m_code;
138 this->m_Total += FileLineInfo.m_Total;
139 this->m_comment += FileLineInfo.m_comment;
140 this->m_NULL += FileLineInfo.m_NULL;
141
142 return (*this);
143}
144/**////////////////////////////////////////////////////////////////145// 输出操作符的重载 方便调试用的
146ostream& operator<<(ostream&out, CDirLineInfo& Dir)
147{
148 out<<"Dir : "<< Dir.m_strDirName<<endl;
149 out<<"m_code: "<<Dir.m_code<<endl;
150 out<<"m_comment: "<<Dir.m_comment<<endl;
151 out<<"m_NULL: "<<Dir.m_NULL<<endl;
152 out<<"m_Total: "<<Dir.m_Total<<endl;
153 out<<"m_nFileCount: "<<Dir.m_nFileCount<<endl;
154 return out;
155}
156/**////////////////////////////////////////////////////////////////157// 把行信息转换到string类型
158string CDirLineInfo::GetWriteXmlInfo()
159{
160 stringstream stream;
161
162 string strCount = "";
163 stream<<m_nFileCount;
164 stream>>strCount;
165 stream.clear();
166
167 string strCode = "";
168 stream<<m_code;
169 stream>>strCode;
170 stream.clear();
171
172 string strTotal = "";
173 stream<<m_Total<<endl;
174 stream>>strTotal;
175 stream.clear();
176
177 string strComment = "";
178 stream<<m_comment;
179 stream>>strComment;
180 stream.clear();
181
182 string strNULL = "";
183 stream<<m_NULL;
184 stream>>strNULL;
185 stream.clear();
186
187 string strTemp = m_strDirName;
188 strTemp = "path=\"" + strTemp + "\"" +
189 " Count=\"" + strCount +"\"" +
190 " Code=\"" + strCode + "\"" +
191 " Tatol=\"" + strTotal + "\"" +
192 " Comment=\""+ strComment + "\"" +
193 " NULL=\""+ strNULL + "\"";
194
195 return strTemp;
196}
197/**////////////////////////////////////////////////////////////////198// 析构函数:释放子目录和自文件的头指针
199CDirLineInfo::~CDirLineInfo()
200{
201 // TODO Auto-generated destructor stub
202 delete m_pSubFileListHead;
203 delete m_pSubDirListHead;
204}
205
206
207
/**//*****************************************************************
* 文件名 : Error.h
* 创建时间 : 2010-9-19
* 作者 : 郭龙
* 作用 : 用于抛出异常
******************************************************************/
#ifndef ERROR_H_
#define ERROR_H_
namespace Error {
struct Syntax_error {
const char* p;
Syntax_error(const char* q) { p = q; }
};
}
#endif /* ERROR_H_ */
1/**//*****************************************************************
2 * 文件名 : FileLineInfo.h
3 * 创建时间 : 2010-9-19
4 * 作者 : 郭龙
5 * 作用 : 文件类的构造,统计文件的行信息
6 ******************************************************************/
7
8#ifndef FILELINEINFO_H_
9#define FILELINEINFO_H_
10
11#include "LineInfo.h"
12#include "HeadFile.h"
13#include <pcre++.h>
14#include <pcrecpp.h>
15#include <fstream>
16using namespace pcrepp;
17
18class CFileLineInfo: public CLineInfo
19{
20
21 friend ostream& operator<<(ostream& out, CFileLineInfo& FileLine);
22public:
23 CFileLineInfo();
24 CFileLineInfo(char* pFilePath);
25 virtual ~CFileLineInfo();
26 string GetWriteXmlInfo();
27
28private:
29 void ReaseString(string& str, bool &bFlag);
30 void Reasestring2(string &str, bool &bFlag);
31 void DeleteString(string &strTemp, bool &bFlag);
32public:
33 CFileLineInfo *m_pNext;
34public:
35 string m_strFileName;
36};
37
38#endif /* FILELINEINFO_H_ */
39
1/**//*****************************************************************
2 * 文件名 : FileLineInfo.cpp
3 * 创建时间 : 2010-9-19
4 * 作者 : 郭龙
5 * 作用 : 文件类的构造,统计文件的行信息
6 ******************************************************************/
7
8#include "FileLineInfo.h"
9
10CFileLineInfo::CFileLineInfo():m_pNext(NULL), m_strFileName("")
11{
12 // TODO Auto-generated constructor stub
13
14}
15
16CFileLineInfo::~CFileLineInfo()
17{
18 // TODO Auto-generated destructor stub
19}
20/**//////////////////////////////////////////////////////////////// 21// 统计行信息:
22CFileLineInfo::CFileLineInfo(char* pFilePath):m_pNext(NULL)
23{
24 ifstream fin(pFilePath);
25 int whiteLine = 0;
26 int commentLine = 0;
27 bool comment = false;
28 int normalLine = 0;
29 char tmp[256] = {0};
30 int nTemp1 = 0;
31 bool bflag = false;
32 bool cflag = false;
33 bool dflag = false;
34 string strTemp1 = "";
35 while(fin.getline(tmp, 256))
36 {
37 string strTemp = string(tmp);
38 Pcre reg1("^[\\s]*$", PCRE_DOTALL); // / 空白行
39 Pcre reg2("^[\\s]*//.*", PCRE_DOTALL); // / 空白// 行
40 Pcre reg3("/\\*.*", PCRE_DOTALL); // / /* = 空白/* + 代码/*
41 Pcre reg4("^[\\s]*/\\*.*", PCRE_DOTALL); // / 空白/*
42 Pcre reg5("(.*)\\*/", PCRE_DOTALL); // / */ = 代码 */ + */代码 \* + */代码 /* */ /*
43 Pcre reg6("\\*/(.*)/\\*", PCRE_DOTALL); // */ /*= */ 代码 /* + */ /*
44 Pcre reg7("/\\*.*\\*/", PCRE_DOTALL); // /* */
45 Pcre reg8("\\*/[\\s]*$", PCRE_DOTALL); // / */ 空白
46 Pcre reg9("\\*/.*/\\*.*", PCRE_DOTALL); // */ /*= */ 代码 /* + */ /*
47 Pcre reg10("\".*[/\\*\\*/**////]+.*\"", PCRE_DOTALL); // " 后面有反斜杠
48 Pcre reg11("//.*[/\\*\\*/]+.*", PCRE_DOTALL); // // /* */ = // /* */ + 代码// /* */
49
50 Pcre reg16(".*(\"|//){1}.*\\\\[\\s]*$", PCRE_DOTALL); // / " // 后面有反斜杠
51 Pcre reg17(".*\".*\\\\[\\s]*$", PCRE_DOTALL); // " // 后面有反斜杠
52 Pcre reg18(".*\\\\[\\s]*$", PCRE_DOTALL); // / 后面有反斜杠
53
54 // 处理 /* */ + /* */int a = 0; /* */ + /* */ /* */
55 if ((true == reg4.search(strTemp)) && (true == reg8.search(strTemp)))
56 {
57 ReaseString(strTemp, bflag); // 删除 /* */
58 if(true == reg1.search(strTemp))
59 {
60 commentLine ++;
61 }
62 else
63 {
64 normalLine ++;
65 }
66 continue;
67 }
68
69 DeleteString(strTemp, bflag); // 删除 /* */ 和 " /* "
70 // 处理 " // 后面有反斜杠
71 if(true == reg16.search(strTemp))
72 {
73 nTemp1 ++;
74 strTemp.erase(strTemp.rfind("\\"),1); // 删除 反斜杠
75 strTemp1 += strTemp;
76 dflag = true;
77 cflag = true;
78 continue;
79 }
80 // 处理 " // 后面有反斜杠 多行情况
81 if(cflag == true)
82 {
83 if(true == reg18.search(strTemp))
84 {
85 strTemp1 += strTemp;
86 nTemp1 ++;
87 continue;
88 }
89 else
90 {
91 strTemp1 += strTemp;
92 cflag = false;
93 }
94 }
95 // 处理 " // 后面有反斜杠 多行情况 合并的字符串:
96 if(true == dflag)
97 {
98 unsigned int npos1 = ((strTemp1.find(("\""),0 )!= string::npos)? strTemp1.find("\""):225);
99 unsigned int npos2 = ((strTemp1.find(("//"), 0) != string::npos)? strTemp1.find("//"):225);
100 if(npos1 > npos2) // // 后面有反斜杠
101 {
102 commentLine += nTemp1;
103 if(false == reg2.search(strTemp1))
104 {
105 normalLine ++;
106 commentLine--; //增加的是 /前面的那个
107 }
108 DeleteString(strTemp1, bflag); // 删除 /* */ 和 " /* "
109 }
110 else // 代码行:“ 后面有反斜杠 //不会出现npos1 == npos2
111 {
112 normalLine += nTemp1;
113 DeleteString(strTemp1, bflag); // 删除 /* */ 和 " /* "
114 }
115 nTemp1 = 0;
116 }
117 //处理 " // 后面有反斜杠 多行情况 设置控制变量
118 if(true == dflag)
119 {
120 strTemp = strTemp1;
121 strTemp1 = "";
122 dflag = false;
123 }
124 // 统计 空白//
125 if (true == reg2.search(strTemp))
126 {
127 commentLine ++;
128 }
129 // /* = 空白/* + 代码/*
130 else if (true == reg3.search(strTemp) && (false == reg5.search(strTemp)) )
131 {
132 if(true == reg4.search(strTemp))
133 {
134 commentLine ++;
135 }
136 else
137 {
138 normalLine ++;
139 }
140 comment = true;
141 }
142 // 处理 */ = 代码 */ + */代码 \* + */代码 /* */ /*
143 else if (comment)
144 {
145 commentLine ++;
146 if(true == reg5.search(strTemp))
147 {
148 if(true == reg8.search(strTemp))
149 {
150 comment = false;
151 }
152 else
153 {
154 normalLine ++;
155 commentLine --;
156 comment = false;
157 }
158 if(bflag == true) // bfalg 是为了标记 /* */ /*这种情况:
159 {
160 comment = true;
161 bflag = false;
162 }
163 }
164 }
165 // 统计 空白行
166 else if(true == reg1.search(strTemp))
167 {
168 whiteLine ++;
169 }
170 // 统计 代码行
171 else
172 {
173 normalLine ++;
174 }
175
176 }
177
178 m_code = normalLine;
179 m_comment = commentLine;
180 m_NULL = whiteLine;
181 m_Total = normalLine + commentLine + whiteLine;
182 m_strFileName = pFilePath;
183
184 fin.close();
185}
186/**////////////////////////////////////////////////////////////////187// 删除 /* */ 和 “ /* */ "
188void CFileLineInfo::DeleteString(string &strTemp, bool &bFlag)
189{
190 Pcre reg7("/\\*.*\\*/", PCRE_DOTALL); // /* */
191 Pcre reg8("\\*/[\\s]*$", PCRE_DOTALL); // / */ 空白
192 Pcre reg9("\\*/.*/\\*.*", PCRE_DOTALL); // */ /*= */ 代码 /* + */ /*
193 Pcre reg10("\".*[/\\*\\*/**////]+.*\"", PCRE_DOTALL); // " 后面有反斜杠
194 Pcre reg11("//.*[/\\*\\*/]+.*", PCRE_DOTALL); // // /* */ = // /* */ + 代码// /* */
195
196 if(true == reg11.search(strTemp) && (false == bFlag) )
197 {
198 unsigned int nTempPos = strTemp.find("//", 0);
199 if((nTempPos != string::npos) && ( (nTempPos+ 2 ) < strTemp.size()))
200 {
201 strTemp.erase((strTemp.find("//", 0) + 2));
202 }
203 }
204 if(true == reg7.search(strTemp) && true == reg10.search(strTemp))
205 {
206 unsigned int nBegPos = strTemp.find("/*", 0);
207 unsigned int nEndPos = strTemp.find("\"", 0);
208 if(nBegPos > nEndPos)
209 {
210 Reasestring2( strTemp, bFlag);
211 }
212 else
213 {
214 ReaseString(strTemp, bFlag);
215 }
216 }
217 if(true == reg7.search(strTemp))
218 {
219 ReaseString(strTemp, bFlag);
220 }
221 if(true == reg10.search(strTemp))
222 {
223 Reasestring2( strTemp, bFlag);
224 }
225
226}
227/**////////////////////////////////////////////////////////////////228// 删除 /* */
229void CFileLineInfo::ReaseString(string& str, bool &bFlag)
230{
231 Pcre reg14("\".*[/\\*\\*/**////]+.*\"", PCRE_DOTALL);
232 unsigned int nBegPos = str.find("/*", 0);
233 unsigned int nEndPos = str.find("*/", 0);
234 if(nBegPos > nEndPos)
235 {
236 nEndPos = str.find("*/", nEndPos+2);
237 }
238 while((nBegPos != string::npos) && (nEndPos != string::npos))
239 {
240 str.erase(nBegPos, nEndPos - nBegPos + 2);
241
242 if(true == reg14.search(str))
243 {
244 Reasestring2( str, bFlag);
245 }
246 nBegPos = str.find("/*");
247 nEndPos = str.find("*/", nEndPos+2);
248 }
249 nEndPos = str.find("/*", 0);
250 nBegPos = str.find("*/", 0);
251 if((nEndPos != string::npos ) && (nBegPos != string::npos))
252 {
253 str.erase(nEndPos, str.size() - nEndPos);
254 bFlag = true;
255 }
256}
257/**////////////////////////////////////////////////////////////////258// 删除 " /* "
259void CFileLineInfo::Reasestring2(string &str, bool &bFlag)
260{
261 Pcre reg15("/\\*.*\\*/", PCRE_DOTALL); // if /* abc+ */ else not daima
262 unsigned int nBegPos = str.find("\"", 0);
263 unsigned int nTempPos = str.find("\\\"",nBegPos +1);
264 while(nTempPos != string::npos)
265 {
266 str.erase(nTempPos, 2);
267 nTempPos = str.find("\\\"", nTempPos + 2);
268 }
269 unsigned int nEndPos = str.find("\"", nBegPos+ 1);
270 while((nBegPos != string::npos) && (nEndPos != string::npos) && (nBegPos < (nEndPos - 1)))
271 {
272 str.erase(nBegPos+1, nEndPos - nBegPos - 1 );
273 if(true == reg15.search(str))
274 {
275 ReaseString(str, bFlag);
276 }
277
278 nBegPos = str.find("\"",0);
279 nEndPos = str.find("\"", nBegPos + 1);
280 }
281}
282/**////////////////////////////////////////////////////////////////283// 把行信息转换成string类型:
284string CFileLineInfo::GetWriteXmlInfo()
285{
286 stringstream stream;
287
288 string strCode = "";
289 stream<<m_code;
290 stream>>strCode;
291 stream.clear();
292
293 string strTotal = "";
294 stream<<m_Total<<endl;
295 stream>>strTotal;
296 stream.clear();
297
298 string strComment = "";
299 stream<<m_comment;
300 stream>>strComment;
301 stream.clear();
302
303 string strNULL = "";
304 stream<<m_NULL;
305 stream>>strNULL;
306 stream.clear();
307
308 string strTemp = m_strFileName;
309 strTemp = "path=\"" + strTemp + "\"" +
310 " Code=\"" + strCode + "\"" +
311 " Tatol=\"" + strTotal + "\"" +
312 " Comment=\""+ strComment + "\"" +
313 " NULL=\""+ strNULL + "\"";
314
315// return strTemp;
316 RETURN(strTemp);
317}
318/**////////////////////////////////////////////////////////////////319// 操作符重载 方便调试:
320ostream& operator<<(ostream& out, CFileLineInfo& FileLine)
321{
322 out<<"File: "<<FileLine.m_strFileName<<endl;
323 out<<"m_code: "<<FileLine.m_code<<endl;
324 out<<"m_comment: "<<FileLine.m_comment<<endl;
325 out<<"m_NULL: "<<FileLine.m_NULL<<endl;
326 out<<"m_Total: "<<FileLine.m_Total<<endl;
327
328 return out;
329}
330
331
332
333
1/**//*****************************************************************
2 * 文件名 : DirLineInfo.cpp
3 * 创建时间 : 2010-9-19
4 * 作者 : 郭龙
5 * 作用 : Line Class
6 ******************************************************************/
7
8#ifndef LINEINFO_H_
9#define LINEINFO_H_
10
11class CLineInfo
12{
13public:
14 int m_code;
15 int m_Total;
16 int m_comment;
17 int m_NULL;
18
19public:
20 CLineInfo();
21 virtual ~CLineInfo();
22};
23
24#endif /* LINEINFO_H_ */
25
1/**//*****************************************************************
2 * 文件名 : LineInfo.cpp
3 * 创建时间 : 2010-9-19
4 * 作者 : 郭龙
5 * 作用 : LineInfo Class
6 ******************************************************************/
7
8#include "LineInfo.h"
9#include "HeadFile.h"
10CLineInfo::CLineInfo():m_code(0), m_Total(0), m_comment(0), m_NULL(0)
11{
12 // TODO Auto-generated constructor stub
13}
14
15CLineInfo::~CLineInfo()
16{
17 // TODO Auto-generated destructor stub
18}
19
1/**//*****************************************************************
2 * 文件名 : DirLineInfo.cpp
3 * 创建时间 : 2010-9-19
4 * 作者 : 郭龙
5 * 作用 : Read ParameterInfo And Write XML File
6 ******************************************************************/
7#ifndef OPERATOR_H_
8#define OPERATOR_H_
9#include "HeadFile.h"
10#include "FileLineInfo.h"
11#include "DirLineInfo.h"
12#include<libxml/parser.h>
13#include<libxml/tree.h>
14#include <time.h>
15#include <sys/time.h>
16#include <ctype.h>
17#define INTTOCHAR(i) (streamInToCharp<<i,\
18 streamInToCharp>>StrInToCharp,\
19 streamInToCharp.clear(),\
20 (char*)(StrInToCharp.c_str()) )\
21
22class CDirLineInfo;
23class CFileLineInfo;
24
25extern tagParameterInfo_t ParameterInfo;
26
27class COperator
28{
29
30public:
31 static void ReadOutPutParameterInfo(int &argv , char **argc);
32 static void OpenMainDir();
33 static void WriteDirFileXmlHead();
34 static void WriteDirXml(CDirLineInfo *DirLineInfo, xmlNodePtr pXmlNode);
35 static void WriteFileXml(xmlNodePtr pXmlNode);
36 static void WriteFile(CDirLineInfo *DirLineInfo);
37 static void PrintEndl(int i);
38 static void PrintHelpInfo();
39 static void IsFileTypeParameter(string strFileType);
40 static string GetDateAndTimeString();
41
42public:
43 static CFileLineInfo m_FileLineInfoRoot;
44 static CDirLineInfo m_DirLineInfoRoot;
45 static string StrInToCharp;
46 static stringstream streamInToCharp;
47 static ofstream out;
48
49};
50
51#endif /* OPERATOR_H_ */
52
1/**//*****************************************************************
2 * 文件名 : DirLineInfo.cpp
3 * 创建时间 : 2010-9-19
4 * 作者 : 郭龙
5 * 作用 : Read ParameterInfo And Write XML File
6 ******************************************************************/
7
8#include "Operator.h"
9
10string COperator::StrInToCharp = "";
11stringstream COperator::streamInToCharp;
12CDirLineInfo COperator::m_DirLineInfoRoot;
13CFileLineInfo COperator::m_FileLineInfoRoot;
14
15ofstream COperator::out;
16/**/////////////////////////////////////////////////// 17//读取参数:并进行判断
18void COperator::ReadOutPutParameterInfo(int &argv , char **argc)
19{
20 string strUser = getenv("HOME");
21
22 if( argv > 1)
23 {
24 if(0 == strcmp(argc[1], "--h"))
25 {
26 COperator::PrintHelpInfo();
27 exit(1);
28 }
29 }
30
31 if(argv < 5)
32 {
33 throw Error::Syntax_error("Parameter is short ,please input again: ");
34 }
35
36 if(0 == strcmp(argc[1], "--h"))
37 {
38 COperator::PrintHelpInfo();
39 exit(1);
40 }
41 if(0 != strcmp(argc[1], "-pin"))
42 {
43 throw Error::Syntax_error("-pin parameter is wrong, please input path again: ");
44 }
45 else
46 {
47 ParameterInfo.strInputPath = argc[2];
48 if(ParameterInfo.strInputPath.substr(0, 2) == "..")
49 {
50 ParameterInfo.strInputPath.erase(0,2);
51 ParameterInfo.strInputPath = strUser + ParameterInfo.strInputPath ;
52 }
53 }
54 if(0 != strcmp(argc[3], "-pout"))
55 {
56 throw Error::Syntax_error("-pout parameter is wrong, please Output path again: ");
57 }
58 else
59 {
60 ParameterInfo.strOutPutPath = argc[4];
61 if(ParameterInfo.strOutPutPath.substr(0, 2) == "..")
62 {
63 ParameterInfo.strOutPutPath.erase(0, 2);
64 ParameterInfo.strOutPutPath = strUser + ParameterInfo.strOutPutPath;
65 }
66 ofstream fout(ParameterInfo.strOutPutPath.c_str());
67 if(NULL == fout)
68 {
69 throw Error::Syntax_error("OutPutxml is wrong, please Output path again: ");
70 }
71 fout.close();
72 }
73 if(argv > 5)
74 {
75 int nTemp = 5;
76 int nCurrentArgc = -1;
77 while(nTemp < argv)
78 {
79
80 static int nCountArgc = 0;
81 if(nCountArgc <= nCurrentArgc)
82 {
83 cout<<"please input right Parameter"<<endl;
84 COperator::PrintHelpInfo();
85 exit(1);
86 }
87 nCurrentArgc = nCountArgc;
88 if(0 == strcmp(argc[nTemp], "-suffix") && argc[nTemp+1] != NULL)
89 {
90 Pcre reg12("^[\\s]*([ch]:|\\bcpp\\b:){1,2}([ch]|\\bcpp\\b){1}[\\s]*$", PCRE_CASELESS);
91 Pcre reg13("^[\\s]*([ch]|\\bcpp\\b){1}[\\s]*$", PCRE_CASELESS);
92
93 string strTemp(argc[nTemp+1] );
94 if(true == reg12.search(strTemp) || true == reg13.search(strTemp))
95 {
96 char *pTemp = argc[nTemp+1];
97 for(unsigned int i=0; i < strlen(pTemp); ++i)
98 {
99 pTemp[i] = tolower(pTemp[i]);
100 }
101 strTemp = pTemp;
102 //判断c:cpp:C 这种类型:
103 COperator::IsFileTypeParameter(strTemp);
104
105 ParameterInfo.strFileType = argc[nTemp+1];
106 nTemp = nTemp +2;
107 ++ nCountArgc;
108 }
109 else
110 {
111 throw Error::Syntax_error("-suffix parameter is wrong ,please input: ");
112 }
113 }
114 else if(0 == strcmp(argc[nTemp], "-r") && argc[nTemp+1] != NULL)
115 {
116 if(( 0 == strcmp(argc[nTemp+1], "true"))
117 || (0 == strcmp(argc[nTemp+1], "false")))
118 {
119 ParameterInfo.bSubDir = argc[nTemp+1];
120 nTemp = nTemp + 2;
121 ++ nCountArgc;
122 }
123 else
124 {
125 throw Error::Syntax_error("-r parameter is wrong ,please input: ");
126 }
127 }
128 else if(0 == strcmp(argc[nTemp], "-view") && argc[nTemp+1] != NULL)
129 {
130 if(( 0 == strcmp(argc[nTemp+1], "1"))
131 || (0 == strcmp(argc[nTemp+1], "2"))
132 || (0 == strcmp(argc[nTemp+1], "3")))
133 {
134 ParameterInfo.nOutPutView = argc[nTemp+1];
135 nTemp = nTemp + 2;
136 ++ nCountArgc;
137 }
138 else
139 {
140 throw Error::Syntax_error("-view parameter is wrong ,please input: ");
141 }
142 }
143 else if( 0 == strcmp(argc[nTemp], "--h"))
144 {
145 COperator::PrintHelpInfo();
146 exit(1);
147 }
148 else
149 {
150 }
151 }
152 }
153
154}
155/**///////////////////////////////////////////////////156//打开输入的路径,判断是目录还是文件
157void COperator::OpenMainDir()
158{
159
160 struct dirent *ptr = NULL;
161 DIR *pDir = opendir(ParameterInfo.strInputPath.c_str());
162 Pcre regc(".*\\.c$",PCRE_CASELESS);
163 Pcre regh(".*\\.h$",PCRE_CASELESS);
164 Pcre regcpp(".*\\.cpp$",PCRE_CASELESS);
165 if(pDir != 0)
166 {
167 (COperator::m_DirLineInfoRoot).m_pNext = new CDirLineInfo::CDirLineInfo((char*)ParameterInfo.strInputPath.c_str());
168 }
169 else if( true == regc.search(ParameterInfo.strInputPath)
170 || true == regh.search(ParameterInfo.strInputPath)
171 || true == regcpp.search(ParameterInfo.strInputPath) )
172 {
173 ParameterInfo.Type = File;
174 (COperator::m_FileLineInfoRoot).m_pNext = new CFileLineInfo::CFileLineInfo((char*)ParameterInfo.strInputPath.c_str());
175 }
176 else
177 {
178 throw Error::Syntax_error("InPut path is Error ,please input new path: ");
179 }
180
181}
182/**///////////////////////////////////////////////////183//写入目录或者文件xml 结构的Head 信息
184void COperator::WriteDirFileXmlHead()
185{
186
187 xmlDocPtr doc = xmlNewDoc(BAD_CAST"1.0");
188 xmlNodePtr root_node = xmlNewNode(NULL, BAD_CAST"LineCounter");
189 xmlDocSetRootElement(doc, root_node);
190 if(ParameterInfo.Type == Dir)
191 {
192 xmlNewProp(root_node,BAD_CAST"Input",BAD_CAST ((COperator::m_DirLineInfoRoot).m_pNext)->m_strDirName.c_str());
193 }
194 else if(ParameterInfo.Type == File)
195 {
196 xmlNewProp(root_node,BAD_CAST"Input",BAD_CAST ((COperator::m_FileLineInfoRoot).m_pNext)->m_strFileName.c_str());
197 }
198 else
199 {
200
201 }
202 xmlNewProp(root_node,BAD_CAST"Time",BAD_CAST GetDateAndTimeString().c_str());
203 xmlNewProp(root_node,BAD_CAST"suffix",BAD_CAST ParameterInfo.strFileType.c_str() );
204 xmlNewProp(root_node,BAD_CAST"Recursive",BAD_CAST ParameterInfo.bSubDir.c_str());
205 xmlNewProp(root_node,BAD_CAST"View",BAD_CAST ParameterInfo.nOutPutView.c_str());
206
207 //创建一个节点,设置其内容和属性,然后加入根结点
208 xmlNodePtr node = xmlNewNode(NULL, BAD_CAST"Result");
209 xmlAddChild(root_node,node);
210
211 if(ParameterInfo.Type == Dir)
212 {
213 out.open("LineCounter.txt");
214 cout<<".txt Write To LineCounter.txt "<<endl;
215 WriteFile((COperator::m_DirLineInfoRoot).m_pNext);
216 out.close();
217 xmlNewProp(node,BAD_CAST"Count",BAD_CAST INTTOCHAR((COperator::m_DirLineInfoRoot).m_pNext->m_nFileCount));
218 xmlNewProp(node,BAD_CAST"Code",BAD_CAST INTTOCHAR((COperator::m_DirLineInfoRoot).m_pNext->m_code));
219 xmlNewProp(node,BAD_CAST"Tatol",BAD_CAST INTTOCHAR((COperator::m_DirLineInfoRoot).m_pNext->m_Total));
220 xmlNewProp(node,BAD_CAST"Comment",BAD_CAST INTTOCHAR((COperator::m_DirLineInfoRoot).m_pNext->m_comment));
221 xmlNewProp(node,BAD_CAST"Null",BAD_CAST INTTOCHAR((COperator::m_DirLineInfoRoot).m_pNext->m_NULL));
222 COperator::WriteDirXml(((COperator::m_DirLineInfoRoot).m_pNext), root_node);
223 }
224 else if(ParameterInfo.Type == File)
225 {
226 xmlNewProp(node,BAD_CAST"Code",BAD_CAST INTTOCHAR((COperator::m_FileLineInfoRoot).m_pNext->m_code));
227 xmlNewProp(node,BAD_CAST"Tatol",BAD_CAST INTTOCHAR((COperator::m_FileLineInfoRoot).m_pNext->m_Total));
228 xmlNewProp(node,BAD_CAST"Comment",BAD_CAST INTTOCHAR((COperator::m_FileLineInfoRoot).m_pNext->m_comment));
229 xmlNewProp(node,BAD_CAST"Null",BAD_CAST INTTOCHAR((COperator::m_FileLineInfoRoot).m_pNext->m_NULL));
230
231 WriteFileXml(root_node);
232 }
233 else
234 {
235
236 }
237
238 int nRel = xmlSaveFile(ParameterInfo.strOutPutPath.c_str(), doc);
239 if(nRel != -1)
240 {
241 cout<<" xml write Path: "<<ParameterInfo.strOutPutPath <<endl;
242 }
243 else
244 {
245 throw Error::Syntax_error("xml Path is Wrong, please");
246 }
247
248 xmlFreeDoc(doc);
249
250}
251/**///////////////////////////////////////////////////252//把输入路径是目录的信息。写入xml文件中
253void COperator::WriteDirXml(CDirLineInfo *DirLineInfo, xmlNodePtr pXmlNode)
254{
255
256 if(NULL != DirLineInfo)
257 {
258
259 CDirLineInfo *pDirLineTemp = NULL;
260 CFileLineInfo *pFileLineTemp = NULL;
261 pDirLineTemp = DirLineInfo->m_pSubDirListHead->m_pNext;
262 pFileLineTemp = DirLineInfo->m_pSubFileListHead->m_pNext;
263
264 while(NULL != pFileLineTemp)
265 {
266 if(ParameterInfo.nOutPutView != string("1"))
267 {
268 xmlNodePtr FileSon = xmlNewNode(NULL, BAD_CAST"File");
269 xmlAddChild(pXmlNode, FileSon);
270
271 xmlNewProp(FileSon,BAD_CAST"Path",BAD_CAST pFileLineTemp->m_strFileName.c_str());
272 xmlNewProp(FileSon,BAD_CAST"Code",BAD_CAST INTTOCHAR(pFileLineTemp->m_code));
273 xmlNewProp(FileSon,BAD_CAST"Tatol",BAD_CAST INTTOCHAR(pFileLineTemp->m_Total));
274 xmlNewProp(FileSon,BAD_CAST"Comment",BAD_CAST INTTOCHAR(pFileLineTemp->m_comment));
275 xmlNewProp(FileSon,BAD_CAST"Null",BAD_CAST INTTOCHAR(pFileLineTemp->m_NULL));
276 }
277 pFileLineTemp = pFileLineTemp->m_pNext;
278 }
279 while((NULL != pDirLineTemp) )
280 {
281 if(ParameterInfo.nOutPutView == string("2"))
282 {
283 WriteDirXml(pDirLineTemp, pXmlNode);
284 }
285 else
286 {
287 xmlNodePtr DirSon = xmlNewNode(NULL, BAD_CAST"Dir");
288 xmlAddChild(pXmlNode, DirSon);
289
290 xmlNewProp(DirSon,BAD_CAST"Path",BAD_CAST pDirLineTemp->m_strDirName.c_str());
291 xmlNewProp(DirSon,BAD_CAST"Count",BAD_CAST INTTOCHAR(pDirLineTemp->m_nFileCount));
292 xmlNewProp(DirSon,BAD_CAST"Code",BAD_CAST INTTOCHAR(pDirLineTemp->m_code));
293 xmlNewProp(DirSon,BAD_CAST"Tatol",BAD_CAST INTTOCHAR(pDirLineTemp->m_Total));
294 xmlNewProp(DirSon,BAD_CAST"Comment",BAD_CAST INTTOCHAR(pDirLineTemp->m_comment));
295 xmlNewProp(DirSon,BAD_CAST"Null",BAD_CAST INTTOCHAR(pDirLineTemp->m_NULL));
296 WriteDirXml(pDirLineTemp, DirSon);
297 }
298
299 pDirLineTemp = pDirLineTemp->m_pNext;
300 }
301
302
303 }
304}
305/**///////////////////////////////////////////////////306//把输入路径是文件的信息。写入xml文件中
307void COperator::WriteFileXml(xmlNodePtr pXmlNode)
308{
309 xmlNodePtr FileSon = xmlNewNode(NULL, BAD_CAST"File");
310 xmlAddChild(pXmlNode, FileSon);
311 CFileLineInfo *pFileLineTemp = (COperator::m_FileLineInfoRoot).m_pNext;
312
313 xmlNewProp(FileSon,BAD_CAST"Path",BAD_CAST pFileLineTemp->m_strFileName.c_str());
314 xmlNewProp(FileSon,BAD_CAST"Code",BAD_CAST INTTOCHAR(pFileLineTemp->m_code));
315 xmlNewProp(FileSon,BAD_CAST"Tatol",BAD_CAST INTTOCHAR(pFileLineTemp->m_Total));
316 xmlNewProp(FileSon,BAD_CAST"Comment",BAD_CAST INTTOCHAR(pFileLineTemp->m_comment));
317 xmlNewProp(FileSon,BAD_CAST"Null",BAD_CAST INTTOCHAR(pFileLineTemp->m_NULL));
318}
319/**///////////////////////////////////////////////////320// 帮助信息
321void COperator::PrintHelpInfo()
322{
323 cout<<"--h: help "<<endl;
324 cout<<"The useage of linecounter pragram as follow:"<<endl;
325 cout<<"-pin: input arg, input a path of directory of file: "<<endl;
326 cout<<"-pout: output arg, output a result of the count info: "<<endl;
327 cout<<"-suffix: h:c:cpp, file type:"<<endl;
328 cout<<"-r: ture/false count subDir or not: "<<endl;
329 cout<<"-view : 1.only Dir Write Xml, 2. only File Write xml. 3. Dir and File Write xml"<<endl;
330 cout<<"Example: -pin /home/guolong -pout line.xml -r true"<<endl;
331}
332/**///////////////////////////////////////////////////333// 获取当前时间的函数
334string COperator::GetDateAndTimeString()
335 {
336
337 struct timeval t2;
338 stringstream stream;
339 gettimeofday(&t2, NULL);
340 struct tm *ptm = localtime(&t2.tv_sec);
341 string strYear = "";
342 stream<<ptm->tm_year + 1900;
343 stream>>strYear;
344 stream.clear();
345 string strMon = "";
346 stream<<ptm->tm_mon + 1;
347 stream>>strMon;
348 stream.clear();
349 string strDay = "";
350 stream<<ptm->tm_mday;
351 stream>>strDay;
352 stream.clear();
353 string strHour = "";
354 stream<<ptm->tm_hour;
355 stream>>strHour;
356 stream.clear();
357 string strMin = "";
358 stream<<ptm->tm_min;
359 stream>>strMin;
360 stream.clear();
361 string strSec = "";
362 stream<<ptm->tm_sec;
363 stream>>strSec;
364 stream.clear();
365 string strUsec = "";
366 stream<<t2.tv_usec;
367 stream>>strUsec;
368
369 string strDateTime = strYear + "-" + strMon + "-" + strDay + " " +
370 strHour + ":" + strMin + ":" + strSec + "." + strUsec;
371 RETURN(strDateTime);
372
373 }
374/**///////////////////////////////////////////////////375// 写入文件中xml格式的函数
376void COperator::WriteFile(CDirLineInfo *DirLineInfo)
377{
378 static int nCountBlack = 0;
379 int nCurrentBlack = nCountBlack;
380 if(nCurrentBlack == 0)
381 {
382 out<<"<?xml version=\"1.0\"?>"<<endl;
383 out<<"<LineCounter "
384 <<"Input=\""<<DirLineInfo->m_strDirName<<"\" Time =\""
385 <<COperator::GetDateAndTimeString()<<"\" suffix=\""
386 <<ParameterInfo.strFileType<<"\" Recursive=\""
387 <<ParameterInfo.bSubDir<<"\" View=\""
388 <<ParameterInfo.nOutPutView<<"\">"<<endl;
389 }
390 else
391 {
392 PrintEndl(nCurrentBlack);
393 out<<"<Dir ";
394 out<<(*DirLineInfo).GetWriteXmlInfo();
395 out<<endl;
396 }
397 CDirLineInfo *pDirLineTemp;
398 CFileLineInfo *pFileLineTemp;
399 pDirLineTemp = DirLineInfo->m_pSubDirListHead->m_pNext;
400 pFileLineTemp = DirLineInfo->m_pSubFileListHead->m_pNext;
401 while(NULL != pFileLineTemp)
402 {
403 //ReadFile(pFileLineTemp);
404 PrintEndl(nCurrentBlack + 1);
405 out<<"<File ";
406 out<<(*pFileLineTemp).GetWriteXmlInfo();
407 pFileLineTemp = pFileLineTemp->m_pNext;
408 out<<"/>"<<endl;
409 }
410 while(NULL != pDirLineTemp)
411 {
412 ++ nCountBlack;
413 WriteFile(pDirLineTemp);
414
415 nCountBlack = nCurrentBlack;
416 pDirLineTemp = pDirLineTemp->m_pNext;
417 }
418
419 if(nCurrentBlack != 0)
420 {
421 PrintEndl(nCurrentBlack);
422 out<<"</Dir>"<<endl;
423 }
424 else
425 {
426 out<<"</LineCounter>"<<endl;
427 }
428}
429
430void COperator::PrintEndl(int i)
431{
432 for(int j = 0; j < i; j++)
433 out<<" ";
434}
435/**///////////////////////////////////////////////////436// 判断c:cpp:C 这种类型:
437void COperator::IsFileTypeParameter(string strFileType)
438{
439
440 string strTemp = strFileType;
441 unsigned int nSubPosBeg = 0;
442 unsigned int nSubposEnd = 0;
443 int nCountc = 0;
444 int nCounth = 0;
445 int nCountcpp = 0;
446 nSubposEnd = strTemp.find(":");
447 while(nSubposEnd != string::npos)
448 {
449 if(strTemp.substr(nSubPosBeg, nSubposEnd - nSubPosBeg) == "cpp")
450 {
451 ++ nCountcpp;
452 }
453 else if(strTemp.substr(nSubPosBeg, nSubposEnd - nSubPosBeg) == "h")
454 {
455 ++ nCounth;
456 }
457 else
458 {
459 ++ nCountc;
460 }
461
462 nSubPosBeg = nSubposEnd+1;
463 nSubposEnd = strTemp.find(":", nSubposEnd + 2); /**//// 曾在这里错了,注意 + 2
464
465 }
466
467 if(strTemp.substr(nSubPosBeg, strTemp.size() - nSubPosBeg) == "cpp")
468 {
469 ++ nCountcpp;
470 }
471 else if(strTemp.substr(nSubPosBeg, strTemp.size() - nSubPosBeg) == "h")
472 {
473 ++ nCounth;
474 }
475 else
476 {
477 ++ nCountc;
478 }
479
480 if((nCountc > 1) || (nCounth > 1) || (nCountcpp > 1))
481 {
482 throw Error::Syntax_error("-suffix parameter is wrong ,please input: ");
483 }
484}
485
486
487
488
489
490
491
1/**//*****************************************************************
2 * 文件名 : LineCounter.cpp
3 * 创建时间 : 2010-9-19
4 * 作者 : 郭龙
5 * 作用 : 主函数main()文件
6 ******************************************************************/
7
8#include <iostream>
9#include "Operator.h"
10#include "HeadFile.h"
11#include "DirLineInfo.h"
12#include "FileLineInfo.h"
13#include<stdio.h>
14#include<libxml/parser.h>
15#include<libxml/tree.h>
16using namespace std;
17
18tagParameterInfo_t ParameterInfo;
19
20int main(int argv ,char ** argc)
21{
22 LogInit();
23 try
24 {
25 COperator::ReadOutPutParameterInfo(argv, argc);
26 COperator::OpenMainDir();
27 COperator::WriteDirFileXmlHead();
28 }
29 catch(Error::Syntax_error e)
30 {
31 cerr << "syntax error:" << e.p << "\n";
32 }
33 RETURN(0);
34}
35
36
37
38
39
40
41
42
43
LineCounter心得
一.LineCounter简介:
实现一个有配置的代码行统计工具,需要使用我们之前实现的liblogging.so库,尽可能提高性能。详细见:LineCounter 需求分析:
二.LineCounter功能:
用户可以通过输入的参数来输出所需的信息:
-pin:必选参数;输入文件或者目录路径,支持相对路径
-pout:必选参数;输出文件路径(包含文件名)。
-suffix: 可选参数; 支持文件的类型。默认值c:h:cpp
-r:可选参数;是否统计子目录。默认值:true/false
-view: 可选参数;显示目录,文件还是都显示1.目录 2.文件3.目录和文件
--h : 帮助信息
举例说明:
./linecounter -pin /home/guolong –pout linecounter.xml –r true
三.学习心得:
这个程序做了两个星期,学习到许多知识,主要有以下几点:
- 树形结构。
- 正则表达式
- libxml2库
- log库
四. 具体描述:
1. 树形结构
因为目录结构是一个树形结构,因此在刚开始的时候我考虑了左孩子右兄弟结构来实现总体结构。但是这种结构有几次遍历树才能统计到用户所需要的行信息。最后经过老师的指点。构造了主目录类且在里面聚合一个子目录指针和子文件指针(也即是现在的结构)
1.1开始的时候写了一个递归遍历目录和文件名的函数:
2.正则表达式
1
int ReadDir(const char *pName,)
2
3
{
4
5
DIR *pDir = opendir(pName);
6
7
struct dirent *ptr;
8
9
if(0 == pDir)
10
11
{
12
13
// .c .h .cpp
14
15
cout<<"File pName: "<<pName<<endl;
16
17
closedir(pDir);
18
19
return 0;
20
21
}
22
23
else
24
25
{
26
27
cout<<"Dir PName: "<<pName<<endl;
28
29
}
30
31
while( NULL != (ptr = readdir(pDir)))
32
33
{
34
35
if((string(ptr->d_name) == string(".")) || ((string(ptr->d_name) == string(".."))))
36
37
continue;
38
39
string strPathName(pName);
40
41
string strDirName(ptr->d_name);
42
43
strPathName = strPathName + "/" + strDirName;
44
45
ReadDir(strPathName.c_str() );
46
47
}
48
49
closedir(pDir);
50
51
return 0;
52
53
}
54
55
2.1查询资料学习了正则表达式及库的连接:
《正则表达式30十分钟入门教程》名字有点俗,但是短短十一页,基本语法都包含了,我看很受益。
2.2查询这则表达式的库。
好几个库,但是最后选了个既好安装,又好用的pcre库
安装:
下面安装pcrecpp
sudo apt-get install libpcre++-dev
sudo apt-get install libpcre++0
连接库
在Eclipse设置里面库里面包换pcre++
头文件:
#include <pcre++.h>
#include <pcrecpp.h>
using namespace pcrepp;
2.3 几个正则表达式
Pcre reg1("^[\\s]*$", PCRE_DOTALL); //whiteLine
Pcre reg2("^[\\s]*//.*", PCRE_DOTALL); // whilteLile//
Pcre reg3("/\\*.*", PCRE_DOTALL); // love/* or whilteLile/*
Pcre reg4("^[\\s]*/\\*.*", PCRE_DOTALL); // whilteLile/*
Pcre reg5("(.*)\\*/", PCRE_DOTALL); // */ = abc */ + abc */(abc )\* + */
Pcre reg6("\\*/(.*)/\\*", PCRE_DOTALL); // abc */ abc or white /*
Pcre reg7("\\*/[^\\s]+/\\*", PCRE_DOTALL); // if */ abc+ /*
Pcre reg8("\\*/[\\s]*$", PCRE_DOTALL); // */whiteLine____
Pcre reg9("\\*/.*/\\*.*", PCRE_DOTALL);
简单说一下:
. 匹配除换行符以外的任何字符
\w 匹配字母或者数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
之所以用 \\s 是用于转移字符。
2.4 一个正则表达式的测试例子
3. libxml2库
3.1查询资料学习了libxml2及库的连接
C++的XML编程经验――LIBXML2库使用指南
http://www.blogjava.net/wxb_nudt/archive/2007/11/ 18/161340.html
这个作者把libxml2写的很好,我感觉比教材都好,看了他的这个文章我掌握了libxml2简单实用。下面是一个部分的截图:详情查询上面网站:
库的连接:
在头文件包含 /usr/include/libxml2
在库文件里面 xml2
4.log库
4.1 预处理
#if
#else
#endif
一种是为了注释,一种是为了便与错误时,重复调用函数:
#if FATAL
#define FATAL(info) fatal(info);
#else
#define FATAL(info) NULL;
#endif
4.2注意不要把ifstream fout; getline(fout , str, '\n');
写成ofstream
4.3可以把ofstream fout,定义类的成私有的,在初始化的时候
使用 fout.open("/home/ganhm/.loging/loging.conf");
if(NULL == fout)
cout<<"da kai shi bai"<<endl;
4.4.以后程序尽量不要赋值粘贴,尽量自己写:
c 语言可以传FILE流 而 c++ 不可以传:
4.5 区分:/home/ganhm/
和\home\ganhm\
\\
\[
4.6.注意三文件格式:
4.7使用函数指针,
4.8注意static的参数,和函数的使用,如:Factory工厂。
在定义时候注意static一定要初始化。
如:
class A
{
private:
static int m_inum;
public:
static int Fun();
};
int A::m_inum = 0; //注意不能在构造函数里面初始化,不能
//在前面加上static
int A::Fun();
4.9 一个关于流转化:
#include<fstream>
ofstream fout(1.txt);
streambuf *x = cout.rduf(fout.rduf());
cout.rdbuf(x);
例子:
void WriteLog(struct timeval t2, string file2,
unsigned int id2, string function2,
int line2, char *info2 ,int type2)
{
streambuf *x = NULL;
if(type2 == 1)
{
x = cout.rdbuf(fout.rdbuf());
}
ptm = localtime(&t2.tv_sec);
cout<<ptm->tm_year+1900<<"-"<<ptm->tm_mon+1<<"-"<<ptm->tm_mda;
cout<<"-"<<ptm->tm_hour<<":"<<ptm->tm_min<<":"<<ptm->tm_sec<<".";
cout<<t2.tv_usec;
file2 = FileMainPath::GetFileMainPaht() + file2.substr( file2.find('/') );
cout<<" "<<id2;
cout<<" "<<function2;
cout<<" "<<file2;
cout<<":"<<line2;
cout<<" "<<"Info"<<info2;
if(type2 == 1)
cout.rdbuf(x);
}
4.10.一个关与流转化
#include<sstream>
stringstream stream;
int num;
stream<<str;
stream>>num;
//注意还有一个函数是stream.clear();
4.11一个关于变量参数:#include <cstdarg>
va_list argptr;
va_start(argptr, info);
char buffer[256];
vsprintf( buffer,info,argptr);
va_end(argptr);
4.12关于一个时间的:#include <time.h>
#include <sys/time.h>
struct timeval t_time;
gettimeofday(&t_time, NULL);
ptm = localtime(&t1.tv_sec);
out<<ptm->tm_year+1900<<"-"<<ptm->tm_mon+1<<"-"<<ptm->tm_mday; out<<"-"<<ptm->tm_hour<<":"<<ptm->tm_min<<":"<<ptm->tm_sec<<"."; out<<t1.tv_usec;
4.13几个常用的宏
__TIME__
__FUNCTION__
__LINE__
syscall(224)
__DATE__
4.14 stringstream stream 补充:
在到底是文件操作,还是控制台,还是XML
可以先把所有数据写到一个 stream流里面:
然后:在cout>>str;
fout>>str;
xout>>str;
附录1:
构造链表时遇到的一个问题:空指针,关于堆栈
/* o. right
*
* CFileLineInfo* pFileTemp = new CFileLineInfo;
* CDirLineInfo* pDirTemp = new CDirLineInfo;
* m_pSubFileListHead = pFileTemp;
* m_pSubDirListHead = pDirTemp;
*
*
*/
/* o. wrong
*
* CFileLineInfo FileLineHead;
* CDirLineInfo DirLineHead;
* m_pSubFileListHead = &FileLineHead;
* m_pSubDirListHead = &DirLineHead;
*
* stack or heap
*/
/*2 */
m_pSubFileListHead = new CFileLineInfo;
m_pSubDirListHead = new CDirLineInfo;
CFileLineInfo *pFileTemp = m_pSubFileListHead;
CDirLineInfo *pDirTemp = m_pSubDirListHead;