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