函数指针实现多态

    技术2024-08-14  90

    1,<Inside The C++ Object Model>是本好书。2,对四个字节的指针封装,对数据地址(函数行为,数据属性)聚合,而什么样的数据才能够聚合在一起,就是我们所要考虑的面向对象,面向聚合,面向抽象。3,练手简单的内存管理。继续练手cpp文件分析,准确度不是本次练手重点。不过文件格式分析确实要考虑很多种状态装换。

     

     

    #include <stdio.h> #include <stdlib.h> #include <memory.h> #define INT int #define BUFF_LENGTH 1024 #define BLANK_LINES_PARSER 1 #define CODE_LINES_PARSER 2 #define COMMENT_SIGLE_LINE_PARSER 3 #define COMMENT_COMPLEX_LINE_PARSER 4 #define COMPLEX_LINES_PARSER 5 struct tag_cpp_count { INT is_line_begin; INT in_comment_complex_line; INT blank_lines; INT comment_lines; INT code_lines; INT complex_lines; }cpp_count; typedef INT (*lines_parser)(char curr_token, char last_token); INT comment_sigle_line_parser(char curr_token, char last_token); INT comment_complex_line_parser(char curr_token, char last_token); INT complex_lines_parser(char cur_token, char last_token); INT code_lines_parser(char curr_token, char last_token); INT blank_lines_parser(char curr_token, char last_token); INT code_line_end(); INT comment_line_end(); INT blank_line_end(); INT complex_line_end(); lines_parser base_lines_parser; lines_parser fun_array[] = { NULL, blank_lines_parser, code_lines_parser, comment_sigle_line_parser, comment_complex_line_parser, complex_lines_parser }; //get file buff char* get_file_buff(char* filename) { if (!filename) return NULL; FILE *fp = fopen(filename, "r"); if (fp == NULL) return NULL; INT buff_size = BUFF_LENGTH; char *buff_all_start = (char*)malloc(buff_size); char *buff_curr_pos = buff_all_start; while (fread(buff_curr_pos, BUFF_LENGTH, 1, fp)) { buff_size += BUFF_LENGTH; char *buff_tmp = (char*)malloc(buff_size); memset(buff_tmp, 0, buff_size); memcpy(buff_tmp, buff_all_start, strlen(buff_all_start)); free(buff_all_start); buff_all_start = buff_tmp; buff_curr_pos = buff_all_start + strlen(buff_all_start); } return buff_all_start; } //parser token void control_lines_parser(char* buff) { if (!buff) return ; char last_char = 0; base_lines_parser = fun_array[CODE_LINES_PARSER]; memset(&cpp_count, 0, sizeof(tag_cpp_count)); cpp_count.is_line_begin = 1; while (*buff && base_lines_parser) { base_lines_parser = fun_array[base_lines_parser(*buff, last_char)]; last_char = *buff; buff++; } } INT blank_lines_parser(char curr_token, char last_token) { if (last_token == '/' && curr_token == '/') return COMMENT_SIGLE_LINE_PARSER; else if (last_token == '/' && curr_token == '*') { cpp_count.in_comment_complex_line = 1; return COMMENT_COMPLEX_LINE_PARSER; } else if (curr_token == ' ' || curr_token == '/t' || ((last_token == ' ' || last_token == '/t') && curr_token == '/')) return BLANK_LINES_PARSER; else if (curr_token == '/n') blank_line_end(); return CODE_LINES_PARSER; } INT code_lines_parser(char curr_token, char last_token) { if (cpp_count.is_line_begin) { cpp_count.is_line_begin = 0; if (last_token == '/' && curr_token == '/') return COMMENT_SIGLE_LINE_PARSER; else if (last_token == '/' && curr_token == '*') { cpp_count.in_comment_complex_line = 1; return COMMENT_COMPLEX_LINE_PARSER; } else if ((last_token == '/n' || last_token == '/0') && curr_token == '/') cpp_count.is_line_begin = 1; else if (curr_token == ' ' || curr_token == '/t') return BLANK_LINES_PARSER; else if (curr_token == '/n') code_line_end(); return CODE_LINES_PARSER; } else { if ((last_token == '/' && curr_token == '/') || (last_token == '/' && curr_token == '*')) { cpp_count.in_comment_complex_line = 1; return COMPLEX_LINES_PARSER; } if (curr_token == '/n') code_line_end(); return CODE_LINES_PARSER; } return 0; } INT comment_complex_line_parser(char curr_token, char last_token) { if (cpp_count.in_comment_complex_line) { if (last_token == '*' && curr_token == '/') { cpp_count.in_comment_complex_line = 0; return COMMENT_COMPLEX_LINE_PARSER; } else if (curr_token == '/n') comment_line_end(); return COMMENT_COMPLEX_LINE_PARSER; } else { if (curr_token == ' ' || curr_token == '/t' || (last_token == '/' && curr_token == '/')) return COMMENT_COMPLEX_LINE_PARSER; else if (curr_token == '/n') { comment_line_end(); return CODE_LINES_PARSER; } else return COMPLEX_LINES_PARSER; } return 0; } //comment_sigle_line parser the same as complex_lines parser, //meet any char will be only one state; INT comment_sigle_line_parser(char curr_token, char last_token) { if (curr_token == '/n') { comment_line_end(); return CODE_LINES_PARSER; } return COMMENT_SIGLE_LINE_PARSER; } INT complex_lines_parser(char curr_token, char last_token) { if (curr_token == '/n') { complex_line_end(); if (cpp_count.in_comment_complex_line) return COMMENT_COMPLEX_LINE_PARSER; return CODE_LINES_PARSER; } return COMPLEX_LINES_PARSER; } ///line end deal INT code_line_end() { /*test code * printf("code/n");/* test code*/ cpp_count.is_line_begin = 1; cpp_count.code_lines++; } INT comment_line_end() { printf("comment/n"); cpp_count.is_line_begin = 1; cpp_count.comment_lines++; } INT blank_line_end() { printf("blank/n"); cpp_count.is_line_begin = 1; cpp_count.blank_lines++; } INT complex_line_end() { printf("complex/n"); cpp_count.is_line_begin = 1; cpp_count.complex_lines++; } int main() { char *buff = NULL; buff = get_file_buff("./CppParser.c"); char *buff_start = buff; control_lines_parser(buff); printf("code lines: %d/n", cpp_count.code_lines); printf("comment lines: %d/n", cpp_count.comment_lines); printf("blank lines: %d/n", cpp_count.blank_lines); printf("complex lines: %d/n", cpp_count.complex_lines); printf("total lines: %d/n", cpp_count.code_lines + cpp_count.comment_lines + cpp_count.blank_lines + cpp_count.complex_lines); if (buff_start) free(buff_start); return 0; }  

    最新回复(0)