Add perror()

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@5061 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
patacongo
2012-08-28 19:01:14 +00:00
parent bbe3db55f2
commit f53d3ecc71
13 changed files with 396 additions and 21 deletions
+141 -3
View File
@@ -1,8 +1,8 @@
/************************************************************************
* lib/string/lib_strerror.c
*
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
* Copyright (C) 2007, 2009, 2011-2012 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -61,6 +61,8 @@ struct errno_strmap_s
* Private Data
************************************************************************/
#ifdef CONFIG_LIBC_STRERROR
/* This table maps all error numbers to descriptive strings.
* The only assumption that the code makes with regard to this
* this table is that it is ordered by error number.
@@ -70,6 +72,8 @@ struct errno_strmap_s
* strings.
*/
#ifndef CONFIG_LIBC_STRERROR_SHORT
static const struct errno_strmap_s g_errnomap[] =
{
{ EPERM, EPERM_STR },
@@ -196,8 +200,140 @@ static const struct errno_strmap_s g_errnomap[] =
{ EMEDIUMTYPE, EMEDIUMTYPE_STR }
};
#else /* CONFIG_LIBC_STRERROR_SHORT */
static const struct errno_strmap_s g_errnomap[] =
{
{ EPERM, "EPERM" },
{ ENOENT, "ENOENT" },
{ ESRCH, "ESRCH" },
{ EINTR, "EINTR" },
{ EIO, "EIO" },
{ ENXIO, "ENXIO" },
{ E2BIG, "E2BIG" },
{ ENOEXEC, "ENOEXEC" },
{ EBADF, "EBADF" },
{ ECHILD, "ECHILD" },
{ EAGAIN, "EAGAIN" },
{ ENOMEM, "ENOMEM" },
{ EACCES, "EACCES" },
{ EFAULT, "EFAULT" },
{ ENOTBLK, "ENOTBLK" },
{ EBUSY, "EBUSY" },
{ EEXIST, "EEXIST" },
{ EXDEV, "EXDEV" },
{ ENODEV, "ENODEV" },
{ ENOTDIR, "ENOTDIR" },
{ EISDIR, "EISDIR" },
{ EINVAL, "EINVAL" },
{ ENFILE, "ENFILE" },
{ EMFILE, "EMFILE" },
{ ENOTTY, "ENOTTY" },
{ ETXTBSY, "ETXTBSY" },
{ EFBIG, "EFBIG" },
{ ENOSPC, "ENOSPC" },
{ ESPIPE, "ESPIPE" },
{ EROFS, "EROFS" },
{ EMLINK, "EMLINK" },
{ EPIPE, "EPIPE" },
{ EDOM, "EDOM" },
{ ERANGE, "ERANGE" },
{ EDEADLK, "EDEADLK" },
{ ENAMETOOLONG, "ENAMETOOLONG" },
{ ENOLCK, "ENOLCK" },
{ ENOSYS, "ENOSYS" },
{ ENOTEMPTY, "ENOTEMPTY" },
{ ELOOP, "ELOOP" },
{ ENOMSG, "ENOMSG" },
{ EIDRM, "EIDRM" },
{ ECHRNG, "ECHRNG" },
{ EL2NSYNC, "EL2NSYNC" },
{ EL3HLT, "EL3HLT" },
{ EL3RST, "EL3RST" },
{ EL3RST, "EL3RST" },
{ EUNATCH, "EUNATCH" },
{ ENOCSI, "ENOCSI" },
{ EL2HLT, "EL2HLT" },
{ EBADE, "EBADE" },
{ EBADR, "EBADR" },
{ EXFULL, "EXFULL" },
{ ENOANO, "ENOANO" },
{ EBADRQC, "EBADRQC" },
{ EBADSLT, "EBADSLT" },
{ EBFONT, "EBFONT" },
{ ENOSTR, "ENOSTR" },
{ ENODATA, "ENODATA" },
{ ETIME, "ETIME" },
{ ENOSR, "ENOSR" },
{ ENONET, "ENONET" },
{ ENOPKG, "ENOPKG" },
{ EREMOTE, "EREMOTE" },
{ ENOLINK, "ENOLINK" },
{ EADV, "EADV" },
{ ESRMNT, "ESRMNT" },
{ ECOMM, "ECOMM" },
{ EPROTO, "EPROTO" },
{ EMULTIHOP, "EMULTIHOP" },
{ EDOTDOT, "EDOTDOT" },
{ EBADMSG, "EBADMSG" },
{ EOVERFLOW, "EOVERFLOW" },
{ ENOTUNIQ, "ENOTUNIQ" },
{ EBADFD, "EBADFD" },
{ EREMCHG, "EREMCHG" },
{ ELIBACC, "ELIBACC" },
{ ELIBBAD, "ELIBBAD" },
{ ELIBSCN, "ELIBSCN" },
{ ELIBMAX, "ELIBMAX" },
{ ELIBEXEC, "ELIBEXEC" },
{ EILSEQ, "EILSEQ" },
{ ERESTART, "ERESTART" },
{ ESTRPIPE, "ESTRPIPE" },
{ EUSERS, "EUSERS" },
{ ENOTSOCK, "ENOTSOCK" },
{ EDESTADDRREQ, "EDESTADDRREQ" },
{ EMSGSIZE, "EMSGSIZE" },
{ EPROTOTYPE, "EPROTOTYPE" },
{ ENOPROTOOPT, "ENOPROTOOPT" },
{ EPROTONOSUPPORT, "EPROTONOSUPPORT" },
{ ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT" },
{ EOPNOTSUPP, "EOPNOTSUPP" },
{ EPFNOSUPPORT, "EPFNOSUPPORT" },
{ EAFNOSUPPORT, "EAFNOSUPPORT" },
{ EADDRINUSE, "EADDRINUSE" },
{ EADDRNOTAVAIL, "EADDRNOTAVAIL" },
{ ENETDOWN, "ENETDOWN" },
{ ENETUNREACH, "ENETUNREACH" },
{ ENETRESET, "ENETRESET" },
{ ECONNABORTED, "ECONNABORTED" },
{ ECONNRESET, "ECONNRESET" },
{ ENOBUFS, "ENOBUFS" },
{ EISCONN, "EISCONN" },
{ ENOTCONN, "ENOTCONN" },
{ ESHUTDOWN, "ESHUTDOWN" },
{ ETOOMANYREFS, "ETOOMANYREFS" },
{ ETIMEDOUT, "ETIMEDOUT" },
{ ECONNREFUSED, "ECONNREFUSED" },
{ EHOSTDOWN, "EHOSTDOWN" },
{ EHOSTUNREACH, "EHOSTUNREACH" },
{ EALREADY, "EALREADY" },
{ EINPROGRESS, "EINPROGRESS" },
{ ESTALE, "ESTALE" },
{ EUCLEAN, "EUCLEAN" },
{ ENOTNAM, "ENOTNAM" },
{ ENAVAIL, "ENAVAIL" },
{ EISNAM, "EISNAM" },
{ EREMOTEIO, "EREMOTEIO" },
{ EDQUOT, "EDQUOT" },
{ ENOMEDIUM, "ENOMEDIUM" },
{ EMEDIUMTYPE, "EMEDIUMTYPE" }
};
#endif /* CONFIG_LIBC_STRERROR_SHORT */
#define NERRNO_STRS (sizeof(g_errnomap) / sizeof(struct errno_strmap_s))
#endif /* CONFIG_LIBC_STRERROR */
/************************************************************************
* Private Functions
************************************************************************/
@@ -210,8 +346,9 @@ static const struct errno_strmap_s g_errnomap[] =
* Name: strerror
************************************************************************/
const char *strerror(int errnum)
FAR const char *strerror(int errnum)
{
#ifdef CONFIG_LIBC_STRERROR
int ndxlow = 0;
int ndxhi = NERRNO_STRS - 1;
int ndxmid;
@@ -233,5 +370,6 @@ const char *strerror(int errnum)
}
}
while (ndxlow <= ndxhi);
#endif
return "Unknown error";
}