-/* $Id$ */
-
/* _PDCLIB_stdinit
This file is part of the Public Domain C Library (PDCLib).
#include <limits.h>
#ifndef REGTEST
+#include "_PDCLIB_io.h"
+#include "_PDCLIB_locale.h"
+#include "_PDCLIB_encoding.h"
+
+extern const _PDCLIB_fileops_t _PDCLIB_fileops;
/* In a POSIX system, stdin / stdout / stderr are equivalent to the (int) file
descriptors 0, 1, and 2 respectively.
static unsigned char _PDCLIB_sout_ungetbuf[_PDCLIB_UNGETCBUFSIZE];
static unsigned char _PDCLIB_serr_ungetbuf[_PDCLIB_UNGETCBUFSIZE];
-static struct _PDCLIB_file_t _PDCLIB_serr = { NULL, _PDCLIB_serr_buffer, BUFSIZ, 0, 0, { 0, 0 }, 0, _PDCLIB_serr_ungetbuf, _IONBF | _PDCLIB_FWRITE | _PDCLIB_STATIC, NULL, NULL };
-static struct _PDCLIB_file_t _PDCLIB_sout = { NULL, _PDCLIB_sout_buffer, BUFSIZ, 0, 0, { 0, 0 }, 0, _PDCLIB_sout_ungetbuf, _IOLBF | _PDCLIB_FWRITE | _PDCLIB_STATIC, NULL, &_PDCLIB_serr };
-static struct _PDCLIB_file_t _PDCLIB_sin = { NULL, _PDCLIB_sin_buffer, BUFSIZ, 0, 0, { 0, 0 }, 0, _PDCLIB_sin_ungetbuf, _IOLBF | _PDCLIB_FREAD | _PDCLIB_STATIC, NULL, &_PDCLIB_sout };
+static FILE _PDCLIB_serr = {
+ .ops = &_PDCLIB_fileops,
+ .buffer = _PDCLIB_serr_buffer,
+ .bufsize = BUFSIZ,
+ .bufidx = 0,
+ .bufend = 0,
+ .ungetidx = 0,
+ .ungetbuf = _PDCLIB_serr_ungetbuf,
+ .status = _IONBF | _PDCLIB_FWRITE | _PDCLIB_STATIC,
+ .filename = NULL,
+ .next = NULL,
+};
+static FILE _PDCLIB_sout = {
+ .ops = &_PDCLIB_fileops,
+ .buffer = _PDCLIB_sout_buffer,
+ .bufsize = BUFSIZ,
+ .bufidx = 0,
+ .bufend = 0,
+ .ungetidx = 0,
+ .ungetbuf = _PDCLIB_sout_ungetbuf,
+ .status = _IOLBF | _PDCLIB_FWRITE | _PDCLIB_STATIC,
+ .filename = NULL,
+ .next = &_PDCLIB_serr
+};
+static FILE _PDCLIB_sin = {
+ .ops = &_PDCLIB_fileops,
+ .buffer = _PDCLIB_sin_buffer,
+ .bufsize = BUFSIZ,
+ .bufidx = 0,
+ .bufend = 0,
+ .ungetidx = 0,
+ .ungetbuf = _PDCLIB_sin_ungetbuf,
+ .status = _IOLBF | _PDCLIB_FREAD | _PDCLIB_STATIC,
+ .filename = NULL,
+ .next = &_PDCLIB_sout
+};
-struct _PDCLIB_file_t * stdin = &_PDCLIB_sin;
-struct _PDCLIB_file_t * stdout = &_PDCLIB_sout;
-struct _PDCLIB_file_t * stderr = &_PDCLIB_serr;
+
+FILE* stdin = &_PDCLIB_sin;
+FILE* stdout = &_PDCLIB_sout;
+FILE* stderr = &_PDCLIB_serr;
/* FIXME: This approach is a possible attack vector. */
-struct _PDCLIB_file_t * _PDCLIB_filelist = &_PDCLIB_sin;
+FILE* _PDCLIB_filelist = &_PDCLIB_sin;
+
+tss_t _PDCLIB_locale_tss;
/* "C" locale - defaulting to ASCII-7.
1 kByte (+ 4 byte) of <ctype.h> data.
Each line: flags, lowercase, uppercase, collation.
*/
-static struct _PDCLIB_ctype_t _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 },
{ 0x00, 0xFF, 0xFF, 0xFF }
};
-struct lconv _PDCLIB_lconv = {
- /* _PDCLIB_ctype */ _ctype + 1,
- /* _PDCLIB_errno_texts */
- {
- /* no error */ (char *)"",
- /* ERANGE */ (char *)"ERANGE (Range error)",
- /* EDOM */ (char *)"EDOM (Domain error)",
- /* EILSEQ */ (char *)"EILSEQ (Illegal sequence)"
+extern const struct _PDCLIB_charcodec_t _PDCLIB_ascii_codec;
+struct _PDCLIB_locale _PDCLIB_global_locale = {
+ ._Codec = &_PDCLIB_ascii_codec,
+ ._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 = {
+ "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)",
+ "Unknown error",
+ "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)",
+ "Unknown error",
+ "EDEADLK (resource deadlock would occur)",
+ "Unknown error",
+ "ENAMETOOLONG (filename too long)",
+ "ENOLCK (no lock available)",
+ "ENOSYS (function not supported)",
+ "ENOTEMPTY (directory not empty)",
+ "EILSEQ (illegal byte sequence)",
+ "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",
+ "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",
+ "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",
+ "Unknown error",
+ "Unknown error",
+ "Unknown error",
+ "Unknown error",
+ "Unknown error",
+ "Unknown error",
+ "Unknown error",
+ "Unknown error",
+ "Unknown error",
+ "EADDRINUSE (address in use)",
+ "EADDRNOTAVAIL (address not available)",
+ "EAFNOSUPPORT (address family not supported)",
+ "EALREADY (connection already in progress)",
+ "EBADMSG (bad message)",
+ "ECANCELED (operation canceled)",
+ "ECONNABORTED (connection aborted)",
+ "ECONNREFUSED (connection refused)",
+ "ECONNRESET (connection reset)",
+ "EDESTADDRREQ (destination address required)",
+ "EHOSTUNREACH (host unreachable)",
+ "EIDRM (identifier removed)",
+ "EINPROGRESS (operation in progress)",
+ "EISCONN (already connected)",
+ "ELOOP (too many symbolic link levels)",
+ "EMSGSIZE (message size)",
+ "ENETDOWN (network down)",
+ "ENETRESET (network reset)",
+ "ENETUNREACH (network unreachable)",
+ "ENOBUFS (no buffer space)",
+ "ENODATA (no message available)",
+ "ENOLINK (no link)",
+ "ENOMSG (no message)",
+ "ENOPROTOOPT (no protocol option)",
+ "ENOSR (no stream resources)",
+ "ENOSTR (not a stream)",
+ "ENOTCONN (not connected)",
+ "ENOTRECOVERABLE (state not recoverable)",
+ "ENOTSOCK (not a socket)",
+ "ENOTSUP (not supported)",
+ "EOPNOTSUPP (operation not supported)",
+ "Unknown error",
+ "EOVERFLOW (value too large)",
+ "EOWNERDEAD (owner dead)",
+ "EPROTO (protocol error)",
+ "EPROTONOSUPPORT (protocol not supported)",
+ "EPROTOTYPE (wrong protocol type)",
+ "ETIME (stream timeout)",
+ "ETIMEDOUT (timed out)",
+ "ETXTBSY (text file busy)",
+ "EWOULDBLOCK (operation would block)",
},
- /* 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,
};
-
#endif
#ifdef TEST
-#include <_PDCLIB_test.h>
+#include "_PDCLIB_test.h"
int main( void )
{