* libio/fileops.c (_IO_new_file_open): Recognize ,ccs= in mode string
	and load appropriate conversions.
	* libio/iofwide.c (__libio_codecvt): Renamed from libio_codecvt and
	made global.
	* libio/libioP.h: Declare __libio_codecvt.
	* manual/stdio.texi: Document ,ccs= option for fopen.
	* wcsmbs/wcsmbsload.c (__wcsmbs_named_conv): New function.
	* wcsmbs/wcsmbsload.h (__wcsmbs_named_conv): Declare.

	* libio/iofclose.c: Free conversion data if stream was wide-oriented.

	* sysdeps/unix/sysv/linux/i386/Dist: Add sys/io.h.
This commit is contained in:
Ulrich Drepper 2000-01-26 06:55:29 +00:00
parent c36897fb5b
commit 4e2e99997a
9 changed files with 146 additions and 10 deletions

View File

@ -1,5 +1,18 @@
2000-01-25 Ulrich Drepper <drepper@cygnus.com>
* libio/fileops.c (_IO_new_file_open): Recognize ,ccs= in mode string
and load appropriate conversions.
* libio/iofwide.c (__libio_codecvt): Renamed from libio_codecvt and
made global.
* libio/libioP.h: Declare __libio_codecvt.
* manual/stdio.texi: Document ,ccs= option for fopen.
* wcsmbs/wcsmbsload.c (__wcsmbs_named_conv): New function.
* wcsmbs/wcsmbsload.h (__wcsmbs_named_conv): Declare.
* libio/iofclose.c: Free conversion data if stream was wide-oriented.
* sysdeps/unix/sysv/linux/i386/Dist: Add sys/io.h.
* sysdeps/unix/sysv/linux/Dist: Remove sys/io.h.
* posix/fnmatch_loop.c: Fix problem with FNM_LEADING_DIR.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1993, 1995, 1997, 1998, 1999 Free Software Foundation, Inc.
/* Copyright (C) 1993, 1995, 1997-1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU IO Library.
Written by Per Bothner <bothner@cygnus.com>.
@ -37,6 +37,9 @@
#ifdef __STDC__
#include <stdlib.h>
#endif
#if _LIBC
# include "../wcsmbs/wcsmbsload.h"
#endif
#ifndef errno
extern int errno;
#endif
@ -214,6 +217,11 @@ _IO_new_file_fopen (fp, filename, mode, is32not64)
int read_write;
int oprot = 0666;
int i;
_IO_FILE *result;
#if _LIBC
const char *cs;
#endif
if (_IO_file_is_open (fp))
return 0;
switch (*mode)
@ -257,8 +265,54 @@ _IO_new_file_fopen (fp, filename, mode, is32not64)
break;
}
return _IO_file_open (fp, filename, omode|oflags, oprot, read_write,
is32not64);
result = _IO_file_open (fp, filename, omode|oflags, oprot, read_write,
is32not64);
#if _LIBC
/* Test whether the mode string specifies the conversion. */
cs = strstr (mode, ",ccs=");
if (cs != NULL)
{
/* Yep. Load the appropriate conversions and set the orientation
to wide. */
struct gconv_fcts fcts;
struct _IO_codecvt *cc = &fp->_wide_data->_codecvt;
if (__wcsmbs_named_conv (&fcts, cs + 5) != 0)
{
/* Something went wrong, we cannot load the conversion modules.
This means we cannot proceed since the user explicitly asked
for these. */
_IO_new_fclose (result);
return NULL;
}
/* The functions are always the same. */
*cc = __libio_codecvt;
cc->__cd_in.__cd.__nsteps = 1; /* Only one step allowed. */
cc->__cd_in.__cd.__steps = fcts.towc;
cc->__cd_in.__cd.__data[0].__invocation_counter = 0;
cc->__cd_in.__cd.__data[0].__internal_use = 1;
cc->__cd_in.__cd.__data[0].__is_last = 1;
cc->__cd_in.__cd.__data[0].__statep = &result->_wide_data->_IO_state;
cc->__cd_out.__cd.__nsteps = 1; /* Only one step allowed. */
cc->__cd_out.__cd.__steps = fcts.tomb;
cc->__cd_out.__cd.__data[0].__invocation_counter = 0;
cc->__cd_out.__cd.__data[0].__internal_use = 1;
cc->__cd_out.__cd.__data[0].__is_last = 1;
cc->__cd_out.__cd.__data[0].__statep = &result->_wide_data->_IO_state;
/* Set the mode now. */
result->_mode = 1;
}
#endif /* GNU libc */
return result;
}
_IO_FILE *

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1993, 1995, 1997, 1998, 1999 Free Software Foundation, Inc.
/* Copyright (C) 1993, 1995, 1997-1999, 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
@ -27,6 +27,9 @@
#ifdef __STDC__
#include <stdlib.h>
#endif
#if _LIBC
# include "../iconv/gconv_int.h"
#endif
int
_IO_new_fclose (fp)
@ -52,6 +55,25 @@ _IO_new_fclose (fp)
status = fp->_flags & _IO_ERR_SEEN ? -1 : 0;
_IO_FINISH (fp);
_IO_funlockfile (fp);
if (fp->_mode > 0)
{
#if _LIBC
/* This stream has a wide orientation. This means we have to free
the conversion functions. */
struct _IO_codecvt *cc = &fp->_wide_data->_codecvt;
if (cc->__cd_in.__cd.__steps->__shlib_handle != NULL)
{
--cc->__cd_in.__cd.__steps->__counter;
__gconv_close_transform (cc->__cd_in.__cd.__steps, 1);
}
if (cc->__cd_out.__cd.__steps->__shlib_handle != NULL)
{
--cc->__cd_out.__cd.__steps->__counter;
__gconv_close_transform (cc->__cd_out.__cd.__steps, 1);
}
#endif
}
_IO_cleanup_region_end (0);
if (_IO_have_backup (fp))
_IO_free_backup_area (fp);

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1999 Free Software Foundation, Inc.
/* Copyright (C) 1999, 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
@ -62,7 +62,7 @@ static int do_always_noconv (struct _IO_codecvt *codecvt);
/* The functions used in `codecvt' for libio are always the same. */
static struct _IO_codecvt libio_codecvt =
struct _IO_codecvt __libio_codecvt =
{
.__codecvt_destr = NULL, /* Destructor, never used. */
.__codecvt_do_out = do_out,
@ -114,7 +114,7 @@ _IO_fwide (fp, mode)
__wcsmbs_clone_conv (&fcts);
/* The functions are always the same. */
*cc = libio_codecvt;
*cc = __libio_codecvt;
cc->__cd_in.__cd.__nsteps = 1; /* Only one step allowed. */
cc->__cd_in.__cd.__steps = fcts.towc;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1993, 1997, 1998, 1999 Free Software Foundation, Inc.
/* Copyright (C) 1993, 1997, 1998, 1999, 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
@ -390,6 +390,7 @@ extern struct _IO_jump_t _IO_proc_jumps;
extern struct _IO_jump_t _IO_old_proc_jumps;
extern struct _IO_jump_t _IO_str_jumps;
extern struct _IO_jump_t _IO_wstr_jumps;
extern struct _IO_codecvt __libio_codecvt;
extern int _IO_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
extern int _IO_new_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
extern int _IO_old_do_write __P ((_IO_FILE *, const char *, _IO_size_t));

View File

@ -206,6 +206,21 @@ difference in POSIX systems (including the GNU system). If both
@samp{+} and @samp{b} are specified, they can appear in either order.
@xref{Binary Streams}.
@cindex stream orientation
@cindex orientation, stream
If the @var{opentype} string contains the sequence
@code{,ccs=@var{STRING}} then @var{STRING} is taken as the name of a
coded character set and @code{fopen} will mark the stream as
wide-oriented which appropriate conversion functions in place to convert
from and to the character set @var{STRING} is place. Any other stream
is opened initially unoriented and the orientation is decided with the
first file operation. If the first operation is a wide character
operation, the stream is not only marked as wide-oriented, also the
conversion functions to convert to the coded character set used for the
current locale are loaded. This will not change anymore from this point
on even if the locale selected for the @code{LC_CTYPE} category is
changed.
Any other characters in @var{opentype} are simply ignored. They may be
meaningful in other systems.

View File

@ -6,6 +6,7 @@ setfsuid.c
setfsgid.c
sys/debugreg.h
sys/elf.h
sys/io.h
sys/perm.h
sys/procfs.h
sys/reg.h

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1998, 1999 Free Software Foundation, Inc.
/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -250,3 +250,29 @@ __wcsmbs_clone_conv (struct gconv_fcts *copy)
__libc_lock_unlock (lock);
}
/* Clone the current conversion function set. */
int
internal_function
__wcsmbs_named_conv (struct gconv_fcts *copy, const char *name)
{
copy->towc = getfct ("INTERNAL", name);
if (copy->towc != NULL)
{
copy->tomb = getfct (name, "INTERNAL");
if (copy->tomb == NULL)
__gconv_close_transform (copy->towc, 1);
}
if (copy->towc == NULL || copy->tomb == NULL)
return 1;
/* Now increment the usage counters. */
if (copy->towc->__shlib_handle != NULL)
++copy->towc->__counter;
if (copy->tomb->__shlib_handle != NULL)
++copy->tomb->__counter;
return 0;
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1998, 1999 Free Software Foundation, Inc.
/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -45,6 +45,10 @@ extern void __wcsmbs_load_conv (const struct locale_data *new_category)
extern void __wcsmbs_clone_conv (struct gconv_fcts *copy)
internal_function;
/* Find the conversion functions for converting to and from NAME. */
extern int __wcsmbs_named_conv (struct gconv_fcts *copy, const char *name)
internal_function;
/* Check whether the LC_CTYPE locale changed since the last call.
Update the pointers appropriately. */