/*
	WARNING: This file was generated by dkct.
	Changes you make here will be lost if dkct is run again!
	You should modify the original source and run dkct on it.
	Original source: f2lopt.ctr
*/

/*
Copyright (C) 2012-2013, Dirk Krause

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice,
  this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above opyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.
* Neither the name of the author nor the names of contributors may be used
  to endorse or promote products derived from this software without specific
  prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/**	@file f2lopt.c The f2lopt module.
*/


#line 29 "f2lopt.ctr"

#include "fig2lat.h"





#line 35 "f2lopt.ctr"



/**	Options for the fig2lat program.
*/
static dk3_option_t f2lopt_options[] = {
  { dkT('h'), dkT("help"), 0 },
  { dkT('v'), dkT("version"), 0 },
  { dkT('L'), dkT("license"), 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[] = {
/* 0 */
dkT("tf"),

/* 1 */
dkT("ts"),

/* 2 */
dkT("cosp"),

/* 3 */
dkT("coah"),

/* 4 */
dkT("xsss"),

/* 5 */
dkT("qbs"),

/* 6 */
dkT("lighten"),

/* 7 */
dkT("debug"),

/* 8 */
dkT("showpage"),

/* 9 */
dkT("level"),

/* 10 */
dkT("dsc"),

/* 11 */
dkT("xfig"),

/* 12 */
dkT("jfig"),

/* 13 */
dkT("winfig"),

/* 14 */
dkT("ahas"),

/* 15 */
dkT("ahss"),

/* 16 */
dkT("ahms"),

/* 17 */
dkT("ahip"),

/* 18 */
dkT("smash"),

/* 19 */
dkT("mbox"),

/* 20 */
dkT("reset@font"),

/* 21 */
dkT("codi"),

/* 22 */
dkT("dcts"),

/* 23 */
dkT("css"),

/* 24 */
dkT("fragment"),

/* 25 */
dkT("fontbase"),

/* 26 */
dkT("group"),

/* 27 */
dkT("miterlimit"),

/* 28 */
dkT("cols"),

/* 29 */
dkT("replacementfonts"),

/* 30 */
dkT("bbts"),

NULL


#line 184 "f2lopt.ctr"
};



/**	Values for font base choices.
*/
static dkChar const * const f2lopt_svg_font_bases[] = {
/* 0 */
dkT("none"),

/* 1 */
dkT("local"),

/* 2 */
dkT("web"),

NULL


#line 196 "f2lopt.ctr"
};


/**	Fixed keywords used by the module, not localized.
*/
static dkChar const * const f2lopt_kw[] = {
/* 0 */
dkT("none"),

NULL


#line 208 "f2lopt.ctr"
};



/**	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[] = {
/* 0 */
dkT("pgf"),

/* 1 */
dkT("tex"),

/* 2 */
dkT("tex.pdf"),

/* 3 */
dkT("eps.tex"),

/* 4 */
dkT("pdf.tex"),

/* 5 */
dkT("eps"),

/* 6 */
dkT("svg"),

NULL


#line 230 "f2lopt.ctr"
};



/**	Keywords for font name decision.
*/
static dkChar const * f2lopt_text_font_names[] = {
/* 0 */
dkT("similar"),

/* 1 */
dkT("fig"),

NULL


#line 247 "f2lopt.ctr"
};



/**	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)
{
  

#line 259 "f2lopt.ctr"
  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;
  }
  

#line 286 "f2lopt.ctr"
}



/**	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;
  

#line 301 "f2lopt.ctr"
  job->dr = dk3str_array_index(f2lopt_language_names, lstr, 0);
  if(job->dr > -1) {
    back = 1;
    f2lopt_set_default_options_for_language(job);
  } else {						

#line 306 "f2lopt.ctr"
    /* ERROR: Unknown language ... */
    dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 7, 8, lstr);
    job->exval = FIG2LAT_EXIT_ERROR_SYNTAX; 

#line 309 "f2lopt.ctr"
  } 

#line 310 "f2lopt.ctr"
  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;
  

#line 327 "f2lopt.ctr"
  switch((i = dk3str_array_index(f2lopt_text_font_names, vptr, 0))) {
    case 0: case 1: {		

#line 329 "f2lopt.ctr"
      job->ntf = i;
      back = 1;
    } break;
    default: {			

#line 333 "f2lopt.ctr"
      /* ERROR: No such text font selection! */
      dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 9, 10, vptr);
    } break;
  }
  

#line 338 "f2lopt.ctr"
  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;
  

#line 355 "f2lopt.ctr"
  if(dk3str_cmp(vptr, f2lopt_kw[0]) == 0) {		

#line 356 "f2lopt.ctr"
    job->nts = -1.0;
    back = 1;
  } else {
    if(dk3sf_sscanf3(vptr, dkT("%lf"), &d) == 1) {	

#line 360 "f2lopt.ctr"
      job->nts = d;
      back = 1;
    } else {						

#line 363 "f2lopt.ctr"
      /* ERROR: Invalid font size specification! */
      dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 11, 12, vptr);
    }
  }
  

#line 368 "f2lopt.ctr"
  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)
{
  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;
}



/**	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(dk3sf_sscanf3(src, dkT("%lg"), &dval) == 1) {
      switch(tp) {
        case 1: {
	  if(dval >= min) {
	    *dvar = dval;
	    back = 1;
	  } else {
	    /* ERROR: Minimum for option ... is ...! */
	    dk3sf_sprintf3(buf, dkT("%lg"), min);
	    dk3app_log_5(
	      job->app, DK3_LL_ERROR, job->msg, 15, 16, 17, src, buf
	    );
	  }
	} break;
	case 2: {
	  if(dval > 0) {
	    if(dval < max) {
	      *dvar = dval;
	      back = 1;
	    } else {
	      /* ERROR: Maximum for option ... is ...! */
	      dk3sf_sprintf3(buf, dkT("%lg"), max);
	      dk3app_log_5(job->app,DK3_LL_ERROR,job->msg,15,18,17,src,buf);
	    }
	  } 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;
  

#line 490 "f2lopt.ctr"
  if(dk3str_len(str) < DK3_SIZEOF(bu,dkChar)) {
    dk3str_cpy(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: {	

#line 501 "f2lopt.ctr"
	  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: {	

#line 509 "f2lopt.ctr"
	  if(vptr) {
	    back = f2lopt_set_text_size(job, vptr);
	  } else {
	    job->nts = -1.0;
	    back = 1;
	  }
	} break;
	case 2: {	

#line 517 "f2lopt.ctr"
	  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: {	

#line 530 "f2lopt.ctr"
	  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: {	

#line 543 "f2lopt.ctr"
	  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: {	

#line 551 "f2lopt.ctr"
	  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(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;
	  }
	} 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(dk3sf_sscanf3(vptr, dkT("%d"), &i) == 1) {
	      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(dk3sf_sscanf3(vptr, dkT("%u"), &u) == 1) {
	      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(dk3sf_sscanf3(vptr, dkT("%u"), &u) == 1) {
	      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(dk3sf_sscanf3(vptr, dkT("%lg"), &d) == 1) {
	      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;
	default: {
	  /* ERROR: Unknown key name! */
	  dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 27, 28, kptr);
	} break;
      }
    } else {					

#line 864 "f2lopt.ctr"
      back = 1;
    }
    if(!(back)) {
      job->exval = FIG2LAT_EXIT_ERROR_SYNTAX; 

#line 868 "f2lopt.ctr"
    }
  } else {
    /* ERROR: Option ... too long! */
    dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 29, 30, str);
    job->exval = FIG2LAT_EXIT_ERROR_SYNTAX; 

#line 873 "f2lopt.ctr"
  } 

#line 874 "f2lopt.ctr"
  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;
  

#line 893 "f2lopt.ctr"
  if(dk3str_len(optarg) < DK3_SIZEOF(bu,dkChar)) {
    dk3str_cpy(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) {		

#line 903 "f2lopt.ctr"
        pn = dk3str_chr(pc, dkT(','));
	if(pn) { *(pn++) = dkT('\0'); pn = dk3str_start(pn, NULL); }
	if(!f2lopt_apply_option(job, pc)) {
	  back = 0;		

#line 907 "f2lopt.ctr"
	  pn = NULL;
	}
	pc = pn;
      }
    }
  } else {
    /* ERROR: Option argument too long! */
    dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 31, 30, optarg);
  } 

#line 916 "f2lopt.ctr"
  return back;
}



int
f2lopt_process(f2l_job_t *job)
{
  dkChar const		*optarg;	/* Option argument. */
  int			 back = 0;
  int			 i;		/* Current file name. */
  

#line 928 "f2lopt.ctr"
  job->opt = dk3opt_open_from_app(
    f2lopt_options, f2lopt_sz_options,
    dkT('o'), dkT("option"),
    job->app
  );
  if(job->opt) {					

#line 934 "f2lopt.ctr"
    if(0 == dk3opt_get_error_code(job->opt)) {		

#line 935 "f2lopt.ctr"
      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) {					

#line 952 "f2lopt.ctr"
	    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 {					

#line 965 "f2lopt.ctr"
	    back = 0;
	    /* ERROR: Option requires an argument! */
	    dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 32);
	  }
	} else {
	}
      }
    } else {						

#line 973 "f2lopt.ctr"
    }
  } else {						

#line 975 "f2lopt.ctr"
    job->exval = FIG2LAT_EXIT_ERROR_SYSTEM; 

#line 976 "f2lopt.ctr"
  } 

#line 977 "f2lopt.ctr"
  return back;
}


