1,<Inside The C++ Object Model>是本好書。
2,對四個位元組的指標封裝,對資料地址(函數行為,資料屬性)彙總,而什麼樣的資料才能夠彙總在一起,就是我們所要考慮的物件導向,面向彙總,面向抽象。
3,練手簡單的記憶體管理。
繼續練手cpp檔案分析,準確度不是本次練手重點。不過檔案格式分析確實要考慮很多種狀態裝換。
#include <stdio.h><br />#include <stdlib.h><br />#include <memory.h><br />#define INT int<br />#define BUFF_LENGTH 1024<br />#define BLANK_LINES_PARSER 1<br />#define CODE_LINES_PARSER 2<br />#define COMMENT_SIGLE_LINE_PARSER 3<br />#define COMMENT_COMPLEX_LINE_PARSER 4<br />#define COMPLEX_LINES_PARSER 5<br />struct tag_cpp_count<br />{<br />INT is_line_begin;<br />INT in_comment_complex_line;<br />INT blank_lines;<br />INT comment_lines;<br />INT code_lines;<br />INT complex_lines;<br />}cpp_count;<br />typedef INT (*lines_parser)(char curr_token, char last_token);<br />INT comment_sigle_line_parser(char curr_token, char last_token);<br />INT comment_complex_line_parser(char curr_token, char last_token);<br />INT complex_lines_parser(char cur_token, char last_token);<br />INT code_lines_parser(char curr_token, char last_token);<br />INT blank_lines_parser(char curr_token, char last_token);<br />INT code_line_end();<br />INT comment_line_end();<br />INT blank_line_end();<br />INT complex_line_end();<br />lines_parser base_lines_parser;<br />lines_parser fun_array[] =<br />{<br />NULL,<br />blank_lines_parser,<br />code_lines_parser,<br />comment_sigle_line_parser,<br />comment_complex_line_parser,<br />complex_lines_parser<br />};<br />//////////get file buff<br />char* get_file_buff(char* filename)<br />{<br />if (!filename)<br />return NULL;<br />FILE *fp = fopen(filename, "r");<br />if (fp == NULL)<br />return NULL;<br />INT buff_size = BUFF_LENGTH;<br />char *buff_all_start = (char*)malloc(buff_size);<br />char *buff_curr_pos = buff_all_start;</p><p>while (fread(buff_curr_pos, BUFF_LENGTH, 1, fp))<br />{<br />buff_size += BUFF_LENGTH;<br />char *buff_tmp = (char*)malloc(buff_size);<br />memset(buff_tmp, 0, buff_size);<br />memcpy(buff_tmp, buff_all_start, strlen(buff_all_start));<br />free(buff_all_start);<br />buff_all_start = buff_tmp;<br />buff_curr_pos = buff_all_start + strlen(buff_all_start);<br />}</p><p>return buff_all_start;<br />}<br />//////////parser token<br />void control_lines_parser(char* buff)<br />{<br />if (!buff)<br />return ;<br />char last_char = 0;<br />base_lines_parser = fun_array[CODE_LINES_PARSER];<br />memset(&cpp_count, 0, sizeof(tag_cpp_count));<br />cpp_count.is_line_begin = 1;<br />while (*buff && base_lines_parser)<br />{<br />base_lines_parser = fun_array[base_lines_parser(*buff, last_char)];<br />last_char = *buff;<br />buff++;<br />}<br />}<br />INT blank_lines_parser(char curr_token, char last_token)<br />{<br />if (last_token == '/' && curr_token == '/')<br />return COMMENT_SIGLE_LINE_PARSER;<br />else if (last_token == '/' && curr_token == '*')<br />{<br />cpp_count.in_comment_complex_line = 1;<br />return COMMENT_COMPLEX_LINE_PARSER;<br />}<br />else if (curr_token == ' ' ||<br /> curr_token == '/t' ||<br />((last_token == ' ' ||<br />last_token == '/t') &&<br />curr_token == '/'))<br />return BLANK_LINES_PARSER;<br />else if (curr_token == '/n')<br />blank_line_end();<br />return CODE_LINES_PARSER;<br />}<br />INT code_lines_parser(char curr_token, char last_token)<br />{<br />if (cpp_count.is_line_begin)<br />{<br />cpp_count.is_line_begin = 0;<br />if (last_token == '/' && curr_token == '/')<br />return COMMENT_SIGLE_LINE_PARSER;<br />else if (last_token == '/' && curr_token == '*')<br />{<br />cpp_count.in_comment_complex_line = 1;<br />return COMMENT_COMPLEX_LINE_PARSER;<br />}<br />else if ((last_token == '/n' || last_token == '/0') &&<br />curr_token == '/')<br />cpp_count.is_line_begin = 1;<br />else if (curr_token == ' ' || curr_token == '/t')<br />return BLANK_LINES_PARSER;<br />else if (curr_token == '/n')<br />code_line_end();<br />return CODE_LINES_PARSER;<br />}<br />else<br />{<br />if ((last_token == '/' && curr_token == '/') ||<br />(last_token == '/' && curr_token == '*'))<br />{<br />cpp_count.in_comment_complex_line = 1;<br />return COMPLEX_LINES_PARSER;<br />}<br />if (curr_token == '/n')<br />code_line_end();</p><p>return CODE_LINES_PARSER;<br />}<br />return 0;<br />}<br />INT comment_complex_line_parser(char curr_token, char last_token)<br />{<br />if (cpp_count.in_comment_complex_line)<br />{<br />if (last_token == '*' && curr_token == '/')<br />{<br />cpp_count.in_comment_complex_line = 0;<br />return COMMENT_COMPLEX_LINE_PARSER;<br />}<br />else if (curr_token == '/n')<br />comment_line_end();<br />return COMMENT_COMPLEX_LINE_PARSER;<br />}<br />else<br />{<br />if (curr_token == ' ' || curr_token == '/t' ||<br />(last_token == '/' && curr_token == '/'))<br />return COMMENT_COMPLEX_LINE_PARSER;<br />else if (curr_token == '/n')<br />{<br />comment_line_end();<br />return CODE_LINES_PARSER;<br />}<br />else<br />return COMPLEX_LINES_PARSER;<br />}<br />return 0;<br />}<br />//comment_sigle_line parser the same as complex_lines parser,<br />//meet any char will be only one state;<br />INT comment_sigle_line_parser(char curr_token, char last_token)<br />{<br />if (curr_token == '/n')<br />{<br />comment_line_end();<br />return CODE_LINES_PARSER;<br />}<br />return COMMENT_SIGLE_LINE_PARSER;<br />}<br />INT complex_lines_parser(char curr_token, char last_token)<br />{<br />if (curr_token == '/n')<br />{<br />complex_line_end();<br />if (cpp_count.in_comment_complex_line)<br />return COMMENT_COMPLEX_LINE_PARSER;<br />return CODE_LINES_PARSER;<br />}<br />return COMPLEX_LINES_PARSER;<br />}<br />///////////////////////line end deal<br />INT code_line_end()<br />{<br /> /*test code<br /> *////<br />printf("code/n");/*<br />test code*/<br />cpp_count.is_line_begin = 1;<br />cpp_count.code_lines++;<br />}<br />INT comment_line_end()<br />{<br />printf("comment/n");<br />cpp_count.is_line_begin = 1;<br />cpp_count.comment_lines++;<br />}<br />INT blank_line_end()<br />{<br />printf("blank/n");<br />cpp_count.is_line_begin = 1;<br />cpp_count.blank_lines++;<br />}<br />INT complex_line_end()<br />{<br />printf("complex/n");<br />cpp_count.is_line_begin = 1;<br />cpp_count.complex_lines++;<br />}<br />int main()<br />{<br />char *buff = NULL;<br />buff = get_file_buff("./CppParser.c");<br />char *buff_start = buff;<br />control_lines_parser(buff);<br />printf("code lines: %d/n", cpp_count.code_lines);<br />printf("comment lines: %d/n", cpp_count.comment_lines);<br />printf("blank lines: %d/n", cpp_count.blank_lines);<br />printf("complex lines: %d/n", cpp_count.complex_lines);<br />printf("total lines: %d/n", cpp_count.code_lines +<br />cpp_count.comment_lines +<br />cpp_count.blank_lines +<br />cpp_count.complex_lines);<br />if (buff_start)<br />free(buff_start);<br />return 0;<br />}<br />