MAJOR_VERSION=1
MINOR_VERSION=3
PATCH_LEVEL=113
-MY_PATCH_LEVEL=jcn2
+MY_PATCH_LEVEL=jcn3
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
extern void set_inclusion_names (Array<String>);
extern File_path global_path;
+extern Array<String> global_score_header_fields;
extern String default_outname_base_global;
extern String default_outname_suffix_global;
{
public:
bool outputting_comment_b_;
- ostream *os;
+ ostream *os_;
int nest_level;
/// to check linelen in output. TeX has limits.
int line_len_i_;
void break_line();
};
+class ostream;
+ostream *open_file_stream (String filename);
+void close_file_stream (ostream *os);
+
+
#endif // PAPER_STREAM_HH
int default_count_global;
File_path global_path;
+Array<String> global_score_header_fields;
+
bool safe_global_b = false;
bool experimental_features_global_b = false;
bool dependency_global_b = false;
Long_option_init theopts[] = {
{_i ("EXT"), "output-format", 'f', _i ("use output format EXT (scm, ps, tex or as)")},
{0, "help", 'h', _i ("this help")},
+ {_i ("FIELD"), "header", 'H', _i ("write header field to BASENAME.FIELD")},
{_i ("DIR"), "include", 'I', _i ("add DIR to search path")},
{_i ("FILE"), "init", 'i', _i ("use FILE as init file")},
{0, "dependencies", 'M', _i ("write Makefile dependencies for every input file")},
global_path.add (p);
#if !KPATHSEA
- /*
- Although kpathsea seems nice, it is not universally available
- (GNU/Windows).
-
- Compiling kpathsea seems not possible without
- (compiling) a matching tex installation. Apart from the fact
- that I cannot get kpathsea compiled for GNU/Windows, another
- major problem is that TeX installations may be different on
- different clients, so it wouldn't work anyway. While ugly,
- this code is simple and effective.
- -- jcn
- */
-
/* Urg: GNU make's $(word) index starts at 1 */
int i = 1;
while (global_path.try_add (p + to_str (".") + to_str (i)))
case 'Q':
find_old_relative_b= true;
break;
+ case 'H':
+ global_score_header_fields.push (oparser_global_p->optional_argument_ch_C_);
+ break;
case 'I':
global_path.push (oparser_global_p->optional_argument_ch_C_);
break;
free (c);
}
}
+
void
Paper_outputter::output_scope (Scope *scope, String prefix)
{
output_scheme (scm);
}
-
-
void
Paper_outputter::output_string (SCM str)
{
*stream_p_ << ly_scm2string (str);
}
+
+void
+Paper_outputter::output_score_header_field (String filename, String key, String value)
+{
+ if (filename != "-")
+ filename += String (".") + key;
+ progress_indication (_f ("writing header field %s to %s...",
+ key,
+ filename == "-" ? String ("<stdout>") : filename));
+
+ ostream* os = open_file_stream (filename);
+ *os << value;
+ close_file_stream (os);
+ progress_indication ("\n");
+}
+
+void
+Paper_outputter::output_score_header_fields (Paper_def *paper)
+{
+ if (global_score_header_fields.size ())
+ {
+ SCM fields = paper->scope_p_->to_alist ();
+ String base = paper->base_output_str ();
+ for (int i = 0; i < global_score_header_fields.size (); i++)
+ {
+ String key = paper->global_score_header_fields[i];
+ SCM val = gh_assoc (ly_str02scm (key), fields);
+ String s
+ if (val != SCM_BOOL_F)
+ s = ly_scm2string (val);
+ output_score_header_field (base, key, s);
+ }
+ }
+}
return sol;
}
-
-
/*
urg. clean me
*/
outputter_l_->output_scheme (scm);
progress_indication ("\n");
+
+ outputter_l_->output_score_header_fields (paper_l_);
+
// huh?
delete outputter_l_;
outputter_l_ = 0;
-
+
if (verbose_global_b)
ly_display_scm (scm_gc_stats ());
}
const int MAXLINELEN = 200;
-Paper_stream::Paper_stream (String filename)
+ostream*
+open_file_stream (String filename)
{
if (filename.length_i () && (filename != "-"))
os = new ofstream (filename.ch_C ());
else
- // os = new ostream (cout.ostreambuf ());
os = new ostream (cout._strbuf);
if (!*os)
error (_f ("can't open file: `%s'", filename));
- nest_level = 0;
- line_len_i_ = 0;
- outputting_comment_b_=false;
+ return os;
}
-Paper_stream::~Paper_stream ()
+void
+close_file_stream (ostream* os)
{
*os << flush;
if (!*os)
exit_status_i_ = 1;
}
delete os;
+}
+
+Paper_stream::Paper_stream (String filename)
+{
+ os_ = open_file_stream (filename);
+ nest_level = 0;
+ line_len_i_ = 0;
+ outputting_comment_b_=false;
+}
+
+Paper_stream::~Paper_stream ()
+{
+ close_file_stream (os_);
assert (nest_level == 0);
}
{
if (outputting_comment_b_)
{
- *os << *cp;
+ *os_ << *cp;
if (*cp == '\n')
{
outputting_comment_b_=false;
{
case '%':
outputting_comment_b_ = true;
- *os << *cp;
+ *os_ << *cp;
break;
case '{':
nest_level++;
- *os << *cp;
+ *os_ << *cp;
break;
case '}':
nest_level--;
- *os << *cp;
+ *os_ << *cp;
if (nest_level < 0)
{
- delete os; // we want to see the remains.
+ delete os_; // we want to see the remains.
assert (nest_level>=0);
}
if (nest_level == 0)
break;
- *os << '%';
+ *os_ << '%';
break_line ();
break;
case '\n':
break_line ();
break;
case ' ':
- *os << ' ';
+ *os_ << ' ';
if (line_len_i_ > MAXLINELEN)
break_line ();
break;
default:
- *os << *cp;
+ *os_ << *cp;
break;
}
}
//urg, for debugging only!!
- *os << flush;
+ *os_ << flush;
return *this;
}
void
Paper_stream::break_line ()
{
- *os << '\n';
- *os << to_str (' ', nest_level);
+ *os_ << '\n';
+ *os_ << to_str (' ', nest_level);
outputting_comment_b_ = false;
line_len_i_ = 0;
}