Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4973 | right-hear | 1 | /* Copyright (C) 1999 DJ Delorie, see COPYING.DJ for details */ |
2 | /* Copyright (C) 1997 DJ Delorie, see COPYING.DJ for details */ |
||
3 | /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ |
||
4 | #ifndef __dj_include_libc_file_h__ |
||
5 | #define __dj_include_libc_file_h__ |
||
6 | |||
7 | #include |
||
8 | #include |
||
9 | #include |
||
10 | |||
11 | #ifdef __cplusplus |
||
12 | extern "C" { |
||
13 | #endif |
||
14 | |||
15 | #ifndef __dj_ENFORCE_ANSI_FREESTANDING |
||
16 | |||
17 | #ifndef __STRICT_ANSI__ |
||
18 | |||
19 | #ifndef _POSIX_SOURCE |
||
20 | |||
21 | #define _IOREAD 000010 |
||
22 | #define _IOWRT 000020 |
||
23 | #define _IOMYBUF 000040 |
||
24 | #define _IOEOF 000100 |
||
25 | #define _IOERR 000200 |
||
26 | #define _IOSTRG 000400 |
||
27 | #define _IORW 001000 |
||
28 | #define _IOAPPEND 002000 |
||
29 | #define _IORMONCL 004000 /* remove on close, for temp files */ |
||
30 | /* if _flag & _IORMONCL, ._name_to_remove needs freeing */ |
||
31 | #define _IOUNGETC 010000 /* there is an ungetc'ed character in the buffer */ |
||
32 | #define _IOTERM 020000 /* file's handle hooked by termios */ |
||
33 | #define _IONTERM 040000 /* file's handle not hooked by termios */ |
||
34 | |||
35 | int _flsbuf(int, FILE*); |
||
36 | int _filbuf(FILE *); |
||
37 | void _fwalk(void (*)(FILE *)); |
||
38 | |||
39 | static __inline__ int __getc_raw(FILE *const p) |
||
40 | { |
||
41 | if(p->_cnt>0) |
||
42 | { |
||
43 | p->_cnt--; |
||
44 | return((unsigned char)*(p->_ptr++)); |
||
45 | } |
||
46 | return(_filbuf(p)); |
||
47 | } |
||
48 | |||
49 | static __inline__ int __putc_raw(int const x,FILE *const p) |
||
50 | { |
||
51 | if(p->_cnt>0) |
||
52 | { |
||
53 | p->_cnt--; |
||
54 | return((unsigned char)(*(p->_ptr++)=(unsigned char)x)); |
||
55 | } |
||
56 | return(_flsbuf((unsigned char)x,p)); |
||
57 | } |
||
58 | |||
59 | static __inline__ int __is_text_file(FILE *const p) |
||
60 | { |
||
61 | return(!((p)->_flag & (_IOSTRG | _IOTERM)) |
||
62 | && (__file_handle_modes[(p)->_file]&O_TEXT)); |
||
63 | } |
||
64 | |||
65 | static __inline__ int __getc(FILE *const p) |
||
66 | { |
||
67 | int __c; |
||
68 | if (__libc_read_termios_hook |
||
69 | && ((p)->_flag & (_IOTERM | _IONTERM)) == 0) |
||
70 | { |
||
71 | extern int __isatty(int); |
||
72 | /* first time we see this handle--see if termios hooked it */ |
||
73 | if (!((p)->_flag & _IOSTRG) && __isatty((p)->_file)) |
||
74 | (p)->_flag |= _IOTERM; |
||
75 | else |
||
76 | (p)->_flag |= _IONTERM; |
||
77 | } |
||
78 | __c = __getc_raw(p); |
||
79 | if (__c=='\r' && __is_text_file(p)) |
||
80 | return __getc_raw(p); |
||
81 | return __c; |
||
82 | } |
||
83 | |||
84 | static __inline__ int __putc(const int x,FILE *const p) |
||
85 | { |
||
86 | if (__libc_write_termios_hook |
||
87 | && ((p)->_flag & (_IOTERM | _IONTERM)) == 0) |
||
88 | { |
||
89 | extern int __isatty(int); |
||
90 | /* first time we see this handle--see if termios hooked it */ |
||
91 | if (!((p)->_flag & _IOSTRG) && __isatty((p)->_file)) |
||
92 | (p)->_flag |= _IOTERM; |
||
93 | else |
||
94 | (p)->_flag |= _IONTERM; |
||
95 | } |
||
96 | if(x=='\n' && __is_text_file(p)) |
||
97 | __putc_raw('\r',p); |
||
98 | return __putc_raw(x,p); |
||
99 | } |
||
100 | |||
101 | #undef fileno |
||
102 | #define fileno(f) (f->_file) |
||
103 | #undef feof |
||
104 | #define feof(f) (((f)->_flag&_IOEOF)!=0) |
||
105 | #undef ferror |
||
106 | #define ferror(f) (((f)->_flag&_IOERR)!=0) |
||
107 | |||
108 | #endif /* !_POSIX_SOURCE */ |
||
109 | #endif /* !__STRICT_ANSI__ */ |
||
110 | #endif /* !__dj_ENFORCE_ANSI_FREESTANDING */ |
||
111 | |||
112 | #ifndef __dj_ENFORCE_FUNCTION_CALLS |
||
113 | #endif /* !__dj_ENFORCE_FUNCTION_CALLS */ |
||
114 | |||
115 | #ifdef __cplusplus |
||
116 | } |
||
117 | #endif |
||
118 | |||
119 | #endif /* __dj_include_libc_file_h__ */ |