summaryrefslogtreecommitdiff
path: root/support/dktools/f2lopt.ctr
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/f2lopt.ctr
Initial commit
Diffstat (limited to 'support/dktools/f2lopt.ctr')
-rw-r--r--support/dktools/f2lopt.ctr1271
1 files changed, 1271 insertions, 0 deletions
diff --git a/support/dktools/f2lopt.ctr b/support/dktools/f2lopt.ctr
new file mode 100644
index 0000000000..f3a1c376b0
--- /dev/null
+++ b/support/dktools/f2lopt.ctr
@@ -0,0 +1,1271 @@
+%% options
+
+copyright owner = Dirk Krause
+copyright year = 2012-xxxx
+license = bsd
+
+
+
+%% header
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Process command line arguments.
+ @param job Job to process.
+ @return 1 on success, 0 on error.
+*/
+int
+f2lopt_process(f2l_job_t *job);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+%% module
+
+#include "fig2lat.h"
+
+
+
+$!trace-include
+
+
+
+/** Options for the fig2lat program.
+*/
+static dk3_option_t const f2lopt_options[] = {
+ { dkT('h'), dkT("help"), 0 },
+ { dkT('v'), dkT("version"), 0 },
+ { dkT('L'), dkT("license-terms"), 0 },
+ { dkT('l'), dkT("language"), 1 },
+ { dkT('m'), dkT("make"), 0 }
+};
+
+/** Number of options in f2lopt_options.
+*/
+static size_t const f2lopt_sz_options =
+sizeof(f2lopt_options)/sizeof(dk3_option_t);
+
+
+
+/** Key names for key/value pairs.
+*/
+static dkChar const * f2lopt_key_names[] = {
+$!string-table macro=dkT
+#
+# 0: Text font (similar or fig)
+#
+tf
+#
+# 1: Text size (none or scale factor).
+#
+ts
+#
+# 2: Compatibility for splines.
+#
+cosp
+#
+# 3: Compatibility for arrowheads.
+#
+coah
+#
+# 4: X-spline segments Bezier segments.
+#
+xsss
+#
+# 5: Quadrant Bezier segments.
+#
+qbs
+#
+# 6: Lighten look.
+#
+# lighten
+lw
+#
+# 7: Write debug information.
+#
+debug
+#
+# 8: Write showpage operator at end of EPS files.
+#
+showpage
+#
+# 9: PS level.
+#
+level
+#
+# 10: DSC comments.
+#
+dsc
+#
+# 11:
+#
+xfig
+#
+# 12:
+#
+jfig
+#
+# 13:
+#
+winfig
+#
+# 14: Arrowhead arc segments
+#
+ahas
+#
+# 15: Arrowhead spline segments
+#
+ahss
+#
+# 16: Arrowhead min segments
+#
+ahms
+#
+# 17: Arrowhead interpolation precision
+#
+ahip
+#
+# 18: Use smash in LaTeX output
+#
+smash
+#
+# 19: Use mbox in LaTeX output
+#
+mbox
+#
+# 20: Use reset@font in LaTeX output
+#
+reset@font
+#
+# 21: Number of color digits.
+#
+codi
+#
+# 22: TeX text size.
+#
+dcts
+#
+# 23: Align SVG output to grid.
+#
+css
+#
+# 24: Write SVG fragment
+#
+fragment
+#
+# 25: Where to obtain SVG fonts
+#
+fontbase
+#
+# 26: Group SVG object with its arrowheads
+#
+group
+#
+# 27: Miterlimit
+#
+miterlimit
+#
+# 28: Compatible line styles.
+#
+cols
+#
+# 29: Use replacement fonts
+#
+replacementfonts
+#
+# 30: Use text size for bounding box.
+#
+bbts
+#
+# 31: Special text encoding.
+#
+ste
+#
+# 32: Compatible fill open paths.
+#
+cofop
+#
+# 33: X-spline arrowheads.
+#
+xsah
+$!end
+};
+
+
+
+/** Values for font base choices.
+*/
+static dkChar const * const f2lopt_svg_font_bases[] = {
+$!string-table macro=dkT
+none
+local
+web
+$!end
+};
+
+
+/** Fixed keywords used by the module, not localized.
+*/
+static dkChar const * const f2lopt_kw[] = {
+$!string-table macro=dkT
+#
+# 0: none (used to specify the font size).
+#
+none
+#
+# 1: lighten
+#
+lighten
+#
+# 2: automatic
+#
+auto$matic
+$!end
+};
+
+
+
+/** Units for line width specification.
+*/
+static dkChar const * const f2lopt_units[] = {
+$!string-table macro=dkT
+bp
+pt
+in
+mm
+cm
+$!end
+};
+
+
+/** Language (output driver) names.
+ The order of names must correspond the the numbers defined
+ in fig2lat.ctr, see @ref fig2latdrivers.
+*/
+static dkChar const * const f2lopt_language_names[] = {
+$!string-table macro=dkT
+pgf
+tex
+tex.pdf
+eps.tex
+pdf.tex
+eps
+svg
+# @DRIVER@
+# Add name of new driver above this comment section
+# The order of driver names must correspond to the
+# driver names defined in fig2lat.ctr.
+$!end
+};
+
+
+
+/** Keywords for font name decision.
+*/
+static dkChar const * f2lopt_text_font_names[] = {
+$!string-table macro=dkT
+#
+# 0: similar
+#
+similar
+#
+# 1: fig
+#
+fig
+$!end
+};
+
+
+
+/** Set default options depending on the driver just configured.
+ @param job Job structure.
+*/
+static
+void
+f2lopt_set_default_options_for_language(f2l_job_t *job)
+{
+ $? "+ f2lopt_set_default_options_for_language"
+ job->ntf = 0;
+ job->nts = -1.0;
+ job->showpage = 0;
+ job->dsc = 0;
+ job->smash = 1;
+ job->mbox = 0;
+ job->resfont = 0;
+ switch(job->dr) {
+ case FIG2LAT_DRIVER_EPS_STANDALONE: {
+ job->ntf = 1;
+ job->showpage = 1;
+ job->dsc = 1;
+ job->smash = 0;
+ job->mbox = 0;
+ job->resfont = 0;
+ } break;
+ case FIG2LAT_DRIVER_SVG_STANDALONE:
+ {
+ job->smash = 0; job->mbox = 0; job->resfont = 0;
+ }
+ case FIG2LAT_DRIVER_TEX_FULL_PGF:
+ case FIG2LAT_DRIVER_TEX_FULL_PDF:
+ {
+ job->ntf = 1;
+ } break;
+ }
+ $? "- f2lopt_set_default_options_for_language"
+}
+
+
+
+/** Set language.
+ @param job Job structure to configure.
+ @param lstr Language name without trailing options.
+ @return 1 on success, 0 on error.
+*/
+static
+int
+f2lopt_apply_language(f2l_job_t *job, dkChar const *lstr)
+{
+ int back = 0;
+ $? "+ f2lopt_apply_language \"%!ds\"", TR_STR(lstr)
+ job->dr = dk3str_array_index(f2lopt_language_names, lstr, 0);
+ if(job->dr > -1) {
+ back = 1;
+ f2lopt_set_default_options_for_language(job);
+ } else { $? "! unknown language"
+ /* ERROR: Unknown language ... */
+ dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 7, 8, lstr);
+ job->exval = FIG2LAT_EXIT_ERROR_SYNTAX; $? ". exitcode"
+ } $? "- f2lopt_apply_language %d", back
+ return back;
+}
+
+
+
+/** Set text font.
+ @param job Job structure.
+ @param vptr Font specification (similar or fig).
+ @return 1 on success, 0 on error.
+*/
+static
+int
+f2lopt_set_text_font(f2l_job_t *job, dkChar const *vptr)
+{
+ int i; /* Decision for font handling. */
+ int back = 0;
+ $? "+ f2lopt_set_text_font \"%!ds\"", TR_STR(vptr)
+ switch((i = dk3str_array_index(f2lopt_text_font_names, vptr, 0))) {
+ case 0: case 1: { $? ". font selection = %d", i
+ job->ntf = i;
+ back = 1;
+ } break;
+ default: { $? "! wrong font selection"
+ /* ERROR: No such text font selection! */
+ dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 9, 10, vptr);
+ } break;
+ }
+ $? "- f2lopt_set_text_font %d", back
+ return back;
+}
+
+
+
+/** Set text size.
+ @param job Job structure.
+ @param vptr Text size as string (none or scale factor).
+ @return 1 on success, 0 on error.
+*/
+static
+int
+f2lopt_set_text_size(f2l_job_t *job, dkChar const *vptr)
+{
+ double d; /* Font size factor. */
+ int back = 0;
+ $? "+ f2lopt_set_text_font \"%!ds\"", vptr
+ if(dk3str_cmp(vptr, f2lopt_kw[0]) == 0) { $? ". no size"
+ job->nts = -1.0;
+ back = 1;
+ } else {
+#if VERSION_BEFORE_20140716
+ if(dk3sf_sscanf3(vptr, dkT("%lf"), &d) == 1)
+#else
+ if (0 != dk3ma_d_from_string(&d, vptr, NULL))
+#endif
+ { $? ". size %lg", d
+ job->nts = d;
+ back = 1;
+ } else { $? "! invalid size"
+ /* ERROR: Invalid font size specification! */
+ dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 11, 12, vptr);
+ }
+ }
+ $? "- f2lopt_set_text_font %d", back
+ return back;
+}
+
+
+
+/** Read a size_t from text.
+ @param dptr Pointer to destination variable.
+ @param vptr Source text.
+ @param job Job structure.
+ @return 1 on success, 0 on error.
+*/
+static
+int
+f2lopt_read_size_t(size_t *dptr, dkChar const *vptr, f2l_job_t *job)
+{
+#if VERSION_BEFORE_20140809
+ unsigned u; /* Conversion result. */
+ int back = 0;
+ if(1 == dk3sf_sscanf3(vptr, dkT("%u"), &u)) {
+ *dptr = (size_t)u;
+ back = 1;
+ if((unsigned)(*dptr) != u) {
+ back = 0;
+ /* ERROR: Range overflow */
+ dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 13, 14, vptr);
+ }
+ } else {
+ /* ERRROR: Not a number! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 141, 142, vptr);
+ }
+ return back;
+#else
+ dk3_um_t um = DK3_UM_0;
+ int back = 0;
+ int mec = 0;
+
+ if (dk3ma_um_from_string(&um, vptr, NULL)) { /* OK: Number */
+ *dptr = dk3ma_um_to_sz(um, &mec);
+ if (0 == mec) { /* OK: Converted */
+ back = 1;
+ } else { /* Overflow */
+ dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 13, 14, vptr);
+ }
+ } else { /* Not a number */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 141, 142, vptr);
+ }
+ return back;
+#endif
+}
+
+
+
+/** Read double value from string to configuration variable.
+ @param job Job structure.
+ @param dvar Pointer to destination variable.
+ @param src Source text.
+ @param min Minimum value.
+ @param max Maximum value.
+ @param tp Type (1=check minimum, 2=positive number + check max).
+ @param optnr Option index, used for error messages.
+ @return 1 on success, 0 on error.
+*/
+static
+int
+f2lopt_read_double(
+ f2l_job_t *job,
+ double *dvar,
+ dkChar const *src,
+ double min,
+ double max,
+ int tp,
+ size_t optnr
+)
+{
+ dkChar buf[128]; /* Conversion buffer. */
+ double dval = 0.0; /* Conversion result. */
+ int back = 0;
+ if(src) {
+#if VERSION_BEFORE_20140716
+ if(dk3sf_sscanf3(src, dkT("%lg"), &dval) == 1)
+#else
+ if (0 != dk3ma_d_from_string(&dval, src, NULL))
+#endif
+ {
+ switch(tp) {
+ case 1: {
+ if(dval >= min) {
+ *dvar = dval;
+ back = 1;
+ } else {
+ /* ERROR: Minimum for option ... is ...! */
+#if VERSION_BEFORE_20140716
+ dk3sf_sprintf3(buf, dkT("%g"), min);
+ dk3app_log_5(
+ job->app, DK3_LL_ERROR, job->msg, 15, 16, 17, src, buf
+ );
+#else
+ if (0 != dk3ma_d_to_string(buf, DK3_SIZEOF(buf,dkChar), min)) {
+ dk3app_log_5(
+ job->app, DK3_LL_ERROR, job->msg, 15, 16, 17, src, buf
+ );
+ }
+#endif
+ }
+ } break;
+ case 2: {
+ if(dval > 0) {
+ if(dval < max) {
+ *dvar = dval;
+ back = 1;
+ } else {
+ /* ERROR: Maximum for option ... is ...! */
+#if VERSION_BEFORE_20140716
+ dk3sf_sprintf3(buf, dkT("%g"), max);
+ dk3app_log_5(job->app,DK3_LL_ERROR,job->msg,15,18,17,src,buf);
+#else
+ if (0 != dk3ma_d_to_string(buf, DK3_SIZEOF(buf,dkChar), max)) {
+ dk3app_log_5(job->app,DK3_LL_ERROR,job->msg,15,18,17,src,buf);
+ }
+#endif
+ }
+ } else {
+ /* ERROR: Option ... requires positive value! */
+ dk3app_log_3(
+ job->app, DK3_LL_ERROR, job->msg, 19, 20,
+ f2lopt_key_names[optnr]
+ );
+ }
+ } break;
+ }
+ } else {
+ /* ERROR: Option argument is not numeric! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 141, 142, src);
+ }
+ } else {
+ /* ERROR: Option requires an argument. */
+ dk3app_log_3(
+ job->app, DK3_LL_ERROR, job->msg, 21, 22,
+ f2lopt_key_names[optnr]
+ );
+ }
+ return back;
+}
+
+
+/** Process one option.
+ @param job Job structure to configure.
+ @param str Key=value text.
+ @return 1 on success, 0 on error.
+*/
+static
+int
+f2lopt_apply_option(f2l_job_t *job, dkChar const *str)
+{
+ dkChar bu[1024]; /* Private copy of str. */
+ dkChar *kptr; /* Key pointer. */
+ dkChar *vptr; /* Value pointer. */
+ int back = 0;
+ $? "+ f2lopt_apply_option \"%!ds\"", TR_STR(str)
+ if(dk3str_len(str) < DK3_SIZEOF(bu,dkChar)) {
+ dk3str_cpy_not_overlapped(bu, str);
+ kptr = dk3str_start(bu, NULL);
+ if(kptr) {
+ vptr = dk3str_chr(kptr, dkT('='));
+ if(vptr) {
+ *(vptr++) = dkT('\0');
+ vptr = dk3str_start(vptr, NULL);
+ }
+ switch(dk3str_array_index(f2lopt_key_names, kptr, 0)) {
+ case 0: { $? ". tf"
+ if(vptr) {
+ back = f2lopt_set_text_font(job, vptr);
+ } else {
+ /* ERRROR: Key needs an argument! */
+ dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 21, 22, kptr);
+ }
+ } break;
+ case 1: { $? ". ts"
+ if(vptr) {
+ back = f2lopt_set_text_size(job, vptr);
+ } else {
+ job->nts = -1.0;
+ back = 1;
+ }
+ } break;
+ case 2: { $? ". cosp"
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->cosp = (dk3str_is_on(vptr) ? 1 : 0);
+ back = 1;
+ } else {
+ /* ERROR: Not a boolean */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ job->cosp = 1; back = 1;
+ }
+ } break;
+ case 3: { $? ". coah"
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->coah = (dk3str_is_on(vptr) ? 1 : 0);
+ back = 1;
+ } else {
+ /* ERROR: Not a boolean */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ job->coah = 1; back = 1;
+ }
+ } break;
+ case 4: { $? ". xssbs"
+ if(vptr) {
+ back = f2lopt_read_size_t(&(job->xssbs), vptr, job);
+ } else {
+ /* ERROR: Argument required! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 133, 134, kptr);
+ }
+ } break;
+ case 5: { $? ". qbs"
+ if(vptr) {
+ back = f2lopt_read_size_t(&(job->qbs), vptr, job);
+ } else {
+ /* ERROR: Argument required! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 133, 134, kptr);
+ }
+ } break;
+ case 6: {
+#if VERSION_BEFORE_20140330
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->lighten = ((dk3str_is_on(vptr)) ? 1 : 0);
+ back = 1;
+ } else {
+ /* ERROR: Not a boolean value! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ back = 1;
+ job->lighten = 1;
+ }
+#else
+ job->lwbp = 0.9;
+ job->lwauto = 0;
+ if (vptr) {
+ double x;
+ size_t vplen;
+ vplen = dk3str_len(vptr);
+ if (0 == dk3str_cmp(f2lopt_kw[1], vptr)) {
+ job->lwbp = 0.45;
+ job->lwauto = 0;
+ back = 1;
+ } else {
+ if (dk3str_is_abbr(vptr,f2lopt_kw[2],dkT('$'), 0)) {
+ job->lwauto = 1;
+ back = 1;
+ } else {
+ if (2 < vplen) {
+ switch (dk3str_array_index(f2lopt_units, &(vptr[vplen-2]), 0))
+ {
+ case 0: { /* bp */
+ vptr[vplen - 2] = dkT('\0');
+#if VERSION_BEFORE_20140716
+ if (dk3sf_sscanf3(vptr, dkT("%lg"), &x) == 1)
+#else
+ if (0 != dk3ma_d_from_string(&x, vptr, NULL))
+#endif
+ {
+ job->lwbp = x;
+ back = 1;
+ } else {
+ /* ERROR: Failed to process */
+ dk3app_log_3(job->app,DK3_LL_ERROR,job->msg,45,46,vptr);
+ }
+ } break;
+ case 1: { /* pt */
+ vptr[vplen - 2] = dkT('\0');
+#if VERSION_BEFORE_20140716
+ if (dk3sf_sscanf3(vptr, dkT("%lg"), &x) == 1)
+#else
+ if (0 != dk3ma_d_from_string(&x, vptr, NULL))
+#endif
+ {
+ job->lwbp = x * 72.0 / 72.27;
+ back = 1;
+ } else {
+ /* ERROR: Failed to process */
+ dk3app_log_3(job->app,DK3_LL_ERROR,job->msg,45,46,vptr);
+ }
+ } break;
+ case 2: { /* in */
+ vptr[vplen - 2] = dkT('\0');
+#if VERSION_BEFORE_20140716
+ if (dk3sf_sscanf3(vptr, dkT("%lg"), &x) == 1)
+#else
+ if (0 != dk3ma_d_from_string(&x, vptr, NULL))
+#endif
+ {
+ job->lwbp = x * 72.0;
+ back = 1;
+ } else {
+ /* ERROR: Failed to process */
+ dk3app_log_3(job->app,DK3_LL_ERROR,job->msg,45,46,vptr);
+ }
+ } break;
+ case 3: { /* mm */
+ vptr[vplen - 2] = dkT('\0');
+#if VERSION_BEFORE_20140716
+ if (dk3sf_sscanf3(vptr, dkT("%lg"), &x) == 1)
+#else
+ if (0 != dk3ma_d_from_string(&x, vptr, NULL))
+#endif
+ {
+ job->lwbp = x * 72.0 / 25.4;
+ back = 1;
+ } else {
+ /* ERROR: Failed to process */
+ dk3app_log_3(job->app,DK3_LL_ERROR,job->msg,45,46,vptr);
+ }
+ } break;
+ case 4: { /* cm */
+ vptr[vplen - 2] = dkT('\0');
+#if VERSION_BEFORE_20140716
+ if (dk3sf_sscanf3(vptr, dkT("%lg"), &x) == 1)
+#else
+ if (0 != dk3ma_d_from_string(&x, vptr, NULL))
+#endif
+ {
+ job->lwbp = x * 72.0 / 2.54;
+ back = 1;
+ } else {
+ /* ERROR: Failed to process */
+ dk3app_log_3(job->app,DK3_LL_ERROR,job->msg,45,46,vptr);
+ }
+ } break;
+ default: {
+#if VERSION_BEFORE_20140716
+ if (dk3sf_sscanf3(vptr, dkT("%lg"), &x) == 1)
+#else
+ if (0 != dk3ma_d_from_string(&x, vptr, NULL))
+#endif
+ {
+ job->lwbp = x;
+ back = 1;
+ } else {
+ /* ERROR: Failed to process */
+ dk3app_log_3(job->app,DK3_LL_ERROR,job->msg,45,46,vptr);
+ }
+ } break;
+ }
+ } else {
+#if VERSION_BEFORE_20140716
+ if (dk3sf_sscanf3(vptr, dkT("%lg"), &x) == 1)
+#else
+ if (0 != dk3ma_d_from_string(&x, vptr, NULL))
+#endif
+ {
+ job->lwbp = x;
+ back = 1;
+ } else {
+ /* ERROR: Failed to process */
+ dk3app_log_3(job->app,DK3_LL_ERROR,job->msg,45,46,vptr);
+ }
+ }
+ }
+ }
+ } else {
+ job->lwbp = 0.9;
+ job->lwauto = 1;
+ back = 1;
+ if (job->lwbp < 0.001) {
+ job->lwbp = 0.001;
+ }
+ } $? ". lwbp=%lg lwauto=%d", job->lwbp, job->lwauto
+#endif
+ } break;
+ case 7: {
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ back = 1;
+ job->debug = ((dk3str_is_on(vptr)) ? 1 : 0);
+ } else {
+ /* ERROR: Not a boolean value! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ back = 1;
+ job->debug = 1;
+ }
+ } break;
+ case 8: {
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->showpage = ((dk3str_is_on(vptr)) ? 1 : 0);
+ back = 1;
+ } else {
+ /* ERROR: Not a boolean value! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ job->showpage = 1;
+ back = 1;
+ }
+ } break;
+ case 9: {
+ if(vptr) {
+ int i;
+#if VERSION_BEFORE_20140716
+ if(dk3sf_sscanf3(vptr, dkT("%d"), &i) == 1)
+#else
+ if (0 != dk3ma_i_from_string(&i, vptr, NULL))
+#endif
+ {
+ if((i >= 2) && (i <= 3)) {
+ job->pslevel = i;
+ } else {
+ /* ERROR: Must be 2 or 3! */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 33);
+ }
+ } else {
+ /* ERROR: Argument not a number! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 141, 142, vptr);
+ }
+ } else {
+ /* ERROR: Argument required! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 133, 134, kptr);
+ }
+ } break;
+ case 10: {
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->dsc = ((dk3str_is_on(vptr)) ? 1 : 0);
+ back = 1;
+ } else {
+ /* ERROR: Not a boolean argument. */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ job->dsc = 1;
+ back = 1;
+ }
+ } break;
+ case 11: {
+ if(DK3_FIG_SRCTYPE_UNKNOWN == job->srctype) {
+ job->srctype = DK3_FIG_SRCTYPE_XFIG;
+ back = 1;
+ } else {
+ /* ERROR: Source type already set! */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 23);
+ }
+ } break;
+ case 12: {
+ if(DK3_FIG_SRCTYPE_UNKNOWN == job->srctype) {
+ job->srctype = DK3_FIG_SRCTYPE_JFIG;
+ back = 1;
+ } else {
+ /* ERROR: Source type already set! */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 23);
+ }
+ } break;
+ case 13: {
+ if(DK3_FIG_SRCTYPE_UNKNOWN == job->srctype) {
+ job->srctype = DK3_FIG_SRCTYPE_WINFIG;
+ back = 1;
+ } else {
+ /* ERROR: Source type already set! */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 23);
+ }
+ } break;
+ case 14: { /* Arrowhead arc segments */
+ back = f2lopt_read_double(job,&(job->arcspp),vptr,2.0,-1.0,1,14);
+ } break;
+ case 15: { /* Arrowhead spline segments */
+ back = f2lopt_read_double(job,&(job->splspp),vptr,2.0,-1.0,1,15);
+ } break;
+ case 16: { /* Arrowhead min segments. */
+ unsigned u = 2;
+ if(vptr) {
+#if VERSION_BEFORE_20140716
+ if(dk3sf_sscanf3(vptr, dkT("%u"), &u) == 1)
+#else
+ if (0 != dk3ma_ui_from_string(&u, vptr, NULL))
+#endif
+ {
+ if(2 <= u) {
+ job->minspp = (size_t)u;
+ back = 1;
+ } else {
+ /* Warning: Must be at least 2! */
+ job->minspp = 2;
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 34);
+ back = 1;
+ }
+ } else {
+ /* ERROR: Argument is not numeric */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 141, 142, vptr);
+ }
+ } else {
+ /* ERROR: Option requires an argument! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 133, 134, kptr);
+ }
+ } break;
+ case 17: { /* Arrowhead interpolation precision. */
+ back = f2lopt_read_double(job,&(job->xsprec),vptr,0.0,0.1,2,17);
+ } break;
+ case 18: { /* smash */
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->smash = ((dk3str_is_on(vptr)) ? 1 : 0);
+ back = 1;
+ } else {
+ /* ERROR: Option requires boolean argument */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ job->smash = 1;
+ back = 1;
+ }
+ } break;
+ case 19: { /* mbox */
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->mbox = ((dk3str_is_on(vptr)) ? 1 : 0);
+ back = 1;
+ } else {
+ /* ERROR: Option requires boolean argument! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ job->mbox = 1;
+ back = 1;
+ }
+ } break;
+ case 20: {
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->resfont = ((dk3str_is_on(vptr)) ? 1 : 0);
+ back = 1;
+ } else {
+ /* ERROR: Option requires boolean argument! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ job->resfont = 1;
+ back = 1;
+ }
+ } break;
+ case 21: {
+ if(vptr) {
+ unsigned u;
+#if VERSION_BEFORE_20140716
+ if(dk3sf_sscanf3(vptr, dkT("%u"), &u) == 1)
+#else
+ if (0 != dk3ma_ui_from_string(&u, vptr, NULL))
+#endif
+ {
+ job->codi = (size_t)u;
+ back = 1;
+ } else {
+ /* ERROR: Option requires an unsigned numeric argument! */
+ dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 24, 25, kptr);
+ }
+ } else {
+ job->codi = 0;
+ back = 1;
+ }
+ } break;
+ case 22: {
+ if(vptr) {
+ double d;
+#if VERSION_BEFORE_20140716
+ if(dk3sf_sscanf3(vptr, dkT("%lg"), &d) == 1)
+#else
+ if (0 != dk3ma_d_from_string(&d, vptr, NULL))
+#endif
+ {
+ if(d > 0.0) {
+ job->tts = d; back = 1;
+ } else {
+ /* ERROR: Cannot handle negative font size! */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 26);
+ }
+ } else {
+ /* ERROR: Option requires a floating point number arg! */
+ dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 12, 22, kptr);
+ }
+ } else {
+ job->tts = 12.0; back = 1;
+ }
+ } break;
+ case 23: {
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->css = ((dk3str_is_on(vptr)) ? 1 : 0); back = 1;
+ } else {
+ /* ERROR: Option requires boolean argument! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ job->css = 1; back = 1;
+ }
+ } break;
+ case 24: {
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->fragment = ((dk3str_is_on(vptr)) ? 1 : 0); back = 1;
+ } else {
+ /* ERROR: Option requires boolean argument! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ job->fragment = 1; back = 1;
+ }
+ } break;
+ case 25: {
+ if(vptr) {
+ job->svgfontbase = dk3str_array_index(f2lopt_svg_font_bases, vptr, 0);
+ if(0 <= job->svgfontbase) {
+ back = 1;
+ } else {
+ /* ##### ERROR: Illegal font base name! */
+ }
+ } else {
+ job->svgfontbase = 0; back = 1;
+ }
+ } break;
+ case 26: {
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->group = ((dk3str_is_on(vptr)) ? 1 : 0); back = 1;
+ } else {
+ /* ERROR: Option requires boolean argument! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ job->group = 1; back = 1;
+ }
+ } break;
+ case 27: {
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->miterlim = ((dk3str_is_on(vptr)) ? 1 : 0); back = 1;
+ } else {
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ job->miterlim = 1; back = 1;
+ }
+ } break;
+ case 28: {
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->cols = ((dk3str_is_on(vptr)) ? 1 : 0); back = 1;
+ } else {
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ job->cols = 1; back = 1;
+ }
+ } break;
+ case 29: {
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->otherfonts = ((dk3str_is_on(vptr)) ? 1 : 0); back = 1;
+ } else {
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ job->otherfonts = 1; back = 1;
+ }
+ } break;
+ case 30: {
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->bbts = ((dk3str_is_on(vptr)) ? 1 : 0); back = 1;
+ } else {
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ job->bbts = 1; back = 1;
+ }
+ } break;
+ case 31: {
+ int enc;
+ if(vptr) {
+ enc = dk3enc_get_text_encoding_app(vptr, job->app);
+ } else {
+ if(DK3_ENCODING_UTF8 == dk3app_get_encoding(job->app)) {
+ enc = DK3_ENCODING_PLAIN;
+ } else {
+ enc = DK3_ENCODING_UTF8;
+ }
+ }
+ back = 1;
+ switch(enc) {
+ case DK3_ENCODING_UTF8: {
+ job->stu8 = 1;
+ } break;
+ case DK3_ENCODING_PLAIN: {
+ job->stu8 = 0;
+ } break;
+ default: {
+ job->stu8 = 0;
+ /* ##### WARNING Only ascii and utf-8 allowed. */
+ } break;
+ }
+ } break;
+ case 32: {
+ if(vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->cofop = ((dk3str_is_on(vptr)) ? 1 : 0);
+ back = 1;
+ } else {
+ /* ERROR: Not a boolean! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ job->cofop = 1;
+ back = 1;
+ }
+ } break;
+ case 33: {
+ if (vptr) {
+ if(dk3str_is_bool(vptr)) {
+ job->xsah = ((dk3str_is_on(vptr)) ? 1 : 0);
+ back = 1;
+ } else {
+ /* ERROR: Not a boolean! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 147, kptr);
+ }
+ } else {
+ job->xsah = 1;
+ back = 1;
+ }
+ } break;
+ default: {
+ /* ERROR: Unknown key name! */
+ dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 27, 28, kptr);
+ } break;
+ }
+ } else { $? "! empty option"
+ back = 1;
+ }
+ if(!(back)) {
+ job->exval = FIG2LAT_EXIT_ERROR_SYNTAX; $? ". exitcode"
+ }
+ } else {
+ /* ERROR: Option ... too long! */
+ dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 29, 30, str);
+ job->exval = FIG2LAT_EXIT_ERROR_SYNTAX; $? ". exitcode"
+ } $? "- f2lopt_apply_option %d", back
+ return back;
+}
+
+
+
+/** Set language, apply options if any.
+ @param job Job structure to set up.
+ @param optarg Language, optionally with further options.
+ @return 1 on success, 0 on error.
+*/
+static
+int
+f2lopt_set_language(f2l_job_t *job, dkChar const *optarg)
+{
+ dkChar bu[1024]; /* Private copy of optarg. */
+ dkChar *pc; /* Current string. */
+ dkChar *pn; /* Next string. */
+ int back = 0;
+ $? "+ f2lopt_set_language \"%!ds\"", TR_STR(optarg)
+ if(dk3str_len(optarg) < DK3_SIZEOF(bu,dkChar)) {
+ dk3str_cpy_not_overlapped(bu, optarg);
+ pc = dk3str_chr(bu, dkT(','));
+ if(pc) {
+ *(pc++) = dkT('\0');
+ pc = dk3str_start(pc, NULL);
+ }
+ if(f2lopt_apply_language(job, bu)) {
+ back = 1;
+ while(pc) { $? ". pc = \"%!ds\"", TR_STR(pc)
+ pn = dk3str_chr(pc, dkT(','));
+ if(pn) { *(pn++) = dkT('\0'); pn = dk3str_start(pn, NULL); }
+ if(!f2lopt_apply_option(job, pc)) {
+ back = 0; $? "! f2lopt_apply_option"
+ pn = NULL;
+ }
+ pc = pn;
+ }
+ }
+ } else {
+ /* ERROR: Option argument too long! */
+ dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 31, 30, optarg);
+ } $? "- f2lopt_set_language %d", back
+ return back;
+}
+
+
+
+int
+f2lopt_process(f2l_job_t *job)
+{
+ dkChar const *optarg; /* Option argument. */
+ int back = 0;
+ int i; /* Current file name. */
+ $? "+ f2lopt_process"
+ job->opt = dk3opt_open_from_app(
+ f2lopt_options, f2lopt_sz_options,
+ dkT('o'), dkT("option"),
+ job->app
+ );
+ if(job->opt) { $? ". option set"
+ if(0 == dk3opt_get_error_code(job->opt)) { $? ". error check"
+ back = 1;
+ if(dk3opt_is_set(job->opt, dkT('h'))) {
+ job->cmd |= DK3_APP_CMD_HELP;
+ }
+ if(dk3opt_is_set(job->opt, dkT('v'))) {
+ job->cmd |= DK3_APP_CMD_VERSION;
+ }
+ if(dk3opt_is_set(job->opt, dkT('L'))) {
+ job->cmd |= DK3_APP_CMD_LICENSE;
+ }
+ if(0 == job->cmd) {
+ if(dk3opt_is_set(job->opt, dkT('m'))) {
+ job->mm = 1;
+ }
+ if(dk3opt_is_set(job->opt, dkT('l'))) {
+ optarg = dk3opt_get_short_arg(job->opt, dkT('l'));
+ if(optarg) { $? ". optarg"
+ if(f2lopt_set_language(job, optarg)) {
+ for(i = 0; i < dk3opt_get_num_fo(job->opt); i++) {
+ optarg = dk3opt_get_fo(job->opt, i);
+ if(optarg) {
+ if(!f2lopt_apply_option(job, optarg)) {
+ back = 0;
+ }
+ }
+ }
+ } else {
+ back = 0;
+ }
+ } else { $? "! optarg"
+ back = 0;
+ /* ERROR: Option requires an argument! */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 32);
+ }
+ } else {
+ }
+ }
+ /* Automatically calculate line width in points
+ from TeX text size.
+ */
+ if (job->lwauto) {
+ job->lwbp = 0.4 * 72.0 * job->tts / (10 * 72.27);
+ $? ". lwbp=%lg", job->lwbp
+ }
+ } else { $? "! error check"
+ }
+ } else { $? "! option set"
+ job->exval = FIG2LAT_EXIT_ERROR_SYSTEM; $? ". exitcode"
+ } $? "- f2lopt_process %d", back
+ return back;
+}
+
+