summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux
diff options
context:
space:
mode:
authorManuel Novoa III <mjn3@codepoet.org>2002-07-03 17:24:17 +0000
committerManuel Novoa III <mjn3@codepoet.org>2002-07-03 17:24:17 +0000
commit599ad608ee3297bc1e2bb11656a97335e303877a (patch)
treec5b59cb5fa2c90f3b0c8b4d9831ae763f2825327 /libc/sysdeps/linux
parentab579e469c6787df9bd2252b3de8b1700d5097d8 (diff)
Enable WCHAR support for C/POSIX stub locales.
Implemented unformatted wide i/o functions. (ungetwc still needs testing) Fix a few bugs in wchar.c. Modifications for bcc/elks support.
Diffstat (limited to 'libc/sysdeps/linux')
-rw-r--r--libc/sysdeps/linux/common/bits/uClibc_locale.h14
-rw-r--r--libc/sysdeps/linux/common/bits/uClibc_stdio.h53
2 files changed, 51 insertions, 16 deletions
diff --git a/libc/sysdeps/linux/common/bits/uClibc_locale.h b/libc/sysdeps/linux/common/bits/uClibc_locale.h
index 2a35d38ec..a9cd39f2f 100644
--- a/libc/sysdeps/linux/common/bits/uClibc_locale.h
+++ b/libc/sysdeps/linux/common/bits/uClibc_locale.h
@@ -63,11 +63,7 @@
#define __LC_ALL 6
/**********************************************************************/
-#if defined(_LIBC) && !defined(__LOCALE_C_ONLY)
-
-#include <stddef.h>
-#include <stdint.h>
-#include <bits/uClibc_locale_data.h>
+#ifdef _LIBC
/* TODO: This really needs to be somewhere else... */
#include <limits.h>
@@ -89,6 +85,14 @@ typedef uintmax_t __uwchar_t;
#error Can not determine an appropriate type for __uwchar_t!
#endif
+#endif
+
+/**********************************************************************/
+#if defined(_LIBC) && !defined(__LOCALE_C_ONLY)
+
+#include <stddef.h>
+#include <stdint.h>
+#include <bits/uClibc_locale_data.h>
extern void _locale_set(const unsigned char *p);
diff --git a/libc/sysdeps/linux/common/bits/uClibc_stdio.h b/libc/sysdeps/linux/common/bits/uClibc_stdio.h
index 1a559bd9c..16a7da876 100644
--- a/libc/sysdeps/linux/common/bits/uClibc_stdio.h
+++ b/libc/sysdeps/linux/common/bits/uClibc_stdio.h
@@ -40,6 +40,10 @@
#define __STDIO_LARGE_FILES
#endif /* __UCLIBC_HAVE_LFS__ */
+#ifdef __UCLIBC_HAS_WCHAR__
+#define __STDIO_WIDE
+#endif
+
/* Make sure defines related to large files are consistent. */
#ifdef _LIBC
@@ -67,9 +71,14 @@
/* These are the stdio configuration options. Keep them here until
uClibc's configuration process gets reworked. */
-/* #define __STDIO_WIDE */
#ifdef __STDIO_WIDE
-typedef int __wchar_t; /* TODO: temporary, as not currently uClibc */
+#define __need_wchar_t
+#include <stddef.h>
+/* Note: we don't really need mbstate for 8-bit locales. We do for UTF-8.
+ * For now, always use it. */
+#define __STDIO_MBSTATE
+#define __need_mbstate_t
+#include <wchar.h>
#endif
#define __STDIO_BUFFERS
@@ -163,13 +172,19 @@ typedef int __wchar_t; /* TODO: temporary, as not currently uClibc */
typedef struct {
__off_t __pos;
-/* __mbstate_t __state; */
+#ifdef __STDIO_MBSTATE
+ __mbstate_t __mbstate;
+#endif
} __stdio_fpos_t;
+#ifdef __STDIO_LARGE_FILES
typedef struct {
__off64_t __pos;
-/* __mbstate_t __state; */
+#ifdef __STDIO_MBSTATE
+ __mbstate_t __mbstate;
+#endif
} __stdio_fpos64_t;
+#endif
/**********************************************************************/
@@ -229,8 +244,9 @@ struct __stdio_file_struct {
unsigned short modeflags;
/* There could be a hole here, but modeflags is used most.*/
#ifdef __STDIO_WIDE
+ /* TOOD - ungot_width could be combined with ungot. But what about hole? */
unsigned char ungot_width[2];
- __wchar_t ungot[2];
+ wchar_t ungot[2];
#else /* __STDIO_WIDE */
unsigned char ungot[2];
#endif /* __STDIO_WIDE */
@@ -241,8 +257,8 @@ struct __stdio_file_struct {
#ifdef __STDIO_BUFFERS
unsigned char *bufstart; /* pointer to buffer */
unsigned char *bufend; /* pointer to 1 past end of buffer */
- unsigned char *bufwpos; /* pointer to 1 past last buffered */
- unsigned char *bufrpos; /* pointer to next readable buffered */
+ unsigned char *bufpos;
+ unsigned char *bufread; /* pointer to 1 past last buffered read char. */
#ifdef __STDIO_GETC_MACRO
unsigned char *bufgetc; /* 1 past last readable by getc */
#endif /* __STDIO_GETC_MACRO */
@@ -254,6 +270,9 @@ struct __stdio_file_struct {
void *cookie;
_IO_cookie_io_functions_t gcs;
#endif /* __STDIO_GLIBC_CUSTOM_STREAMS */
+#ifdef __STDIO_MBSTATE
+ __mbstate_t state;
+#endif
#ifdef __STDIO_THREADSAFE
int user_locking;
pthread_mutex_t lock;
@@ -302,6 +321,16 @@ extern int _cs_close(void *cookie);
/**********************************************************************/
+#ifdef __STDIO_MBSTATE
+#define __COPY_MBSTATE(dest,src) ((dest)->mask = (src)->mask, (dest)->wc = (src)->wc)
+#define __INIT_MBSTATE(dest) ((dest)->mask = 0)
+#else
+#define __COPY_MBSTATE(dest,src)
+#define __INIT_MBSTATE(dest)
+#endif
+
+/**********************************************************************/
+
/* TODO -- thread safety issues */
#define __CLEARERR(stream) \
((stream)->modeflags &= ~(__FLAG_EOF|__FLAG_ERROR), (void)0)
@@ -323,16 +352,16 @@ extern int _cs_close(void *cookie);
*/
#ifdef __STDIO_GETC_MACRO
-#define __GETC(stream) ( ((stream)->bufrpos < (stream)->bufgetc) \
- ? (*(stream)->bufrpos++) \
+#define __GETC(stream) ( ((stream)->bufpos < (stream)->bufgetc) \
+ ? (*(stream)->bufpos++) \
: fgetc_unlocked(stream) )
#else /* __STDIO_GETC_MACRO */
#define __GETC(stream) fgetc_unlocked(stream)
#endif /* __STDIO_GETC_MACRO */
#ifdef __STDIO_PUTC_MACRO
-#define __PUTC(c, stream) ( ((stream)->bufwpos < (stream)->bufputc) \
- ? (*(stream)->bufwpos++) = (c) \
+#define __PUTC(c, stream) ( ((stream)->bufpos < (stream)->bufputc) \
+ ? (*(stream)->bufpos++) = (c) \
: fputc_unlocked((c),(stream)) )
#else /* __STDIO_PUTC_MACRO */
#define __PUTC(c, stream) fputc_unlocked(c, stream);
@@ -488,7 +517,9 @@ extern char *_uintmaxtostr(char * __restrict bufend, uintmax_t uval,
/* TODO: note done above.. typedef struct __stdio_file_struct _UC_FILE; */
typedef __stdio_fpos_t _UC_fpos_t;
+#ifdef __STDIO_LARGE_FILES
typedef __stdio_fpos64_t _UC_fpos64_t;
+#endif
#define _UC_IOFBF _STDIO_IOFBF /* Fully buffered. */
#define _UC_IOLBF _STDIO_IOLBF /* Line buffered. */