1 // This file was automatically generated by opt2cpp.
2 // It is part of the dvisvgm package and published under the terms
3 // of the GNU General Public License version 3, or (at your option) any later version.
4 // See file COPYING for further details.
5 // (C) 2009-2015 Martin Gieseking <martin.gieseking@uos.de>
6
7 #include <config.h>
8 #include <cstdio>
9 #include <iostream>
10 #include <iomanip>
11 #include "InputReader.h"
12 #include "CommandLine.h"
13
14 using namespace std;
15
16 const CmdLineParserBase::Option CommandLine::_options[] = {
17 {'b', "bbox", ARG_REQUIRED, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_bbox)},
18 {'C', "cache", ARG_OPTIONAL, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_cache)},
19 #if !defined(DISABLE_GS)
20 {'j', "clipjoin", ARG_NONE, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_clipjoin)},
21 #endif
22 {'\0', "color", ARG_NONE, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_color)},
23 #if !defined(DISABLE_GS)
24 {'E', "eps", ARG_NONE, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_eps)},
25 #endif
26 {'e', "exact", ARG_NONE, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_exact)},
27 {'m', "fontmap", ARG_REQUIRED, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_fontmap)},
28 #if !defined(DISABLE_GS)
29 {'\0', "grad-overlap", ARG_NONE, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_grad_overlap)},
30 #endif
31 #if !defined(DISABLE_GS)
32 {'\0', "grad-segments", ARG_REQUIRED, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_grad_segments)},
33 #endif
34 #if !defined(DISABLE_GS)
35 {'\0', "grad-simplify", ARG_REQUIRED, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_grad_simplify)},
36 #endif
37 {'h', "help", ARG_OPTIONAL, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_help)},
38 {'\0', "keep", ARG_NONE, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_keep)},
39 #if !defined(HAVE_LIBGS) && !defined(DISABLE_GS)
40 {'\0', "libgs", ARG_REQUIRED, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_libgs)},
41 #endif
42 {'L', "linkmark", ARG_REQUIRED, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_linkmark)},
43 {'l', "list-specials", ARG_NONE, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_list_specials)},
44 {'M', "mag", ARG_REQUIRED, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_mag)},
45 {'n', "no-fonts", ARG_OPTIONAL, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_no_fonts)},
46 {'\0', "no-merge", ARG_NONE, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_no_merge)},
47 {'\0', "no-mktexmf", ARG_NONE, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_no_mktexmf)},
48 {'S', "no-specials", ARG_OPTIONAL, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_no_specials)},
49 {'\0', "no-styles", ARG_NONE, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_no_styles)},
50 {'o', "output", ARG_REQUIRED, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_output)},
51 {'p', "page", ARG_REQUIRED, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_page)},
52 {'d', "precision", ARG_REQUIRED, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_precision)},
53 {'P', "progress", ARG_OPTIONAL, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_progress)},
54 {'R', "relative", ARG_NONE, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_relative)},
55 {'r', "rotate", ARG_REQUIRED, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_rotate)},
56 {'c', "scale", ARG_REQUIRED, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_scale)},
57 {'s', "stdout", ARG_NONE, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_stdout)},
58 {'a', "trace-all", ARG_OPTIONAL, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_trace_all)},
59 {'T', "transform", ARG_REQUIRED, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_transform)},
60 {'t', "translate", ARG_REQUIRED, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_translate)},
61 {'v', "verbosity", ARG_REQUIRED, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_verbosity)},
62 {'V', "version", ARG_OPTIONAL, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_version)},
63 {'z', "zip", ARG_OPTIONAL, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_zip)},
64 {'Z', "zoom", ARG_REQUIRED, new OptionHandlerImpl<CommandLine>(&CommandLine::handle_zoom)},
65 };
66
options(size_t * numopts) const67 const CmdLineParserBase::Option* CommandLine::options (size_t *numopts) const {
68 *numopts = sizeof(_options)/sizeof(CmdLineParserBase::Option);
69 return _options;
70 }
71
init()72 void CommandLine::init () {
73 CmdLineParserBase::init();
74
75 // disable all options by default
76 _bbox_given = false;
77 _cache_given = false;
78 #if !defined(DISABLE_GS)
79 _clipjoin_given = false;
80 #endif
81 _color_given = false;
82 #if !defined(DISABLE_GS)
83 _eps_given = false;
84 #endif
85 _exact_given = false;
86 _fontmap_given = false;
87 #if !defined(DISABLE_GS)
88 _grad_overlap_given = false;
89 #endif
90 #if !defined(DISABLE_GS)
91 _grad_segments_given = false;
92 #endif
93 #if !defined(DISABLE_GS)
94 _grad_simplify_given = false;
95 #endif
96 _help_given = false;
97 _keep_given = false;
98 #if !defined(HAVE_LIBGS) && !defined(DISABLE_GS)
99 _libgs_given = false;
100 #endif
101 _linkmark_given = false;
102 _list_specials_given = false;
103 _mag_given = false;
104 _no_fonts_given = false;
105 _no_merge_given = false;
106 _no_mktexmf_given = false;
107 _no_specials_given = false;
108 _no_styles_given = false;
109 _output_given = false;
110 _page_given = false;
111 _precision_given = false;
112 _progress_given = false;
113 _relative_given = false;
114 _rotate_given = false;
115 _scale_given = false;
116 _stdout_given = false;
117 _trace_all_given = false;
118 _transform_given = false;
119 _translate_given = false;
120 _verbosity_given = false;
121 _version_given = false;
122 _zip_given = false;
123 _zoom_given = false;
124
125 // set default option values
126 _bbox_arg = "min";
127 _cache_arg.clear();
128 _fontmap_arg.clear();
129 #if !defined(DISABLE_GS)
130 _grad_segments_arg = 20;
131 #endif
132 #if !defined(DISABLE_GS)
133 _grad_simplify_arg = 0.05;
134 #endif
135 _help_arg = 0;
136 #if !defined(HAVE_LIBGS) && !defined(DISABLE_GS)
137 _libgs_arg.clear();
138 #endif
139 _linkmark_arg = "box";
140 _mag_arg = 4;
141 _no_fonts_arg = 0;
142 _no_specials_arg.clear();
143 _output_arg.clear();
144 _page_arg = "1";
145 _precision_arg = 0;
146 _progress_arg = 0.5;
147 _rotate_arg = 0;
148 _scale_arg.clear();
149 _trace_all_arg = false;
150 _transform_arg.clear();
151 _translate_arg.clear();
152 _verbosity_arg = 7;
153 _version_arg = false;
154 _zip_arg = 9;
155 _zoom_arg = 1.0;
156 }
157
helplines(size_t * numlines) const158 const char** CommandLine::helplines (size_t *numlines) const {
159 static const char *lines[] = {
160 "dThis program converts DVI files, as created by TeX/LaTeX, to\nthe XML-based scalable vector graphics format SVG.\n\nUsage: dvisvgm [options] dvifile\n dvisvgm -E [options] epsfile",
161 "sInput options:",
162 "o-p, --page=ranges choose pages to convert [1]",
163 "o-m, --fontmap=filenames evaluate (additional) font map files",
164 #if !defined(DISABLE_GS)
165 "o-E, --eps convert an EPS file to SVG",
166 #endif
167 "sSVG output options:",
168 "o-b, --bbox=size set size of bounding box [min]",
169 #if !defined(DISABLE_GS)
170 "o-j, --clipjoin compute intersection of clipping paths",
171 #endif
172 #if !defined(DISABLE_GS)
173 "o --grad-overlap create operlapping color gradient segments",
174 #endif
175 #if !defined(DISABLE_GS)
176 "o --grad-segments=number number of color gradient segments per row [20]",
177 #endif
178 #if !defined(DISABLE_GS)
179 "o --grad-simplify=delta reduce level of detail for small segments [0.05]",
180 #endif
181 "o-L, --linkmark=style select how to mark hyperlinked areas [box]",
182 "o-o, --output=pattern set name pattern of output files",
183 "o-d, --precision=number set number of decimal points (0-6) [0]",
184 "o-R, --relative create relative path commands",
185 "o-s, --stdout write SVG output to stdout",
186 "o-n, --no-fonts[=variant] draw glyphs by using path elements [0]",
187 "o --no-merge don't merge adjacent text elements",
188 "o --no-styles don't use styles to reference fonts",
189 "o-z, --zip[=level] create compressed .svgz file [9]",
190 "sSVG transformations:",
191 "o-r, --rotate=angle rotate page content clockwise",
192 "o-c, --scale=sx[,sy] scale page content",
193 "o-t, --translate=tx[,ty] shift page content",
194 "o-T, --transform=commands transform page content",
195 "o-Z, --zoom=factor zoom page content [1.0]",
196 "sProcessing options:",
197 "o-C, --cache[=dir] set/print path of cache directory",
198 "o-e, --exact compute exact glyph boxes",
199 "o --keep keep temporary files",
200 #if !defined(HAVE_LIBGS) && !defined(DISABLE_GS)
201 "o --libgs=filename set name of Ghostscript shared library",
202 #endif
203 "o-M, --mag=factor magnification of Metafont output [4]",
204 "o --no-mktexmf don't try to create missing fonts",
205 "o-S, --no-specials[=prefixes] don't process [selected] specials",
206 "o-a, --trace-all[=retrace] trace all glyphs of bitmap fonts [no]",
207 "sMessage options:",
208 "o --color colorize messages",
209 "o-h, --help[=mode] print this summary of options and exit [0]",
210 "o-l, --list-specials print supported special sets and exit",
211 "o-P, --progress[=delay] enable progess indicator [0.5]",
212 "o-v, --verbosity=level set verbosity level (0-7) [7]",
213 "o-V, --version[=extended] print version and exit [no]",
214 };
215 *numlines = sizeof(lines)/sizeof(char*);
216 return lines;
217 }
218
handle_bbox(InputReader & ir,const Option & opt,bool longopt)219 void CommandLine::handle_bbox (InputReader &ir, const Option &opt, bool longopt) {
220 if (getStringArg(ir, opt, longopt, _bbox_arg))
221 _bbox_given = true;
222 }
223
handle_cache(InputReader & ir,const Option & opt,bool longopt)224 void CommandLine::handle_cache (InputReader &ir, const Option &opt, bool longopt) {
225 if (ir.eof() || getStringArg(ir, opt, longopt, _cache_arg))
226 _cache_given = true;
227 }
228
229 #if !defined(DISABLE_GS)
handle_clipjoin(InputReader & ir,const Option & opt,bool longopt)230 void CommandLine::handle_clipjoin (InputReader &ir, const Option &opt, bool longopt) {
231 _clipjoin_given = true;
232 }
233 #endif
234
handle_color(InputReader & ir,const Option & opt,bool longopt)235 void CommandLine::handle_color (InputReader &ir, const Option &opt, bool longopt) {
236 _color_given = true;
237 }
238
239 #if !defined(DISABLE_GS)
handle_eps(InputReader & ir,const Option & opt,bool longopt)240 void CommandLine::handle_eps (InputReader &ir, const Option &opt, bool longopt) {
241 _eps_given = true;
242 }
243 #endif
244
handle_exact(InputReader & ir,const Option & opt,bool longopt)245 void CommandLine::handle_exact (InputReader &ir, const Option &opt, bool longopt) {
246 _exact_given = true;
247 }
248
handle_fontmap(InputReader & ir,const Option & opt,bool longopt)249 void CommandLine::handle_fontmap (InputReader &ir, const Option &opt, bool longopt) {
250 if (getStringArg(ir, opt, longopt, _fontmap_arg))
251 _fontmap_given = true;
252 }
253
254 #if !defined(DISABLE_GS)
handle_grad_overlap(InputReader & ir,const Option & opt,bool longopt)255 void CommandLine::handle_grad_overlap (InputReader &ir, const Option &opt, bool longopt) {
256 _grad_overlap_given = true;
257 }
258 #endif
259
260 #if !defined(DISABLE_GS)
handle_grad_segments(InputReader & ir,const Option & opt,bool longopt)261 void CommandLine::handle_grad_segments (InputReader &ir, const Option &opt, bool longopt) {
262 if (getIntArg(ir, opt, longopt, _grad_segments_arg))
263 _grad_segments_given = true;
264 }
265 #endif
266
267 #if !defined(DISABLE_GS)
handle_grad_simplify(InputReader & ir,const Option & opt,bool longopt)268 void CommandLine::handle_grad_simplify (InputReader &ir, const Option &opt, bool longopt) {
269 if (getDoubleArg(ir, opt, longopt, _grad_simplify_arg))
270 _grad_simplify_given = true;
271 }
272 #endif
273
handle_help(InputReader & ir,const Option & opt,bool longopt)274 void CommandLine::handle_help (InputReader &ir, const Option &opt, bool longopt) {
275 if (ir.eof() || getIntArg(ir, opt, longopt, _help_arg))
276 _help_given = true;
277 }
278
handle_keep(InputReader & ir,const Option & opt,bool longopt)279 void CommandLine::handle_keep (InputReader &ir, const Option &opt, bool longopt) {
280 _keep_given = true;
281 }
282
283 #if !defined(HAVE_LIBGS) && !defined(DISABLE_GS)
handle_libgs(InputReader & ir,const Option & opt,bool longopt)284 void CommandLine::handle_libgs (InputReader &ir, const Option &opt, bool longopt) {
285 if (getStringArg(ir, opt, longopt, _libgs_arg))
286 _libgs_given = true;
287 }
288 #endif
289
handle_linkmark(InputReader & ir,const Option & opt,bool longopt)290 void CommandLine::handle_linkmark (InputReader &ir, const Option &opt, bool longopt) {
291 if (getStringArg(ir, opt, longopt, _linkmark_arg))
292 _linkmark_given = true;
293 }
294
handle_list_specials(InputReader & ir,const Option & opt,bool longopt)295 void CommandLine::handle_list_specials (InputReader &ir, const Option &opt, bool longopt) {
296 _list_specials_given = true;
297 }
298
handle_mag(InputReader & ir,const Option & opt,bool longopt)299 void CommandLine::handle_mag (InputReader &ir, const Option &opt, bool longopt) {
300 if (getDoubleArg(ir, opt, longopt, _mag_arg))
301 _mag_given = true;
302 }
303
handle_no_fonts(InputReader & ir,const Option & opt,bool longopt)304 void CommandLine::handle_no_fonts (InputReader &ir, const Option &opt, bool longopt) {
305 if (ir.eof() || getIntArg(ir, opt, longopt, _no_fonts_arg))
306 _no_fonts_given = true;
307 }
308
handle_no_merge(InputReader & ir,const Option & opt,bool longopt)309 void CommandLine::handle_no_merge (InputReader &ir, const Option &opt, bool longopt) {
310 _no_merge_given = true;
311 }
312
handle_no_mktexmf(InputReader & ir,const Option & opt,bool longopt)313 void CommandLine::handle_no_mktexmf (InputReader &ir, const Option &opt, bool longopt) {
314 _no_mktexmf_given = true;
315 }
316
handle_no_specials(InputReader & ir,const Option & opt,bool longopt)317 void CommandLine::handle_no_specials (InputReader &ir, const Option &opt, bool longopt) {
318 if (ir.eof() || getStringArg(ir, opt, longopt, _no_specials_arg))
319 _no_specials_given = true;
320 }
321
handle_no_styles(InputReader & ir,const Option & opt,bool longopt)322 void CommandLine::handle_no_styles (InputReader &ir, const Option &opt, bool longopt) {
323 _no_styles_given = true;
324 }
325
handle_output(InputReader & ir,const Option & opt,bool longopt)326 void CommandLine::handle_output (InputReader &ir, const Option &opt, bool longopt) {
327 if (getStringArg(ir, opt, longopt, _output_arg))
328 _output_given = true;
329 }
330
handle_page(InputReader & ir,const Option & opt,bool longopt)331 void CommandLine::handle_page (InputReader &ir, const Option &opt, bool longopt) {
332 if (getStringArg(ir, opt, longopt, _page_arg))
333 _page_given = true;
334 }
335
handle_precision(InputReader & ir,const Option & opt,bool longopt)336 void CommandLine::handle_precision (InputReader &ir, const Option &opt, bool longopt) {
337 if (getIntArg(ir, opt, longopt, _precision_arg))
338 _precision_given = true;
339 }
340
handle_progress(InputReader & ir,const Option & opt,bool longopt)341 void CommandLine::handle_progress (InputReader &ir, const Option &opt, bool longopt) {
342 if (ir.eof() || getDoubleArg(ir, opt, longopt, _progress_arg))
343 _progress_given = true;
344 }
345
handle_relative(InputReader & ir,const Option & opt,bool longopt)346 void CommandLine::handle_relative (InputReader &ir, const Option &opt, bool longopt) {
347 _relative_given = true;
348 }
349
handle_rotate(InputReader & ir,const Option & opt,bool longopt)350 void CommandLine::handle_rotate (InputReader &ir, const Option &opt, bool longopt) {
351 if (getDoubleArg(ir, opt, longopt, _rotate_arg))
352 _rotate_given = true;
353 }
354
handle_scale(InputReader & ir,const Option & opt,bool longopt)355 void CommandLine::handle_scale (InputReader &ir, const Option &opt, bool longopt) {
356 if (getStringArg(ir, opt, longopt, _scale_arg))
357 _scale_given = true;
358 }
359
handle_stdout(InputReader & ir,const Option & opt,bool longopt)360 void CommandLine::handle_stdout (InputReader &ir, const Option &opt, bool longopt) {
361 _stdout_given = true;
362 }
363
handle_trace_all(InputReader & ir,const Option & opt,bool longopt)364 void CommandLine::handle_trace_all (InputReader &ir, const Option &opt, bool longopt) {
365 if (ir.eof() || getBoolArg(ir, opt, longopt, _trace_all_arg))
366 _trace_all_given = true;
367 }
368
handle_transform(InputReader & ir,const Option & opt,bool longopt)369 void CommandLine::handle_transform (InputReader &ir, const Option &opt, bool longopt) {
370 if (getStringArg(ir, opt, longopt, _transform_arg))
371 _transform_given = true;
372 }
373
handle_translate(InputReader & ir,const Option & opt,bool longopt)374 void CommandLine::handle_translate (InputReader &ir, const Option &opt, bool longopt) {
375 if (getStringArg(ir, opt, longopt, _translate_arg))
376 _translate_given = true;
377 }
378
handle_verbosity(InputReader & ir,const Option & opt,bool longopt)379 void CommandLine::handle_verbosity (InputReader &ir, const Option &opt, bool longopt) {
380 if (getUIntArg(ir, opt, longopt, _verbosity_arg))
381 _verbosity_given = true;
382 }
383
handle_version(InputReader & ir,const Option & opt,bool longopt)384 void CommandLine::handle_version (InputReader &ir, const Option &opt, bool longopt) {
385 if (ir.eof() || getBoolArg(ir, opt, longopt, _version_arg))
386 _version_given = true;
387 }
388
handle_zip(InputReader & ir,const Option & opt,bool longopt)389 void CommandLine::handle_zip (InputReader &ir, const Option &opt, bool longopt) {
390 if (ir.eof() || getIntArg(ir, opt, longopt, _zip_arg))
391 _zip_given = true;
392 }
393
handle_zoom(InputReader & ir,const Option & opt,bool longopt)394 void CommandLine::handle_zoom (InputReader &ir, const Option &opt, bool longopt) {
395 if (getDoubleArg(ir, opt, longopt, _zoom_arg))
396 _zoom_given = true;
397 }
398
399