Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libast/string/strerror.c
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1985-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* David Korn <[email protected]> *
19
* Phong Vo <[email protected]> *
20
* *
21
***********************************************************************/
22
#pragma prototyped
23
24
/*
25
* Glenn Fowler
26
* AT&T Research
27
*
28
* return error message string given errno
29
*/
30
31
#include "lclib.h"
32
33
#include "FEATURE/errno"
34
35
#undef strerror
36
37
#if !defined(sys_errlist) && !_def_errno_sys_errlist
38
#if _dat_sys_errlist
39
extern char* sys_errlist[];
40
#else
41
#undef _dat_sys_nerr
42
char* sys_errlist[] = { 0 };
43
#endif
44
#endif
45
46
#if !defined(sys_nerr) && !_def_errno_sys_nerr
47
#if _dat_sys_nerr
48
extern int sys_nerr;
49
#else
50
#undef _dat_sys_nerr
51
int sys_nerr = 0;
52
#endif
53
#endif
54
55
#if _lib_strerror
56
extern char* strerror(int);
57
#endif
58
59
#if _PACKAGE_astsa
60
61
#define fmtbuf(n) ((n),tmp)
62
63
static char tmp[32];
64
65
#endif
66
67
char*
68
_ast_strerror(int err)
69
{
70
char* msg;
71
int z;
72
73
#if _lib_strerror
74
z = errno;
75
msg = strerror(err);
76
errno = z;
77
#else
78
if (err > 0 && err <= sys_nerr)
79
msg = (char*)sys_errlist[err];
80
else
81
msg = 0;
82
#endif
83
if (msg)
84
{
85
#if !_PACKAGE_astsa
86
if (ERROR_translating())
87
{
88
#if _lib_strerror
89
static int sys;
90
91
if (!sys)
92
{
93
char* s;
94
char* t;
95
char* p;
96
97
#if _lib_strerror
98
/*
99
* stash the pending strerror() msg
100
*/
101
102
msg = strcpy(fmtbuf(strlen(msg) + 1), msg);
103
#endif
104
105
/*
106
* make sure that strerror() translates
107
*/
108
109
if (!(s = strerror(1)))
110
sys = -1;
111
else
112
{
113
t = fmtbuf(z = strlen(s) + 1);
114
strcpy(t, s);
115
ast.locale.set |= AST_LC_internal;
116
p = setlocale(LC_MESSAGES, NiL);
117
setlocale(LC_MESSAGES, "C");
118
sys = (s = strerror(1)) && strcmp(s, t) ? 1 : -1;
119
setlocale(LC_MESSAGES, p);
120
ast.locale.set &= ~AST_LC_internal;
121
}
122
}
123
if (sys > 0)
124
return msg;
125
#endif
126
return ERROR_translate(NiL, NiL, "errlist", msg);
127
}
128
#endif
129
return msg;
130
}
131
msg = fmtbuf(z = 32);
132
sfsprintf(msg, z, ERROR_translate(NiL, NiL, "errlist", "Error %d"), err);
133
return msg;
134
}
135
136
#if !_lib_strerror
137
138
#if defined(__EXPORT__)
139
#define extern __EXPORT__
140
#endif
141
142
extern char*
143
strerror(int err)
144
{
145
return _ast_strerror(err);
146
}
147
148
#endif
149
150