/*************************************************************** __MPU_MTHERR.C This file contains source code of functions for MATH ERROR operations. PART OF : MPU - library . USAGE : Internal only . NOTE : NONE . Copyright (C) 2000 - 2024 by Andrew V.Kosteltsev. All Rights Reserved. ***************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include /******************************************************** INTEGER operations error. ********************************************************/ void __integer_invalid_size( __mpu_char8_t *name ) { struct __exception e; __integer_error_no = __I_ESIZE__; /* Invalid size of operand(s) */ __STV; /* Set INTEGER Invalid operation Flag*/ e.who = _INTEGER_; e.type = __integer_error_no; e.name = name; e.msg = __mpu_utf8mpu_error( _INTEGER_, __integer_error_no ); e.msg_type = _ERROR_MSG_; e.nb_a1 = 0; e.nb_a2 = 0; e.nb_rv = 0; e.arg_1 = (unsigned char *)0; e.arg_2 = (unsigned char *)0; e.return_value = (unsigned char *)0; if( __extra_warnings ) { __mpu_warning( &e ); } if( e.msg ) free( e.msg ); return; } /* End of __integer_invalid_size( __mpu_char8_t *name ) */ void __integer_invalid_shift( __mpu_char8_t *name ) { struct __exception e; __integer_error_no = __I_ESHIFT__; /* Invalid number of shifts */ __STV; /* Set INTEGER Invalid operation Flag*/ e.who = _INTEGER_; e.type = __integer_error_no; e.name = name; e.msg = __mpu_utf8mpu_error( _INTEGER_, __integer_error_no ); e.msg_type = _ERROR_MSG_; e.nb_a1 = 0; e.nb_a2 = 0; e.nb_rv = 0; e.arg_1 = (unsigned char *)0; e.arg_2 = (unsigned char *)0; e.return_value = (unsigned char *)0; if( __extra_warnings ) { __mpu_warning( &e ); } if( e.msg ) free( e.msg ); return; } /* End of __integer_invalid_shift( __mpu_char8_t *name ) */ void __integer_invalid_number( __mpu_char8_t *name ) { struct __exception e; __integer_error_no = __I_ENUMBER__; /* Invalid number of shifts */ __STV; /* Set INTEGER Invalid operation Flag*/ e.who = _INTEGER_; e.type = __integer_error_no; e.name = name; e.msg = __mpu_utf8mpu_error( _INTEGER_, __integer_error_no ); e.msg_type = _ERROR_MSG_; e.nb_a1 = 0; e.nb_a2 = 0; e.nb_rv = 0; e.arg_1 = (unsigned char *)0; e.arg_2 = (unsigned char *)0; e.return_value = (unsigned char *)0; if( __extra_warnings ) { __mpu_warning( &e ); } if( e.msg ) free( e.msg ); return; } /* End of __integer_invalid_number( __mpu_char8_t *name ) */ void __integer_invalid_radix( __mpu_char8_t *name ) { struct __exception e; __integer_error_no = __I_ERADIX__; /* Invalid number of shifts */ __STV; /* Set INTEGER Invalid operation Flag*/ e.who = _INTEGER_; e.type = __integer_error_no; e.name = name; e.msg = __mpu_utf8mpu_error( _INTEGER_, __integer_error_no ); e.msg_type = _ERROR_MSG_; e.nb_a1 = 0; e.nb_a2 = 0; e.nb_rv = 0; e.arg_1 = (unsigned char *)0; e.arg_2 = (unsigned char *)0; e.return_value = (unsigned char *)0; if( __extra_warnings ) { __mpu_warning( &e ); } if( e.msg ) free( e.msg ); return; } /* End of __integer_invalid_radix( __mpu_char8_t *name ) */ /******************************************************** REAL operations error. ********************************************************/ void __real_invalid_size( __mpu_char8_t *name ) { struct __exception e; __real_error_no = __R_ESIZE__; /* Invalid size of operand(s) */ __STIND; /* Set REAL ind-produsing operation Flag */ e.who = _REAL_; e.type = __real_error_no; e.name = name; e.msg = __mpu_utf8mpu_error( _REAL_, __real_error_no ); e.msg_type = _ERROR_MSG_; e.nb_a1 = 0; e.nb_a2 = 0; e.nb_rv = 0; e.arg_1 = (unsigned char *)0; e.arg_2 = (unsigned char *)0; e.return_value = (unsigned char *)0; if( __extra_warnings ) { __mpu_warning( &e ); } if( e.msg ) free( e.msg ); return; } /* End of __real_invalid_size( __mpu_char8_t *name ) */ void __real_truncate_error( void ) { struct __exception e; __real_error_no = __R_ETRUNC__; /* Invalid number of TRUNC bits(BZ) */ __STIND; /* Set REAL ind-produsing operation Flag */ e.who = _REAL_; e.type = __real_error_no; e.name = (__mpu_char8_t *)"ei_trunc"; e.msg = __mpu_utf8mpu_error( _REAL_, __real_error_no ); e.msg_type = _ERROR_MSG_; e.nb_a1 = 0; e.nb_a2 = 0; e.nb_rv = 0; e.arg_1 = (unsigned char *)0; e.arg_2 = (unsigned char *)0; e.return_value = (unsigned char *)0; if( __extra_warnings ) { __mpu_warning( &e ); } if( e.msg ) free( e.msg ); return; } /* End of __real_truncate_error( void ) */ void _mtherr( EMUSHORT *rc, __mpu_char8_t *name, int type, EMUSHORT *ret_val, EMUSHORT *arg1, EMUSHORT *arg2, int nb ) /* *rc; - return code */ /* *name; - name of function */ /* type; - type of ERROR */ /* *ret_val; - internal e-type number */ /* *arg1; - internal e-type number */ /* *arg2; - internal e-type number */ /* nb; - number of bits */ { __mpu_byte_t rv[NB_R_MAX], a1[NB_R_MAX], a2[NB_R_MAX]; int n_bytes; int i; struct __exception e; /* ZERO: rv, a1, a2. */ for( i = 0; i < NB_R_MAX; i++ ) { rv[i]=0; a1[i]=0; a2[i]=0; } n_bytes = nb / BITS_PER_BYTE; if( n_bytes > NB_R_MAX ) { /* error: Invalid size of operand(s) */ __real_invalid_size( (__mpu_char8_t *)"_mtherr" ); _gen_zero( rc, nb ); return; } if( (type <= 0) || (type >= __M_MAX_ERRNO) ) type = 0; __math_error_no = type; e.who = _MATH_; e.type = type; e.name = name; e.msg = __mpu_utf8mpu_error( _MATH_, type ); e.msg_type = _ERROR_MSG_; /* RETURN VALUE **************/ if( ret_val ) { pack( (EMUSHORT *)rv, ret_val, nb ); e.nb_rv = n_bytes; e.return_value = (unsigned char *)rv; } else { e.nb_rv = 0; e.return_value = (unsigned char *)0; } /* ARGUMENT NO _1_ *****************/ if( arg1 ) { pack( (EMUSHORT *)a1, arg1, nb ); e.nb_a1 = n_bytes; e.arg_1 = (unsigned char *)a1; } else { e.nb_a1 = 0; e.arg_1 = (unsigned char *)0; } /* ARGUMENT NO _2_ *****************/ if( arg2 ) { pack( (EMUSHORT *)a2, arg2, nb ); e.nb_a2 = n_bytes; e.arg_2 = (unsigned char *)a2; } else { e.nb_a2 = 0; e.arg_2 = (unsigned char *)0; } if( !__mpu_math_error( &e ) ) { /* ERROR NOT TREAT */ errno = __mpu_math_errnotab[type]; if( __extra_warnings ) { __mpu_warning( &e ); } } /* End if( !_math_error( &e ) ) */ if( rc ) { unpack( rc, (EMUSHORT *)e.return_value, nb ); } if( e.msg ) free( e.msg ); } /* End of _mtherr() */ /*************************************************************** Hide internal symbols: ***************************************************************/ __mpu_hidden_decl(__integer_invalid_size); __mpu_hidden_decl(__integer_invalid_shift); __mpu_hidden_decl(__integer_invalid_number); __mpu_hidden_decl(__integer_invalid_radix); __mpu_hidden_decl(__real_invalid_size); __mpu_hidden_decl(__real_truncate_error); __mpu_hidden_decl(_mtherr); /* End of hide internal symbols. ***************************************************************/