author: kx <kx@radix-linux.su> 2024-12-20 16:11:07 +0300
committer: kx <kx@radix-linux.su> 2024-12-20 16:11:07 +0300
commit: 868b2b66b564b5c00e3a74d10be45db7151627ac
parent: cce2ae8d3312493b7653358bb4af201d3271377b
Commit Summary:
Diffstat:
1 file changed, 286 insertions, 0 deletions
diff --git a/mpu/mpu-math-errno.c b/mpu/mpu-math-errno.c
new file mode 100644
index 0000000..f5a7e9e
--- /dev/null
+++ b/mpu/mpu-math-errno.c
@@ -0,0 +1,365 @@
+
+/***************************************************************
+ __MPU_MATH_ERRNO.C
+
+ This file contains source code of functions for
+ MATH ERRNO SUPPRESS 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 <config.h>
+#endif
+
+#include <nls.h>
+
+#include <errno.h>
+
+#include <libmpu.h>
+#include <mpu-context.h>
+#include <mpu-symbols.h>
+
+#include <mpu-math-errno.h>
+
+
+#ifndef _ERR_REMAP
+# define _ERR_REMAP(n) n
+#endif
+
+const __mpu_char8_t *const __mpu_integer_errlist[] =
+{
+ /************************************************************
+ Нет ошибки.
+ ************************************************************/
+ /* 0 */
+ [0] = (__mpu_char8_t *)N_("Success"),
+
+#ifdef __I_ESIZE__
+ /************************************************************
+ Invalid size of operand(s).
+ ==========================================================
+ Недопустимый размер операнда/операндов.
+
+ В типичном случае эта ошибка указывает на то, что
+ при вызове функции целочисленной арифметики был
+ задан нулевой размер операнда.
+ ************************************************************/
+ /* 1 __I_ESIZE__ */
+ [_ERR_REMAP(__I_ESIZE__)] = (__mpu_char8_t *)N_("Invalid size of operand(s)"),
+#endif
+
+#ifdef __I_ESHIFT__
+ /************************************************************
+ Invalid number of shifts.
+ ==========================================================
+ Недопустимое количество сдвигов операнда на один бит.
+
+ ************************************************************/
+ /* 2 __I_ESHIFT__ */
+ [_ERR_REMAP(__I_ESHIFT__)] = (__mpu_char8_t *)N_("Invalid number of shifts"),
+#endif
+
+#ifdef __I_ENUMBER__
+ /************************************************************
+ Invalid number.
+ ==========================================================
+ Недопустимая числовая константа.
+
+ В типичном случае эта ошибка указывает на то, что
+ при вызове функции перевода числовой константы из
+ строкового представления в целое число был обнаружен
+ символ, недопустимый для представления числовых
+ констант.
+ ************************************************************/
+ /* 3 __I_ENUMBER__ */
+ [_ERR_REMAP(__I_ENUMBER__)] = (__mpu_char8_t *)N_("Invalid number"),
+#endif
+
+#ifdef __I_ERADIX__
+ /************************************************************
+ Invalid radix.
+ ==========================================================
+ Недопустимая система счисления.
+
+ В типичном случае эта ошибка указывает на то, что
+ при вызове функции перевода числовой константы из
+ строкового представления в целое число или наоборот
+ была задана недопустимая исходная или целевая система
+ счисления.
+ ************************************************************/
+ /* 4 __I_ERADIX__ */
+ [_ERR_REMAP(__I_ERADIX__)] = (__mpu_char8_t *)N_("Invalid radix"),
+#endif
+
+
+ [_ERR_REMAP(__I_MAX_ERRNO)] = (__mpu_char8_t *)0 /* __TX_MATH_EUNKNOW_MSG */
+
+};
+
+const __mpu_error_t __mpu_integer_nerr = sizeof( __mpu_integer_errlist ) /
+ sizeof( __mpu_integer_errlist[0] ) - 1;
+
+
+
+const __mpu_char8_t *const __mpu_real_errlist[] =
+{
+ /************************************************************
+ Нет ошибки.
+ ************************************************************/
+ /* 0 */
+ [0] = (__mpu_char8_t *)N_("Success"),
+
+#ifdef __R_ESIZE__
+ /************************************************************
+ Invalid size of operand(s).
+ ==========================================================
+ Недопустимый размер операнда/операндов.
+
+ В типичном случае эта ошибка указывает на то, что
+ при вызове функции арифметики вещественных чисел был
+ задан нулевой размер операнда.
+ ************************************************************/
+ /* 1 __R_ESIZE__ */
+ [_ERR_REMAP(__R_ESIZE__)] = (__mpu_char8_t *)N_("Invalid size of operand(s)"),
+#endif
+
+#ifdef __R_ETRUNC__
+ /************************************************************
+ Invalid number of TRUNC bits(BZ).
+ ==========================================================
+ Недопустимое количество отсекаемых бит.
+
+ В типичном случае эта ошибка указывает на то, что
+ при вызове функции арифметики вещественных чисел во
+ время операций нормализации или округления, количество
+ обнуляемых бит оказалось больше чем количество бит
+ мантиссы (см. ei_TRUNC() в math_f.c).
+ ************************************************************/
+ /* 2 __R_ETRUNC__ */
+ [_ERR_REMAP(__R_ETRUNC__)] = (__mpu_char8_t *)N_("Invalid number of TRUNC bits(BZ)"),
+#endif
+
+
+ [_ERR_REMAP(__R_MAX_ERRNO)] = (__mpu_char8_t *)0 /* __TX_MATH_EUNKNOW_MSG */
+
+};
+
+const __mpu_error_t __mpu_real_nerr = sizeof( __mpu_real_errlist ) /
+ sizeof( __mpu_real_errlist[0] ) - 1;
+
+
+
+const __mpu_char8_t *const __mpu_complex_errlist[] =
+{
+ /************************************************************
+ Нет ошибки.
+ ************************************************************/
+ /* 0 */
+ [0] = (__mpu_char8_t *)N_("Success"),
+
+#ifdef __C_EDIVZEROBYZERO__
+ /************************************************************
+ Complex attempted division by zero( Divide ZERO by ZERO).
+ ==========================================================
+ Деление НУЛЯ на НУЛЬ.
+
+ Эта ошибка указывает на то, что при вызове функции
+ арифметики комплексных чисел была попытка разделить
+ НУЛЬ на НУЛЬ.
+ ************************************************************/
+ /* 1 __C_EDIVZEROBYZERO__ */
+ [_ERR_REMAP(__C_EDIVZEROBYZERO__)] = (__mpu_char8_t *)N_("Complex attempted division by zero"),
+#endif
+
+#ifdef __C_ELOGOFZERO__
+ /************************************************************
+ Complex attempted LOG of zero magnitude number.
+ ==========================================================
+ Вычисление логарифма НУЛЯ.
+
+ Эта ошибка указывает на то, что при вызове функции
+ вычисления логарифма комплексного числа был задан
+ операнд, равный НУЛЮ.
+ ************************************************************/
+ /* 2 __C_ELOGOFZERO__ */
+ [_ERR_REMAP(__C_ELOGOFZERO__)] = (__mpu_char8_t *)N_("Complex attempted LOG of zero magnitude number"),
+#endif
+
+#ifdef __C_EPOWOFZERO__
+ /************************************************************
+ Complex attempted POW of zero magnitude number.
+ ==========================================================
+ Возведение в степень НУЛЯ.
+
+ Эта ошибка указывает на то, что при вызове функции
+ возведения комплексного числа в степень был задан
+ операнд, равный НУЛЮ.
+ ************************************************************/
+ /* 3 __C_EPOWOFZERO__ */
+ [_ERR_REMAP(__C_EPOWOFZERO__)] = (__mpu_char8_t *)N_("Complex attempted POW of zero magnitude number"),
+#endif
+
+
+ [_ERR_REMAP(__C_MAX_ERRNO)] = (__mpu_char8_t *)0 /* __TX_MATH_EUNKNOW_MSG */
+
+};
+
+const __mpu_error_t __mpu_complex_nerr = sizeof( __mpu_complex_errlist ) /
+ sizeof( __mpu_complex_errlist[0] ) - 1;
+
+
+
+const __mpu_char8_t *const __mpu_math_errlist[] =
+{
+ /************************************************************
+ Нет ошибки.
+ ************************************************************/
+ /* 0 */
+ [0] = (__mpu_char8_t *)N_("Success"),
+
+#ifdef __DOMAIN__
+ /************************************************************
+ Argument domain error.
+ ==========================================================
+ Math argument (Domain error)
+ (Ошибка в задании параметра математической функции)
+
+ Значение параметра функции из библиотеки математических
+ функций лежит вне области определения этой функции.
+ ************************************************************/
+ /* 1 __DOMAIN__ */
+ [_ERR_REMAP(__DOMAIN__)] = (__mpu_char8_t *)N_("Argument domain"),
+#endif
+
+#ifdef __SING__
+ /************************************************************
+ Argument singularity error.
+ ==========================================================
+
+ ************************************************************/
+ /* 2 __SING__ */
+ [_ERR_REMAP(__SING__)] = (__mpu_char8_t *)N_("Function singularity"),
+#endif
+
+#ifdef __OVERFLOW__
+ /************************************************************
+ Overflow range error.
+ ==========================================================
+
+ ************************************************************/
+ /* 3 __OVERFLOW__ */
+ [_ERR_REMAP(__OVERFLOW__)] = (__mpu_char8_t *)N_("Overflow range"),
+#endif
+
+#ifdef __UNDERFLOW__
+ /************************************************************
+ Underflow range error.
+ ==========================================================
+
+ ************************************************************/
+ /* 4 __UNDERFLOW__ */
+ [_ERR_REMAP(__UNDERFLOW__)] = (__mpu_char8_t *)N_("Underflow range"),
+#endif
+
+#ifdef __TLOSS__
+ /************************************************************
+ Total loss of precision.
+ ==========================================================
+
+ ************************************************************/
+ /* 5 __TLOSS__ */
+ [_ERR_REMAP(__TLOSS__)] = (__mpu_char8_t *)N_("Total loss of precision"),
+#endif
+
+#ifdef __PLOSS__
+ /************************************************************
+ Partial loss of precision.
+ ==========================================================
+
+ ************************************************************/
+ /* 6 __PLOSS__ */
+ [_ERR_REMAP(__PLOSS__)] = (__mpu_char8_t *)N_("Partial loss of precision"),
+#endif
+
+#ifdef __INVALID__
+ /************************************************************
+ -InD - produsing operation.
+ ==========================================================
+
+ ************************************************************/
+ /* 7 __INVALID__ */
+ [_ERR_REMAP(__INVALID__)] = (__mpu_char8_t *)N_("Invalid operation"),
+#endif
+
+#ifdef __INEXACT__
+ /************************************************************
+ Inexact result of operation.
+ ==========================================================
+
+ ************************************************************/
+ /* 8 __INEXACT__ */
+ [_ERR_REMAP(__INEXACT__)] = (__mpu_char8_t *)N_("Inexact result of operation"),
+#endif
+
+
+ [_ERR_REMAP(__M_MAX_ERRNO)] = (__mpu_char8_t *)0 /* __TX_MATH_EUNKNOW_MSG */
+
+};
+
+const __mpu_error_t __mpu_math_nerr = sizeof( __mpu_math_errlist ) /
+ sizeof( __mpu_math_errlist[0] ) - 1;
+
+
+/***************************************************************
+ Таблица перевода кодов ошибок математических функций
+ в системные коды ошибок.
+
+ Код __EUNKNOWN__ в нашем случае равен НУЛЮ. Это сделано
+ для того, чтобы __EUNKNOWN__-вхождения в таблицу
+ __mpu_math_errnotab[] возвращали НУЛЬ - то есть код,
+ который говорит об отсутствии ошибок. Таким образом
+ перевод кода __EUNKNOWN__ в системный код ошибки дает
+ нулевой результат( отсутствие системной ошибки ).
+ ***************************************************************/
+int __mpu_math_errnotab[] =
+{
+ /*
+ syserror value <== matherror value
+ ************************************/
+ __EUNKNOWN__, /* Success */
+ EDOM, /* __DOMAIN__ */
+ EDOM, /* __SING__ */
+ ERANGE, /* __OVERFLOW__ */
+ ERANGE, /* __UNDERFLOW__ */
+ ERANGE, /* __TLOSS__ */
+ ERANGE, /* __PLOSS__ */
+ EDOM, /* __INVALID__ */
+ ERANGE, /* __INEXACT__ */
+ __EUNKNOWN__ /* __M_MAX_ERRNO */
+};
+
+
+/***************************************************************
+ Hide internal symbols:
+ ***************************************************************/
+__mpu_hidden_decl(__mpu_integer_errlist);
+__mpu_hidden_decl(__mpu_integer_nerr);
+__mpu_hidden_decl(__mpu_real_errlist);
+__mpu_hidden_decl(__mpu_real_nerr);
+__mpu_hidden_decl(__mpu_complex_errlist);
+__mpu_hidden_decl(__mpu_complex_nerr);
+__mpu_hidden_decl(__mpu_math_errlist);
+__mpu_hidden_decl(__mpu_math_nerr);
+
+__mpu_hidden_decl(__mpu_math_errnotab);
+/*
+ End of hide internal symbols.
+ ***************************************************************/