X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmain.cc;h=d1158824c167db06075af6a161a064aa55e108ee;hb=d9b43b93f2c885409bafdb157138158f65cc49aa;hp=d0a4492d0ec11a3210c45270e90eec31c716ec00;hpb=452fce3d93d6caa5670f39835fa62749ed609c8e;p=lilypond.git diff --git a/lily/main.cc b/lily/main.cc index d0a4492d0e..d1158824c1 100644 --- a/lily/main.cc +++ b/lily/main.cc @@ -3,13 +3,14 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2001 Han-Wen Nienhuys + (c) 1997--2002 Han-Wen Nienhuys */ #include #include #include #include +#include #include "config.h" @@ -33,6 +34,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. @@ -101,20 +103,19 @@ static Getopt_long *oparser_p_static = 0; follow regular localisation guidelines). */ static Long_option_init options_static[] = { + /* print example usage: lilypond -e "(set-lily-option 'help 0)" ? */ + {_i ("EXPR"), "evaluate", 'e',_i ("evalute EXPR as Scheme after .scm init is read")}, /* another bug in option parser: --output=foe is taken as an abbreviation for --output-format */ - // {_i ("EXT"), "output-format", 'f', _i ("use output format EXT (scm, ps, tex or as)")}, - - {_i ("EXT"), "format", 'f', _i ("use output format EXT (scm, ps, tex or as)")}, + {_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")}, - {_i ("EXPR"), "evaluate", 'e',_i ("evalute EXPR as Scheme after .scm init is read")}, {0, "no-paper", 'm', _i ("produce MIDI output only")}, {_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, "version", 'v', _i ("print version number")}, {0, "verbose", 'V', _i ("verbose")}, @@ -135,7 +136,7 @@ usage () /* No version number or newline here. It confuses help2man */ - cout << _f ("Usage: %s [OPTION]... [FILE]...", "lilypond"); + cout << _f ("Usage: %s [OPTION]... FILE...", "lilypond"); cout << "\n\n"; cout << _ ("Typeset music and or play MIDI from FILE"); cout << "\n\n"; @@ -155,12 +156,6 @@ _ ( << " " << #ifdef NDEBUG "NDEBUG " -#endif -#ifdef NPRINT - "NPRINT " -#endif -#ifdef STRING_UTILS_INLINED - "STRING_UTILS_INLINED " #endif "\n" "datadir: `" DIR_DATADIR "'\n" @@ -170,7 +165,7 @@ _ ( cout << endl; - cout << _f ("Report bugs to %s", "bug-gnu-music@gnu.org") << endl; + cout << _f ("Report bugs to %s", "bug-lilypond@gnu.org") << endl; } void @@ -185,7 +180,7 @@ version () "lilypond"); cout << endl; - cout << _f ("Copyright (c) %s by", "1996--2001"); + cout << _f ("Copyright (c) %s by", "1996--2002"); cout << '\n'; cout << " Han-Wen Nienhuys \n"; cout << " Jan Nieuwenhuizen \n"; @@ -197,7 +192,7 @@ notice () cout << '\n'; cout << _ ("GNU LilyPond -- The music typesetter"); cout << '\n'; - cout << _f ("Copyright (c) %s by", "1996--2001"); + cout << _f ("Copyright (c) %s by", "1996--2002"); cout << '\n'; cout << " Han-Wen Nienhuys \n"; cout << " Jan Nieuwenhuizen \n"; @@ -218,12 +213,14 @@ notice () "USA.\n"); } +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; @@ -255,16 +252,15 @@ setup_paths () 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 @@ -317,15 +313,19 @@ 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 (); @@ -335,20 +335,26 @@ main_prog (int, char**) 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 (); @@ -384,19 +390,17 @@ 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) +sane_putenv (char const* key, char const* value, bool overwrite) { - /* - putenv is POSIX, setenv is BSD 4.3 - Urg, but putenv blindly overwrites environment settings. - */ - if (!getenv (key)) + if (overwrite || !getenv (key)) return putenv ((char*)((String (key) + "=" + value).ch_C ())); return -1; } @@ -414,10 +418,11 @@ main (int argc, char **argv) export GUILE_MAX_SEGMENT_SIZE=576000 may considerably decrease memory footprint (~*0.85), with a small - execution time penalty (~*1.10). */ + 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"); - sane_putenv ("GUILE_MAX_SEGMENT_SIZE", "8388608"); + sane_putenv ("GUILE_INIT_SEGMENT_SIZE_1", "4194304", false); + sane_putenv ("GUILE_MAX_SEGMENT_SIZE", "8388608", false); ly_init_kpath (argv[0]); @@ -434,7 +439,7 @@ 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 (); } @@ -486,9 +491,9 @@ main (int argc, char **argv) identify (&cerr); #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