]> pd.if.org Git - pdclib/blobdiff - platform/posix/functions/_PDCLIB/_PDCLIB_stdinit.c
PDCLib includes with quotes, not <>.
[pdclib] / platform / posix / functions / _PDCLIB / _PDCLIB_stdinit.c
index 3f479f53889860e466e359f368e33171f53b5db1..b977b4ec53baaef18f76c2dac4f6f8f8425f9326 100644 (file)
@@ -1,5 +1,3 @@
-/* $Id$ */
-
 /* _PDCLIB_stdinit
 
    This file is part of the Public Domain C Library (PDCLib).
@@ -16,8 +14,9 @@
 #include <limits.h>
 
 #ifndef REGTEST
-#include <_PDCLIB_io.h>
-#include <_PDCLIB_locale.h>
+#include "_PDCLIB_io.h"
+#include "_PDCLIB_locale.h"
+#include "_PDCLIB_clocale.h"
 #include <threads.h>
 
 /* In a POSIX system, stdin / stdout / stderr are equivalent to the (int) file
@@ -79,14 +78,6 @@ FILE * stdout = &_PDCLIB_sout;
 FILE * stderr = &_PDCLIB_serr;
 
 tss_t _PDCLIB_locale_tss;
-/* Todo: Better solution than this! */
-__attribute__((constructor)) void init_stdio(void)
-{
-    tss_create(&_PDCLIB_locale_tss, (tss_dtor_t) freelocale);
-    mtx_init(&stdin->lock,  mtx_recursive);
-    mtx_init(&stdout->lock, mtx_recursive);
-    mtx_init(&stderr->lock, mtx_recursive);
-}
 
 /* FIXME: This approach is a possible attack vector. */
 FILE * _PDCLIB_filelist = &_PDCLIB_sin;
@@ -95,8 +86,7 @@ FILE * _PDCLIB_filelist = &_PDCLIB_sin;
    1 kByte (+ 4 byte) of <ctype.h> data.
    Each line: flags, lowercase, uppercase, collation.
 */
-static 
-_PDCLIB_ctype_t global_ctype[] = {
+static const _PDCLIB_ctype_t global_ctype[] = {
     { /* EOF */    0,    0,    0,    0 },
     { /* NUL */ _PDCLIB_CTYPE_CNTRL,                                             0x00, 0x00, 0x00 },
     { /* SOH */ _PDCLIB_CTYPE_CNTRL,                                             0x01, 0x01, 0x01 },
@@ -356,51 +346,186 @@ _PDCLIB_ctype_t global_ctype[] = {
     { 0x00, 0xFF, 0xFF, 0xFF }
 };
 
-static struct lconv global_lconv = { 
-    /* decimal_point      */ (char *)".",
-    /* thousands_sep      */ (char *)"",
-    /* grouping           */ (char *)"",
-    /* mon_decimal_point  */ (char *)"",
-    /* mon_thousands_sep  */ (char *)"",
-    /* mon_grouping       */ (char *)"",
-    /* positive_sign      */ (char *)"",
-    /* negative_sign      */ (char *)"",
-    /* currency_symbol    */ (char *)"",
-    /* int_curr_symbol    */ (char *)"",
-    /* frac_digits        */ CHAR_MAX,
-    /* p_cs_precedes      */ CHAR_MAX,
-    /* n_cs_precedes      */ CHAR_MAX,
-    /* p_sep_by_space     */ CHAR_MAX,
-    /* n_sep_by_space     */ CHAR_MAX,
-    /* p_sign_posn        */ CHAR_MAX,
-    /* n_sign_posn        */ CHAR_MAX,
-    /* int_frac_digits    */ CHAR_MAX,
-    /* int_p_cs_precedes  */ CHAR_MAX,
-    /* int_n_cs_precedes  */ CHAR_MAX,
-    /* int_p_sep_by_space */ CHAR_MAX,
-    /* int_n_sep_by_space */ CHAR_MAX,
-    /* int_p_sign_posn    */ CHAR_MAX,
-    /* int_n_sign_posn    */ CHAR_MAX,
-};
-
-extern struct _PDCLIB_charcodec _PDCLIB_ascii_codec;
-struct _PDCLIB_locale _PDCLIB_global_locale 
-= {
+extern const struct _PDCLIB_charcodec_t _PDCLIB_ascii_codec;
+struct _PDCLIB_locale _PDCLIB_global_locale = {
     ._Codec = &_PDCLIB_ascii_codec,
-    ._Conv  = &global_lconv,
+    ._Conv  = { 
+        /* decimal_point      */ (char *)".",
+        /* thousands_sep      */ (char *)"",
+        /* grouping           */ (char *)"",
+        /* mon_decimal_point  */ (char *)"",
+        /* mon_thousands_sep  */ (char *)"",
+        /* mon_grouping       */ (char *)"",
+        /* positive_sign      */ (char *)"",
+        /* negative_sign      */ (char *)"",
+        /* currency_symbol    */ (char *)"",
+        /* int_curr_symbol    */ (char *)"",
+        /* frac_digits        */ CHAR_MAX,
+        /* p_cs_precedes      */ CHAR_MAX,
+        /* n_cs_precedes      */ CHAR_MAX,
+        /* p_sep_by_space     */ CHAR_MAX,
+        /* n_sep_by_space     */ CHAR_MAX,
+        /* p_sign_posn        */ CHAR_MAX,
+        /* n_sign_posn        */ CHAR_MAX,
+        /* int_frac_digits    */ CHAR_MAX,
+        /* int_p_cs_precedes  */ CHAR_MAX,
+        /* int_n_cs_precedes  */ CHAR_MAX,
+        /* int_p_sep_by_space */ CHAR_MAX,
+        /* int_n_sep_by_space */ CHAR_MAX,
+        /* int_p_sign_posn    */ CHAR_MAX,
+        /* int_n_sign_posn    */ CHAR_MAX,
+    },
     ._CType = &global_ctype[1],
     ._ErrnoStr = {
-        /* no error */ (char *)"",
-        /* ERANGE   */ (char *)"ERANGE (Range error)",
-        /* EDOM     */ (char *)"EDOM (Domain error)",
-        /* EILSEQ   */ (char *)"EILSEQ (Illegal sequence)"
+        "Success",
+        "EPERM (operation not permitted)",
+        "ENOENT (no such file or directory)",
+        "ESRCH (no such process)",
+        "EINTR (interrupted)",
+        "EIO (io error)",
+        "ENXIO (no such device or address)",
+        "E2BIG (argument list too long)",
+        "ENOEXEC (executable format error)",
+        "EBADF (bad file descriptor)",
+        "ECHILD (no child process)",
+        "EAGAIN (resource unavailable try again)",
+        "ENOMEM (not enough memory)",
+        "EACCES (permission denied)",
+        "EFAULT (bad address)",
+        "Unknown error",
+        "EBUSY (device or resource busy)",
+        "EEXIST (file exists)",
+        "EXDEV (cross device link)",
+        "ENODEV (no such device)",
+        "ENOTDIR (not a directory)",
+        "EISDIR (is a directory)",
+        "EINVAL (invalid argument)",
+        "ENFILE (too many files open in system)",
+        "EMFILE (too many files open)",
+        "ENOTTY (inappropriate io control operation)",
+        "ETXTBSY (text file busy)",
+        "EFBIG (file too large)",
+        "ENOSPC (no space on device)",
+        "ESPIPE (invalid seek)",
+        "EROFS (read only file system)",
+        "EMLINK (too many links)",
+        "EPIPE (broken pipe)",
+        "EDOM (argument out of domain)",
+        "ERANGE (result out of range)",
+        "EDEADLK (resource deadlock would occur)",
+        "ENAMETOOLONG (filename too long)",
+        "ENOLCK (no lock available)",
+        "ENOSYS (function not supported)",
+        "ENOTEMPTY (directory not empty)",
+        "ELOOP (too many symbolic link levels)",
+        "Unknown error",
+        "ENOMSG (no message)",
+        "EIDRM (identifier removed)",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "ENOSTR (not a stream)",
+        "ENODATA (no message available)",
+        "ETIME (stream timeout)",
+        "ENOSR (no stream resources)",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "ENOLINK (no link)",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "EPROTO (protocol error)",
+        "Unknown error",
+        "Unknown error",
+        "EBADMSG (bad message)",
+        "EOVERFLOW (value too large)",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "EILSEQ (illegal byte sequence)",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "ENOTSOCK (not a socket)",
+        "EDESTADDRREQ (destination address required)",
+        "EMSGSIZE (message size)",
+        "EPROTOTYPE (wrong protocol type)",
+        "ENOPROTOOPT (no protocol option)",
+        "EPROTONOSUPPORT (protocol not supported)",
+        "Unknown error",
+        "ENOTSUP (not supported)",
+        "Unknown error",
+        "EAFNOSUPPORT (address family not supported)",
+        "EADDRINUSE (address in use)",
+        "EADDRNOTAVAIL (address not available)",
+        "ENETDOWN (network down)",
+        "ENETUNREACH (network unreachable)",
+        "ENETRESET (network reset)",
+        "ECONNABORTED (connection aborted)",
+        "ECONNRESET (connection reset)",
+        "ENOBUFS (no buffer space)",
+        "EISCONN (already connected)",
+        "ENOTCONN (not connected)",
+        "Unknown error",
+        "Unknown error",
+        "ETIMEDOUT (timed out)",
+        "ECONNREFUSED (connection refused)",
+        "Unknown error",
+        "EHOSTUNREACH (host unreachable)",
+        "EALREADY (connection already in progress)",
+        "EINPROGRESS (operation in progress)",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "ECANCELED (operation canceled)",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "Unknown error",
+        "EOWNERDEAD (owner dead)",
+        "ENOTRECOVERABLE (state not recoverable)",
     },
 };
 
+/* Todo: Better solution than this! */
+__attribute__((constructor)) static void init_stdio(void)
+{
+    _PDCLIB_initclocale( &_PDCLIB_global_locale );
+    tss_create(&_PDCLIB_locale_tss, (tss_dtor_t) freelocale);
+    mtx_init(&stdin->lock,  mtx_recursive);
+    mtx_init(&stdout->lock, mtx_recursive);
+    mtx_init(&stderr->lock, mtx_recursive);
+}
+
 #endif
 
 #ifdef TEST
-#include <_PDCLIB_test.h>
+#include "_PDCLIB_test.h"
 
 int main( void )
 {