1 /*@ file_case: input file encapsulator
3 * Copyright (c) 2014 Steffen (Daode) Nurpmeso <sdaoden@users.sf.net>.
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
29 FILE *_file
; // fc_have_stdio
30 void *_layer
; // E.g., gzFile
35 // Flags for ctor / muxer()
38 fc_dont_close
= 1<<0, // Don't close the file, if any
39 fc_pipe
= 1<<1, // _file is not seekable
40 fc_const_path
= 1<<2, // Don't dup path, and don't a_delete it
41 fc_take_path
= 1<<3, // Don't dup path, but a_delete it
42 fc_have_stdio
= 1<<4, // .file() may be used
44 fc_mask
= (1<<_fc_freebit
) - 1
47 // Flags only for muxer()
49 mux_need_seek
= 1<<(_fc_freebit
+0), // File must be seekable
50 mux_need_binary
= 1<<(_fc_freebit
+1), // Need binary I/O
51 mux_unpack
= 1<<(_fc_freebit
+2), // Do auto-check for FILE{.gz,.bz2..}
52 mux_no_unpack
= 1<<(_fc_freebit
+3), // Do NOT auto-check
53 mux_need_stdio
= 1<<(_fc_freebit
+4), // Only then may .file() be used
54 _mux_freebit
= _fc_freebit
+ 5,
56 mux_default
= fc_none
,
57 // Defines the global default strategy for dealing with packed files in case
58 // none of the above has been given explicitly by a callee
59 _mux_unpack_default
= mux_unpack
68 file_case(FILE *fp
, char const *path
, uint32_t flags
=fc_none
);
72 char const * path(void) const;
73 FILE * file(void) const;
74 bool is_pipe(void) const;
76 bool is_eof(void) const;
79 char * get_line(char *buf
, size_t buf_size
);
80 size_t get_buf(void *buf
, size_t buf_size
);
82 int seek(long offset
, seek_whence whence
=seek_set
);
84 // Factory muxer; note that fc_take_path will be honoured even on failure
85 // If path is NULL or "-" we'll go for stdin
86 static file_case
* muxer(char const *path
=NULL
, uint32_t flags
=mux_default
);
88 CLASS_DISABLE_COPY(file_case
);
92 file_case::file_case(FILE *fp
, char const *path
, uint32_t flags
)
94 _path(path
), _file(fp
), _layer(NULL
), _flags(flags
)
96 assert(!(flags
& (fc_const_path
| fc_take_path
)) ||
97 !(flags
& fc_const_path
) != !(flags
& fc_take_path
));
98 assert(!(flags
& ~fc_mask
));
102 file_case::~file_case(void)
104 if (_file
!= NULL
|| _layer
!= NULL
) // xxx (uintptr_t)a|(uintptr_t)b
109 file_case::path(void) const
115 file_case::file(void) const
117 assert(_flags
& fc_have_stdio
);
122 file_case::is_pipe(void) const
124 return ((_flags
& fc_pipe
) != 0);
127 #endif // _FILE_CASE_H