X-Git-Url: https://pd.if.org/git/?p=pdclib;a=blobdiff_plain;f=platform%2Fexample%2Ffunctions%2F_PDCLIB%2Fstdinit.c;h=b10e99a26c0c357718654d460ab3b7358a946867;hp=5550c4d7ce02acc324a87daeef7cc91181410b91;hb=da0f3f353d417fed71f358a48d5d5394145e460d;hpb=31bc073732a9303dd6f4813f0408cb2b9fcd0add diff --git a/platform/example/functions/_PDCLIB/stdinit.c b/platform/example/functions/_PDCLIB/stdinit.c index 5550c4d..b10e99a 100644 --- a/platform/example/functions/_PDCLIB/stdinit.c +++ b/platform/example/functions/_PDCLIB/stdinit.c @@ -1,5 +1,3 @@ -/* $Id$ */ - /* _PDCLIB_stdinit This file is part of the Public Domain C Library (PDCLib). @@ -16,6 +14,11 @@ #include #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. @@ -29,22 +32,55 @@ static unsigned char _PDCLIB_sin_ungetbuf[_PDCLIB_UNGETCBUFSIZE]; static unsigned char _PDCLIB_sout_ungetbuf[_PDCLIB_UNGETCBUFSIZE]; static unsigned char _PDCLIB_serr_ungetbuf[_PDCLIB_UNGETCBUFSIZE]; -static struct _PDCLIB_file_t _PDCLIB_serr = { 2, _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 = { 1, _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 = { 0, _PDCLIB_sin_buffer, BUFSIZ, 0, 0, { 0, 0 }, 0, _PDCLIB_sin_ungetbuf, _IOLBF | _PDCLIB_FREAD | _PDCLIB_STATIC, NULL, &_PDCLIB_sout }; -struct _PDCLIB_file_t * stdin = &_PDCLIB_sin; -struct _PDCLIB_file_t * stdout = &_PDCLIB_sout; -struct _PDCLIB_file_t * stderr = &_PDCLIB_serr; +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 +}; + +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; /* "C" locale - defaulting to ASCII-7. 1 kByte (+ 4 byte) of 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 }, @@ -304,38 +340,176 @@ static struct _PDCLIB_ctype_t _ctype[] = { { 0x00, 0xFF, 0xFF, 0xFF } }; -struct lconv _PDCLIB_lconv = { - /* _PDCLIB_ctype */ _ctype + 1, - /* 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 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)", + "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)", + }, }; #endif #ifdef TEST -#include <_PDCLIB_test.h> +#include "_PDCLIB_test.h" int main( void ) {