diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/f2lopt.ctr |
Initial commit
Diffstat (limited to 'support/dktools/f2lopt.ctr')
-rw-r--r-- | support/dktools/f2lopt.ctr | 1271 |
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; +} + + |