⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stringline.cpp

📁 AliEditor_Source code
💻 CPP
📖 第 1 页 / 共 4 页
字号:

	int datatype = 0;

	pos = linestr.Find("UINT32", 0);
	if(!pos)
	{
		datatype = 32;
	}

	if(!datatype)
	{
		pos = linestr.Find("UINT16", 0);
		if(!pos)
		{
			datatype = 16;
		}
	}

	if(!datatype)
	{
		pos = linestr.Find("UINT8", 0);
		if(!pos)
		{
			datatype = 8;
		}
	}

	if(!datatype)
	{
		pos = linestr.Find("char", 0);
		if(!pos)
		{
			datatype = 8;
		}
	}

	if(!datatype)
	{
		pos = linestr.Find("short", 0);
		if(!pos)
		{
			datatype = 16;
		}
	}

	if(!datatype)
	{
		pos = linestr.Find("int", 0);
		if(!pos)
		{
			datatype = 32;
		}
	}

	if(!datatype)
	{
		pos = linestr.Find("long", 0);
		if(!pos)
		{
			datatype = 32;
		}
	}

	if(!datatype)
	{
		pos = linestr.Find("unsigned", 0);
		if(!pos)
		{
			pos = linestr.Find("char", 0);
			if(!pos)
			{
				datatype = 8;
			}

			if(!datatype)
			{
				pos = linestr.Find("short", 0);
				if(!pos)
				{
					datatype = 16;
				}
			}

			if(!datatype)
			{
				pos = linestr.Find("int", 0);
				if(!pos)
				{
					datatype = 32;
				}
			}

			if(!datatype)
			{
				pos = linestr.Find("long", 0);
				if(!pos)
				{
					datatype = 32;
				}
			}

		}
	}
	
	if(!datatype)
	{//sorry, can't find data type
		return NULL;
	}

	if(1)//parse name
	{
		//parse var name now
		pos = FindSpacePos(linestr);
		if(pos <= 0) return NULL;//can't find variable
		
		CString namestr = linestr.Right(linestr.GetLength() - pos - 1);

		pos = FindSpacePos(namestr);
		if(pos > 0)
		{
			CString tempstr = namestr.Right(namestr.GetLength() - pos);

			namestr = namestr.Left(pos);
			
			int spos = tempstr.Find(']');
			if(spos > 0)
			{
				tempstr = tempstr.Left(spos + 1);
				tempstr = FilterFrontChar(tempstr, ' ');

				namestr = namestr + tempstr;
			}
			
		}

		pos = namestr.Find(":", 0);//first find bits id;

		if(pos > 0) namestr = namestr.Left(pos);
		
		if(bComment)
		{
			CommentPos = namestr.Find("/*#", 0);
			if(CommentPos > 0) namestr = namestr.Left(CommentPos);
			else
			{
				;
			}
		}
		else
		{
			;
		}
		
		pos = namestr.Find("[", 0);
		if(pos != -1)
		{
			CString arraystr = namestr.Right(namestr.GetLength() - pos - 1);

			namestr = namestr.Left(pos);

			pos = arraystr.Find(']', 0);
			if(pos == -1) return NULL;

			arraystr = arraystr.Left(pos);
			ArrayNum = GetDigitValue(arraystr);
		}

		namestr = FilterFrontChar(namestr, ' ');
		namestr = FilterBackChar(namestr, ' ');

		if(!name[0]) strcpy(name, (LPCSTR)namestr);
	}

	if(!bits_length)
	{
		CString namestr;

		pos = linestr.Find(":", 0);
		if(pos == -1)
		{
			bits_length = datatype;
		}
		else
		{
			if(bComment)
			{
				CommentPos = linestr.Find("/*#", 0);
				if(CommentPos > pos || CommentPos == -1)
				{
					namestr = linestr.Right(linestr.GetLength() - pos -1);

					bits_length = GetDigitValue((LPCSTR)namestr);
				}
				else
				{
					bits_length = datatype;
				}
			}
			else
			{
				namestr = linestr.Right(linestr.GetLength() - pos -1);

				bits_length = GetDigitValue((LPCSTR)namestr);
			}

		}
	}

	if(!bits_length) return NULL;

	if(tag == NOFIND) tag = DIGIT;

	//well, create new node
	pNodeInfo = new NodeField;
	memset(pNodeInfo, 0, sizeof(NodeField));

	strcpy(pNodeInfo->name, name);

	pNodeInfo->bits_width = bits_length;

	if(bArray) 
	{
		bits_length = datatype * ArrayNum;

		if(tag != STRING) tag = ARRAY;
	}

	pNodeInfo->bits_length = bits_length;

	pNodeInfo->field_mask = bFieldMask;

	pNodeInfo->field_pos = fieldpos;

	pNodeInfo->tag = tag;

	return pNodeInfo;
}

long CStringLines::GetDigitValue(CString str)
{
	int factor;
	int i = 0;
	long lval = 0;

	str = FilterFrontValidChar(str);
	str.MakeLower();
	int pos = str.Find("0x");

	if(!pos)
	{
		factor = 16;
		str.Delete(0, 2);
	}
	else factor = 10;

	for(i = 0; i < str.GetLength(); i++)
	{
		if(!((str.GetAt(i) >= '0' && str.GetAt(i) <= '9') || (str.GetAt(i) >= 'a' && str.GetAt(i) <= 'f')))
			break;
	}

	str = str.Left(i);

	i = 0;
	const char *buf = (LPCSTR)str;

	while(buf[i] && ((buf[i] >= '0' && buf[i] <= '9') || (buf[i] >= 'a' && buf[i] <= 'f')))
	{
		if(buf[i] >= '0' && buf[i] <= '9')
		{
			lval = lval * factor + buf[i] - '0';
		}
		else if(buf[i] >= 'a' && buf[i] <= 'f')
		{
			lval = lval * factor + buf[i] - 'a' + 10;
		}
		
		i++;
	};
	
	return lval;
}

NodeField** CStringLines::ParseNodeField(enum NodeType type, const char* buf)
{
	if(type == TP_NODE)
	{
		if(m_tp_node) FreeNodeFieldInfo(m_tp_node);

		m_tp_node = ParseNodeField("/*#tp_node@*/", buf);

		return m_tp_node;
	}
	if(type == SAT_NODE)
	{
		if(!m_sat_node) FreeNodeFieldInfo(m_sat_node);

		m_sat_node = ParseNodeField("/*#sat_node@*/", buf);

		return m_sat_node;
	}
	if(type == PROG_NODE)
	{
		if(!m_prog_node) FreeNodeFieldInfo(m_prog_node);

		m_prog_node = ParseNodeField("/*#prog_node@*/", buf);

		return m_prog_node;
	}

	if(type == DEF_PROG_NODE)
	{
		if(!m_prog_node) FreeNodeFieldInfo(m_prog_node);

		m_prog_node = ParseNodeField("/*#prog_node@*/", buf);

		return m_prog_node;
	}

	return NULL;
}

NodeField**CStringLines::GetNodeFieldInfo(enum NodeType type, BOOL bFull)
{
	if(type == TP_NODE)
	{
		if(bFull) return m_tp_full_node;
		else return m_tp_node;
	}
	if(type == SAT_NODE)
	{
		if(bFull) return m_sat_full_node;
		else return m_sat_node;
	}
	if(type == PROG_NODE)
	{
		if(bFull) return m_prog_full_node;
		else return m_prog_node;
	}

	if(type == DEF_PROG_NODE)
	{
		return m_def_prog_full_node;
	}

	return NULL;
}

void CStringLines::FreeNodeFieldInfo(enum NodeType type)
{
	if(type == TP_NODE)
	{
		if(m_tp_node) FreeNodeFieldInfo(m_tp_node);
		if(m_tp_full_node) FreeNodeFieldInfo(m_tp_full_node);

		m_tp_node = NULL;
		m_tp_full_node = NULL;

		m_tp_field_count = 0;
		m_tp_field_full_count = 0;
	}
	if(type == SAT_NODE)
	{
		if(m_sat_node) FreeNodeFieldInfo(m_sat_node);
		if(m_sat_full_node) FreeNodeFieldInfo(m_sat_full_node);

		m_sat_node = NULL;
		m_sat_full_node = NULL;

		m_sat_field_count = 0;
		m_sat_field_full_count = 0;
	}
	if(type == PROG_NODE)
	{
		if(m_prog_node) FreeNodeFieldInfo(m_prog_node);
		if(m_prog_full_node) FreeNodeFieldInfo(m_prog_full_node);

		m_prog_node = NULL;
		m_prog_full_node = NULL;

		m_prog_field_count = 0;
		m_prog_field_full_count = 0;
	}
	if(type == DEF_PROG_NODE)
	{
		if(m_def_prog_full_node) FreeNodeFieldInfo(m_def_prog_full_node);

		m_def_prog_full_node = NULL;

		m_def_prog_field_full_count = 0;
	}
}

int CStringLines::GetNodeFieldCount(enum NodeType type, const char *buf)
{
	if(type == TP_NODE)
	{
		if(!m_tp_field_full_count) m_tp_field_full_count = GetNodeFieldCount("/*#tp_node@*/", buf);

		return m_tp_field_full_count;
	}
	if(type == SAT_NODE)
	{
		if(!m_sat_field_full_count) m_sat_field_full_count = GetNodeFieldCount("/*#sat_node@*/", buf);

		return m_sat_field_full_count;
	}
	if(type == PROG_NODE)
	{
		if(!m_prog_field_full_count) m_prog_field_full_count = GetNodeFieldCount("/*#prog_node@*/", buf);

		return m_prog_field_full_count;
	}

	return 0;
}

int CStringLines::GetNodeFieldCount(enum NodeType type)
{
	int count = 0;

	if(type == TP_NODE)
	{
		if(m_tp_field_count) return m_tp_field_count;
		
		while(m_tp_node[count]) count++;

		m_tp_field_count = count;

		return m_tp_field_count;
	}
	if(type == SAT_NODE)
	{
		if(m_sat_field_count) return m_sat_field_count;
		
		while(m_sat_node[count]) count++;

		m_sat_field_count = count;

		return m_sat_field_count;
	}
	if(type == PROG_NODE)
	{
		if(m_prog_field_count) return m_prog_field_count;
		
		while(m_prog_node[count]) count++;

		m_prog_field_count = count;

		return m_prog_field_count;
	}

	if(type == DEF_PROG_NODE)
	{
		if(m_def_prog_field_full_count) return m_def_prog_field_full_count;
		
		while(m_def_prog_full_node[count]) count++;

		m_def_prog_field_full_count = count;

		return m_def_prog_field_full_count;
	}
	
	return 0;
}

int CStringLines::GetUnMaskFieldCount(enum NodeType type)
{
	int count;
	int unmasked;
	NodeField** pNode = GetNodeFieldInfo(type);
	if(!pNode) return 0;

	count = 0;
	unmasked = 0;

	count = GetNodeFieldCount(type);
	for(int i = 0; i < count; i++)
	{
		if(!pNode[i]) break;

		if(!pNode[i]->field_mask) unmasked++;
	}

	return unmasked;
}

int CStringLines::GetNodeSize(enum NodeType type)
{
	NodeField **pNode = NULL;

	if(type == TP_NODE)
	{
		pNode = m_tp_full_node;
	}
	if(type == SAT_NODE)
	{
		pNode = m_sat_full_node;
	}
	if(type == PROG_NODE)
	{
		pNode = m_prog_full_node;
	}
	if(type == DEF_PROG_NODE)
	{
		pNode = m_def_prog_full_node;
	}

	if(!pNode) return 0;

	int i = 0;
	int bits_all = 0;

	while(pNode[i])
	{
		bits_all += pNode[i]->bits_length;
		i++;
	}

	if(bits_all % 8 != 0)
	{
		ASSERT(0);

		return 0;
	}

	bits_all = bits_all / 8;


	return bits_all;
}

#define MAX_LIMITED 1024

NodeField** CStringLines::ReadOneNodeFieldFromScript(FILE *fd, const char*nodesz)
{
	int val;
	int reads;
	short length, count;
	NodeField**pField = NULL;

	count = 0;

	reads = fread(&count, 1, sizeof(count), fd);
	if(reads != sizeof(count)) return NULL;

	pField = new NodeField*[count + 1];
	if(!pField) return NULL;

	memset(pField, 0, sizeof(NodeField*) * (count + 1));

#ifdef _MY_DEBUG

	fprintf(scriptfd, "\r\nbegin parse script file...\r\n");
	fprintf(scriptfd, "\tNode type : %s\r\n", nodesz);
#endif

	for(int i = 0; i < count; i++)
	{
		pField[i] = new NodeField;
		if(!pField[i]) return NULL;

		//first name
		reads = fread(&length, 1, sizeof(length), fd);
		if(reads != sizeof(length)) goto FAILED;

		if(length < 0 || length >= sizeof(pField[i]->name)) goto FAILED;

		reads = fread(pField[i]->name, 1, length, fd);
		if(reads != length) goto FAILED;

		pField[i]->name[length] = 0;

		//tag
		reads = fread(&val, 1, sizeof(int), fd);//4
		if(reads != sizeof(int)) goto FAILED;
		pField[i]->tag = (enum DataType)val;

		//mask
		reads = fread(&val, 1, sizeof(int), fd);//4
		if(reads != sizeof(int)) goto FAILED;
		pField[i]->field_mask = val;

		//pos
		reads = fread(&val, 1, sizeof(int), fd);//4
		if(reads != sizeof(int)) goto FAILED;
		pField[i]->field_pos = val;

		//bits width
		reads = fread(&val, 1, sizeof(int), fd);//4
		if(reads != sizeof(int)) goto FAILED;
		pField[i]->bits_width = val;
	
		//bits length
		reads = fread(&val, 1, sizeof(int), fd);//4
		if(reads != sizeof(int)) goto FAILED;
		pField[i]->bits_length = val;

		//bits offset
		reads = fread(&val, 1, sizeof(int), fd);//4
		if(reads != sizeof(int)) goto FAILED;
		pField[i]->bits_offset = val;

		//bytes offset
		reads = fread(&val, 1, sizeof(int), fd);//4
		if(reads != sizeof(int)) goto FAILED;
		pField[i]->bytes_offset = val;

#ifdef _MY_DEBUG

			fprintf(scriptfd, "name : %24s, tag : %d, length : %2d, bits : %2d, bytes: %2d, masked : %1d\r\n",
				pField[i]->name, pField[i]->tag, pField[i]->bits_length, pField[i]->bits_offset,
				pField[i]->bytes_offset, pField[i]->field_mask);
#endif
	}

#ifdef _MY_DEBUG

			fprintf(scriptfd, "end parse script file...\r\n");
#endif

	return pField;

FAILED:
	
	FreeNodeFieldInfo(pField);

	return NULL;
}

BOOL CStringLines::ReadNodeFieldFromScript(FILE *fd)
{
	int reads;
	int count, UsedCount;
	short length;
	char bufsz[MAX_LIMITED];
	NodeField**pField = NULL;
	NodeField**pUsedField = NULL;

	while(!feof(fd))
	{
		reads = fread(&length, 1, sizeof(length), fd);
		if(reads != sizeof(length)) return FALSE;
		if(length <= 0 || length >= MAX_LIMITED) return FALSE;
		reads = fread(&bufsz, 1, length, fd);
		if(reads != length) return FALSE;
		bufsz[length] = 0;

		pField = ReadOneNodeFieldFromScript(fd, bufsz);
		if(!pField) return FALSE;

		count = 0;
		while(pField[count]) count++;

		pUsedField = AdjustNodeField(pField);

		UsedCount = 0;
		while(pField[UsedCount]) UsedCount++;

		if(!strcmp(bufsz, "/*#tp_node@*/"))
		{
			if(m_tp_full_node) FreeNodeFieldInfo(m_tp_full_node);
			m_tp_full_node = pField;
			m_tp_field_full_count = count;
/*
			CString str;
			str.Format("read tp count : %d", count);
			AfxMessageBox(str);
*/
			if(m_tp_node) FreeNodeFieldInfo(m_tp_node);
			m_tp_node = pUsedField;	
			m_tp_field_count = UsedCount;
		}
		else if(!strcmp(bufsz, "/*#sat_node@*/"))
		{
			if(m_sat_full_node) FreeNodeFieldInfo(m_sat_full_node);
			m_sat_full_node = pField;
			m_sat_field_full_count = count;
/*
			CString str;
			str.Format("read sat count : %d", count);
			AfxMessageBox(str);
*/
			if(m_sat_node) FreeNodeFieldInfo(m_sat_node);
			m_sat_node = pUsedField;
			m_sat_field_count = UsedCount;
		}
		else if(!strcmp(bufsz, "/*#prog_node@*/"))
		{
			if(m_prog_full_node) FreeNodeFieldInfo(m_prog_full_node);
			m_prog_full_node = pField;
			m_prog_field_full_count = count;

/*			CString str;
			str.Format("read prog count : %d", count);
			AfxMessageBox(str);*/

			if(m_prog_node) FreeNodeFieldInfo(m_prog_node);
			m_prog_node = pUsedField;
			m_prog_field_count = UsedCount;
		}
		else if(!strcmp(bufsz, "/*#def_prog_node@*/"))
		{
			if(m_def_prog_full_node) FreeNodeFieldInfo(m_def_prog_full_node);
			m_def_prog_full_node = pField;
			m_def_prog_field_full_count = count;

			FreeNodeFieldInfo(pUsedField);//free it

/*			CString str;
			str.Format("read prog count : %d", count);
			AfxMessageBox(str);*/
		}

	};

	return TRUE;
}

BOOL CStringLines::WriteOneNodeFieldToScript(FILE *fd, NodeField**pField)
{
	int i, val;
	short length;

	i = 0;

	while(pField[i])
	{
		//first name
		length = strlen(pField[i]->name);

		fwrite(&length, 1, sizeof(length), fd);
		fwrite(pField[i]->name, 1, length, fd);

		//tag
		val = (int)pField[i]->tag;
		fwrite(&val, 1, sizeof(int), fd);//4

		//mask
		val = (int)pField[i]->field_mask;
		fwrite(&val, 1, sizeof(int), fd);//4

		//pos
		val = (int)pField[i]->field_pos;
		fwrite(&val, 1, sizeof(int), fd);//4

		//bits width
		val = (int)pField[i]->bits_width;
		fwrite(&val, 1, sizeof(int), fd);//4

		//bits length
		val = (int)pField[i]->bits_length;
		fwrite(&val, 1, sizeof(int), fd);//4

		//bits offset
		val = (int)pField[i]->bits_offset;
		fwrite(&val, 1, sizeof(int), fd);//4

		//bytes offset
		val = (int)pField[i]->bytes_offset;
		fwrite(&val, 1, sizeof(int), fd);//4

		i++;
	};

	return TRUE;
}

BOOL CStringLines::WriteNodeFieldToScript(FILE *fd)
{
	short length;
	char bufsz[64];

	if(!m_tp_full_node || !m_sat_full_node || !m_prog_full_node) return FALSE;

	if(m_tp_full_node)
	{
		sprintf(bufsz, "%s", "/*#tp_node@*/");
		length = strlen(bufsz);
		
		fwrite(&length, 1, sizeof(length), fd);
		fwrite(bufsz, 1, length, fd);
/*
		{
			CString str;
			str.Format("write tp count : %d", length);
			AfxMessageBox(str);
		}
		*/
		length = m_tp_field_full_count;
		fwrite(&length, 1, sizeof(length), fd);

		WriteOneNodeFieldToScript(fd, m_tp_full_node);
	}

	if(m_sat_full_node)
	{
		sprintf(bufsz, "%s", "/*#sat_node@*/");
		length = strlen(bufsz);
		
		fwrite(&length, 1, sizeof(length), fd);
		fwrite(bufsz, 1, length, fd);

		length = m_sat_field_full_count;
/*
		CString str;
			str.Format("write sat count : %d", length);
			AfxMessageBox(str);
*/
		fwrite(&length, 1, sizeof(length), fd);

		WriteOneNodeFieldToScript(fd, m_sat_full_node);
	}


	if(m_prog_full_node)
	{
		sprintf(bufsz, "%s", "/*#prog_node@*/");
		length = strlen(bufsz);
		
		fwrite(&length, 1, sizeof(length), fd);
		fwrite(bufsz, 1, length, fd);

		length = m_prog_field_full_count;
		fwrite(&length, 1, sizeof(length), fd);
/*
		CString str;
			str.Format("write prog count : %d", length);
			AfxMessageBox(str);
*/
		WriteOneNodeFieldToScript(fd, m_prog_full_node);
	}

	if(m_def_prog_full_node)
	{
		sprintf(bufsz, "%s", "/*#def_prog_node@*/");
		length = strlen(bufsz);
		
		fwrite(&length, 1, sizeof(length), fd);
		fwrite(bufsz, 1, length, fd);

		length = GetNodeFieldCount(DEF_PROG_NODE);
		fwrite(&length, 1, sizeof(length), fd);
/*
		CString str;
			str.Format("write prog count : %d", length);
			AfxMessageBox(str);
*/
		WriteOneNodeFieldToScript(fd, m_def_prog_full_node);
	}

	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -