ListTimer::ListTimer() : Timer() { m_pNodeList = new DoubleList(); pthread_mutexattr_init(&m_lockAttr); pthread_mutexattr_settype(&m_lockAttr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&m_listLock, &m_lockAttr); DoubleListInit(m_pNodeList); }
bool parse_lines(Array* file_stack, Array* file_records, DoubleList* lines, DoubleList* file_binarys) { // travel each line DoubleListNode *p_node = DoubleListFirst(lines), *p_tmp_node = NULL; while (p_node) { // get single line char **p_line = (char**)GET_DOUBLE_LIST_NODE_DATA_ADDRESS(*p_node); // detect whether contain #include const char* include_str = "#include "; if (strncmp(include_str, *p_line, strlen(include_str)) == 0) { DoubleList sub_lines; char *p, *q; bool is_std_file = false; bool is_successful = false; // get file name p = *p_line + strlen(include_str); if (*p == '<') { p++; q = p; while (*q != '>') { ++q; } *q = '\0'; is_std_file = true; } else if (*p == '\"') { p++; q = p; while (*q != '\"') { ++q; } *q = '\0'; is_std_file = false; } else { MASSERT_MSG(0, "Invalid include file syntax"); return false; } // get lines in file DoubleListInit(&sub_lines, sizeof(char*), 8); is_successful = process_file(p, is_std_file, file_stack, file_records, &sub_lines, file_binarys); if (!is_successful) { DoubleListDestroy(&sub_lines); return false; } // remove #include line and get insert position p_tmp_node = DoubleListNext(lines, p_node); DoubleListRemove(lines, p_node); p_node = p_tmp_node; // insert all sub lines p_tmp_node = DoubleListFirst(&sub_lines); while (p_tmp_node) { if (p_node == NULL) { DoubleListAdd(lines, GET_DOUBLE_LIST_NODE_DATA_ADDRESS(*p_tmp_node)); } else { DoubleListInsertNode(lines, GET_DOUBLE_LIST_NODE_DATA_ADDRESS(*p_tmp_node), p_node); } p_tmp_node = DoubleListNext(&sub_lines, p_tmp_node); } DoubleListDestroy(&sub_lines); continue; } p_node = DoubleListNext(lines, p_node); } return true; }