int main()
{
	char* test_null = NULL;
	char test[] = "abcdef";
	char test2[] = "xabcdef";
	printf( "%s\n", test);	
	printf( "%i\n", lengthString( test ));	
	printf( "%i\n", lengthString( test_null ));	
	printf( "%s\n", appendStringToString( test, test2 ));	
	char*  connec = appendStringToString( test, test2 );
	printf( "%i\n", lengthString( connec ));	
	printf( "%s\n", subString( test, 2, 4 ));	
	printf( "%s\n", subString( test, 6, 2 ));	
	printf( "%s\n", subString( test, 4, 4 ));	
	printf( "%s\n", subString( test, 1, lengthString( test )));	
	printf( "%s\n", subString( test, lengthString( test ), 1 ));	
	printf( "%s\n", invertString( invertString ( test )));	
	printf( "%s\n", invertString( test ));	
	 
}
Пример #2
0
Файл: expr.c Проект: Dasio/IFJ
static void reduce_two_constants(THandle handle)
{
	if (handle.first[0].E.data_type == INT &&
		handle.first[2].E.data_type == INT)
	{
		switch (handle.first[1].token->type)
		{
			case TT_multiply:
				handle.first[0].E.int_ = handle.first[0].E.int_ * handle.first[2].E.int_;
				break;
			case TT_division:
				if (handle.first[2].E.int_ == 0)
				{
					setError(ERR_DivisionByZero);
					return;
				}
				handle.first[0].E.double_ = (double)handle.first[0].E.int_ / handle.first[2].E.int_;
				break;
			case TT_plus:
				handle.first[0].E.int_ = handle.first[0].E.int_ + handle.first[2].E.int_;
				break;
			case TT_minus:
				handle.first[0].E.int_ = handle.first[0].E.int_ - handle.first[2].E.int_;
				break;
			case TT_less:
				handle.first[0].E.bool_ = handle.first[0].E.int_ < handle.first[2].E.int_;
				break;
			case TT_greater:
				handle.first[0].E.bool_ = handle.first[0].E.int_ > handle.first[2].E.int_;
				break;
			case TT_lessOrEqual:
				handle.first[0].E.bool_ = handle.first[0].E.int_ <= handle.first[2].E.int_;
				break;
			case TT_greaterOrEqual:
				handle.first[0].E.bool_ = handle.first[0].E.int_ >= handle.first[2].E.int_;
				break;
			case TT_equality:
				handle.first[0].E.bool_ = handle.first[0].E.int_ == handle.first[2].E.int_;
				break;
			case TT_inequality:
				handle.first[0].E.bool_ = handle.first[0].E.int_ != handle.first[2].E.int_;
				break;
			default:
				break;
		}
	}
	else if (handle.first[0].E.data_type == INT &&
			handle.first[2].E.data_type == DOUBLE)
	{
		switch (handle.first[1].token->type)
		{
			case TT_multiply:
				handle.first[0].E.double_ = handle.first[0].E.int_ * handle.first[2].E.double_;
				break;
			case TT_division:
				if (handle.first[2].E.double_ == 0)
				{
					setError(ERR_DivisionByZero);
					return;
				}
				handle.first[0].E.double_ = handle.first[0].E.int_ / handle.first[2].E.double_;
				break;
			case TT_plus:
				handle.first[0].E.double_ = handle.first[0].E.int_ + handle.first[2].E.double_;
				break;
			case TT_minus:
				handle.first[0].E.double_ = handle.first[0].E.int_ - handle.first[2].E.double_;
				break;
			case TT_less:
				handle.first[0].E.bool_ = handle.first[0].E.int_ < handle.first[2].E.double_;
				break;
			case TT_greater:
				handle.first[0].E.bool_ = handle.first[0].E.int_ > handle.first[2].E.double_;
				break;
			case TT_lessOrEqual:
				handle.first[0].E.bool_ = handle.first[0].E.int_ <= handle.first[2].E.double_;
				break;
			case TT_greaterOrEqual:
				handle.first[0].E.bool_ = handle.first[0].E.int_ >= handle.first[2].E.double_;
				break;
			case TT_equality:
				handle.first[0].E.bool_ = handle.first[0].E.int_ == handle.first[2].E.double_;
				break;
			case TT_inequality:
				handle.first[0].E.bool_ = handle.first[0].E.int_ != handle.first[2].E.double_;
				break;
			default:
				break;
		}
	}
	else if (handle.first[0].E.data_type == DOUBLE &&
		handle.first[2].E.data_type == INT)
	{
		switch (handle.first[1].token->type)
		{
			case TT_multiply:
				handle.first[0].E.double_ = handle.first[0].E.double_ * handle.first[2].E.int_;
				break;
			case TT_division:
				if (handle.first[2].E.int_ == 0)
				{
					setError(ERR_DivisionByZero);
					return;
				}
				handle.first[0].E.double_ = handle.first[0].E.double_ / handle.first[2].E.int_;
				break;
			case TT_plus:
				handle.first[0].E.double_ = handle.first[0].E.double_ + handle.first[2].E.int_;
				break;
			case TT_minus:
				handle.first[0].E.double_ = handle.first[0].E.double_ - handle.first[2].E.int_;
				break;
			case TT_less:
				handle.first[0].E.bool_ = handle.first[0].E.double_ < handle.first[2].E.int_;
				break;
			case TT_greater:
				handle.first[0].E.bool_ = handle.first[0].E.double_ > handle.first[2].E.int_;
				break;
			case TT_lessOrEqual:
				handle.first[0].E.bool_ = handle.first[0].E.double_ <= handle.first[2].E.int_;
				break;
			case TT_greaterOrEqual:
				handle.first[0].E.bool_ = handle.first[0].E.double_ >= handle.first[2].E.int_;
				break;
			case TT_equality:
				handle.first[0].E.bool_ = handle.first[0].E.double_ == handle.first[2].E.int_;
				break;
			case TT_inequality:
				handle.first[0].E.bool_ = handle.first[0].E.double_ != handle.first[2].E.int_;
				break;
			default:
				break;
		}
	}
	else if (handle.first[0].E.data_type == DOUBLE &&
		handle.first[2].E.data_type == DOUBLE)
	{
		switch (handle.first[1].token->type)
		{
			case TT_multiply:
				handle.first[0].E.double_ = handle.first[0].E.double_ * handle.first[2].E.double_;
				break;
			case TT_division:
				if (handle.first[2].E.double_ == 0)
				{
					setError(ERR_DivisionByZero);
					return;
				}
				handle.first[0].E.double_ = handle.first[0].E.double_ / handle.first[2].E.double_;
				break;
			case TT_plus:
				handle.first[0].E.double_ = handle.first[0].E.double_ + handle.first[2].E.double_;
				break;
			case TT_minus:
				handle.first[0].E.double_ = handle.first[0].E.double_ - handle.first[2].E.double_;
				break;
			case TT_less:
				handle.first[0].E.bool_ = handle.first[0].E.double_ < handle.first[2].E.double_;
				break;
			case TT_greater:
				handle.first[0].E.bool_ = handle.first[0].E.double_ > handle.first[2].E.double_;
				break;
			case TT_lessOrEqual:
				handle.first[0].E.bool_ = handle.first[0].E.double_ <= handle.first[2].E.double_;
				break;
			case TT_greaterOrEqual:
				handle.first[0].E.bool_ = handle.first[0].E.double_ >= handle.first[2].E.double_;
				break;
			case TT_equality:
				handle.first[0].E.bool_ = handle.first[0].E.double_ == handle.first[2].E.double_;
				break;
			case TT_inequality:
				handle.first[0].E.bool_ = handle.first[0].E.double_ != handle.first[2].E.double_;
				break;
			default:
				break;
		}
	}
	else if (handle.first[0].E.data_type == BOOL &&
		handle.first[2].E.data_type == BOOL)
	{
		switch (handle.first[1].token->type)
		{
			case TT_and:
				handle.first[0].E.bool_ = handle.first[0].E.bool_ && handle.first[2].E.bool_;
				break;
			case TT_or:
				handle.first[0].E.bool_ = handle.first[0].E.bool_ || handle.first[2].E.bool_;
				break;
			case TT_xor:
				handle.first[0].E.bool_ = handle.first[0].E.bool_ ^ handle.first[2].E.bool_;
				break;
			case TT_less:
				handle.first[0].E.bool_ = handle.first[0].E.bool_ < handle.first[2].E.bool_;
				break;
			case TT_greater:
				handle.first[0].E.bool_ = handle.first[0].E.bool_ > handle.first[2].E.bool_;
				break;
			case TT_lessOrEqual:
				handle.first[0].E.bool_ = handle.first[0].E.bool_ >= handle.first[2].E.bool_;
				break;
			case TT_greaterOrEqual:
				handle.first[0].E.bool_ = handle.first[0].E.bool_ >= handle.first[2].E.bool_;
				break;
			case TT_equality:
				handle.first[0].E.bool_ = handle.first[0].E.bool_ == handle.first[2].E.bool_;
				break;
			case TT_inequality:
				handle.first[0].E.bool_ = handle.first[0].E.bool_ != handle.first[2].E.bool_;
				break;
			default:
				break;
		}
	}
	else if (handle.first[0].E.data_type == STRING &&
		handle.first[2].E.data_type == STRING)
	{
		if (handle.first[1].token->type == TT_plus)
		{
			appendStringToString(handle.first[0].E.str, handle.first[2].E.str);
			return;
		}
		int compare_result = strcmp(handle.first[0].E.str->data, handle.first[2].E.str->data);
		switch (handle.first[1].token->type)
		{
			case TT_less:
				handle.first[0].E.bool_ = compare_result < 0;
				break;
			case TT_greater:
				handle.first[0].E.bool_ = compare_result > 0;
				break;
			case TT_lessOrEqual:
				handle.first[0].E.bool_ = compare_result <= 0;
				break;
			case TT_greaterOrEqual:
				handle.first[0].E.bool_ = compare_result >= 0;
				break;
			case TT_equality:
				handle.first[0].E.bool_ = compare_result == 0;
				break;
			case TT_inequality:
				handle.first[0].E.bool_ = compare_result != 0;
				break;
			default:
				break;
		}
	}
	else
	{
		setError(ERR_Reduction);
		return;
	}
}