mirror of
				https://github.com/zigzap/zap.git
				synced 2025-10-21 23:54:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			166 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
| Copyright: Boaz Segev, 2017-2019
 | |
| License: MIT
 | |
| */
 | |
| #if !defined(H_FIOBJ_IO_H) && (defined(__unix__) || defined(__APPLE__) ||      \
 | |
|                                defined(__linux__) || defined(__CYGWIN__))
 | |
| 
 | |
| /**
 | |
|  * A dynamic type for reading / writing to a local file,  a temporary file or an
 | |
|  * in-memory string.
 | |
|  *
 | |
|  * Supports basic reak, write, seek, puts and gets operations.
 | |
|  *
 | |
|  * Writing is always performed at the end of the stream / memory buffer,
 | |
|  * ignoring the current seek position.
 | |
|  */
 | |
| #define H_FIOBJ_IO_H
 | |
| 
 | |
| #include <fiobject.h>
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /* *****************************************************************************
 | |
| Creating the Data Stream object
 | |
| ***************************************************************************** */
 | |
| 
 | |
| /** Creates a new local in-memory Data Stream object */
 | |
| FIOBJ fiobj_data_newstr(void);
 | |
| 
 | |
| /**
 | |
|  * Creates a Data object from an existing buffer. The buffer will be deallocated
 | |
|  * using the provided `dealloc` function pointer. Use a NULL `dealloc` function
 | |
|  * pointer if the buffer is static and shouldn't be freed.
 | |
|  */
 | |
| FIOBJ fiobj_data_newstr2(void *buffer, uintptr_t length,
 | |
|                          void (*dealloc)(void *));
 | |
| 
 | |
| /** Creates a new local tempfile Data Stream object */
 | |
| FIOBJ fiobj_data_newtmpfile(void);
 | |
| 
 | |
| /** Creates a new local file Data Stream object */
 | |
| FIOBJ fiobj_data_newfd(int fd);
 | |
| 
 | |
| /** Creates a slice from an existing Data object. */
 | |
| FIOBJ fiobj_data_slice(FIOBJ parent, intptr_t offset, uintptr_t length);
 | |
| 
 | |
| /* *****************************************************************************
 | |
| Saving the Data Stream object
 | |
| ***************************************************************************** */
 | |
| 
 | |
| /** Creates a new local file Data Stream object */
 | |
| int fiobj_data_save(FIOBJ io, const char *filename);
 | |
| 
 | |
| /* *****************************************************************************
 | |
| Reading API
 | |
| ***************************************************************************** */
 | |
| 
 | |
| /**
 | |
|  * Reads up to `length` bytes and returns a temporary(!) buffer object (not NUL
 | |
|  * terminated).
 | |
|  *
 | |
|  * If `length` is zero or negative, it will be computed from the end of the
 | |
|  * input backwards (0 == EOF).
 | |
|  *
 | |
|  * The C string object will be invalidate the next time a function call to the
 | |
|  * Data Stream object is made.
 | |
|  */
 | |
| fio_str_info_s fiobj_data_read(FIOBJ io, intptr_t length);
 | |
| 
 | |
| /**
 | |
|  * Reads until the `token` byte is encountered or until the end of the stream.
 | |
|  *
 | |
|  * Returns a temporary(!) C string including the end of line marker.
 | |
|  *
 | |
|  * Careful when using this call on large file streams, as the whole file
 | |
|  * stream might be loaded into the memory.
 | |
|  *
 | |
|  * The C string object will be invalidate the next time a function call to the
 | |
|  * Data Stream object is made.
 | |
|  */
 | |
| fio_str_info_s fiobj_data_read2ch(FIOBJ io, uint8_t token);
 | |
| 
 | |
| /**
 | |
|  * Reads a line (until the '\n' byte is encountered) or until the end of the
 | |
|  * available data.
 | |
|  *
 | |
|  * Returns a temporary(!) buffer object (not NUL terminated) including the end
 | |
|  * of line marker.
 | |
|  *
 | |
|  * Careful when using this call on large file streams, as the whole file stream
 | |
|  * might be loaded into the memory.
 | |
|  *
 | |
|  * The C string object will be invalidate the next time a function call to the
 | |
|  * Data Stream object is made.
 | |
|  */
 | |
| #define fiobj_data_gets(io) fiobj_data_read2ch((io), '\n');
 | |
| 
 | |
| /**
 | |
|  * Returns the current reading position. Returns -1 on error.
 | |
|  */
 | |
| intptr_t fiobj_data_pos(FIOBJ io);
 | |
| 
 | |
| /**
 | |
|  * Returns the length of the stream.
 | |
|  */
 | |
| intptr_t fiobj_data_len(FIOBJ io);
 | |
| 
 | |
| /**
 | |
|  * Moves the reading position to the requested position.
 | |
|  */
 | |
| void fiobj_data_seek(FIOBJ io, intptr_t position);
 | |
| 
 | |
| /**
 | |
|  * Reads up to `length` bytes starting at `start_at` position and returns a
 | |
|  * temporary(!) buffer object (not NUL terminated) string object. The reading
 | |
|  * position is ignored and unchanged.
 | |
|  *
 | |
|  * The C string object will be invalidate the next time a function call to the
 | |
|  * Data Stream object is made.
 | |
|  */
 | |
| fio_str_info_s fiobj_data_pread(FIOBJ io, intptr_t start_at, uintptr_t length);
 | |
| 
 | |
| /* *****************************************************************************
 | |
| Writing API
 | |
| ***************************************************************************** */
 | |
| 
 | |
| /**
 | |
|  * Writes `length` bytes at the end of the Data Stream stream, ignoring the
 | |
|  * reading position.
 | |
|  *
 | |
|  * Behaves and returns the same value as the system call `write`.
 | |
|  */
 | |
| intptr_t fiobj_data_write(FIOBJ io, void *buffer, uintptr_t length);
 | |
| 
 | |
| /**
 | |
|  * Writes `length` bytes at the end of the Data Stream stream, ignoring the
 | |
|  * reading position, adding an EOL marker ("\r\n") to the end of the stream.
 | |
|  *
 | |
|  * Behaves and returns the same value as the system call `write`.
 | |
|  */
 | |
| intptr_t fiobj_data_puts(FIOBJ io, void *buffer, uintptr_t length);
 | |
| 
 | |
| /**
 | |
|  * Makes sure the Data Stream object isn't attached to a static or external
 | |
|  * string.
 | |
|  *
 | |
|  * If the Data Stream object is attached to a static or external string, the
 | |
|  * data will be copied to a new memory block.
 | |
|  *
 | |
|  * If the Data Stream object is a slice from another Data Stream object, the
 | |
|  * data will be copied and the type of Data Stream object (memory vs. tmpfile)
 | |
|  * will be inherited.
 | |
|  */
 | |
| void fiobj_data_assert_dynamic(FIOBJ io);
 | |
| 
 | |
| #if DEBUG
 | |
| void fiobj_data_test(void);
 | |
| #endif
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif
 | 
