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