MCPcopy Create free account
hub / github.com/defold/defold / dmStrError

Function dmStrError

engine/dlib/src/dlib/dstrings.cpp:264–330  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

262#endif // DM_NO_ERRNO
263
264void dmStrError(char* dst, size_t size, int err)
265{
266 if (dst == 0 || size == 0)
267 {
268 return;
269 }
270
271 char scratch[256];
272 const size_t scratch_size = sizeof(scratch);
273 size_t err_msg_len = 0;
274 int old_errno = errno;
275 char* retstr = 0;
276
277#ifdef DM_STRERROR_USE_POSIX
278 int ret = DM_STRERROR_FN(scratch, scratch_size, err);
279
280 if (ret == 0 || ret == ERANGE)
281 {
282 // apparently windows returns a success ret value and a "Unknown error" string
283 // even if it's not a supported errno
284 if (dmStrCaseCmp("Unknown error", scratch) == 0)
285 {
286 dmSnPrintf(scratch, scratch_size, "Unknown error %d", err);
287 }
288 // Another platform returns "error_code=0xffffffff"
289 else if (strstr(scratch, "error_code=0x") == scratch)
290 {
291 dmSnPrintf(scratch, scratch_size, "Unknown error %d", err);
292 }
293 }
294 else
295 {
296 if (ret == EINVAL)
297 {
298 dmSnPrintf(scratch, scratch_size, "Unknown error %d", err);
299 }
300 else
301 {
302 dmSnPrintf(scratch, scratch_size, "Failed getting error (code %d)", ret);
303 }
304 }
305
306 retstr = &scratch[0];
307#endif
308
309#ifdef DM_STRERROR_USE_GNU
310 // GNU version, char* returned
311 retstr = strerror_r(err, scratch, scratch_size);
312#endif
313
314#ifdef DM_STRERROR_USE_UNSAFE
315 retstr = strerror(err);
316#endif
317
318 err_msg_len = strlen(retstr) + 1;
319
320 // Restore errno in case strerror variants raised error
321 errno = old_errno;

Callers 4

Sys_SaveFunction · 0.85
EndFunction · 0.85
TESTFunction · 0.85
MapFileFunction · 0.85

Calls 2

dmStrCaseCmpFunction · 0.85
dmSnPrintfFunction · 0.85

Tested by 1

TESTFunction · 0.68