* mach/devstream.c (devstream_write, devstream_read): New functions.

(input, output): Functions removed.
	(mach_open_devstream): Use devstream_{read,write} as cookie functions,
	using only the vanilla fopencookie interface.

	* hurd/fopenport.c [! USE_IN_LIBIO] (cookie_io_functions_t): Define
	as macro for __io_functions.
	(funcsio): Use cookie_io_functions_t type name.
	(fopenport): Renamed from __fopenport.  Rewrite to call fopencookie.

	* libio/iofopncook.c (_IO_cookie_init): New function, broken out of
	fopencookie.
	(fopencookie): Use it.
	* libio/libio.h: Declare _IO_cookie_init.
	* hurd/vpprintf.c (vpprintf) [USE_IN_LIBIO]: Implement using
	_IO_cookie_init.

	* libio/libio.h (__io_seek_fn): Fix second argument type
	to be a pointer, in line with the manual and the old stdio.
	* libio/iofopncook.c (_IO_cookie_seek): Fix (sole) caller.

	* sysdeps/generic/bits/stdio-lock.h: New file.
	This is a stub with #error, but that's better than no file at all.

	* sysdeps/unix/sysv/linux/alpha/syscall.S:
	* manual/message.texi (Using gettextized software):
	* manual/filesys.texi (File Size):
	* manual/charset.texi (glibc iconv Implementation):
	* locale/programs/ld-collate.c (collate_output):
	* manual/stdio.texi (Output Conversion Syntax):
This commit is contained in:
Roland McGrath 2000-03-10 08:46:33 +00:00
parent 418f095a3e
commit b4e54243c4
7 changed files with 240 additions and 213 deletions

View file

@ -1,15 +1,41 @@
2000-03-10 Roland McGrath <roland@baalperazim.frob.com>
* mach/devstream.c (devstream_write, devstream_read): New functions.
(input, output): Functions removed.
(mach_open_devstream): Use devstream_{read,write} as cookie functions,
using only the vanilla fopencookie interface.
* hurd/fopenport.c [! USE_IN_LIBIO] (cookie_io_functions_t): Define
as macro for __io_functions.
(funcsio): Use cookie_io_functions_t type name.
(fopenport): Renamed from __fopenport. Rewrite to call fopencookie.
* libio/iofopncook.c (_IO_cookie_init): New function, broken out of
fopencookie.
(fopencookie): Use it.
* libio/libio.h: Declare _IO_cookie_init.
* hurd/vpprintf.c (vpprintf) [USE_IN_LIBIO]: Implement using
_IO_cookie_init.
* libio/libio.h (__io_seek_fn): Fix second argument type
to be a pointer, in line with the manual and the old stdio.
* libio/iofopncook.c (_IO_cookie_seek): Fix (sole) caller.
* sysdeps/generic/bits/stdio-lock.h: New file.
This is a stub with #error, but that's better than no file at all.
2000-03-09 Martin Buchholz <martin@xemacs.org>
* sysdeps/unix/sysv/linux/alpha/syscall.S:
* manual/message.texi (Using gettextized software):
* sysdeps/unix/sysv/linux/alpha/syscall.S:
* manual/message.texi (Using gettextized software):
* manual/message.texi (Message Translation): Doc Fixes.
* manual/filesys.texi (File Size):
* manual/charset.texi (glibc iconv Implementation):
* locale/programs/ld-collate.c (collate_output):
* manual/filesys.texi (File Size):
* manual/charset.texi (glibc iconv Implementation):
* locale/programs/ld-collate.c (collate_output):
* iconv/gconv_db.c (find_derivation):
* manual/install.texi:
* manual/search.texi (Hash Search Function):
* manual/stdio.texi (Output Conversion Syntax):
* manual/stdio.texi (Output Conversion Syntax):
* FAQ.in:
* config.h.in:
* sysdeps/generic/dl-sysdep.c:

46
bits/stdio-lock.h Normal file
View file

@ -0,0 +1,46 @@
/* Thread package specific definitions of stream lock type. Stub version.
Copyright (C) 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _BITS_STDIO_LOCK_H
#define _BITS_STDIO_LOCK_H 1
#include <bits/libc-lock.h>
__libc_lock_define (typedef, _IO_lock_t)
/* We need recursive (counting) mutexes. */
#define _IO_lock_initializer STUB_LOSER
#error libio needs recursive mutexes for _IO_MTSAFE_IO
#define _IO_cleanup_region_start(_fct, _fp) \
__libc_cleanup_region_start (_fct, _fp)
#define _IO_cleanup_region_end(_doit) \
__libc_cleanup_region_end (_doit)
#define _IO_lock_init(_name) \
__libc_lock_init_recursive (_name)
#define _IO_lock_fini(_name) \
__libc_lock_fini_recursive (_name)
#define _IO_lock_lock(_name) \
__libc_lock_lock (_name)
#define _IO_lock_unlock(_name) \
__libc_lock_unlock (_name)
#endif /* bits/stdio-lock.h */

View file

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1994, 1997 Free Software Foundation, Inc.
/* Copyright (C) 1991,94,97,2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -33,7 +33,6 @@ pwrite (void *cookie,
return n;
}
/* Write formatted output to PORT, a Mach port supporting the i/o protocol,
according to the format string FORMAT, using the argument list in ARG. */
int
@ -42,6 +41,27 @@ vpprintf (io_t port,
va_list arg)
{
int done;
#ifdef USE_IN_LIBIO
struct locked_FILE
{
struct _IO_cookie_file cfile;
#ifdef _IO_MTSAFE_IO
_IO_lock_t lock;
#endif
} temp_f;
#ifdef _IO_MTSAFE_IO
temp_f.cfile.__file._lock = &temp_f.lock;
#endif
_IO_cookie_init (&temp_f.cfile, _IO_NO_READS,
(void *) port, (cookie_io_functions_t) { write: pwrite });
done = _IO_vfprintf (&temp_f.cfile.__file, format, arg);
#else
FILE f;
/* Create an unbuffered stream talking to PORT on the stack. */
@ -57,5 +77,7 @@ vpprintf (io_t port,
/* vfprintf will use a buffer on the stack for the life of the call. */
done = vfprintf (&f, format, arg);
#endif
return done;
}

View file

@ -1,4 +1,4 @@
/* Copyright (C) 1993, 1995, 1997, 1999 Free Software Foundation, Inc.
/* Copyright (C) 1993,95,97,99,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
@ -74,10 +74,9 @@ _IO_cookie_seek (fp, offset, dir)
{
struct _IO_cookie_file *cfile = (struct _IO_cookie_file *) fp;
if (cfile->__io_functions.seek == NULL)
return _IO_pos_BAD;
return cfile->__io_functions.seek (cfile->__cookie, offset, dir);
return ((cfile->__io_functions.seek == NULL
|| cfile->__io_functions.seek (cfile->__cookie, &offset, dir))
? _IO_pos_BAD : offset);
}
static int
@ -117,6 +116,29 @@ static struct _IO_jump_t _IO_cookie_jumps = {
};
void
_IO_cookie_init (struct _IO_cookie_file *cfile, int read_write,
void *cookie, _IO_cookie_io_functions_t io_functions)
{
_IO_init (&cfile->__file, 0);
_IO_JUMPS (&cfile->__file) = &_IO_cookie_jumps;
cfile->__cookie = cookie;
cfile->__io_functions = io_functions;
_IO_file_init(&cfile->__file);
cfile->__file._IO_file_flags =
_IO_mask_flags (&cfile->__file, read_write,
_IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
/* We use a negative number different from -1 for _fileno to mark that
this special stream is not associated with a real file, but still has
to be treated as such. */
cfile->__file._fileno = -2;
}
_IO_FILE *
fopencookie (cookie, mode, io_functions)
void *cookie;
@ -156,21 +178,7 @@ fopencookie (cookie, mode, io_functions)
new_f->cfile.__file._lock = &new_f->lock;
#endif
_IO_init (&new_f->cfile.__file, 0);
_IO_JUMPS (&new_f->cfile.__file) = &_IO_cookie_jumps;
new_f->cfile.__cookie = cookie;
new_f->cfile.__io_functions = io_functions;
_IO_file_init(&new_f->cfile.__file);
new_f->cfile.__file._IO_file_flags =
_IO_mask_flags (&new_f->cfile.__file, read_write,
_IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
/* We use a negative number different from -1 for _fileno to mark that
this special stream is not associated with a real file, but still has
to be treated as such. */
new_f->cfile.__file._fileno = -2;
_IO_cookie_init (&new_f->cfile, read_write, cookie, io_functions);
return &new_f->cfile.__file;
}

View file

@ -1,4 +1,4 @@
/* Copyright (C) 1991,92,93,94,95,97,98,99 Free Software Foundation, Inc.
/* Copyright (C) 1991,92,93,94,95,97,98,99,2000 Free Software Foundation, Inc.
This file is part of the GNU IO Library.
Written by Per Bothner <bothner@cygnus.com>.
@ -346,7 +346,7 @@ typedef __ssize_t __io_write_fn (void *__cookie, __const char *__buf,
or the end of the file (if W is SEEK_END).
Set *POS to the new file position.
Returns zero if successful, nonzero if not. */
typedef int __io_seek_fn (void *__cookie, _IO_off_t __pos, int __w);
typedef int __io_seek_fn (void *__cookie, _IO_off64_t *__pos, int __w);
/* Close COOKIE. */
typedef int __io_close_fn (void *__cookie);
@ -377,6 +377,10 @@ struct _IO_cookie_file
void *__cookie;
_IO_cookie_io_functions_t __io_functions;
};
/* Initialize one of those. */
extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write,
void *__cookie, _IO_cookie_io_functions_t __fns);
#endif

View file

@ -1,6 +1,6 @@
/* stdio on a Mach device port.
Translates \n to \r\n on output, echos and translates \r to \n on input.
Copyright (C) 1992, 1993, 1994, 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1992,93,94,96,97,2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -24,126 +24,13 @@
#include <errno.h>
#include <string.h>
static int
input (FILE *f)
static ssize_t
devstream_write (void *cookie, const char *buffer, size_t n)
{
kern_return_t err;
char *buffer;
size_t to_read;
mach_msg_type_number_t nread;
char c;
const device_t dev = (device_t) cookie;
if (f->__buffer == NULL)
{
buffer = &c;
to_read = 1;
}
else
{
buffer = f->__buffer;
to_read = f->__bufsize;
}
f->__eof = 0;
nread = to_read;
err = device_read_inband ((device_t) f->__cookie, 0, f->__target,
to_read, buffer, &nread);
if (err)
{
f->__error = 1;
f->__bufp = f->__get_limit = f->__put_limit = f->__buffer;
errno = err;
return EOF;
}
/* Echo it back. */
err = device_write_inband ((device_t) f->__cookie, 0, f->__target,
buffer, nread, (int *) &to_read);
/* Translate LF to CR. */
{
char *p;
for (p = memchr (buffer, '\r', nread); p;
p = memchr (p + 1, '\r', (buffer + nread) - (p + 1)))
*p = '\n';
}
if (f->__buffer == NULL)
return (unsigned char) c;
f->__get_limit = f->__buffer + nread;
f->__bufp = f->__buffer;
f->__put_limit = f->__buffer + (f->__mode.__write ? f->__bufsize : 0);
return (unsigned char) *f->__bufp++;
}
#if 0
static void
output (FILE *f, int c)
{
inline void write_some (const char *p, size_t to_write)
{
kern_return_t err;
int wrote;
while (to_write > 0)
{
if (err = device_write ((device_t) f->__cookie, 0,
f->__target, (char *)p,
to_write, &wrote))
{
errno = err;
f->__error = 1;
break;
}
p += wrote;
to_write -= wrote;
f->__target += wrote;
}
}
if (f->__buffer != NULL)
{
if (f->__put_limit == f->__buffer)
{
/* Prime the stream for writing. */
f->__put_limit = f->__buffer + f->__bufsize;
f->__bufp = f->__buffer;
if (c != EOF)
{
*f->__bufp++ = (unsigned char) c;
c = EOF;
}
}
/* Write out the buffer. */
write_some (f->__buffer, f->__bufp - f->__buffer);
f->__bufp = f->__buffer;
}
if (c != EOF && !ferror (f))
{
if (f->__linebuf && (unsigned char) c == '\n')
{
static const char nl = '\n';
write_some (&nl, 1);
}
else
*f->__bufp++ = (unsigned char) c;
}
}
#endif
static void
output (FILE *f, int c)
{
void write_some (const char *p, size_t to_write)
int write_some (const char *p, size_t to_write)
{
kern_return_t err;
int wrote;
@ -155,85 +42,71 @@ output (FILE *f, int c)
if (thiswrite > IO_INBAND_MAX)
thiswrite = IO_INBAND_MAX;
if (err = device_write_inband ((device_t) f->__cookie, 0,
f->__target, p, thiswrite, &wrote))
if (err = device_write_inband (dev, 0, 0, p, thiswrite, &wrote))
{
errno = err;
f->__error = 1;
break;
return 0;
}
p += wrote;
to_write -= wrote;
f->__target += wrote;
}
return 1;
}
void write_crlf (void)
int write_crlf (void)
{
static const char crlf[] = "\r\n";
write_some (crlf, 2);
return write_some (crlf, 2);
}
if (f->__buffer == NULL)
/* Search for newlines (LFs) in the buffer. */
const char *start = buffer, *p;
while ((p = memchr (start, '\n', n)) != NULL)
{
/* The stream is unbuffered. */
/* Found one. Write out through the preceding character,
and then write a CR/LF pair. */
if (c == '\n')
write_crlf ();
else if (c != EOF)
{
char cc = (unsigned char) c;
write_some (&cc, 1);
}
if ((p > start && !write_some (start, p - start))
|| !write_crlf ())
return (start - buffer) ?: -1;
return;
n -= p + 1 - start;
start = p + 1;
}
if (f->__put_limit == f->__buffer)
/* Write the remainder of the buffer. */
if (write_some (start, n))
start += n;
return (start - buffer) ?: -1;
}
static ssize_t
devstream_read (void *cookie, char *buffer, size_t to_read)
{
const device_t dev = (device_t) cookie;
kern_return_t err;
mach_msg_type_number_t nread = to_read;
err = device_read_inband (dev, 0, 0, to_read, buffer, &nread);
if (err)
{
/* Prime the stream for writing. */
f->__put_limit = f->__buffer + f->__bufsize;
f->__bufp = f->__buffer;
if (c != EOF)
{
*f->__bufp++ = (unsigned char) c;
c = EOF;
}
errno = err;
return -1;
}
/* Translate CR to LF. */
{
/* Search for newlines (LFs) in the buffer. */
char *start = f->__buffer, *p = start;
while (!ferror (f) && (p = memchr (p, '\n', f->__bufp - start)))
{
/* Found one. Replace it with a CR and write out through that CR. */
*p = '\r';
write_some (start, p + 1 - start);
/* Change it back to an LF; the next iteration will write it out
first thing. Start the next searching iteration one char later. */
start = p;
*p++ = '\n';
}
/* Write the remainder of the buffer. */
if (!ferror (f))
write_some (start, f->__bufp - start);
char *p;
for (p = memchr (buffer, '\r', nread); p;
p = memchr (p + 1, '\r', (buffer + nread) - (p + 1)))
*p = '\n';
}
f->__bufp = f->__buffer;
/* Echo back what we read. */
(void) devstream_write (cookie, buffer, nread);
if (c != EOF && !ferror (f))
{
if (f->__linebuf && (unsigned char) c == '\n')
write_crlf ();
else
*f->__bufp++ = (unsigned char) c;
}
return nread;
}
static int
@ -247,6 +120,12 @@ dealloc_ref (void *cookie)
return 0;
}
#ifndef USE_IN_LIBIO
#define cookie_io_functions_t __io_functions
#define write __write
#define read __read
#define close __close
#endif
FILE *
mach_open_devstream (mach_port_t dev, const char *mode)
@ -259,19 +138,15 @@ mach_open_devstream (mach_port_t dev, const char *mode)
return NULL;
}
stream = fopencookie ((void *) dev, mode, __default_io_functions);
stream = fopencookie ((void *) dev, mode,
(cookie_io_functions_t) { write: devstream_write,
read: devstream_read,
close: dealloc_ref });
if (stream == NULL)
{
mach_port_deallocate (mach_task_self (), dev);
return NULL;
}
stream->__room_funcs.__input = input;
stream->__room_funcs.__output = output;
stream->__io_funcs.__close = dealloc_ref;
stream->__io_funcs.__seek = NULL; /* Cannot seek. */
stream->__io_funcs.__fileno = NULL; /* No corresponding POSIX.1 fd. */
stream->__seen = 1;
return stream;
}

View file

@ -0,0 +1,46 @@
/* Thread package specific definitions of stream lock type. Stub version.
Copyright (C) 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _BITS_STDIO_LOCK_H
#define _BITS_STDIO_LOCK_H 1
#include <bits/libc-lock.h>
__libc_lock_define (typedef, _IO_lock_t)
/* We need recursive (counting) mutexes. */
#define _IO_lock_initializer STUB_LOSER
#error libio needs recursive mutexes for _IO_MTSAFE_IO
#define _IO_cleanup_region_start(_fct, _fp) \
__libc_cleanup_region_start (_fct, _fp)
#define _IO_cleanup_region_end(_doit) \
__libc_cleanup_region_end (_doit)
#define _IO_lock_init(_name) \
__libc_lock_init_recursive (_name)
#define _IO_lock_fini(_name) \
__libc_lock_fini_recursive (_name)
#define _IO_lock_lock(_name) \
__libc_lock_lock (_name)
#define _IO_lock_unlock(_name) \
__libc_lock_unlock (_name)
#endif /* bits/stdio-lock.h */