]> git.donarmstrong.com Git - lilypond.git/blob - mi2mu/lily-stream.cc
release: 0.1.7
[lilypond.git] / mi2mu / lily-stream.cc
1 //
2 // lily-stream.cc
3 //
4 // source file of the LilyPond music typesetter
5 //
6 // (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
7
8 // should i be named Mudela_stream?
9
10 #include "mi2mu.hh"
11
12 Lily_stream::Lily_stream( String filename_str )
13 {
14     filename_str_ = filename_str;
15     os_p_ = 0;
16     indent_i_ = 0;
17     comment_mode_b_ = false;
18     column_i_ = 0;
19     wrap_column_i_ = 60;
20     open();
21     header();
22 }
23
24 Lily_stream::~Lily_stream()
25 {
26     delete os_p_;
27     if ( indent_i_ )
28         warning( "lily indent level: " + String( indent_i_ ));
29 }
30
31 Lily_stream&
32 Lily_stream::operator <<( String str )
33 {
34     static String word_sep_str = "{} \t\n";
35     while ( str.length_i() ) {
36         int i = str.index_any_i( word_sep_str ) + 1;
37         if ( !i )
38             i = str.length_i();
39         String word = str.left_str( i );
40         str = str.mid_str( i, str.length_i() );
41         output_wrapped( word );
42     }
43     return *this;
44 }
45
46 Lily_stream&
47 Lily_stream::operator <<( Midi_event& midi_event_r )
48 {
49     midi_event_r.output_mudela( *this, false );
50     *os_p_ << flush;
51     return *this;
52 }
53
54 void
55 Lily_stream::header()
56 {
57     *os_p_ << "% Creator: " << mi2mu_version_str() << "\n";
58     *os_p_ << "% Automatically generated, at ";
59     time_t t( time( 0 ) );
60     *os_p_ << ctime( &t );
61     *os_p_ << "% from input file: ";
62     *os_p_ << midi_parser_l_g->filename_str_;
63     *os_p_ << "\n\n";    
64     // ugh
65     *os_p_ << "\\version \"0.1.0\";\n";
66 }
67
68 void
69 Lily_stream::open()
70 {
71     os_p_ = new ofstream( filename_str_ );
72     if ( !*os_p_ )
73         error ( "can't open `" + filename_str_ + "\'");
74 }
75
76 void
77 Lily_stream::output( String str )
78 {
79     for ( int i = 0; i < str.length_i(); i++ ) {
80         char c = str[ i ];
81         switch ( c ) {
82             case '{' :
83             case '<' :
84                 indent_i_++;
85                 column_i_++;
86                 *os_p_ << c;
87                 break;
88             case '}' :
89             case '>' :
90                 assert( indent_i_ );
91                 indent_i_--;
92                 column_i_++;
93                 *os_p_ << c;
94                 break;
95             case '%' :
96                 comment_mode_b_ = true;
97                 *os_p_ << c;
98                 column_i_++;
99                 break;
100             case '\t' :
101                 column_i_ += 8;
102                 *os_p_ << c;
103                 break;
104             case '\n' :
105                 *os_p_ << endl;
106                 *os_p_ << String( '\t', indent_i_ );
107                 column_i_ = indent_i_ * 8;
108                 comment_mode_b_ = false;
109                 break;
110             default :
111                 column_i_++;
112                 *os_p_ << c;
113                 break;
114         }       
115     }
116 }
117
118 void
119 Lily_stream::output_wrapped( String str )
120 {
121     // enough room left -> doit
122     if ( column_i_ + str.length_i() <= wrap_column_i_ ) {
123         output( str );
124         return;
125     }
126
127     // we're at BOL already; this will never fit -> doit
128     if ( column_i_ == indent_i_ * 8 ) {
129         output( str );
130         return;
131     }
132     
133     // ok, let's wrap
134     // preserve comment mode
135     if ( comment_mode_b_ )
136         output( String( "\n%" ) );
137     else 
138         output( String( "\n" ) );
139     
140     output( str );
141 }
142
143