2 paper-outputter.cc -- implement Paper_outputter
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 Jan Nieuwenhuizen <janneke@gnu.org>
15 #include "dimensions.hh"
16 #include "virtual-methods.hh"
17 #include "paper-outputter.hh"
18 #include "paper-stream.hh"
19 #include "molecule.hh"
21 #include "string-convert.hh"
23 #include "font-metric.hh"
27 #include "lily-version.hh"
28 #include "paper-def.hh"
29 #include "file-results.hh"
36 Paper_outputter::Paper_outputter (String name)
38 stream_p_ = new Paper_stream (name);
44 verbatim_scheme_b_ = output_format_global == "scm";
46 if (verbatim_scheme_b_)
49 ";;; Usage: guile -s x.scm > x.tex\n"
50 "(primitive-load-path 'standalone.scm)\n"
53 "(map (lambda (x) (display (ly-eval x))) '(\n"
59 Paper_outputter::~Paper_outputter ()
61 if (verbatim_scheme_b_)
70 Paper_outputter::output_header ()
74 gh_define ("security-paranoia", SCM_BOOL_T);
77 SCM exp = gh_list (ly_symbol2scm ((output_format_global + "-scm").ch_C()),
78 ly_quote_scm (ly_symbol2scm ("all-definitions")),
80 exp = scm_eval2 (exp, SCM_EOL);
81 scm_eval2 (exp, SCM_EOL);
84 if (no_timestamps_global_b)
85 creator = gnu_lilypond_str ();
87 creator = gnu_lilypond_version_str ();
90 if (no_timestamps_global_b)
94 generate = _ (", at ");
96 generate += ctime (&t);
97 generate = generate.left_str (generate.length_i () - 1);
101 gh_list (ly_str02scm (creator.ch_l ()),
102 ly_str02scm (generate.ch_l ()), SCM_UNDEFINED);
105 SCM scm = gh_cons (ly_symbol2scm ("header"), args_scm);
112 Paper_outputter::output_comment (String str)
114 output_scheme (gh_list (ly_symbol2scm ("comment"),
115 ly_str02scm ((char*)str.ch_C()),
122 Paper_outputter::output_scheme (SCM scm)
125 we don't rename dump_scheme, because we might in the future want
126 to remember Scheme. We don't now, because it sucks up a lot of memory.
135 Should probably change interface to do less eval ( symbol ), and more
136 apply (procedure, args)
139 Paper_outputter::dump_scheme (SCM s)
141 if (verbatim_scheme_b_)
143 *stream_p_ << ly_scm2string (ly_write2scm (s));
147 SCM result = scm_eval2 (s, SCM_EOL);
148 char *c=gh_scm2newstr (result, NULL);
156 Paper_outputter::output_scope (Scope *scope, String prefix)
158 SCM al = scope->to_alist ();
159 for (SCM s = al ; gh_pair_p (s); s = gh_cdr (s))
163 String s = ly_symbol2string (k);
168 output_String_def (prefix + s, ly_scm2string (v));
170 else if (scm_integer_p (v) == SCM_BOOL_T)
172 output_int_def (prefix + s, gh_scm2int (v));
174 else if (gh_number_p (v))
176 output_Real_def (prefix + s, gh_scm2double (v));
182 Paper_outputter::output_version ()
184 String id_str = "Lily was here";
185 if (no_timestamps_global_b)
188 id_str += String (", ") + version_str ();
190 output_String_def ( "lilypondtagline", id_str);
191 output_String_def ( "LilyPondVersion", version_str ());
198 Paper_outputter::output_Real_def (String k, Real v)
201 SCM scm = gh_list (ly_symbol2scm ("lily-def"),
202 ly_str02scm (k.ch_l ()),
203 ly_str02scm (to_str(v).ch_l ()),
209 Paper_outputter::output_String_def (String k, String v)
212 SCM scm = gh_list (ly_symbol2scm ("lily-def"),
213 ly_str02scm (k.ch_l ()),
214 ly_str02scm (v.ch_l ()),
220 Paper_outputter::output_int_def (String k, int v)
222 SCM scm = gh_list (ly_symbol2scm ("lily-def"),
223 ly_str02scm (k.ch_l ()),
224 ly_str02scm (to_str (v).ch_l ()),
230 Paper_outputter::output_string (SCM str)
232 *stream_p_ << ly_scm2string (str);
236 Paper_outputter::write_header_field_to_file (String filename, String key, String value)
239 filename += String (".") + key;
240 progress_indication (_f ("writing header field %s to %s...",
242 filename == "-" ? String ("<stdout>") : filename));
244 ostream *os = open_file_stream (filename);
246 close_file_stream (os);
247 progress_indication ("\n");
251 Paper_outputter::write_header_fields_to_file (Scope * header)
253 if (dump_header_fieldnames_global.size ())
255 SCM fields = header->to_alist ();
256 for (int i = 0; i < dump_header_fieldnames_global.size (); i++)
258 String key = dump_header_fieldnames_global[i];
259 SCM val = gh_assoc (ly_symbol2scm (key.ch_C ()), fields);
261 /* Only write header field to file if it exists */
264 s = ly_scm2string (gh_cdr (val));
265 /* Always write header field file, even if string is empty ... */
266 write_header_field_to_file (basename_, key, s);