1 #ifndef SCM_FPORTS_H 2 #define SCM_FPORTS_H 3 4 /* Copyright 1995-2001,2006,2008-2009,2011-2012,2017-2019 5 Free Software Foundation, Inc. 6 7 This file is part of Guile. 8 9 Guile is free software: you can redistribute it and/or modify it 10 under the terms of the GNU Lesser General Public License as published 11 by the Free Software Foundation, either version 3 of the License, or 12 (at your option) any later version. 13 14 Guile is distributed in the hope that it will be useful, but WITHOUT 15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 17 License for more details. 18 19 You should have received a copy of the GNU Lesser General Public 20 License along with Guile. If not, see 21 <https://www.gnu.org/licenses/>. */ 22 23 24 25 #include "libguile/gc.h" 26 #include "libguile/ports.h" 27 28 29 30 /* struct allocated for each buffered FPORT. */ 31 typedef struct scm_t_fport { 32 /* The file descriptor. */ 33 int fdes; 34 /* Revealed count; 0 indicates not revealed, > 1 revealed. */ 35 unsigned int revealed; 36 /* Set of scm_fport_option flags. */ 37 unsigned options; 38 } scm_t_fport; 39 40 SCM_API scm_t_port_type *scm_file_port_type; 41 42 #define SCM_FSTREAM(x) ((scm_t_fport *) SCM_STREAM (x)) 43 #define SCM_FPORT_FDES(x) (SCM_FSTREAM (x)->fdes) 44 45 #define SCM_FPORTP(x) \ 46 (SCM_PORTP (x) && SCM_PORT_TYPE (x) == scm_file_port_type) 47 #define SCM_OPFPORTP(x) (SCM_FPORTP (x) && (SCM_CELL_WORD_0 (x) & SCM_OPN)) 48 #define SCM_OPINFPORTP(x) (SCM_OPFPORTP (x) && (SCM_CELL_WORD_0 (x) & SCM_RDNG)) 49 #define SCM_OPOUTFPORTP(x) (SCM_OPFPORTP (x) && (SCM_CELL_WORD_0 (x) & SCM_WRTNG)) 50 51 #define SCM_VALIDATE_FPORT(pos, port) \ 52 SCM_MAKE_VALIDATE_MSG (pos, port, FPORTP, "file port") 53 #define SCM_VALIDATE_OPFPORT(pos, port) \ 54 SCM_MAKE_VALIDATE_MSG (pos, port, OPFPORTP, "open file port") 55 56 57 SCM_API void scm_evict_ports (int fd); 58 SCM_INTERNAL int scm_i_mode_to_open_flags (SCM mode, int *is_binary, 59 const char *FUNC_NAME); 60 SCM_API SCM scm_open_file_with_encoding (SCM filename, SCM modes, 61 SCM guess_encoding, SCM encoding); 62 SCM_API SCM scm_open_file (SCM filename, SCM modes); 63 SCM_API SCM scm_fdes_to_port (int fdes, char *mode, SCM name); 64 SCM_API SCM scm_file_port_p (SCM obj); 65 66 67 /* Revealed counts. */ 68 SCM_API int scm_revealed_count (SCM port); 69 SCM_API SCM scm_port_revealed (SCM port); 70 SCM_API SCM scm_set_port_revealed_x (SCM port, SCM rcount); 71 SCM_API SCM scm_adjust_port_revealed_x (SCM port, SCM addend); 72 73 74 SCM_INTERNAL void scm_init_fports_keywords (void); 75 SCM_INTERNAL void scm_init_fports (void); 76 77 /* internal functions */ 78 79 #ifdef BUILDING_LIBGUILE 80 enum scm_fport_option 81 { 82 /* FD's that aren't created by Guile probably need to be checked for 83 validity. We also check that the open mode is valid. */ 84 SCM_FPORT_OPTION_VERIFY = 1U<<0, 85 /* We know some ports aren't seekable and can elide a syscall in 86 that case. */ 87 SCM_FPORT_OPTION_NOT_SEEKABLE = 1U<<1 88 }; 89 SCM_INTERNAL int scm_i_fdes_is_valid (int fdes, long mode_bits); 90 SCM_INTERNAL SCM scm_i_fdes_to_port (int fdes, long mode_bits, SCM name, 91 unsigned options); 92 93 #endif /* BUILDING_LIBGUILE */ 94 95 #endif /* SCM_FPORTS_H */ 96