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

📄 wbxml_parser.c

📁 WAP Binary XML 简单地说
💻 C
📖 第 1 页 / 共 5 页
字号:
      /* Skip ENTITY */    parser->pos++;      if ( (ret = parse_entcode(parser, &code)) != WBXML_OK ) {        return ret;    }      /* Build Entity */    if ( code > WBXML_PARSER_MAX_ENTITY_CODE )  {        return WBXML_ERROR_ENTITY_CODE_OVERFLOW;    }      /**     * WARNING: If you change the entity variable length (10 chars), change too     *          'WBXML_PARSER_MAX_ENTITY_CODE' defined in this file !     */    sprintf(entity, "&#%u;", code);    /* Create result buffer */    if ( (*result = wbxml_buffer_create_from_cstr(entity)) == NULL ) {        return WBXML_ERROR_NOT_ENOUGH_MEMORY;    }    return WBXML_OK;}/** * @brief Parse WBXML opaque * @param parser The WBXML Parser * @param result Resulting opaque data parsed * @return WBXML_OK if parsing is OK, an error code otherwise * @note opaque = OPAQUE length *byte * @note length = mb_u_int32 */static WBXMLError parse_opaque(WBXMLParser *parser, WBXMLBuffer **result){    WB_ULONG   len = 0;    WBXMLError ret = WBXML_OK;      WBXML_DEBUG((WBXML_PARSER, "(%d) Parsing opaque", parser->pos));      if (parser->version < WBXML_VERSION_11)        WBXML_WARNING((WBXML_PARSER, "No 'opaque' support in WBXML < %s", WBXML_VERSION_TEXT_11));      /* Skip OPAQUE */    parser->pos++;      if ((ret = parse_mb_uint32(parser, &len)) != WBXML_OK) {        return ret;    }    /* Check that length specified in OPAQUE doesn't overflow wbxml length */    if (parser->pos + len > wbxml_buffer_len(parser->wbxml)) {        return WBXML_ERROR_BAD_OPAQUE_LENGTH;    }    /**     * Create result buffer (don't create a static buffer, because this can be     * modified while trying to decode this content)     */    *result = wbxml_buffer_create(wbxml_buffer_get_cstr(parser->wbxml) + parser->pos, len, len);    if (*result == NULL) {        return WBXML_ERROR_NOT_ENOUGH_MEMORY;    }      parser->pos += len;      return ret;}/** * @brief Parse WBXML literalTag * @param parser The WBXML Parser * @param mask   Resulting tag mask (WBXML_TOKEN_MASK          | *                                   WBXML_TOKEN_WITH_CONTENT  | *                                   WBXML_TOKEN_WITH_ATTRS    | *                                   (WBXML_TOKEN_WITH_CONTENT || WBXML_TOKEN_WITH_ATTRS)) * @param result The resulting parsed literal * @return WBXML_OK if parsing is OK, an error code otherwise * @note    result = ( literalTag index ) *            literalTag = LITERAL | LITERAL_A | LITERAL_C | LITERAL_AC */static WBXMLError parse_literal(WBXMLParser  *parser,                                WB_UTINY     *mask,                                WBXMLBuffer **result){    WBXMLError ret     = WBXML_OK;    WB_UTINY   token   = 0;    WB_ULONG   index   = 0;      WBXML_DEBUG((WBXML_PARSER, "(%d) Parsing literalTag", parser->pos));      /* Parse literalTag */    if ( (ret = parse_uint8(parser, &token)) != WBXML_OK ) {        return ret;    }      /* Parse index */    if ( (ret = parse_mb_uint32(parser, &index)) != WBXML_OK ) {        return ret;    }      /* Get string */    if ( (ret = get_strtbl_reference(parser, index, result)) != WBXML_OK ) {        return ret;    }    /* Build Tag Mask */    switch(token) {    case WBXML_LITERAL:        *mask = WBXML_TOKEN_MASK;        break;    case WBXML_LITERAL_C:        *mask = WBXML_TOKEN_WITH_CONTENT;        break;    case WBXML_LITERAL_A:        *mask = WBXML_TOKEN_WITH_ATTRS;        break;    case WBXML_LITERAL_AC:        *mask = ( WBXML_TOKEN_WITH_CONTENT | WBXML_TOKEN_WITH_ATTRS );        break;    default:        return WBXML_ERROR_INTERNAL;    }      return WBXML_OK;}/** * @brief Parse WBXML attrStart * @param parser The WBXML Parser * @param name The Attribute Name parsed * @param value The Attribute Value associated, if any * @return WBXML_OK if parsing is OK, an error code otherwise * @note attrStart = ([switchPage] ATTRSTART) | ( LITERAL index ) */static WBXMLError parse_attr_start(WBXMLParser         *parser,                                   WBXMLAttributeName **name,                                   const WB_UTINY     **value){    WBXMLBuffer *literal_str = NULL;    WB_UTINY     literal     = 0;        WB_UTINY     tag         = 0;    WBXMLError   ret         = WBXML_OK;    WB_ULONG     index       = 0;    WBXML_DEBUG((WBXML_PARSER, "(%d) Parsing attrStart", parser->pos));        /**************************     * Case: ( LITERAL index )      */      if (is_token(parser, WBXML_LITERAL)) {        if ((ret = parse_literal(parser, &literal, &literal_str)) != WBXML_OK) {            return ret;        }            if ((*name = wbxml_attribute_name_create_literal(wbxml_buffer_get_cstr(literal_str))) == NULL) {            ret = WBXML_ERROR_NOT_ENOUGH_MEMORY;        }            /**         * @todo Return Warning if 'literal' is different from 'WBML_TOKEN_MASK' (because it MUST be a 'LITERAL' token, not         *       LITERAL_A, nor LITERAL_C, nor LITERAL_AC         */        wbxml_buffer_destroy(literal_str);        return WBXML_OK;    }        /***********************************     * Case: ( [switchPage] ATTRSTART )     */      /* Parse switchPage */    if (is_token(parser, WBXML_SWITCH_PAGE)) {        if ((ret = parse_switch_page(parser, WBXML_ATTR_TOKEN)) != WBXML_OK) {            return ret;        }    }      /* Parse UINT8 */    if ((ret = parse_uint8(parser, &tag)) != WBXML_OK) {        return ret;    }      WBXML_DEBUG((WBXML_PARSER, "\tToken: 0x%X", tag));      /* Search tag in Tags Table */    if (parser->langTable == NULL) {        return WBXML_ERROR_LANG_TABLE_UNDEFINED;    }      if (parser->langTable->attrTable == NULL) {         return WBXML_ERROR_ATTR_TABLE_UNDEFINED;    }    while ((parser->langTable->attrTable[index].xmlName != NULL) &&           ((parser->langTable->attrTable[index].wbxmlToken != tag) ||            (parser->langTable->attrTable[index].wbxmlCodePage != parser->attrCodePage)))    {        index++;    }      if (parser->langTable->attrTable[index].xmlName == NULL) {#if WBXML_PARSER_BEST_EFFORT        /* Create "unknown" Attribute Name */        if ((*name = wbxml_attribute_name_create_literal(WBXML_PARSER_UNKNOWN_STRING)) == NULL) {            return WBXML_ERROR_NOT_ENOUGH_MEMORY;        }            return WBXML_OK;#else        return WBXML_ERROR_UNKNOWN_ATTR;#endif /* WBXML_PARSER_BEST_EFFORT */    }      /* Create Token Attribute Name */    if ((*name = wbxml_attribute_name_create(WBXML_VALUE_TOKEN)) == NULL) {        return WBXML_ERROR_NOT_ENOUGH_MEMORY;    }      (*name)->u.token = &(parser->langTable->attrTable[index]);      /* Get Attribute start value (if any) */    if (parser->langTable->attrTable[index].xmlValue != NULL) {        *value = (const WB_UTINY *) parser->langTable->attrTable[index].xmlValue;    }      return WBXML_OK;}/** * @brief Parse WBXML attrValue * @param parser [in]  The WBXML Parser * @param result [out] The resulting Value parsed * @return WBXML_OK if parsing is OK, an error code otherwise * @note attrValue = ([switchPage] ATTRVALUE) | string | extension | entity | opaque */static WBXMLError parse_attr_value(WBXMLParser  *parser,                                   WBXMLBuffer **result){    WB_ULONG   index = 0;    WB_UTINY   tag   = 0;    WBXMLError ret   = WBXML_OK;      WBXML_DEBUG((WBXML_PARSER, "(%d) Parsing attrValue", parser->pos));      /* Parse extension */    if (is_extension(parser)) {        return parse_extension(parser, WBXML_ATTR_TOKEN, result);    }      /* Parse entity */    if (is_token(parser, WBXML_ENTITY)) {        return parse_entity(parser, result);    }      /* Parse string */    if (is_string(parser)) {        return parse_string(parser, result);    }    /* Parse opaque */    if (is_token(parser, WBXML_OPAQUE)) {        if (parser->version < WBXML_VERSION_12) {            WBXML_ERROR((WBXML_PARSER, "An Attribute value can't be 'opaque' in WBXML version < %s", WBXML_VERSION_TEXT_12));        }                return parse_opaque(parser, result);    }        /*****************************     *    ([switchPage] ATTRVALUE)     */      /* Parse switchPage */    if (is_token(parser, WBXML_SWITCH_PAGE)) {        ret = parse_switch_page(parser, WBXML_ATTR_TOKEN);        if (ret != WBXML_OK) {            return ret;        }    }      /* Parse UINT8 */    ret = parse_uint8(parser, &tag);    if (ret != WBXML_OK) {        return ret;    }      /* Search tag in Tags Table */    if (parser->langTable == NULL) {        return WBXML_ERROR_LANG_TABLE_UNDEFINED;    }      if (parser->langTable->attrValueTable == NULL) {        return WBXML_ERROR_ATTR_VALUE_TABLE_UNDEFINED;    }      while ((parser->langTable->attrValueTable[index].xmlName != NULL) &&           ((parser->langTable->attrValueTable[index].wbxmlToken != tag) ||            (parser->langTable->attrValueTable[index].wbxmlCodePage != parser->attrCodePage)))    {        index++;    }      if (parser->langTable->attrValueTable[index].xmlName == NULL) {        return WBXML_ERROR_UNKNOWN_ATTR_VALUE;    }    *result = wbxml_buffer_sta_create_from_cstr(parser->langTable->attrValueTable[index].xmlName);    return WBXML_OK;}/** * @brief Parse WBXML termstr * @param parser [in]  The WBXML Parser * @param result [out] The resulting parsed string * @return WBXML_OK if parsing is OK, an error code otherwise * @note termstr = charset-dependent string with termination */static WBXMLError parse_termstr(WBXMLParser  *parser,                                WBXMLBuffer **result){    WB_ULONG   max_len  = 0;    WBXMLError ret      = WBXML_OK;      WBXML_DEBUG((WBXML_PARSER, "(%d) Parsing termstr", parser->pos));    /* Get max possible string length */    max_len = wbxml_buffer_len(parser->wbxml) - parser->pos;      /* Convert to UTF-8 Buffer */    if ((ret = wbxml_charset_conv_term((const WB_TINY *) (wbxml_buffer_get_cstr(parser->wbxml) + parser->pos),                                       &max_len,                                       parser->charset,                                       result,                                       WBXML_CHARSET_UTF_8)) != WBXML_OK) {        return ret;    }    parser->pos += max_len;      WBXML_DEBUG((WBXML_PARSER, "(%d) termstr: %s", parser->pos, wbxml_buffer_get_cstr(*result)));      return WBXML_OK;}/** * @brief Parse WBXML inline * @param parser [in]  The WBXML Parser * @param result [out] The resulting parsed string * @return WBXML_OK if parsing is OK, an error code otherwise * @note inline = STR_I termstr */static WBXMLError parse_inline(WBXMLParser  *parser,                               WBXMLBuffer **result){    WBXML_DEBUG((WBXML_PARSER, "(%d) Parsing inline", parser->pos));      /* Skip STR_I */    parser->pos++;      return parse_termstr(parser, result);}/** * @brief Parse WBXML tableref * @param parser The WBXML Parser * @param result The resulting parsed string * @return WBXML_OK if parsing is OK, an error code otherwise * @note tableref = STR_T index * @note index = mb_u_int32 */static WBXMLError parse_tableref(WBXMLParser  *parser,                                 WBXMLBuffer **result){    WB_ULONG index;    WBXMLError ret = WBXML_OK;      WBXML_DEBUG((WBXML_PARSER, "(%d) Parsing tableref", parser->pos));      /* Skip STR_T */    parser->pos++;      /* Parse index */    if ((ret = parse_mb_uint32(parser, &index)) != WBXML_OK) {        return ret;    }      return get_strtbl_reference(parser, index, result);}/** * @brief Parse WBXML entcode * @param parser [in] The WBXML Parser * @param result [out] The entcode parsed * @return WBXML_OK if parsin

⌨️ 快捷键说明

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