]> git.donarmstrong.com Git - lilypond.git/blob - flower/memory-stream.cc
*** empty log message ***
[lilypond.git] / flower / memory-stream.cc
1 /*
2   memory-stream.cc --  implement Memory_out_stream
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
7
8 */
9
10 #include <assert.h>
11 #include <string.h>
12 #include <stdlib.h>
13 #include "memory-stream.hh"
14
15
16 /*
17   TODO: add read support as well.
18 */
19 const int Memory_out_stream::block_size_ = 1024;
20
21 cookie_io_functions_t
22 Memory_out_stream::functions_ = {
23   Memory_out_stream::reader,
24   Memory_out_stream::writer,
25   Memory_out_stream::seeker,
26   Memory_out_stream::cleaner
27 };
28
29 int
30 Memory_out_stream::cleaner (void *cookie)
31 {
32   Memory_out_stream *stream = (Memory_out_stream*) cookie;
33
34   stream->file_ = 0;
35   return 0;
36 }
37
38 Memory_out_stream::Memory_out_stream ()
39 {
40   size_ = 0;
41   buffer_ = 0; 
42   buffer_blocks_ = 0;
43   file_ = fopencookie ((void*) this, "w", functions_);
44 }
45
46 Memory_out_stream::~Memory_out_stream()
47 {
48   if (file_)
49     fclose (file_);
50
51   free (buffer_);
52 }
53
54 FILE*
55 Memory_out_stream::get_file () const
56 {
57   return file_;
58 }
59
60 ssize_t
61 Memory_out_stream::get_length () const
62 {
63   return size_;
64 }
65
66 const char *
67 Memory_out_stream::get_string () const
68 {
69   return buffer_;
70 }
71
72
73 ssize_t
74 Memory_out_stream::writer (void *cookie,
75                            const char *buffer,
76                            size_t size)
77 {
78   Memory_out_stream * stream = (Memory_out_stream*) cookie;
79   
80   ssize_t newsize = stream->size_ + size;
81
82   bool change = false;
83   while (newsize > stream->buffer_blocks_ * block_size_)
84     {
85       stream->buffer_blocks_ *= 2;
86       stream->buffer_blocks_ += 1;
87       change = true;
88     }
89
90   if (change)
91     stream->buffer_ = (char*) realloc (stream->buffer_, stream->buffer_blocks_ * block_size_);
92
93   memcpy (stream->buffer_ + stream->size_, buffer, size);
94   stream->size_ = newsize;
95
96   return size;
97 }
98
99
100 ssize_t
101 Memory_out_stream::reader (void *cookie,
102                            char *buffer,
103                            size_t size)
104 {
105   (void) cookie;
106   (void) buffer;
107   (void) size;
108   
109   assert (false);
110 }
111
112
113 int
114 Memory_out_stream::seeker (void*, off64_t *, int whence)
115 {
116   assert (false);
117   (void)whence;
118   return 0;
119 }