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 )); }
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; } }