예제 #1
0
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;
	}
}
예제 #2
0
파일: Flic.c 프로젝트: bowlofstew/ja2
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;
}
예제 #3
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());
	
	
}