X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=platform%2Fexample%2Finternals%2F_PDCLIB_config.h;h=0059a7f6d9b9c41975e43bbb7eef0d46f8215619;hb=ce0e5d8cd76b50f239fb8e95170502b146247b35;hp=4251522bc4ec88d0b787c2878f5d16cdafe7b3c8;hpb=73f56e467627b9799275872a7635d9aa15584169;p=pdclib diff --git a/platform/example/internals/_PDCLIB_config.h b/platform/example/internals/_PDCLIB_config.h index 4251522..0059a7f 100644 --- a/platform/example/internals/_PDCLIB_config.h +++ b/platform/example/internals/_PDCLIB_config.h @@ -32,6 +32,14 @@ /* to nothing. (This is to avoid warnings with the exit functions under GCC.) */ #define _PDCLIB_NORETURN __attribute__(( noreturn )) +/* The maximum value that errno can be set to. This is used to set the size */ +/* of the array in struct lconv () holding error messages for the */ +/* strerror() and perror() functions. (If you change this value because you */ +/* are using additional errno values, you *HAVE* to provide appropriate error */ +/* messages for *ALL* locales.) */ +/* Default is 2 (0, ERANGE, EDOM). */ +#define _PDCLIB_ERRNO_MAX 3 + /* -------------------------------------------------------------------------- */ /* Integers */ /* -------------------------------------------------------------------------- */ @@ -92,6 +100,8 @@ struct _PDCLIB_lldiv_t /* SHRT, INT, LONG, or LLONG (telling which values to use for the *_MIN and */ /* *_MAX limits); the lowercase define either short, int, long, or long long */ /* (telling the actual type to use). */ +/* The third define is the length modifier used for the type in printf() and */ +/* scanf() functions (used in ). */ /* If you require a non-standard datatype to define the "usually fastest" */ /* types, PDCLib as-is doesn't support that. Please contact the author with */ /* details on your platform in that case, so support can be added. */ @@ -99,15 +109,19 @@ struct _PDCLIB_lldiv_t #define _PDCLIB_FAST8 INT #define _PDCLIB_fast8 int +#define _PDCLIB_FAST8_CONV #define _PDCLIB_FAST16 INT #define _PDCLIB_fast16 int +#define _PDCLIB_FAST16_CONV #define _PDCLIB_FAST32 INT #define _PDCLIB_fast32 int +#define _PDCLIB_FAST32_CONV #define _PDCLIB_FAST64 LLONG #define _PDCLIB_fast64 long long +#define _PDCLIB_FAST64_CONV ll /* -------------------------------------------------------------------------- */ /* What follows are a couple of "special" typedefs and their limits. Again, */ @@ -118,6 +132,7 @@ struct _PDCLIB_lldiv_t /* The result type of substracting two pointers */ #define _PDCLIB_ptrdiff int #define _PDCLIB_PTRDIFF INT +#define _PDCLIB_PTR_CONV /* An integer type that can be accessed as atomic entity (think asynchronous interrupts). The type itself is not defined in a freestanding environment, @@ -142,6 +157,7 @@ struct _PDCLIB_lldiv_t /* Largest supported integer type. Implementation note: see _PDCLIB_atomax(). */ #define _PDCLIB_intmax long long int #define _PDCLIB_INTMAX LLONG +#define _PDCLIB_MAX_CONV ll /* You are also required to state the literal suffix for the intmax type */ #define _PDCLIB_INTMAX_LITERAL ll @@ -258,8 +274,8 @@ typedef int _PDCLIB_fd_t; /* Length of the longest filename the implementation guarantees to support. */ #define _PDCLIB_FILENAME_MAX 128 -/* Buffer size for tmpnam(). */ -#define _PDCLIB_L_tmpnam 100 +/* Maximum length of filenames generated by tmpnam(). (See tmpfile.c.) */ +#define _PDCLIB_L_tmpnam 46 /* Number of distinct file names that can be generated by tmpnam(). */ #define _PDCLIB_TMP_MAX 50 @@ -278,3 +294,60 @@ typedef int _PDCLIB_fd_t; */ #define _PDCLIB_UNGETCBUFSIZE 1 +/* errno -------------------------------------------------------------------- */ + +/* These are the values that _PDCLIB_errno can be set to by the library. + + By keeping PDCLib's errno in the _PDCLIB_* namespace, the library is capable + to "translate" between errno values used by the hosting operating system and + those used and passed out by the library. + + Example: In the example platform, the remove() function uses the unlink() + system call as backend. Linux sets its errno to EISDIR if you try to unlink() + a directory, but POSIX demands EPERM. Within the remove() function, you can + catch the 'errno == EISDIR', and set '_PDCLIB_errno = _PDCLIB_EPERM'. Anyone + using PDCLib's will "see" EPERM instead of EISDIR (the _PDCLIB_* + prefix removed by mechanics). + + If you do not want that kind of translation, you might want to "match" the + values used by PDCLib with those used by the host OS, as to avoid confusion. + + The standard only defines three distinct errno values: ERANGE, EDOM, and + EILSEQ. The standard leaves it up to "the implementation" whether there are + any more beyond those three. There is some controversy as to whether errno is + such a good idea at all, so you might want to come up with a different error + reporting facility for your platform. Since errno values beyond the three + defined by the standard are not portable anyway (unless you look at POSIX), + having your own error reporting facility would not hurt anybody either. +*/ +#define _PDCLIB_ERANGE 1 +#define _PDCLIB_EDOM 2 +#define _PDCLIB_EILSEQ 3 + +/* The following is not strictly "configuration", but there is no better place + to explain it than here. + + PDCLib strives to be as generic as possible, so by default it does NOT define + any values beyond the three standard ones above, even where it would have + been prudent and convenient to do so. Any errno "caught" from the host OS, + and some internal error conditions as well, are all lumped together into the + value of '_PDCLIB_ERROR'. + + '_PDCLIB_ERROR' is STRICLY meant as a PLACEHOLDER only. + + You should NEVER ship an adaption of PDCLib still using that particular + value. You should NEVER write code that *tests* for that value. Indeed it is + not even conforming, since errno values should be defined as beginning with + an uppercase 'E', and there is no mechanics in to unmask that + particular value (for exactly that reason). + + The idea is that you scan the source of PDCLib for occurrences of this macro + and replace _PDCLIB_ERROR with whatever additional errno value you came up + with for your platform. + + If you cannot find it within you to do that, tell your clients to check for + an errno value larger than zero. That, at least, would be standard compliant + (and fully portable). +*/ +#define _PDCLIB_ERROR 4 +