1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
.TH MPU_PERROR 3 "Август 2026" "libmpuio" "Руководство программиста LIBMPUIO"
.SH ИМЯ
mpu_perror, mpu_strerror_r \- сформировать строгую UCS-2 диагностику для значений errno
.SH ОБЗОР
.nf
#include <libmpuio.h>
void mpu_perror( const __mpu_char16_t *prefix );
int mpu_strerror_r( int errnum, __mpu_char16_t *buffer, size_t size );
.fi
.SH ОПИСАНИЕ
.B mpu_strerror_r
получает из libc диагностическое сообщение, соответствующее
.IR errnum ,
и преобразует его из многобайтовой кодировки текущей локали
.B LC_CTYPE
в строгий UCS-2. Преобразованная строка помещается в
.I buffer
и завершается нулём UCS-2.
.PP
.I size
измеряется в кодовых единицах
.BR __mpu_char16_t ,
а не в байтах. Буфер принадлежит вызывающей стороне и после возврата функции
может использоваться повторно. При успехе функция сохраняет исходное значение
.B errno
вызывающей стороны.
.PP
.B mpu_perror
выводит диагностическое сообщение для текущего значения
.B errno
в
.BR mpu_stderr .
Если
.I prefix
не равен NULL и не пуст, сначала выводится он, затем двоеточие, один пробел,
преобразованное диагностическое сообщение и символ новой строки. Вся запись
защищается рекурсивной блокировкой
.BR mpu_stderr ,
поэтому вызовы LIBMPUIO не перемешивают отдельные части prefix/message.
.B mpu_perror
восстанавливает исходное значение errno перед возвратом.
.SH ПРЕОБРАЗОВАНИЕ СИМВОЛОВ
Исходный текст ошибки поступает из libc и, следовательно, соответствует локали
процесса
.BR LC_CTYPE .
LIBMPUIO преобразует этот многобайтовый текст в своё строгое 16-битное
представление UCS-2 до передачи через обычный потоковый слой. Вывод в реальный
файл затем проходит стандартную границу преобразования UCS-2 в UTF-8.
.PP
Суррогатные кодовые единицы и символы, требующие скалярных значений Unicode
выше U+FFFF, не представимы в строгом UCS-2 LIBMPUIO и приводят к ошибке
преобразования
.BR EILSEQ .
Для самой
.B mpu_perror
ошибка преобразования или выделения памяти заменяется простым ASCII-сообщением
"Error N", чтобы диагностическая операция всё равно вывела запись.
.SH ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
.B mpu_strerror_r
возвращает ноль при успехе и -1 при ошибке.
.B mpu_perror
не возвращает значения.
.SH ОШИБКИ
.B mpu_strerror_r
может завершиться со следующими ошибками:
.TP
.B EINVAL
.I buffer
равен NULL или
.I size
равен нулю.
.TP
.B ERANGE
В буфере вызывающей стороны недостаточно места для полного диагностического
сообщения UCS-2 и завершающего NUL. Если был предоставлен буфер ненулевого
размера, его первая кодовая единица устанавливается в NUL.
.TP
.B EILSEQ
Многобайтовое диагностическое сообщение текущей локали некорректно либо не
представимо в строгом UCS-2.
.TP
.B ENOMEM
Не удалось выделить временное хранилище для диагностического сообщения libc.
.SH ПОТОКОБЕЗОПАСНОСТЬ
Каждый результат
.B mpu_strerror_r
помещается в память, принадлежащую вызывающей стороне. Доступ к временному
результату libc
.B strerror
сериализуется на время, пока LIBMPUIO делает приватную копию, поэтому
параллельные диагностические преобразования LIBMPUIO не открывают общий буфер
результата.
.PP
Как и для других зависящих от локали преобразований стандартной библиотеки C,
одновременное изменение глобальной локали процесса и выполнение активных
преобразований находится вне гарантированной модели использования.
.SH ПРИМЕРЫ
.nf
__mpu_char16_t message[256];
if( mpu_strerror_r( errno, message, 256 ) == 0 )
mpu_fprintf( mpu_stderr, MPU_UCS2("failure: %s\\n"), message );
errno = ENOENT;
mpu_perror( MPU_UCS2("open") );
.fi
.SH СМ. ТАКЖЕ
.BR libmpuio (3),
.BR mpu_fopen (3),
.BR mpu_fprintf (3),
.BR mpu_flockfile (3)
|