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

📄 decompile.c

📁 The Kannel Open Source WAP and SMS gateway works as both an SMS gateway, for implementing keyword b
💻 C
📖 第 1 页 / 共 3 页
字号:
{  WBXML_MB_U_INT32 index;  ReadFixedTag(buffer, TAG_STR_T);  Read_index(buffer, &index);}void Read_entity     (P_WBXML_INFO buffer){	ReadFixedTag(buffer, TAG_ENTITY);	Read_entcode(buffer);}void Read_entcode    (P_WBXML_INFO buffer){	WBXML_MB_U_INT32 result;	Read_mb_u_int32(buffer, &result);}void Read_pi         (P_WBXML_INFO buffer){  ReadFixedTag(buffer, TAG_PI);  Read_attrStart(buffer);    while (Is_attrValue(buffer))  {    Read_attrValue(buffer);  }  ReadFixedTag(buffer, TAG_END);}void Read_opaque     (P_WBXML_INFO buffer){  WBXML_MB_U_INT32 length;  WBXML_BYTES      data;  ReadFixedTag(buffer, TAG_OPAQUE);  Read_length(buffer, &length);  Read_bytes(buffer, mb_u_int32_to_long(&length), &data);}void Read_version    (P_WBXML_INFO buffer){  WBXML_U_INT8 result;  Read_u_int8(buffer, &result);}void Read_publicid   (P_WBXML_INFO buffer){  if (Is_zero(buffer))  {    WBXML_MB_U_INT32 index;    Read_index(buffer, &index);	AddDTDNode(buffer, ZERO_WBXML_MB_U_INT32, index);  }  else  {    WBXML_MB_U_INT32 result;    Read_mb_u_int32(buffer, &result);	AddDTDNode(buffer, result, ZERO_WBXML_MB_U_INT32);  }}void Read_charset    (P_WBXML_INFO buffer){  WBXML_MB_U_INT32 result;  Read_mb_u_int32(buffer, &result);}void Read_termstr_rtn(P_WBXML_INFO buffer, char** result){#define STRING_BLOCK_SIZE 256	int buflen = STRING_BLOCK_SIZE;	char* strbuf = (char*) malloc(buflen);	BOOL doubled = FALSE;	int i = 0;	if (!result)		ParseError(ERR_INTERNAL_BAD_PARAM);	while ( (BytesLeft(buffer) >= 1) && (*(buffer->m_curpos) != 0) )	{		if (i>=buflen)		{			buflen += STRING_BLOCK_SIZE;			strbuf = realloc(strbuf, buflen);		}		if (*(buffer->m_curpos) != '$' || doubled == TRUE)		{			strbuf[i] = *(buffer->m_curpos);			buffer->m_curpos++;			i++;			if (doubled == TRUE)				doubled = FALSE;		}		else		{			strbuf[i] = *(buffer->m_curpos);			i++;			doubled = TRUE;		}	}	strbuf[i] = 0;	buffer->m_curpos++;	if (*result)		free(*result);	*result = strbuf;}void Read_termstr    (P_WBXML_INFO buffer){	char* strbuf = NULL;	Read_termstr_rtn(buffer, &strbuf);	AddStringNode(buffer, strbuf);	free(strbuf);}void Read_index      (P_WBXML_INFO buffer, P_WBXML_MB_U_INT32 result){  Read_mb_u_int32(buffer, result);}void Read_length     (P_WBXML_INFO buffer, P_WBXML_MB_U_INT32 result){  Read_mb_u_int32(buffer, result);}void Read_zero       (P_WBXML_INFO buffer){  WBXML_U_INT8 result;  Read_u_int8(buffer, &result);  if (result != (WBXML_U_INT8) 0)  {    ParseError(ERR_TAG_NOT_FOUND);  }}void Read_pageindex  (P_WBXML_INFO buffer, P_WBXML_U_INT8 result){  Read_u_int8(buffer, result);}static void Init(P_WBXML_INFO buffer){	buffer->m_start = NULL;	buffer->m_curpos = NULL;	buffer->m_length = 0;	buffer->m_tree = NULL;	buffer->m_curnode = NULL;	buffer->m_curpage = 0;}static size_t BufferLength(P_WBXML_INFO buffer){	size_t ret;	while (buffer->m_curpos != '\0')		buffer->m_curpos++;	ret = buffer->m_curpos - buffer->m_start;	buffer->m_curpos = buffer->m_start;	return ret;}static void Free(P_WBXML_INFO buffer){	if (buffer->m_start)	{		free(buffer->m_start);		buffer->m_start = NULL;	}	buffer->m_curpos = NULL;	buffer->m_length = 0;	FreeNode(buffer->m_tree);	buffer->m_tree = NULL;}static long FileSize(FILE* file){	long curpos = ftell(file);	long endpos;	fseek(file, 0, SEEK_END);	endpos = ftell(file);	fseek(file, curpos, SEEK_SET);	return endpos;}static void ReadBinary(P_WBXML_INFO buffer, FILE* file){	char buf[4096];	int m = 1;	long n;	if (buffer && file)	{		if (file != stdin)		{			buffer->m_length = FileSize(file);			buffer->m_start = (P_WBXML) malloc(buffer->m_length);			buffer->m_curpos = buffer->m_start;			if (!buffer->m_start)			{				fclose(file);				ParseError(ERR_NOT_ENOUGH_MEMORY);			}			if (fread(buffer->m_start, 1, buffer->m_length, file) != buffer->m_length)			{				fclose(file);				ParseError(ERR_FILE_NOT_READ);			}			else			{				fclose(file);			}		}		else		{			while ((n = fread(buf, 1, sizeof(buf), file)) > 0)			{				buffer->m_start = (P_WBXML) realloc(buffer->m_start, sizeof(buf) * m);				memcpy(buffer->m_start + (sizeof(buf) * (m - 1)), buf, sizeof(buf));				m++;			}			buffer->m_length = BufferLength(buffer);			buffer->m_curpos = buffer->m_start;		}					}	else	{		ParseError(ERR_INTERNAL_BAD_PARAM);	}}static const char* DTDTypeName(long dtdnum){	int i = 0;	/* Search the DTD list for a match */	while (DTDTypeList[i].m_name)	{		if (DTDTypeList[i].m_id == dtdnum)		{			break;		}		i++;	}	return DTDTypeList[i].m_name;}static const char* CodepageTagName(WBXML_CODEPAGE page, WBXML_TAG tag){	int i = 0;	/* Strip flags off of the tag */	tag = (WBXML_TAG) (tag & CODEPAGE_TAG_MASK);	/* Search the tag list for a match */	while (CodepageTagNames[i].m_name)	{		if ((CodepageTagNames[i].m_dtd_id == dtd_id) &&			(CodepageTagNames[i].m_page == page) &&			(CodepageTagNames[i].m_tag == tag))		{			break;		}		i++;	}	return CodepageTagNames[i].m_name;}static const char* CodepageAttrstartName(WBXML_CODEPAGE page, WBXML_TAG tag, char** value){	int i = 0;	/* Check Parameters */	if (!value)	{		ParseError(ERR_INTERNAL_BAD_PARAM);	}	/* Search the tag list for a match */	while (CodepageAttrstartNames[i].m_name)	{		if ((CodepageAttrstartNames[i].m_dtd_id == dtd_id) &&			(CodepageAttrstartNames[i].m_page == page) &&			(CodepageAttrstartNames[i].m_tag == tag))		{			break;		}		i++;	}	/* Duplicate the value because it may be concatenated to */	if (CodepageAttrstartNames[i].m_valueprefix)	{		*value = strdup(CodepageAttrstartNames[i].m_valueprefix);	}	else	{		*value = NULL;	}	/* Return the tag name */	return CodepageAttrstartNames[i].m_name;}static void CodepageAttrvalueName(WBXML_CODEPAGE page, WBXML_TAG tag, char** value){	int i = 0;	/* Check Parameters */	if (!value)	{		ParseError(ERR_INTERNAL_BAD_PARAM);	}	/* Search the tag list for a match */	while (CodepageAttrvalueNames[i].m_name)	{		if ((CodepageAttrvalueNames[i].m_dtd_id == dtd_id) &&			(CodepageAttrvalueNames[i].m_page == page) &&			(CodepageAttrvalueNames[i].m_tag == tag))		{			break;		}		i++;	}	/* concatenate the value */	if (CodepageAttrvalueNames[i].m_name)	{		if (*value)		{			*value = realloc(*value, strlen(*value) + strlen(CodepageAttrvalueNames[i].m_name) + 1);			strcat(*value, CodepageAttrvalueNames[i].m_name);		}		else		{			*value = strdup(CodepageAttrvalueNames[i].m_name);		}	}}static const char* GetStringTableString(P_WBXML_NODE node, long index){	/* Find the string table node */	P_WBXML_NODE pStringsNode = node;	while (pStringsNode->m_parent)	{		pStringsNode = pStringsNode->m_parent;	}	while (pStringsNode->m_next)	{		pStringsNode = pStringsNode->m_next;	}	while (pStringsNode->m_prev && pStringsNode->m_type != NODE_STRING_TABLE)	{		pStringsNode = pStringsNode->m_prev;	}	if (pStringsNode->m_type != NODE_STRING_TABLE)	{		return "!!NO STRING TABLE!!";	}	/* Find the indexed string */	if ((index >= 0) && (index < mb_u_int32_to_long(&((P_WBXML_STRING_TABLE)pStringsNode->m_data)->m_length)))	{		return (const char*) &(((P_WBXML_STRING_TABLE)pStringsNode->m_data)->m_strings[index]);	}	else	{		return "!!STRING TABLE INDEX TOO LARGE!!";	}}static void DumpNode(P_WBXML_NODE node, int indent, BOOL *inattrs, BOOL hascontent, char** value){	P_WBXML_NODE curnode = node->m_child;	WBXML_TAG nodetype = 0;	long dtdnum = 0;	BOOL bAttributesFollow = FALSE;	BOOL bHasContent = FALSE;	int i;	if (!(*inattrs))	{		for (i=0; i<indent; i++)		{			printf(" ");		}	}	else	{		if ((node->m_type != NODE_ATTRVALUE) && (*value))		{			printf("=\"");			OutputEncodedString((unsigned char*) *value);			printf("\"");			free(*value);			*value = NULL;		}	}	switch (node->m_type)	{		case NODE_DTD_TYPE:			printf("<?xml version=\"1.0\"?>\n<!DOCTYPE wml PUBLIC ");			dtdnum = mb_u_int32_to_long( &((DTD_NODE_DATA*)node->m_data)->m_dtdnum );			if ( dtdnum == 0)			{				printf("\"%s\">\n\n", GetStringTableString(node, mb_u_int32_to_long(&((DTD_NODE_DATA*)node->m_data)->m_index)) );			}			else			{				printf("\"%s\">\n\n", DTDTypeName(dtdnum) );			}			break;		case NODE_CODEPAGE_TAG:			nodetype = *((P_WBXML_TAG)node->m_data);			if ((nodetype & CODEPAGE_TAG_MASK) == nodetype)			{				printf("<%s/>\n", CodepageTagName(node->m_page, nodetype));			}			else			{				if ((nodetype & CODEPAGE_TAG_HAS_CONTENT) == CODEPAGE_TAG_HAS_CONTENT)				{					bHasContent = TRUE;				}				if ((nodetype & CODEPAGE_TAG_HAS_ATTRS) == CODEPAGE_TAG_HAS_ATTRS)				{					printf("<%s", CodepageTagName(node->m_page, nodetype));					bAttributesFollow = TRUE;				}				else				{					printf("<%s>\n", CodepageTagName(node->m_page, nodetype));				}			}			break;		case NODE_CODEPAGE_LITERAL_TAG:			printf("<%s>\n", GetStringTableString(node, mb_u_int32_to_long(((P_WBXML_MB_U_INT32)node->m_data))) );			break;		case NODE_ATTRSTART:			printf(" %s", CodepageAttrstartName(node->m_page, *((P_WBXML_TAG)node->m_data), value) );			break;		case NODE_ATTRSTART_LITERAL:			printf(" %s", GetStringTableString(node, mb_u_int32_to_long(((P_WBXML_MB_U_INT32)node->m_data))) );			break;		case NODE_ATTRVALUE:			CodepageAttrvalueName(node->m_page, *((P_WBXML_TAG)node->m_data), value);			break;		case NODE_ATTREND:			if (!hascontent)			{				printf("/");			}			printf(">\n");			*inattrs = FALSE;			break;		case NODE_STRING:			if (*inattrs)			{				/* concatenate the value */				if (*value)				{					if (node->m_data)					{						*value = realloc(*value, strlen(*value) + strlen((char*) node->m_data) + 1);						strcat(*value, (char*) node->m_data);					}				}				else				{					if (node->m_data)					{						*value = strdup((char*) node->m_data);					}				}			}			else			{				OutputEncodedString((unsigned char*) node->m_data);				printf("\n");			}			break;		case NODE_VARIABLE_STRING:			/* TODO: output variable string */			break;		case NODE_VARIABLE_INDEX:			/* TODO: output variable string */			break;		default:			break;	}	indent += INDENT_SIZE;	if (curnode)	{		while (curnode->m_next) curnode = curnode->m_next;		while (curnode)		{			DumpNode(curnode, indent, &bAttributesFollow, bHasContent, value);			curnode = curnode->m_prev;		}	}	indent -= INDENT_SIZE;	/* Output the element end if we have one */	if ((nodetype & CODEPAGE_TAG_HAS_CONTENT) == CODEPAGE_TAG_HAS_CONTENT)	{		for (i=0; i<indent; i++)		{			printf(" ");		}		switch (node->m_type)		{			case NODE_CODEPAGE_TAG:				printf("</%s>\n", CodepageTagName(node->m_page, *((P_WBXML_TAG)node->m_data)) );				break;			case NODE_CODEPAGE_LITERAL_TAG:				printf("</%s>\n", GetStringTableString(node, mb_u_int32_to_long(((P_WBXML_MB_U_INT32)node->m_data))) );				break;			default:				break;		}	}}static void DumpNodes(P_WBXML_INFO buffer){	P_WBXML_NODE curnode = buffer->m_tree;	BOOL bAttrsFollow = FALSE;	char* value = NULL;	if (curnode)	{		while (curnode->m_next) curnode = curnode->m_next;		while (curnode)		{			DumpNode(curnode, 0, &bAttrsFollow, FALSE, &value);			curnode = curnode->m_prev;		}	}}int main(int argc, char** argv){	WBXML_INFO buffer;	FILE* file;	if (argc < 2)	{		file = stdin;	}	else	{	        file = fopen(argv[1], "r");		if (!file)		{			ParseError(ERR_FILE_NOT_FOUND);		}	}    Init(&buffer);	ReadBinary(&buffer, file);	Read_start(&buffer);	DumpNodes(&buffer);	Free(&buffer);	return 0;}

⌨️ 快捷键说明

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