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