📄 decompile.c
字号:
return ((Is_switchPage(buffer) && (IsTag(&tmpbuffer, TAG_EXT_0) || IsTag(&tmpbuffer, TAG_EXT_1) || IsTag(&tmpbuffer, TAG_EXT_2) || IsTag(&tmpbuffer, TAG_EXT_T_0) || IsTag(&tmpbuffer, TAG_EXT_T_1) || IsTag(&tmpbuffer, TAG_EXT_T_2) || IsTag(&tmpbuffer, TAG_EXT_I_0) || IsTag(&tmpbuffer, TAG_EXT_I_1) || IsTag(&tmpbuffer, TAG_EXT_I_2))) || (IsTag(buffer, TAG_EXT_0) || IsTag(buffer, TAG_EXT_1) || IsTag(buffer, TAG_EXT_2) || IsTag(buffer, TAG_EXT_T_0) || IsTag(buffer, TAG_EXT_T_1) || IsTag(buffer, TAG_EXT_T_2) || IsTag(buffer, TAG_EXT_I_0) || IsTag(buffer, TAG_EXT_I_1) || IsTag(buffer, TAG_EXT_I_2)));}BOOL Is_string (P_WBXML_INFO buffer){ return (Is_inline(buffer) || Is_tableref(buffer));}BOOL Is_switchPage (P_WBXML_INFO buffer){ return IsTag(buffer, TAG_SWITCH_PAGE);}BOOL Is_inline (P_WBXML_INFO buffer){ return IsTag(buffer, TAG_STR_I);}BOOL Is_tableref (P_WBXML_INFO buffer){ return IsTag(buffer, TAG_STR_T);}BOOL Is_entity (P_WBXML_INFO buffer){ return IsTag(buffer, TAG_ENTITY);}BOOL Is_pi (P_WBXML_INFO buffer){ return IsTag(buffer, TAG_PI);}BOOL Is_opaque (P_WBXML_INFO buffer){ return IsTag(buffer, TAG_OPAQUE);}BOOL Is_zero(P_WBXML_INFO buffer){ BOOL result = FALSE; if (buffer) { if (BytesLeft(buffer) >= 1) { result = ((*buffer->m_curpos) == 0); } else { ParseError(ERR_END_OF_DATA); } } else { ParseError(ERR_INTERNAL_BAD_PARAM); } return result;}/*********************** * Basic Type Decoders * ***********************/void Read_u_int8(P_WBXML_INFO buffer, P_WBXML_U_INT8 result){ if (buffer && result) { if (BytesLeft(buffer) >= 1) { *result = *(buffer->m_curpos); (buffer->m_curpos)++; } else { ParseError(ERR_END_OF_DATA); } } else { ParseError(ERR_INTERNAL_BAD_PARAM); }}void Read_mb_u_int32(P_WBXML_INFO buffer, P_WBXML_MB_U_INT32 result){ if (buffer && result) { int i; for (i = 0; i < MAX_MB_U_INT32_BYTES; i++) { if (BytesLeft(buffer) >= 1) { (*result)[i] = *(buffer->m_curpos); (buffer->m_curpos)++; if ( !( (*result)[i] & 0x80 ) ) break; } else { ParseError(ERR_END_OF_DATA); } } } else { ParseError(ERR_INTERNAL_BAD_PARAM); }}void Read_bytes(P_WBXML_INFO buffer, WBXML_LENGTH length, P_WBXML_BYTES result){ if (buffer && result) { if (BytesLeft(buffer) >= length) { *result = (WBXML_BYTES) malloc(length*sizeof(unsigned char)); memcpy(*result, buffer->m_curpos, length); buffer->m_curpos += length; } else { ParseError(ERR_END_OF_DATA); } } else { ParseError(ERR_INTERNAL_BAD_PARAM); }}void ReadFixedTag(P_WBXML_INFO buffer, WBXML_TAG tag){ if (buffer) { if (BytesLeft(buffer) >= sizeof(WBXML_TAG)) { if ((*((WBXML_TAG*) buffer->m_curpos)) == tag) { buffer->m_curpos += sizeof(WBXML_TAG); } else { ParseError(ERR_TAG_NOT_FOUND); } } else { ParseError(ERR_END_OF_DATA); } } else { ParseError(ERR_INTERNAL_BAD_PARAM); }}WBXML_TAG ReadCodepageTag (P_WBXML_INFO buffer, CP_TAG_TYPE type){ WBXML_TAG tag = 0; if (buffer) { if (BytesLeft(buffer) >= sizeof(WBXML_TAG)) { tag = *((WBXML_TAG*) buffer->m_curpos); switch (type) { case CP_TAG_TAG: buffer->m_curpos += sizeof(WBXML_TAG); break; case CP_TAG_ATTRSTART: if ((tag & 0x80) != 0x80) { buffer->m_curpos += sizeof(WBXML_TAG); } else { ParseError(ERR_TAG_NOT_FOUND); } break; case CP_TAG_ATTRVALUE: if ((tag & 0x80) == 0x80) { buffer->m_curpos += sizeof(WBXML_TAG); } else { ParseError(ERR_TAG_NOT_FOUND); } break; default: ParseError(ERR_TAG_NOT_FOUND); break; } } else { ParseError(ERR_END_OF_DATA); } } else { ParseError(ERR_INTERNAL_BAD_PARAM); } return tag;}/************************** * Basic Type Conversions * **************************/long mb_u_int32_to_long(P_WBXML_MB_U_INT32 value){ long result = 0; if (value) { int i; for (i = 0; i < MAX_MB_U_INT32_BYTES; i++) { result <<= 7; result |= ((*value)[i] & 0x7f); if ( !( (*value)[i] & 0x80 ) ) break; } } else { ParseError(ERR_INTERNAL_BAD_PARAM); } return result;}static void OutputEncodedString(const unsigned char* str){ /* Work our way down the string looking for illegal chars */ while (*str != 0) { if ((*str < 0x20) || (*str > 0x7F)) { /* Out of range... encode */ printf("&#x%02x;", *str); } else { switch (*str) { case '<': case '>': case '&': case '\'': case '\"': /* Special symbol... encode */ printf("&#x%2x", *str); break; default: printf("%c", *str); break; } } str++; }}/******************************* * Document Structure Decoders * *******************************/void Read_start (P_WBXML_INFO buffer){ Read_version(buffer); Read_publicid(buffer); Read_charset(buffer); Read_strtbl(buffer); Read_body(buffer);}void Read_strtbl (P_WBXML_INFO buffer){ WBXML_STRING_TABLE result; Read_mb_u_int32(buffer, &(result.m_length)); Read_bytes(buffer, mb_u_int32_to_long(&(result.m_length)), &(result.m_strings)); AddStringTableNode(buffer, &result);}void Read_body (P_WBXML_INFO buffer){ while (Is_pi(buffer)) { Read_pi(buffer); } Read_element(buffer); while (Is_pi(buffer)) { Read_pi(buffer); }}void Read_element (P_WBXML_INFO buffer){ WBXML_TAG stagvalue = 0; if (Is_switchPage(buffer)) { Read_switchPage(buffer); } stagvalue = Read_stag(buffer); /* move the current node down to this one in the tree */ if (buffer->m_curnode) buffer->m_curnode = buffer->m_curnode->m_child; else buffer->m_curnode = buffer->m_tree; if ((stagvalue & CODEPAGE_TAG_HAS_ATTRS) == CODEPAGE_TAG_HAS_ATTRS) { do { Read_attribute(buffer); } while (!IsTag(buffer, TAG_END)); ReadFixedTag(buffer, TAG_END); AddAttrEndNode(buffer); } if ((stagvalue & CODEPAGE_TAG_HAS_CONTENT) == CODEPAGE_TAG_HAS_CONTENT) { while (!IsTag(buffer, TAG_END)) { Read_content(buffer); } ReadFixedTag(buffer, TAG_END); } /* move the current node back up one */ buffer->m_curnode = buffer->m_curnode->m_parent;}void Read_content (P_WBXML_INFO buffer){ if (Is_string(buffer)) { Read_string(buffer); } else if (Is_extension(buffer)) { Read_extension(buffer); } else if (Is_entity(buffer)) { Read_entity(buffer); } else if (Is_pi(buffer)) { Read_pi(buffer); } else if (Is_opaque(buffer)) { Read_opaque(buffer); } else { /* Assume it is an element */ Read_element(buffer); }}WBXML_TAG Read_stag (P_WBXML_INFO buffer){ if (IsCodepageTag(buffer, CP_TAG_TAG)) { WBXML_TAG tag = ReadCodepageTag(buffer, CP_TAG_TAG); AddCodepageTagNode(buffer, tag); return tag; } else if (IsTag(buffer, TAG_LITERAL)) { WBXML_MB_U_INT32 index; ReadFixedTag(buffer, TAG_LITERAL); Read_index(buffer, &index); AddCodepageLiteralTagNode(buffer, index); } else { ParseError(ERR_TAG_NOT_FOUND); } return 0;}void Read_attribute (P_WBXML_INFO buffer){ Read_attrStart(buffer); while (Is_attrValue(buffer)) { Read_attrValue(buffer); }}void Read_attrStart (P_WBXML_INFO buffer){ if (Is_switchPage(buffer)) { WBXML_TAG tag; Read_switchPage(buffer); tag = ReadCodepageTag(buffer, CP_TAG_ATTRSTART); AddAttrStartNode(buffer, tag); } else if (IsCodepageTag(buffer, CP_TAG_ATTRSTART)) { WBXML_TAG tag; tag = ReadCodepageTag(buffer, CP_TAG_ATTRSTART); AddAttrStartNode(buffer, tag); } else if (IsTag(buffer, TAG_LITERAL)) { WBXML_MB_U_INT32 index; ReadFixedTag(buffer, TAG_LITERAL); Read_index(buffer, &index); AddAttrStartLiteralNode(buffer, index); } else { ParseError(ERR_TAG_NOT_FOUND); }}void Read_attrValue (P_WBXML_INFO buffer){ if (Is_switchPage(buffer)) { WBXML_TAG tag; Read_switchPage(buffer); tag = ReadCodepageTag(buffer, CP_TAG_ATTRVALUE); AddAttrValueNode(buffer, tag); } else if (IsCodepageTag(buffer, CP_TAG_ATTRVALUE)) { WBXML_TAG tag; tag = ReadCodepageTag(buffer, CP_TAG_ATTRVALUE); AddAttrValueNode(buffer, tag); } else if (Is_string(buffer)) { Read_string(buffer); } else if (Is_extension(buffer)) { Read_extension(buffer); } else if (Is_entity(buffer)) { Read_entity(buffer); } else if (Is_opaque(buffer)) { Read_opaque(buffer); } else { ParseError(ERR_TAG_NOT_FOUND); }}void Read_extension (P_WBXML_INFO buffer){ if (Is_switchPage(buffer)) { Read_switchPage(buffer); } if (IsTag(buffer, TAG_EXT_I_0)) { char* str = NULL; ReadFixedTag(buffer, TAG_EXT_I_0); Read_termstr_rtn(buffer, &str); AddVariableStringNode(buffer, str, VAR_ESCAPED); } else if (IsTag(buffer, TAG_EXT_I_1)) { char* str = NULL; ReadFixedTag(buffer, TAG_EXT_I_1); Read_termstr_rtn(buffer, &str); AddVariableStringNode(buffer, str, VAR_UNESCAPED); } else if (IsTag(buffer, TAG_EXT_I_2)) { char* str = NULL; ReadFixedTag(buffer, TAG_EXT_I_2); Read_termstr_rtn(buffer, &str); AddVariableStringNode(buffer, str, VAR_UNCHANGED); } else if (IsTag(buffer, TAG_EXT_T_0)) { WBXML_MB_U_INT32 index; ReadFixedTag(buffer, TAG_EXT_T_0); Read_index(buffer, &index); AddVariableIndexNode(buffer, index, VAR_ESCAPED); } else if (IsTag(buffer, TAG_EXT_T_1)) { WBXML_MB_U_INT32 index; ReadFixedTag(buffer, TAG_EXT_T_1); Read_index(buffer, &index); AddVariableIndexNode(buffer, index, VAR_UNESCAPED); } else if (IsTag(buffer, TAG_EXT_T_2)) { WBXML_MB_U_INT32 index; ReadFixedTag(buffer, TAG_EXT_T_2); Read_index(buffer, &index); AddVariableIndexNode(buffer, index, VAR_UNCHANGED); } else if (IsTag(buffer, TAG_EXT_0)) { ReadFixedTag(buffer, TAG_EXT_0); ParseWarning(WARN_FUTURE_EXPANSION_EXT_0); } else if (IsTag(buffer, TAG_EXT_1)) { ReadFixedTag(buffer, TAG_EXT_1); ParseWarning(WARN_FUTURE_EXPANSION_EXT_1); } else if (IsTag(buffer, TAG_EXT_2)) { ReadFixedTag(buffer, TAG_EXT_2); ParseWarning(WARN_FUTURE_EXPANSION_EXT_2); } else { ParseError(ERR_TAG_NOT_FOUND); }}void Read_string (P_WBXML_INFO buffer){ if (Is_inline(buffer)) { Read_inline(buffer); } else if (Is_tableref(buffer)) { Read_tableref(buffer); } else { ParseError(ERR_TAG_NOT_FOUND); }}void Read_switchPage (P_WBXML_INFO buffer){ WBXML_U_INT8 pageindex; ReadFixedTag(buffer, TAG_SWITCH_PAGE); Read_pageindex(buffer, &pageindex); /* Use the new codepage */ buffer->m_curpage = pageindex;}void Read_inline (P_WBXML_INFO buffer){ ReadFixedTag(buffer, TAG_STR_I); Read_termstr(buffer);}void Read_tableref (P_WBXML_INFO buffer)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -