예제 #1
0
파일: Timer.cpp 프로젝트: neowei1987/Zeus
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;
}