1 | /* Binary mode I/O. |
2 | Copyright (C) 2001, 2003, 2005, 2008-2019 Free Software Foundation, Inc. |
3 | |
4 | This program is free software: you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by |
6 | the Free Software Foundation; either version 3 of the License, or |
7 | (at your option) any later version. |
8 | |
9 | This program 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 |
12 | GNU General Public License for more details. |
13 | |
14 | You should have received a copy of the GNU General Public License |
15 | along with this program. If not, see <https://www.gnu.org/licenses/>. */ |
16 | |
17 | #ifndef _BINARY_H |
18 | #define _BINARY_H |
19 | |
20 | /* For systems that distinguish between text and binary I/O. |
21 | O_BINARY is guaranteed by the gnulib <fcntl.h>. */ |
22 | #include <fcntl.h> |
23 | |
24 | /* The MSVC7 <stdio.h> doesn't like to be included after '#define fileno ...', |
25 | so we include it here first. */ |
26 | #include <stdio.h> |
27 | |
28 | #ifndef _GL_INLINE_HEADER_BEGIN |
29 | #error "Please include config.h first." |
30 | #endif |
31 | _GL_INLINE_HEADER_BEGIN |
32 | #ifndef BINARY_IO_INLINE |
33 | # define BINARY_IO_INLINE _GL_INLINE |
34 | #endif |
35 | |
36 | #if O_BINARY |
37 | # if defined __EMX__ || defined __DJGPP__ || defined __CYGWIN__ |
38 | # include <io.h> /* declares setmode() */ |
39 | # define __gl_setmode setmode |
40 | # else |
41 | # define __gl_setmode _setmode |
42 | # undef fileno |
43 | # define fileno _fileno |
44 | # endif |
45 | #else |
46 | /* On reasonable systems, binary I/O is the only choice. */ |
47 | /* Use a function rather than a macro, to avoid gcc warnings |
48 | "warning: statement with no effect". */ |
49 | BINARY_IO_INLINE int |
50 | __gl_setmode (int fd _GL_UNUSED, int mode _GL_UNUSED) |
51 | { |
52 | return O_BINARY; |
53 | } |
54 | #endif |
55 | |
56 | /* Set FD's mode to MODE, which should be either O_TEXT or O_BINARY. |
57 | Return the old mode if successful, -1 (setting errno) on failure. |
58 | Ordinarily this function would be called 'setmode', since that is |
59 | its name on MS-Windows, but it is called 'set_binary_mode' here |
60 | to avoid colliding with a BSD function of another name. */ |
61 | |
62 | #if defined __DJGPP__ || defined __EMX__ |
63 | extern int set_binary_mode (int fd, int mode); |
64 | #else |
65 | BINARY_IO_INLINE int |
66 | set_binary_mode (int fd, int mode) |
67 | { |
68 | return __gl_setmode (fd, mode); |
69 | } |
70 | #endif |
71 | |
72 | /* This macro is obsolescent. */ |
73 | #define SET_BINARY(fd) ((void) set_binary_mode (fd, O_BINARY)) |
74 | |
75 | _GL_INLINE_HEADER_END |
76 | |
77 | #endif /* _BINARY_H */ |
78 | |