]> git.donarmstrong.com Git - lilypond.git/blob - lily/scm-option.cc
e7042cc44ddcdb9f579be21003e32a7f04375f9b
[lilypond.git] / lily / scm-option.cc
1 /*
2   scm-option.cc -- implement option setting from Scheme
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2001--2005  Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "scm-option.hh"
10
11 #include <cstdio>
12
13 #include "parse-scm.hh"
14 #include "warn.hh"
15 #include "main.hh"
16
17 /*
18   This interface to option setting is meant for setting options are
19   useful to a limited audience. The reason for this interface is that
20   making command line options clutters up the command-line option name
21   space.
22
23
24   preferably, also dont use TESTING_LEVEL_GLOBAL, since it defeats
25   another purpose of this very versatile interface, which is to
26   support multiple debug/testing options concurrently.
27 */
28
29 /* Write midi as formatted ascii stream? */
30 bool midi_debug_global_b;
31
32 int preview_resolution_global = 90;
33
34 /* General purpose testing flag */
35 int testing_level_global;
36
37 /*
38   Backwards compatibility.
39 */
40 bool lily_1_8_relative = false;
41 bool lily_1_8_compatibility_used = false;
42
43 /*
44   crash if internally the wrong type is used for a grob property.
45 */
46 bool do_internal_type_checking_global;
47
48 /*
49   What is this function for ?
50 */
51 LY_DEFINE (ly_option_usage, "ly:option-usage", 0, 0, 0, (SCM),
52            "Print ly:set-option usage")
53 {
54   printf (_ ("lilypond -e EXPR means:").to_str0 ());
55   puts ("");
56   printf (_ ("  Evalute the Scheme EXPR before parsing any .ly files.").to_str0 ());
57   puts ("");
58   printf (_ ("  Multiple -e options may be given, they will be evaluated sequentially.").to_str0 ());
59   puts ("");
60   printf (_ ("  The function ly:set-option allows for access to some internal variables.").to_str0 ());
61   puts ("\n");
62   printf (_ ("Usage: lilypond -e \"(ly:set-option SYMBOL VAL)\"").to_str0 ());
63   puts ("\n");
64   printf (_ ("Use help as SYMBOL to get online help.").to_str0 ());
65   puts ("\n");
66
67   exit (0);
68   return SCM_UNSPECIFIED;
69 }
70
71 /* Add these as well:
72
73 @item -T, --no-timestamps
74 don't timestamp the output
75
76 @item -t, --test
77 Switch on any experimental features.  Not for general public use.
78 */
79
80 LY_DEFINE (ly_set_option, "ly:set-option", 1, 1, 0, (SCM var, SCM val),
81            "Set a global option value.  Supported options include\n"
82            "\n"
83            "@table @code\n"
84            "@item help\n"
85            "List all options.\n"
86            "@item point-and-click\n"
87            "Switch point & click on or off.\n"
88            "@item midi-debug\n"
89            "If set to true, generate human readable MIDI\n"
90            "@item internal-type-checking\n"
91            "Set paranoia for property assignments\n"
92            "@item parse-protect\n"
93            "If protection is switched on, errors in inline scheme are caught in the parser. \n"
94            "If off, GUILE will halt on errors, and give a stack trace. Default is protected evaluation. \n"
95            "@item old-relative\n"
96            "Relative for simultaneous music functions similar to chord syntax\n"
97            "@item new-relative\n"
98            "Relative for simultaneous music functions similar to sequential music\n"
99            "@end table\n"
100            "\n"
101            "This function is useful to call from the command line: @code{lilypond -e\n"
102            "\"(ly:set-option 'midi-debug #t)\"}.\n")
103 {
104   if (val == SCM_UNDEFINED)
105     val = SCM_BOOL_T;
106
107   if (var == ly_symbol2scm ("help"))
108     /* lilypond -e "(ly:set-option 'help #t)" */
109     ly_option_usage (SCM_EOL);
110   else if (var == ly_symbol2scm ("midi-debug"))
111     midi_debug_global_b = to_boolean (val);
112   else if (var == ly_symbol2scm ("testing-level"))
113     testing_level_global = scm_to_int (val);
114   else if (var == ly_symbol2scm ("point-and-click"))
115     point_and_click_global = to_boolean (val);
116   else if (var == ly_symbol2scm ("parse-protect"))
117     parse_protect_global = to_boolean (val);
118   else if (var == ly_symbol2scm ("internal-type-checking"))
119     do_internal_type_checking_global = to_boolean (val);
120   else if (var == ly_symbol2scm ("old-relative"))
121     {
122       lily_1_8_relative = true;
123       /*  Needs to be reset for each file that uses this option.  */
124       lily_1_8_compatibility_used = false;
125     }
126   else if (var == ly_symbol2scm ("resolution"))
127     preview_resolution_global = robust_scm2int (val, 90);
128   else if (var == ly_symbol2scm ("new-relative"))
129     lily_1_8_relative = false;
130   else
131     {
132       if (scm_is_symbol (var))
133         var = scm_symbol_to_string (var);
134
135       warning (_f ("no such internal option: %s", ly_scm2string (var)));
136     }
137   return SCM_UNSPECIFIED;
138 }
139
140 LY_DEFINE (ly_get_option, "ly:get-option", 1, 0, 0, (SCM var),
141            "Get a global option setting.  Supported options include\n"
142            "@table @code\n"
143            "@item old-relative-used\n"
144            "Report whether old-relative compatibility mode is necessary\n"
145            "@item point-and-click\n"
146            "Report whether point & click is switched on.\n"
147            "@item old-relative\n"
148            "Report whether old-relative compatibility mode is used\n"
149            "@item verbose\n"
150            "Report whether we are running in verbose mode\n"
151            "@item resolution\n"
152            "Resolution for the PNG output."
153            "@end table\n"
154            "\n")
155 {
156   SCM o = SCM_UNSPECIFIED;
157
158   if (var == ly_symbol2scm ("safe")) // heavily used; put in front. 
159     o = ly_bool2scm (be_safe_global);
160   else if (var == ly_symbol2scm ("old-relative-used"))
161     o = ly_bool2scm (lily_1_8_compatibility_used);
162   else if (var == ly_symbol2scm ("old-relative"))
163     o = ly_bool2scm (lily_1_8_relative);
164   else if (var == ly_symbol2scm ("verbose"))
165     o = ly_bool2scm (be_verbose_global);
166   else if (var == ly_symbol2scm ("resolution"))
167     o = scm_from_int (preview_resolution_global);
168   else
169     {
170       if (scm_is_symbol (var))
171         var = scm_symbol_to_string (var);
172
173       String s = ly_scm2string (var);
174
175       warning (_f ("no such internal option: %s", s.to_str0 ()));
176     }
177   return o;
178 }