函數指標實現多態_繼續分析文本

來源:互聯網
上載者:User

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 /> 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.