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