int openddl::detail::ParserContext::build_literal(Command::LiteralPayload::encoding_t encoding, Token const * ts, Token const * te, Command::LiteralPayload & payload) { payload.encoding = encoding; if (encoding == Command::LiteralPayload::kReference) { Token const * i = ts; std::vector<std::string> * reference = new std::vector<std::string>(); while (i <= te && (i->token_type == Token::kNull || i->token_type == Token::kGlobalName || i->token_type == Token::kLocalName)) { reference->emplace_back(i->payload); i++; } payload.value.reference_ = reference; return i - ts; } else if (encoding == Command::LiteralPayload::kString) { Token const * i = ts; std::string * string = new std::string(); while (i <= te && (i->token_type == Token::kStringLiteral)) { validate_string(errors, *string, i->payload); i++; } payload.value.string_ = string; return i - ts; } else { int code; if ((code=decode_literal(*ts, payload))!=0) { if(code == 1) push_error("parse.literal.out_of_range"); else if (code == -1) push_error("parse.literal.type_mismatch"); } return 1; } }
static ErrCode decode_frame(Flic *flic, FrameHead *frame, Uchar *data) { int i; ChunkHead *chunk; for (i=0; i<frame->chunks; ++i) { chunk = (ChunkHead *)data; data += chunk->size; switch (chunk->type) { case COLOR_256: if (flic->screen.change_palette) //decode_color_256((Uchar *)(chunk+1), flic); decode_color_256( (((Uchar *)chunk) + 4 ), flic); break; case DELTA_FLC: decode_delta_flc((Uchar *)(chunk+1), flic); break; case COLOR_64: if (flic->screen.change_palette) decode_color_64((Uchar *)(chunk+1), flic); break; case DELTA_FLI: decode_delta_fli((Uchar *)(chunk+1), flic); break; case BLACK_FRAME: decode_black((Uchar *)(chunk+1), flic); break; case BYTE_RUN: decode_byte_run((Uchar *)(chunk+1), flic); break; case LITERAL: decode_literal((Uchar *)(chunk+1), flic); break; default: break; } } return 0; }
void openddl::detail::ParserContext::push_array_type(Token const * type, Token const * dimensions, Token const * name) { unsigned int depth = parents.size(); unsigned int parent; Command::DataArrayPayload payload; payload.type = convert(*type); payload.length = 0; payload.dimension = 0; if (parents.empty()) parent = 0; else { parent = parents.back(); if (commands[parents.back()-1].type == Command::kStructure) commands[parents.back()-1].payload.structure_.children++; } if (name != nullptr) payload.name = new std::string(name->payload); else payload.name = nullptr; Command::LiteralPayload dimension_size; dimension_size.encoding = Command::LiteralPayload::kInteger; if (decode_literal(*dimensions, dimension_size) != 0 ) push_error("parse.array.invalid_index"); else { int code = detect_limits(Type::kUnsignedInt32, dimension_size); if (code != 0) push_error("parse.array.invalid_index"); else payload.dimension = (uint32_t)dimension_size.value.integer_.value; } commands.emplace_back(payload, parent, depth); parents.push_back(commands.size()); }