2 * Copyright (c) 2001, Robert Collins.
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 2 of the License, or
7 * (at your option) any later version.
9 * A copy of the GNU General Public License can be found at
12 * Written by Robert Collins <rbtcollins@hotmail.com>
16 #ifndef SETUP_IO_STREAM_MEMORY_H
17 #define SETUP_IO_STREAM_MEMORY_H
22 /* this is a stream class that simply abstracts the issue of maintaining
24 * It's not as efficient as if can be, but that can be fixed without affecting
31 memblock () : next (0), len (0), data (0) {};
32 memblock (size_t size
) : next (0), len (size
) {data
= new unsigned char[size
]; if (!data
) len
= 0;};
39 class io_stream_memory
:public io_stream
42 io_stream_memory () : lasterr (0), mtime(0),length (0), head(), tail (&head
), pos_block (head
.next
), pos_block_offset (0), pos (0) {};
43 /* set the modification time of a file - returns 1 on failure
44 * may distrupt internal state - use after all important io is complete
46 virtual int set_mtime (time_t newmtime
)
47 {mtime
= newmtime
; return 0;};
48 /* get the mtime for a file TODO make this a stat(0 style call */
49 virtual time_t get_mtime () {return mtime
;};
50 virtual mode_t
get_mode () {return 0;};
51 /* returns the _current_ size. */
52 virtual size_t get_size () {return length
;};
53 /* read data (duh!) */
54 virtual ssize_t
read (void *buffer
, size_t len
);
55 /* provide data to (double duh!) */
56 virtual ssize_t
write (const void *buffer
, size_t len
);
57 /* read data without removing it from the class's internal buffer */
58 virtual ssize_t
peek (void *buffer
, size_t len
);
59 /* ever read the f* functions from libc ? */
60 virtual long tell () {return pos
;};
61 virtual int seek (long where
, io_stream_seek_t whence
) { if (whence
!= IO_SEEK_SET
) { lasterr
= EINVAL
; return -1;} ssize_t count
=0; pos
= 0; pos_block
= head
.next
; pos_block_offset
= 0; while (count
< where
&& pos
< length
) {pos_block_offset
++; if (pos_block_offset
== pos_block
->len
) {pos_block
= pos_block
->next
; pos_block_offset
= 0;}pos
++;count
++;}return 0;};
63 /* try guessing this one */
65 // virtual const char* next_file_name() = NULL;
66 /* if you are still needing these hints... give up now! */
67 virtual ~ io_stream_memory ();
75 size_t pos_block_offset
;
79 #endif /* SETUP_IO_STREAM_MEMORY_H */