(_dl_close): Fix byte count while removing the shared object from the
[glibc.git] / stdio / glue.c
blob592700ff94cb5ed0a2992aae348ca6415927288a
1 /* Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB. If
16 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
17 Cambridge, MA 02139, USA. */
19 /* This file provides glue between Unix stdio and GNU stdio.
20 It supports use of Unix stdio `getc' and `putc' (and, by extension,
21 `getchar' and `putchar') macros on GNU stdio streams (they are slow, but
22 they work). It also supports all stdio operations (including Unix
23 `getc' and `putc') on Unix's stdin, stdout, and stderr (the elements of
24 `_iob').
26 The reasoning behind this is to allow programs (and especially
27 libraries) compiled with Unix header files to work with the GNU C
28 library. */
30 #include <stdio.h>
31 #include <errno.h>
33 typedef union
35 struct
37 int magic;
38 FILE **streamp; /* Overlaps GNU stdio `bufp' member. */
39 /* These two overlap the GNU stdio `get_limit' and `put_limit'
40 members. They must be <= `streamp'/`bufp' for GNU getc and putc
41 to do the right thing. */
42 FILE **streamp2, **streamp3;
43 } glue;
44 struct _iobuf
46 int _cnt;
47 unsigned char *_ptr;
48 unsigned char *_base;
49 int _bufsiz;
50 short int _flag;
51 char _file;
52 } unix_iobuf;
53 FILE gnu_stream;
54 } unix_FILE;
56 /* These are the Unix stdio's stdin, stdout, and stderr.
57 In Unix stdin is (&_iob[0]), stdout is (&_iob[1]), and stderr is
58 (&_iob[2]). The magic number marks these as glued streams. The
59 __validfp macro in stdio.h is used by every stdio function. It checks
60 for glued streams, and replaces them with the GNU stdio stream. */
61 unix_FILE _iob[] =
63 #define S(name) { { _GLUEMAGIC, &name, &name, &name } }
64 S (stdin),
65 S (stdout),
66 S (stderr),
67 #undef S
70 /* Called by the Unix stdio `getc' macro.
71 The macro is assumed to look something like:
72 (--file->_cnt < 0 ? _filbuf (file) ...)
73 In a Unix stdio FILE `_cnt' is the first element.
74 In a GNU stdio or glued FILE, the first element is the magic number. */
75 int
76 _filbuf (file)
77 unix_FILE *file;
79 switch (++file->glue.magic) /* Compensate for Unix getc's decrement. */
81 case _GLUEMAGIC:
82 /* This is a glued stream. */
83 return getc (*file->glue.streamp);
85 case _IOMAGIC:
86 /* This is a normal GNU stdio stream. */
87 return getc ((FILE *) file);
89 default:
90 /* Bogus stream. */
91 __set_errno (EINVAL);
92 return EOF;
96 /* Called by the Unix stdio `putc' macro. Much like getc, above. */
97 int
98 _flsbuf (c, file)
99 int c;
100 unix_FILE *file;
102 /* Compensate for putc's decrement. */
103 switch (++file->glue.magic)
105 case _GLUEMAGIC:
106 return putc (c, *file->glue.streamp);
108 case _IOMAGIC:
109 return putc (c, (FILE *) file);
111 default:
112 __set_errno (EINVAL);
113 return EOF;