diff options
author | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2000-08-09 07:31:26 +0000 |
---|---|---|
committer | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2000-08-09 07:31:26 +0000 |
commit | 5c614849364bcaa926bf2017a69ac6569a14dfa0 (patch) | |
tree | d3ca5206944605a943dd451e7be15ec0b3689519 /libstdc++-v3 | |
parent | 86b8dde6332cf181979edb42ab96f672b40261d3 (diff) | |
download | gcc-5c614849364bcaa926bf2017a69ac6569a14dfa0.zip gcc-5c614849364bcaa926bf2017a69ac6569a14dfa0.tar.gz gcc-5c614849364bcaa926bf2017a69ac6569a14dfa0.tar.bz2 |
c_io_libio.h: Tweak.
2000-08-08 Benjamin Kosnik <bkoz@cygnus.com>
Ulrich Drepper <drepper@cygnus.com>
* config/c_io_libio.h: Tweak.
* config/c_io_libio_codecvt.c: New file.
* libio/Makefile.am: Add c_codecvt.c.
* libio/Makefile.in: Regenerate.
* libio/genops.c (_IO_unbuffer_write): Don't call _IO_SETBUF if the
stream is not orientated.
* acinclude.m4: Add config/c_io_libio_codecvt.c dummy file, until
encoding gets fleshed out.
* bits/basic_file.h: Add specialization declarations.
* config/c_io_libio.cc: Add specializations for pbackfail, uflow.
* config/c_io_libio.h: Add __c_wfile_type.
* bits/basic_file.h: Add _M_wfile.
* config/c_io_libio.cc (__basic_file<char>): Initialize the
streams without setting the orientation of the underlying FILE to
either wide or narrow.
(__basic_file<wchar_t>)): Enable tricky wchar_t io bits.
From-SVN: r35583
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/config/c_io_libio_codecvt.c | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/libstdc++-v3/config/c_io_libio_codecvt.c b/libstdc++-v3/config/c_io_libio_codecvt.c new file mode 100644 index 0000000..8407cb9 --- /dev/null +++ b/libstdc++-v3/config/c_io_libio_codecvt.c @@ -0,0 +1,150 @@ +/* Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU IO Library. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2, or (at + your option) any later version. + + This library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this library; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. + + As a special exception, if you link this library with files + compiled with a GNU compiler to produce an executable, this does + not cause the resulting executable to be covered by the GNU General + Public License. This exception does not however invalidate any + other reasons why the executable file might be covered by the GNU + General Public License. */ + +/* Slightly modified from glibc/libio/iofwide.c */ + +#include <libio.h> + + +/* Prototypes of libio's codecvt functions. */ +static enum __codecvt_result +do_out(struct _IO_codecvt *codecvt, __mbstate_t *statep, + const wchar_t *from_start, const wchar_t *from_end, + const wchar_t **from_stop, char *to_start, char *to_end, + char **to_stop); + +static enum __codecvt_result +do_unshift(struct _IO_codecvt *codecvt, __mbstate_t *statep, char *to_start, + char *to_end, char **to_stop); + +static enum __codecvt_result +do_in(struct _IO_codecvt *codecvt, __mbstate_t *statep, + const char *from_start, const char *from_end, const char **from_stop, + wchar_t *to_start, wchar_t *to_end, wchar_t **to_stop); + +static int +do_encoding(struct _IO_codecvt *codecvt); + +static int +do_length(struct _IO_codecvt *codecvt, __mbstate_t *statep, + const char *from_start, const char *from_end, _IO_size_t max); + +static int +do_max_length(struct _IO_codecvt *codecvt); + +static int +do_always_noconv(struct _IO_codecvt *codecvt); + + +/* The functions used in `codecvt' for libio are always the same. */ +struct _IO_codecvt __c_libio_codecvt = +{ + .__codecvt_destr = NULL, /* Destructor, never used. */ + .__codecvt_do_out = do_out, + .__codecvt_do_unshift = do_unshift, + .__codecvt_do_in = do_in, + .__codecvt_do_encoding = do_encoding, + .__codecvt_do_always_noconv = do_always_noconv, + .__codecvt_do_length = do_length, + .__codecvt_do_max_length = do_max_length +}; + +static enum __codecvt_result +do_out(struct _IO_codecvt *codecvt, __mbstate_t *statep, + const wchar_t *from_start, const wchar_t *from_end, + const wchar_t **from_stop, char *to_start, char *to_end, + char **to_stop) +{ + enum __codecvt_result res = __codecvt_ok; + + while (from_start < from_end) + { + if (to_start >= to_end) + { + res = __codecvt_partial; + break; + } + *to_start++ = (char) *from_start++; + } + + *from_stop = from_start; + *to_stop = to_start; + + return res; +} + + +static enum __codecvt_result +do_unshift(struct _IO_codecvt *codecvt, __mbstate_t *statep, + char *to_start, char *to_end, char **to_stop) +{ + *to_stop = to_start; + return __codecvt_ok; +} + + +static enum __codecvt_result +do_in(struct _IO_codecvt *codecvt, __mbstate_t *statep, + const char *from_start, const char *from_end, const char **from_stop, + wchar_t *to_start, wchar_t *to_end, wchar_t **to_stop) +{ + enum __codecvt_result res = __codecvt_ok; + + while (from_start < from_end) + { + if (to_start >= to_end) + { + res = __codecvt_partial; + break; + } + *to_start++ = (wchar_t) *from_start++; + } + + *from_stop = from_start; + *to_stop = to_start; + + return res; +} + + +static int +do_encoding(struct _IO_codecvt *codecvt) +{ return 1; } + + +static int +do_always_noconv(struct _IO_codecvt *codecvt) +{ return 0; } + + +static int +do_length(struct _IO_codecvt *codecvt, __mbstate_t *statep, + const char *from_start, const char *from_end, _IO_size_t max) +{ return from_end - from_start; } + + +static int +do_max_length(struct _IO_codecvt *codecvt) +{ return 1; } |