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_STRERROR.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) getting MATH ERROR messages.
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-mtherr.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 37)
868b2b66 (kx 2024-12-20 16:11:07 +0300 38) #include <mpu-real.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 39)
868b2b66 (kx 2024-12-20 16:11:07 +0300 40)
868b2b66 (kx 2024-12-20 16:11:07 +0300 41) #define MPU_MATH_EUNKNOWN_MSG "Unknown MPU error"
868b2b66 (kx 2024-12-20 16:11:07 +0300 42)
868b2b66 (kx 2024-12-20 16:11:07 +0300 43) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 44) __mpu_utf8mpu_error()
868b2b66 (kx 2024-12-20 16:11:07 +0300 45)
868b2b66 (kx 2024-12-20 16:11:07 +0300 46) Возврашает указатель на строку, содержащую текстовый
868b2b66 (kx 2024-12-20 16:11:07 +0300 47) эквивалент ошибок MPU( Math Processor Unit ), имеющих
868b2b66 (kx 2024-12-20 16:11:07 +0300 48) код ERRNUM.
868b2b66 (kx 2024-12-20 16:11:07 +0300 49)
868b2b66 (kx 2024-12-20 16:11:07 +0300 50) Параметр WHO определяет источник ошибки и может иметь
868b2b66 (kx 2024-12-20 16:11:07 +0300 51) одно из, определенных в __tx_math_errno.h, значений:
868b2b66 (kx 2024-12-20 16:11:07 +0300 52) #define _COMPLEX_ 3
868b2b66 (kx 2024-12-20 16:11:07 +0300 53) #define _REAL_ 2
868b2b66 (kx 2024-12-20 16:11:07 +0300 54) #define _INTEGER_ 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 55) #define _MATH_ 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 56) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 57)
868b2b66 (kx 2024-12-20 16:11:07 +0300 58) Возвращаемое значение переводится в кодировку UTF-8,
868b2b66 (kx 2024-12-20 16:11:07 +0300 59) согласно локали ru.
868b2b66 (kx 2024-12-20 16:11:07 +0300 60)
868b2b66 (kx 2024-12-20 16:11:07 +0300 61) В случае ошибки возвращает RET == (__mpu_utf8_t *)NULL.
868b2b66 (kx 2024-12-20 16:11:07 +0300 62) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 63) ====
868b2b66 (kx 2024-12-20 16:11:07 +0300 64) Функция выделяет память под возвращаемый указатель.
868b2b66 (kx 2024-12-20 16:11:07 +0300 65) Ответственность за освобождение данной памяти лежит
868b2b66 (kx 2024-12-20 16:11:07 +0300 66) на ползователе.
868b2b66 (kx 2024-12-20 16:11:07 +0300 67) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 68) __mpu_utf8_t *
868b2b66 (kx 2024-12-20 16:11:07 +0300 69) __mpu_utf8mpu_error( int who, __mpu_error_t errnum )
868b2b66 (kx 2024-12-20 16:11:07 +0300 70) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 71) __mpu_utf8_t *e = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 72) __mpu_utf8_t *ret = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 73)
868b2b66 (kx 2024-12-20 16:11:07 +0300 74) switch( who )
868b2b66 (kx 2024-12-20 16:11:07 +0300 75) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 76) case _COMPLEX_:
868b2b66 (kx 2024-12-20 16:11:07 +0300 77) e = (__mpu_utf8_t *)__MPU_COMPLEX_ERR_MSG( errnum );
868b2b66 (kx 2024-12-20 16:11:07 +0300 78) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 79) case _REAL_ :
868b2b66 (kx 2024-12-20 16:11:07 +0300 80) e = (__mpu_utf8_t *)__MPU_REAL_ERR_MSG( errnum );
868b2b66 (kx 2024-12-20 16:11:07 +0300 81) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 82) case _INTEGER_:
868b2b66 (kx 2024-12-20 16:11:07 +0300 83) e = (__mpu_utf8_t *)__MPU_INTEGER_ERR_MSG( errnum );
868b2b66 (kx 2024-12-20 16:11:07 +0300 84) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 85) case _MATH_ :
868b2b66 (kx 2024-12-20 16:11:07 +0300 86) e = (__mpu_utf8_t *)__MPU_MATH_ERR_MSG( errnum );
868b2b66 (kx 2024-12-20 16:11:07 +0300 87) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 88) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 89) if( e == (__mpu_utf8_t *)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 90) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 91) /****************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 92) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 93) MPU_MATH_ERROR_MSG_SIZE определено в
868b2b66 (kx 2024-12-20 16:11:07 +0300 94) LIBMPU.H ( == 4096).
868b2b66 (kx 2024-12-20 16:11:07 +0300 95) ****************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 96) static __mpu_utf8_t unknow_error[MPU_MATH_ERROR_MSG_SIZE];
868b2b66 (kx 2024-12-20 16:11:07 +0300 97) static __mpu_utf8_t code_error[64];
868b2b66 (kx 2024-12-20 16:11:07 +0300 98)
868b2b66 (kx 2024-12-20 16:11:07 +0300 99) strncpy( unknow_error, (__mpu_utf8_t *)MPU_MATH_EUNKNOWN_MSG, (size_t)(MPU_MATH_ERROR_MSG_SIZE-1) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 100) unknow_error[MPU_MATH_ERROR_MSG_SIZE-1] = '\0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 101) snprintf( code_error, (size_t)64, ": #%d", errnum );
868b2b66 (kx 2024-12-20 16:11:07 +0300 102) strncat( unknow_error, code_error, (size_t)(MPU_MATH_ERROR_MSG_SIZE-1) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 103) unknow_error[MPU_MATH_ERROR_MSG_SIZE-1] = '\0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 104)
868b2b66 (kx 2024-12-20 16:11:07 +0300 105) e = unknow_error;
868b2b66 (kx 2024-12-20 16:11:07 +0300 106) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 107)
868b2b66 (kx 2024-12-20 16:11:07 +0300 108) /* а вот теперь можно применить gettext: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 109) /* ==================================== */
868b2b66 (kx 2024-12-20 16:11:07 +0300 110) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 111) #if ENABLE_NLS == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 112) char *back_locale = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 113) char *lt = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 114) char *back_env = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 115) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 116) size_t len = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 117)
868b2b66 (kx 2024-12-20 16:11:07 +0300 118) #if ENABLE_NLS == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 119) /*******************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 120) Так как gettext в первую очередь проверяет LC_ALL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 121) затем LC_MESSAGE и в процессе работы пользуется
868b2b66 (kx 2024-12-20 16:11:07 +0300 122) LC_CTYPE, мы для простоты временно выставляем LC_ALL.
868b2b66 (kx 2024-12-20 16:11:07 +0300 123) Использование LC_MESSAGE при отличном от него LC_ALL
868b2b66 (kx 2024-12-20 16:11:07 +0300 124) нам ничего не даст.
868b2b66 (kx 2024-12-20 16:11:07 +0300 125) *******************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 126) back_locale = setlocale( LC_ALL, (const char *)NULL );
868b2b66 (kx 2024-12-20 16:11:07 +0300 127) lt = setlocale( LC_ALL, (const char *)"ru" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 128)
868b2b66 (kx 2024-12-20 16:11:07 +0300 129) back_env = getenv( (const char *)"LANGUAGE" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 130) (void)setenv( (const char *)"LANGUAGE", (const char *)"ru", 1 /* 1 - overwrite */ );
868b2b66 (kx 2024-12-20 16:11:07 +0300 131)
868b2b66 (kx 2024-12-20 16:11:07 +0300 132) e = (__mpu_utf8_t *)dgettext( PACKAGE, (const char *)e );
868b2b66 (kx 2024-12-20 16:11:07 +0300 133) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 134)
868b2b66 (kx 2024-12-20 16:11:07 +0300 135) len = strlen( e );
868b2b66 (kx 2024-12-20 16:11:07 +0300 136) ret = (__mpu_utf8_t *)malloc( (len + 1) * sizeof( __mpu_utf8_t ) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 137) if( !ret )
868b2b66 (kx 2024-12-20 16:11:07 +0300 138) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 139) #if ENABLE_NLS == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 140) /* restore locale and environment */
868b2b66 (kx 2024-12-20 16:11:07 +0300 141) if( back_locale )
868b2b66 (kx 2024-12-20 16:11:07 +0300 142) (void)setlocale( LC_ALL, (const char *)back_locale );
868b2b66 (kx 2024-12-20 16:11:07 +0300 143)
868b2b66 (kx 2024-12-20 16:11:07 +0300 144) if( back_env )
868b2b66 (kx 2024-12-20 16:11:07 +0300 145) (void)setenv( (const char *)"LANGUAGE", (const char *)back_env, 1 /* 1 - overwrite */ );
868b2b66 (kx 2024-12-20 16:11:07 +0300 146) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 147)
868b2b66 (kx 2024-12-20 16:11:07 +0300 148) return( (__mpu_utf8_t *)NULL );
868b2b66 (kx 2024-12-20 16:11:07 +0300 149) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 150)
868b2b66 (kx 2024-12-20 16:11:07 +0300 151) strncpy( ret, e, len+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 152)
868b2b66 (kx 2024-12-20 16:11:07 +0300 153) #if ENABLE_NLS == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 154) /* restore locale and environment */
868b2b66 (kx 2024-12-20 16:11:07 +0300 155) if( back_locale )
868b2b66 (kx 2024-12-20 16:11:07 +0300 156) (void)setlocale( LC_ALL, (const char *)back_locale );
868b2b66 (kx 2024-12-20 16:11:07 +0300 157)
868b2b66 (kx 2024-12-20 16:11:07 +0300 158) if( back_env )
868b2b66 (kx 2024-12-20 16:11:07 +0300 159) (void)setenv( (const char *)"LANGUAGE", (const char *)back_env, 1 /* 1 - overwrite */ );
868b2b66 (kx 2024-12-20 16:11:07 +0300 160) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 161) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 162)
868b2b66 (kx 2024-12-20 16:11:07 +0300 163) return( ret );
868b2b66 (kx 2024-12-20 16:11:07 +0300 164)
868b2b66 (kx 2024-12-20 16:11:07 +0300 165) } /* End of __mpu_utf8mpu_error() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 166)