Math Processor Unit Library

libmpu – library of arithmetic functions for integer, real, and complex numbers of increased digit capacity

16 Commits   0 Branches   2 Tags
868b2b66 (kx 2024-12-20 16:11:07 +0300   1) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   2) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300   3)   __MPU_MTHERR.C
868b2b66 (kx 2024-12-20 16:11:07 +0300   4) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   5)        This file contains source code of functions for
868b2b66 (kx 2024-12-20 16:11:07 +0300   6)        MATH ERROR operations.
868b2b66 (kx 2024-12-20 16:11:07 +0300   7) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   8)        PART OF : MPU - library .
868b2b66 (kx 2024-12-20 16:11:07 +0300   9) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  10)        USAGE   : Internal only .
868b2b66 (kx 2024-12-20 16:11:07 +0300  11) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  12)        NOTE    : NONE .
868b2b66 (kx 2024-12-20 16:11:07 +0300  13) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  14)        Copyright (C) 2000 - 2024  by Andrew V.Kosteltsev.
868b2b66 (kx 2024-12-20 16:11:07 +0300  15)        All Rights Reserved.
868b2b66 (kx 2024-12-20 16:11:07 +0300  16)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  17) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  18) #ifdef HAVE_CONFIG_H
868b2b66 (kx 2024-12-20 16:11:07 +0300  19) #include <config.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  20) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  21) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  22) #include <nls.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  23) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  24) #include <errno.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  25) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  26) #include <stdio.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  27) #include <stdlib.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  28) #include <string.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  29) #include <locale.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  30) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  31) #include <libmpu.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  32) #include <mpu-context.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  33) #include <mpu-symbols.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  34) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  35) #include <mpu-math-errno.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  36) #include <mpu-strerror.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  37) #include <mpu-mtherr.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  38) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  39) #include <mpu-real.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  40) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  41) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  42) /********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  43)   INTEGER operations error.
868b2b66 (kx 2024-12-20 16:11:07 +0300  44)  ********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  45) void __integer_invalid_size( __mpu_char8_t *name )
868b2b66 (kx 2024-12-20 16:11:07 +0300  46) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  47)   struct __exception  e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  48) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  49)   __integer_error_no = __I_ESIZE__; /* Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  50)   __STV; /* Set INTEGER Invalid operation Flag*/
868b2b66 (kx 2024-12-20 16:11:07 +0300  51) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  52)   e.who          = _INTEGER_;
868b2b66 (kx 2024-12-20 16:11:07 +0300  53)   e.type         = __integer_error_no;
868b2b66 (kx 2024-12-20 16:11:07 +0300  54)   e.name         = name;
868b2b66 (kx 2024-12-20 16:11:07 +0300  55)   e.msg          = __mpu_utf8mpu_error( _INTEGER_, __integer_error_no );
868b2b66 (kx 2024-12-20 16:11:07 +0300  56)   e.msg_type     = _ERROR_MSG_;
868b2b66 (kx 2024-12-20 16:11:07 +0300  57)   e.nb_a1        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  58)   e.nb_a2        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  59)   e.nb_rv        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  60)   e.arg_1        = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  61)   e.arg_2        = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  62)   e.return_value = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  63) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  64)   if( __extra_warnings )
868b2b66 (kx 2024-12-20 16:11:07 +0300  65)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  66)     __mpu_warning( &e );
868b2b66 (kx 2024-12-20 16:11:07 +0300  67)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  68) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  69)   if( e.msg ) free( e.msg );
868b2b66 (kx 2024-12-20 16:11:07 +0300  70) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  71)   return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  72) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  73) } /* End of __integer_invalid_size( __mpu_char8_t *name ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  74) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  75) void __integer_invalid_shift( __mpu_char8_t *name )
868b2b66 (kx 2024-12-20 16:11:07 +0300  76) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  77)   struct __exception  e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  78) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  79)   __integer_error_no = __I_ESHIFT__; /* Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300  80)   __STV; /* Set INTEGER Invalid operation Flag*/
868b2b66 (kx 2024-12-20 16:11:07 +0300  81) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  82)   e.who          = _INTEGER_;
868b2b66 (kx 2024-12-20 16:11:07 +0300  83)   e.type         = __integer_error_no;
868b2b66 (kx 2024-12-20 16:11:07 +0300  84)   e.name         = name;
868b2b66 (kx 2024-12-20 16:11:07 +0300  85)   e.msg          = __mpu_utf8mpu_error( _INTEGER_, __integer_error_no );
868b2b66 (kx 2024-12-20 16:11:07 +0300  86)   e.msg_type     = _ERROR_MSG_;
868b2b66 (kx 2024-12-20 16:11:07 +0300  87)   e.nb_a1        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  88)   e.nb_a2        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  89)   e.nb_rv        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  90)   e.arg_1        = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  91)   e.arg_2        = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  92)   e.return_value = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  93) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  94)   if( __extra_warnings )
868b2b66 (kx 2024-12-20 16:11:07 +0300  95)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  96)     __mpu_warning( &e );
868b2b66 (kx 2024-12-20 16:11:07 +0300  97)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  98) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  99)   if( e.msg ) free( e.msg );
868b2b66 (kx 2024-12-20 16:11:07 +0300 100) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 101)   return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 102) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 103) } /* End of __integer_invalid_shift( __mpu_char8_t *name ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 104) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 105) void __integer_invalid_number( __mpu_char8_t *name )
868b2b66 (kx 2024-12-20 16:11:07 +0300 106) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 107)   struct __exception  e;
868b2b66 (kx 2024-12-20 16:11:07 +0300 108) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 109)   __integer_error_no = __I_ENUMBER__; /* Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 110)   __STV; /* Set INTEGER Invalid operation Flag*/
868b2b66 (kx 2024-12-20 16:11:07 +0300 111) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 112)   e.who          = _INTEGER_;
868b2b66 (kx 2024-12-20 16:11:07 +0300 113)   e.type         = __integer_error_no;
868b2b66 (kx 2024-12-20 16:11:07 +0300 114)   e.name         = name;
868b2b66 (kx 2024-12-20 16:11:07 +0300 115)   e.msg          = __mpu_utf8mpu_error( _INTEGER_, __integer_error_no );
868b2b66 (kx 2024-12-20 16:11:07 +0300 116)   e.msg_type     = _ERROR_MSG_;
868b2b66 (kx 2024-12-20 16:11:07 +0300 117)   e.nb_a1        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 118)   e.nb_a2        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 119)   e.nb_rv        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 120)   e.arg_1        = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 121)   e.arg_2        = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 122)   e.return_value = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 123) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 124)   if( __extra_warnings )
868b2b66 (kx 2024-12-20 16:11:07 +0300 125)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 126)     __mpu_warning( &e );
868b2b66 (kx 2024-12-20 16:11:07 +0300 127)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 128) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 129)   if( e.msg ) free( e.msg );
868b2b66 (kx 2024-12-20 16:11:07 +0300 130) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 131)   return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 132) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 133) } /* End of __integer_invalid_number( __mpu_char8_t *name ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 134) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 135) void __integer_invalid_radix( __mpu_char8_t *name )
868b2b66 (kx 2024-12-20 16:11:07 +0300 136) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 137)   struct __exception  e;
868b2b66 (kx 2024-12-20 16:11:07 +0300 138) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 139)   __integer_error_no = __I_ERADIX__; /* Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 140)   __STV; /* Set INTEGER Invalid operation Flag*/
868b2b66 (kx 2024-12-20 16:11:07 +0300 141) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 142)   e.who          = _INTEGER_;
868b2b66 (kx 2024-12-20 16:11:07 +0300 143)   e.type         = __integer_error_no;
868b2b66 (kx 2024-12-20 16:11:07 +0300 144)   e.name         = name;
868b2b66 (kx 2024-12-20 16:11:07 +0300 145)   e.msg          = __mpu_utf8mpu_error( _INTEGER_, __integer_error_no );
868b2b66 (kx 2024-12-20 16:11:07 +0300 146)   e.msg_type     = _ERROR_MSG_;
868b2b66 (kx 2024-12-20 16:11:07 +0300 147)   e.nb_a1        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 148)   e.nb_a2        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 149)   e.nb_rv        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 150)   e.arg_1        = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 151)   e.arg_2        = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 152)   e.return_value = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 153) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 154)   if( __extra_warnings )
868b2b66 (kx 2024-12-20 16:11:07 +0300 155)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 156)     __mpu_warning( &e );
868b2b66 (kx 2024-12-20 16:11:07 +0300 157)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 158) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 159)   if( e.msg ) free( e.msg );
868b2b66 (kx 2024-12-20 16:11:07 +0300 160) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 161)   return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 162) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 163) } /* End of __integer_invalid_radix( __mpu_char8_t *name ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 164) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 165) /********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 166)   REAL operations error.
868b2b66 (kx 2024-12-20 16:11:07 +0300 167)  ********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 168) void __real_invalid_size( __mpu_char8_t *name )
868b2b66 (kx 2024-12-20 16:11:07 +0300 169) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 170)   struct __exception  e;
868b2b66 (kx 2024-12-20 16:11:07 +0300 171) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 172)   __real_error_no = __R_ESIZE__; /* Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 173)   __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 174) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 175)   e.who          = _REAL_;
868b2b66 (kx 2024-12-20 16:11:07 +0300 176)   e.type         = __real_error_no;
868b2b66 (kx 2024-12-20 16:11:07 +0300 177)   e.name         = name;
868b2b66 (kx 2024-12-20 16:11:07 +0300 178)   e.msg          = __mpu_utf8mpu_error( _REAL_, __real_error_no );
868b2b66 (kx 2024-12-20 16:11:07 +0300 179)   e.msg_type     = _ERROR_MSG_;
868b2b66 (kx 2024-12-20 16:11:07 +0300 180)   e.nb_a1        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 181)   e.nb_a2        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 182)   e.nb_rv        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 183)   e.arg_1        = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 184)   e.arg_2        = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 185)   e.return_value = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 186) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 187)   if( __extra_warnings )
868b2b66 (kx 2024-12-20 16:11:07 +0300 188)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 189)     __mpu_warning( &e );
868b2b66 (kx 2024-12-20 16:11:07 +0300 190)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 191) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 192)   if( e.msg ) free( e.msg );
868b2b66 (kx 2024-12-20 16:11:07 +0300 193) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 194)   return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 195) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 196) } /* End of __real_invalid_size( __mpu_char8_t *name ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 197) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 198) void __real_truncate_error( void )
868b2b66 (kx 2024-12-20 16:11:07 +0300 199) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 200)   struct __exception  e;
868b2b66 (kx 2024-12-20 16:11:07 +0300 201) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 202)   __real_error_no = __R_ETRUNC__; /* Invalid number of TRUNC bits(BZ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 203)   __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 204) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 205)   e.who          = _REAL_;
868b2b66 (kx 2024-12-20 16:11:07 +0300 206)   e.type         = __real_error_no;
868b2b66 (kx 2024-12-20 16:11:07 +0300 207)   e.name         = (__mpu_char8_t *)"ei_trunc";
868b2b66 (kx 2024-12-20 16:11:07 +0300 208)   e.msg          = __mpu_utf8mpu_error( _REAL_, __real_error_no );
868b2b66 (kx 2024-12-20 16:11:07 +0300 209)   e.msg_type     = _ERROR_MSG_;
868b2b66 (kx 2024-12-20 16:11:07 +0300 210)   e.nb_a1        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 211)   e.nb_a2        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 212)   e.nb_rv        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 213)   e.arg_1        = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 214)   e.arg_2        = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 215)   e.return_value = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 216) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 217)   if( __extra_warnings )
868b2b66 (kx 2024-12-20 16:11:07 +0300 218)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 219)     __mpu_warning( &e );
868b2b66 (kx 2024-12-20 16:11:07 +0300 220)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 221) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 222)   if( e.msg ) free( e.msg );
868b2b66 (kx 2024-12-20 16:11:07 +0300 223) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 224)   return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 225) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 226) } /* End of __real_truncate_error( void ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 227) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 228) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 229) void _mtherr( EMUSHORT *rc, __mpu_char8_t *name, int type, EMUSHORT *ret_val, EMUSHORT *arg1, EMUSHORT *arg2, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 230)   /* *rc;      - return code            */
868b2b66 (kx 2024-12-20 16:11:07 +0300 231)   /* *name;    - name of function       */
868b2b66 (kx 2024-12-20 16:11:07 +0300 232)   /*  type;    - type of ERROR          */
868b2b66 (kx 2024-12-20 16:11:07 +0300 233)   /* *ret_val; - internal e-type number */
868b2b66 (kx 2024-12-20 16:11:07 +0300 234)   /* *arg1;    - internal e-type number */
868b2b66 (kx 2024-12-20 16:11:07 +0300 235)   /* *arg2;    - internal e-type number */
868b2b66 (kx 2024-12-20 16:11:07 +0300 236)   /*  nb;      - number of bits         */
868b2b66 (kx 2024-12-20 16:11:07 +0300 237) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 238)   __mpu_byte_t        rv[NB_R_MAX],
868b2b66 (kx 2024-12-20 16:11:07 +0300 239)                       a1[NB_R_MAX],
868b2b66 (kx 2024-12-20 16:11:07 +0300 240)                       a2[NB_R_MAX];
868b2b66 (kx 2024-12-20 16:11:07 +0300 241)   int                 n_bytes;
868b2b66 (kx 2024-12-20 16:11:07 +0300 242)   int                 i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 243)   struct __exception  e;
868b2b66 (kx 2024-12-20 16:11:07 +0300 244) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 245)   /* ZERO: rv, a1, a2. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 246)   for( i = 0; i < NB_R_MAX; i++ ) { rv[i]=0; a1[i]=0; a2[i]=0; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 247) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 248)   n_bytes = nb / BITS_PER_BYTE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 249) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 250)   if( n_bytes > NB_R_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 251)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 252)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 253)     __real_invalid_size( (__mpu_char8_t *)"_mtherr" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 254)     _gen_zero( rc, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 255)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 256)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 257) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 258)   if( (type <= 0) || (type >= __M_MAX_ERRNO) ) type = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 259) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 260)   __math_error_no = type;
868b2b66 (kx 2024-12-20 16:11:07 +0300 261) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 262)   e.who           = _MATH_;
868b2b66 (kx 2024-12-20 16:11:07 +0300 263)   e.type          = type;
868b2b66 (kx 2024-12-20 16:11:07 +0300 264)   e.name          = name;
868b2b66 (kx 2024-12-20 16:11:07 +0300 265)   e.msg           = __mpu_utf8mpu_error( _MATH_, type );
868b2b66 (kx 2024-12-20 16:11:07 +0300 266)   e.msg_type      = _ERROR_MSG_;
868b2b66 (kx 2024-12-20 16:11:07 +0300 267) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 268)   /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 269)     RETURN VALUE
868b2b66 (kx 2024-12-20 16:11:07 +0300 270)    **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 271)   if( ret_val )
868b2b66 (kx 2024-12-20 16:11:07 +0300 272)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 273)     pack( (EMUSHORT *)rv, ret_val, nb ); 
868b2b66 (kx 2024-12-20 16:11:07 +0300 274)     e.nb_rv        = n_bytes;
868b2b66 (kx 2024-12-20 16:11:07 +0300 275)     e.return_value = (unsigned char *)rv;
868b2b66 (kx 2024-12-20 16:11:07 +0300 276)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 277)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300 278)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 279)     e.nb_rv        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 280)     e.return_value = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 281)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 282)   /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 283)     ARGUMENT NO _1_
868b2b66 (kx 2024-12-20 16:11:07 +0300 284)    *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 285)   if( arg1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 286)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 287)     pack( (EMUSHORT *)a1, arg1, nb ); 
868b2b66 (kx 2024-12-20 16:11:07 +0300 288)     e.nb_a1 = n_bytes;
868b2b66 (kx 2024-12-20 16:11:07 +0300 289)     e.arg_1 = (unsigned char *)a1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 290)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 291)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300 292)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 293)     e.nb_a1 = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 294)     e.arg_1 = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 295)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 296)   /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 297)     ARGUMENT NO _2_
868b2b66 (kx 2024-12-20 16:11:07 +0300 298)    *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 299)   if( arg2 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 300)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 301)     pack( (EMUSHORT *)a2, arg2, nb ); 
868b2b66 (kx 2024-12-20 16:11:07 +0300 302)     e.nb_a2 = n_bytes;
868b2b66 (kx 2024-12-20 16:11:07 +0300 303)     e.arg_2 = (unsigned char *)a2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 304)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 305)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300 306)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 307)     e.nb_a2 = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 308)     e.arg_2 = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 309)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 310) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 311)   if( !__mpu_math_error( &e ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 312)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 313)     /* ERROR NOT TREAT */
868b2b66 (kx 2024-12-20 16:11:07 +0300 314) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 315)     errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 316) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 317)     if( __extra_warnings )
868b2b66 (kx 2024-12-20 16:11:07 +0300 318)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 319)       __mpu_warning( &e );
868b2b66 (kx 2024-12-20 16:11:07 +0300 320)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 321) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 322)   } /* End if( !_math_error( &e ) ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 323) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 324)   if( rc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 325)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 326)     unpack( rc, (EMUSHORT *)e.return_value, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 327)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 328) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 329)   if( e.msg ) free( e.msg );
868b2b66 (kx 2024-12-20 16:11:07 +0300 330) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 331) } /* End of _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 332) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 333) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 334) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 335)   Hide internal symbols:
868b2b66 (kx 2024-12-20 16:11:07 +0300 336)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 337) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 338) __mpu_hidden_decl(__integer_invalid_size);
868b2b66 (kx 2024-12-20 16:11:07 +0300 339) __mpu_hidden_decl(__integer_invalid_shift);
868b2b66 (kx 2024-12-20 16:11:07 +0300 340) __mpu_hidden_decl(__integer_invalid_number);
868b2b66 (kx 2024-12-20 16:11:07 +0300 341) __mpu_hidden_decl(__integer_invalid_radix);
868b2b66 (kx 2024-12-20 16:11:07 +0300 342) __mpu_hidden_decl(__real_invalid_size);
868b2b66 (kx 2024-12-20 16:11:07 +0300 343) __mpu_hidden_decl(__real_truncate_error);
868b2b66 (kx 2024-12-20 16:11:07 +0300 344) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 345) __mpu_hidden_decl(_mtherr);
868b2b66 (kx 2024-12-20 16:11:07 +0300 346) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 347) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 348) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 349)   End of hide internal symbols.
868b2b66 (kx 2024-12-20 16:11:07 +0300 350)  ***************************************************************/