X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmain.cc;h=0e789e75c9cf8fe1d7a82d95e75e407bb5da0e4f;hb=36079063504b59027cdd84e36a1fc9e2bfc4fc76;hp=d9b1c6f315bd3895ef436ecd9084593af8cd72a5;hpb=0713e9256dc1f35299ce716cf29ddeab4ebca93b;p=lilypond.git diff --git a/lily/main.cc b/lily/main.cc index d9b1c6f315..0e789e75c9 100644 --- a/lily/main.cc +++ b/lily/main.cc @@ -3,13 +3,15 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2000 Han-Wen Nienhuys + (c) 1997--2002 Han-Wen Nienhuys */ #include +#include #include #include #include +#include #include "config.h" @@ -33,6 +35,7 @@ #include "global-ctor.hh" #include "kpath.hh" +static int sane_putenv (char const* key, char const* value, bool overwrite = false); /* Global options that can be overridden through command line. @@ -53,9 +56,6 @@ String init_name_global; /* Do not calculate and write paper output? */ bool no_paper_global_b = false; -/* Do not write timestamps in output? */ -bool no_timestamps_global_b = false; - /* Selected output format. One of tex, ps, scm, as. */ String output_format_global = "tex"; @@ -69,6 +69,8 @@ bool safe_global_b = false; /* Verbose progress indication? */ bool verbose_global_b = false; +/* Scheme code to execute before parsing, after .scm init */ +String init_scheme_code_string = "(begin #t "; /* @@ -102,27 +104,30 @@ static Getopt_long *oparser_p_static = 0; follow regular localisation guidelines). */ static Long_option_init options_static[] = { - {_i ("EXT"), "output-format", 'f', _i ("use output format EXT (scm, ps, tex or as)")}, + /* print example usage: lilypond -e "" ? */ + {_i ("EXPR"), "evaluate", 'e',_i ("Scheme options: try -e \"(set-lily-option 'help 0)\" for more help.")}, + /* another bug in option parser: --output=foe is taken as an abbreviation + for --output-format */ + {_i ("EXT"), "format", 'f', _i ("use output format EXT (tex [default], pdftex, ps, scm 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")}, - {_i ("DIR"), "dep-prefix", 'P', _i ("prepend DIR to dependencies")}, {0, "no-paper", 'm', _i ("produce MIDI output only")}, - {_i ("NAME"), "output", 'o', _i ("write output to NAME")}, + {_i ("FILE"), "output", 'o', _i ("write output to FILE")}, + {_i ("DIR"), "dep-prefix", 'P', _i ("prepend DIR to dependencies")}, {0, "safe", 's', _i ("inhibit file output naming and exporting")}, - {0, "no-timestamps", 'T', _i ("don't timestamp the output")}, {0, "version", 'v', _i ("print version number")}, - {0, "verbose", 'V', _i("verbose")}, + {0, "verbose", 'V', _i ("verbose")}, {0, "warranty", 'w', _i ("show warranty and copyright")}, {0,0,0,0} }; void -identify (ostream* os) +identify (FILE* os) { - *os << gnu_lilypond_version_str (); + fputs(gnu_lilypond_version_str ().ch_C(), os); } void @@ -132,32 +137,26 @@ usage () /* No version number or newline here. It confuses help2man */ - cout << _f ("Usage: %s [OPTION]... [FILE]...", "lilypond"); + cout << _f ("Usage: %s [OPTION]... FILE...", "lilypond").ch_C(); cout << "\n\n"; - cout << _ ("Typeset music and or play MIDI from FILE"); + cout << _ ("Typeset music and or play MIDI from FILE").ch_C(); cout << "\n\n"; cout << -_( +_ ( "LilyPond is a music typesetter. It produces beautiful sheet music\n" "using a high level description file as input. LilyPond is part of \n" "the GNU Project.\n" -); +).ch_C(); cout << '\n'; - cout << _ ("Options:"); + cout << _ ("Options:").ch_C(); cout << '\n'; - cout << Long_option_init::table_str (options_static); + cout << Long_option_init::table_str (options_static).ch_C(); cout << '\n'; - cout << _ ("This binary was compiled with the following options:") + cout << _ ("This binary was compiled with the following options:") .ch_C() << " " << #ifdef NDEBUG "NDEBUG " -#endif -#ifdef NPRINT - "NPRINT " -#endif -#ifdef STRING_UTILS_INLINED - "STRING_UTILS_INLINED " #endif "\n" "datadir: `" DIR_DATADIR "'\n" @@ -167,22 +166,22 @@ _( cout << endl; - cout << _f ("Report bugs to %s", "bug-gnu-music@gnu.org") << endl; + cout << _f ("Report bugs to %s", "bug-lilypond@gnu.org").ch_C() << endl; } void version () { - identify (&cout); + identify (stdout); cout << '\n'; cout << _f ("" "This is free software. It is covered by the GNU General Public License,\n" "and you are welcome to change it and/or distribute copies of it under\n" "certain conditions. Invoke as `%s --warranty' for more information.\n", - "lilypond"); + "lilypond").ch_C(); cout << endl; - cout << _f ("Copyright (c) %s by", "1996--2000"); + cout << _f ("Copyright (c) %s by", "1996--2002").ch_C(); cout << '\n'; cout << " Han-Wen Nienhuys \n"; cout << " Jan Nieuwenhuizen \n"; @@ -192,9 +191,9 @@ void notice () { cout << '\n'; - cout << _ ("GNU LilyPond -- The music typesetter"); + cout << _ ("GNU LilyPond -- The music typesetter").ch_C(); cout << '\n'; - cout << _f ("Copyright (c) %s by", "1996--2000"); + cout << _f ("Copyright (c) %s by", "1996--2002").ch_C(); cout << '\n'; cout << " Han-Wen Nienhuys \n"; cout << " Jan Nieuwenhuizen \n"; @@ -212,15 +211,17 @@ notice () " You should have received a copy (refer to the file COPYING) of the\n" "GNU General Public License along with this program; if not, write to\n" "the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,\n" - "USA.\n"); + "USA.\n").ch_C(); } +String prefix_directory; + void setup_paths () { // facilitate binary distributions char const *env_lily = getenv ("LILYPONDPREFIX"); - String prefix_directory; + if (env_lily) prefix_directory = env_lily; @@ -235,10 +236,10 @@ setup_paths () urg; what *do* we want with $LILYPONDPREFIX, DIR_DATADIR and $prefix/share handy for multiple source-dir runs, though... */ - if (!prefix_directory.empty_b()) + if (!prefix_directory.empty_b ()) { lily_locale_dir = prefix_directory + "/share/locale"; - bindtextdomain (name.ch_C (), lily_locale_dir.ch_C()); + bindtextdomain (name.ch_C (), lily_locale_dir.ch_C ()); } else bindtextdomain (name.ch_C (), DIR_LOCALEDIR); @@ -246,26 +247,21 @@ setup_paths () #endif global_path.add (""); - // must override (come before) "/usr/local/share/lilypond"! - char const *env_sz = getenv ("LILYINCLUDE"); - if (env_sz) - global_path.parse_path (env_sz); - /* - Should use kpathsea, this is getting out of hand. - */ - char *suffixes[] = {"ly", "afm", "scm", "tfm", "ps", 0}; - String prefix = prefix_directory; - if (prefix.empty_b ()) - prefix = DIR_DATADIR; + /* Adding mf/out make lilypond unchanged source directory, when setting + LILYPONDPREFIX to lilypond-x.y.z */ + char *suffixes[] = {"ly", "afm", "mf/out", "scm", "tfm", "ps", 0}; + + if (prefix_directory.empty_b ()) + prefix_directory = DIR_DATADIR; for (char **s = suffixes; *s; s++) { - String p = prefix + to_str ('/') + String (*s); + String p = prefix_directory + to_str ('/') + String (*s); global_path.add (p); #if !KPATHSEA - /* Urg: GNU make's $(word) index starts at 1 */ + /* Urg: GNU make's $ (word) index starts at 1 */ int i = 1; while (global_path.try_add (p + to_str (".") + to_str (i))) i++; @@ -314,35 +310,48 @@ format_to_ext (String format) } void -main_prog (int, char**) +main_prog (void * , int, char**) { /* need to do this first. Engravers use lily.scm contents. */ - init_lily_guile (); - if (verbose_global_b) - progress_indication ("\n"); - read_lily_scm_file ("lily.scm"); + + /* + prepend onto GUILE loadpath. + + Very ugh. + */ + + init_lily_guile (prefix_directory); cout << endl; call_constructors (); all_fonts_global_p = new All_font_metrics (global_path.str ()); + init_scheme_code_string += ")"; + gh_eval_str ((char *)init_scheme_code_string.ch_C()); + int p=0; - const char *arg ; - while ((arg = oparser_p_static->get_next_arg ()) || p == 0) + const char *arg = oparser_p_static->get_next_arg (); + + if (!arg) { - String infile; - - if (arg) - infile = arg; - else - infile = "-"; - - // What/when was this supposed to do? - // It looks like it reset the outname_str_global for every new - // file, but only if user didn't specify a outname? Huh? - // if (outname_str_global == "") + usage (); + /* No FILE arguments is now a usage error */ + exit (2); + } + else + do + { + String infile (arg); + + /* What/when was this supposed to do? + It looks like it reset the outname_str_global for every new + file, but only if user didn't specify a outname? Huh? + + // if (outname_str_global == "") + + */ { Midi_def::reset_score_count (); Paper_def::reset_score_count (); @@ -378,30 +387,44 @@ main_prog (int, char**) output_name_global = save_output_name_global; p++; - } + } while ((arg = oparser_p_static->get_next_arg ())); delete oparser_p_static; + oparser_p_static = 0; exit (exit_status_global); } +static int +sane_putenv (char const* key, char const* value, bool overwrite) +{ + if (overwrite || !getenv (key)) + return putenv ((char*)((String (key) + "=" + value).ch_C ())); + return -1; +} + int main (int argc, char **argv) { - debug_init (); // should be first (can see that; but Why?) setup_paths (); - /* - prepare guile for heavy mem usage. + /* Prepare GUILE for heavy memory usage. If you have plenty memory, + this may speed up GUILE a bit. If you're short on memory, these + settings + + export GUILE_INIT_SEGMENT_SIZE_1=36000 + export GUILE_MAX_SEGMENT_SIZE=576000 - putenv is POSIX, setenv is BSD 4.3 - */ - putenv ("GUILE_INIT_SEGMENT_SIZE_1=4194304"); - putenv ("GUILE_MAX_SEGMENT_SIZE=8388608"); + may considerably decrease memory footprint (~*0.85), with a small + execution time penalty (~*1.10). However, if this 15% gain in memory + usage prevents swapping, the execution time falls drastically. */ + + sane_putenv ("GUILE_INIT_SEGMENT_SIZE_1", "4194304", false); + sane_putenv ("GUILE_MAX_SEGMENT_SIZE", "8388608", false); ly_init_kpath (argv[0]); - oparser_p_static = new Getopt_long(argc, argv, options_static); - while (Long_option_init const * opt = (*oparser_p_static)()) + oparser_p_static = new Getopt_long (argc, argv, options_static); + while (Long_option_init const * opt = (*oparser_p_static) ()) { switch (opt->shortname_ch_) { @@ -413,11 +436,15 @@ main (int argc, char **argv) { String s = oparser_p_static->optional_argument_ch_C_; Path p = split_path (s); - if (p.ext.empty_b ()) + if (s != "-" && p.ext.empty_b ()) p.ext = format_to_ext (output_format_global); output_name_global = p.str (); } break; + case 'e': + init_scheme_code_string += + oparser_p_static->optional_argument_ch_C_; + break; case 'w': notice (); exit (0); @@ -453,20 +480,17 @@ main (int argc, char **argv) case 'm': no_paper_global_b = true; break; - case 'T': - no_timestamps_global_b = true; - break; default: assert (false); break; } } - identify (&cerr); + identify (stderr); #ifdef WINNT - gh_enter (argc, argv, main_prog); + scm_boot_guile (argc, argv, main_prog, 0); #else - gh_enter (argc, argv, (void(*)(int, char**))main_prog); + scm_boot_guile (argc, argv, (void (*) (void*, int, char**))main_prog, 0); #endif return 0; // unreachable