#define B2BO_C	1
#include "bmepsi.h"

#line 3 "b2bo.ctr"


static char str_epsoutput[] = { "EPSOUTPUT" };

static char *str_output_types[] = { "ps", "pdf", "bb", NULL };

static char *str_pdf_levels[] = { "1.2", "1.3", "1.4", NULL };
static char commasep[] = { ", \t\r\n" };

static char colonsep[] = { ": \t\r\n" };

static char dotsep[] = { ". \t\r\n" };

static char cfgfilename[] = { "bmeps.conf" };

static char *str_encodings[] = {
  "a$scii85",
  "r$un-length",
  "l$zw",		/* reserved for future use */
  "f$late",
  "d$ct",
  NULL
};

static char *str_fit_methods[] = {
  "w$idth", "h$eight", "p$age",
  NULL
};

static MSENTRY media_sizes[] = {
  { "A3",        {0.0, 0.0, 842.0, 1190.0, 0.0, 0.0, 842.0, 1190.0 } },
  { "A4",        {0.0, 0.0, 595.0, 842.0, 0.0, 0.0, 595.0, 842.0 } },
  { "A5",        {0.0, 0.0, 420.0, 595.0, 0.0, 0.0, 420.0, 595.0 } },
  { "B4",        {0.0, 0.0, 729.0, 1032.0, 0.0, 0.0, 729.0, 1032.0 } },
  { "B5",        {0.0, 0.0, 516.0, 729.0, 0.0, 0.0, 516.0, 729.0 } },
  { "Letter",    {0.0, 0.0, 612.0, 792.0, 0.0, 0.0, 612.0, 792.0 } },
  { "Legal",     {0.0, 0.0, 612.0, 1008.0, 0.0, 0.0, 612.0, 1008.0 } },
  { "Tabloid",   {0.0, 0.0, 792.0, 1224.0, 0.0, 0.0, 792.0, 1224.0 } },
  { "Ledger",    {0.0, 0.0, 1224.0, 792.0, 0.0, 0.0, 1224.0, 792.0 } },
  { "Statement", {0.0, 0.0, 396.0, 612.0, 0.0, 0.0, 396.0, 612.0 } },
  { "Executive", {0.0, 0.0, 540.0, 720.0, 0.0, 0.0, 540.0, 720.0 } },
  { "Folio",     {0.0, 0.0, 612.0, 936.0, 0.0, 0.0, 612.0, 936.0 } },
  { "Quarto",    {0.0, 0.0, 610.0, 780.0, 0.0, 0.0, 610.0, 780.0 } },
  { "10x14",     {0.0, 0.0, 720.0, 1008.0, 0.0, 0.0, 720.0, 1008.0 } },
  { NULL,        {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } }
};

static char *pk[] = {
  "/language",
  NULL
};

static char *cmd00[] = { "o$utput", "t$ype", NULL };
static char *cmd01[] = { "l$evel", NULL };
static char *cmd02[] = { "e$ncoding", NULL };
static char *cmd03[] = { "b$ackground", NULL };
static char *cmd04[] = { "i$mage", "m$ask", "t$rigger", "l$evel", NULL };
static char *cmd05[] = { "m$edia", "s$ize", NULL };
static char *cmd06[] = { "s$eparated", "d$ictionary", NULL };
static char *cmd07[] = { "o$perator", "d$ictionary", NULL };
static char *cmd08[] = { "m$ultiple", "d$ata", "s$ources", NULL };
static char *cmd09[] = { "a$lways", "u$se", "d$efault", "b$ackground", NULL };
static char *cmd10[] = { "m$ix", NULL };
static char *cmd11[] = { "c$reate", "i$mage", "m$ask", NULL };
static char *cmd12[] = { "dsc", "c$omments", NULL };
static char *cmd13[] = { "sh$owpage", NULL };
static char *cmd14[] = { "v$mreclaim", NULL };
static char *cmd15[] = { "u$se", "r$esolution", "c$hunk", NULL };
static char *cmd16[] = { "t$ransfer", "a$lpha", "c$hannel", NULL };
static char *cmd17[] = { "p$aper", "s$ize", NULL };
static char *cmd18[] = { "d$raft", NULL };
static char *cmd19[] = { "i$nterpolate", NULL };
static char *cmd20[] = { "c$olor", NULL };
static char *cmd21[] = { "j$fif", "s$of", "s$et", NULL };
static char *cmd22[] = { "j$peg", "i$nterpolate", NULL };
static char *cmd23[] = { "p$df", "f$it", NULL };

static char **cmd[] = {
  cmd00, cmd01, cmd02, cmd03, cmd04, cmd05, cmd06, cmd07, cmd08, cmd09,
  cmd10, cmd11, cmd12, cmd13, cmd14, cmd15, cmd16, cmd17, cmd18, cmd19,
  cmd20, cmd21, cmd22, cmd23,
  NULL

};

static char *ft_suffixes[]= {
  "pdf", "eps", "ps", "bb",
  NULL
};


static BO bo_ps1 = {
  BMEPS_OUTPUT_TYPE_EPS,
  BMEPS_PS_LEVEL_1,
  0,
  0,
  (
    BMEPS_OPT_ALPHA_MIX
  ),
  0UL,
  1.0, 1.0, 1.0, 0.000001,
  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }
};

static BO bo_bb = {
  BMEPS_OUTPUT_TYPE_BB,
  BMEPS_PS_LEVEL_1,
  0,
  0,
  0UL,
  0UL,
  1.0, 1.0, 1.0, 0.000001,
  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }
};


static BO bo_ps2 = {
  BMEPS_OUTPUT_TYPE_EPS,
  BMEPS_PS_LEVEL_2,
  (
    BMEPS_ENCODING_ASCII85
    |BMEPS_ENCODING_RUNLENGTH
    |BMEPS_ENCODING_DCT
  ),
  (DKBIF_JFIF_SOF0 | DKBIF_JFIF_SOF1),
  (
    BMEPS_OPT_ALPHA_MIX
    |BMEPS_OPT_OPERATOR_DICTIONARY
    |BMEPS_OPT_COLOR_OUTPUT
    |BMEPS_OPT_DICTIONARY
    |BMEPS_OPT_INTERPOLATE
    |BMEPS_OPT_SEPARATED_DATA
  ),
  0UL,
  1.0, 1.0, 1.0, 0.000001,
  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }
};

static BO bo_ps3 = {
  BMEPS_OUTPUT_TYPE_EPS,
  BMEPS_PS_LEVEL_3,
  (
    BMEPS_ENCODING_ASCII85
    |BMEPS_ENCODING_DCT
    |BMEPS_ENCODING_FLATE
  ),
  (DKBIF_JFIF_SOF0 | DKBIF_JFIF_SOF1),
  (
    BMEPS_OPT_ALPHA_MIX
    |BMEPS_OPT_OPERATOR_DICTIONARY
    |BMEPS_OPT_COLOR_OUTPUT
    |BMEPS_OPT_DICTIONARY
    |BMEPS_OPT_INTERPOLATE
  ),
  0UL,
  1.0, 1.0, 1.0, 0.000001,
  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }
};

static BO bo_eps1 = {
  BMEPS_OUTPUT_TYPE_EPS,
  BMEPS_PS_LEVEL_1,
  0,
  0,
  (
    BMEPS_OPT_ALPHA_MIX
  ),
  0UL,
  1.0, 1.0, 1.0, 0.000001,
  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }
};



static BO bo_eps2 = {
  BMEPS_OUTPUT_TYPE_EPS,
  BMEPS_PS_LEVEL_2,
  (
    BMEPS_ENCODING_ASCII85
    |BMEPS_ENCODING_DCT
    |BMEPS_ENCODING_RUNLENGTH
  ),
  (DKBIF_JFIF_SOF0 | DKBIF_JFIF_SOF1),
  (
    BMEPS_OPT_ALPHA_MIX
    |BMEPS_OPT_OPERATOR_DICTIONARY
    |BMEPS_OPT_COLOR_OUTPUT
    |BMEPS_OPT_DICTIONARY
    |BMEPS_OPT_INTERPOLATE
    |BMEPS_OPT_DSC
    |BMEPS_OPT_SEPARATED_DATA
  ),
  0UL,
  1.0, 1.0, 1.0, 0.000001,
  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }
};

static BO bo_eps3 = {
  BMEPS_OUTPUT_TYPE_EPS,
  BMEPS_PS_LEVEL_3,
  (
    BMEPS_ENCODING_ASCII85
    |BMEPS_ENCODING_DCT
    |BMEPS_ENCODING_FLATE
  ),
  (DKBIF_JFIF_SOF0 | DKBIF_JFIF_SOF1),
  (
    BMEPS_OPT_ALPHA_MIX
    |BMEPS_OPT_OPERATOR_DICTIONARY
    |BMEPS_OPT_COLOR_OUTPUT
    |BMEPS_OPT_DICTIONARY
    |BMEPS_OPT_INTERPOLATE
    |BMEPS_OPT_DSC
  ),
  0UL,
  1.0, 1.0, 1.0, 0.000001,
  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }
};

static BO bo_pdf12 = {
  BMEPS_OUTPUT_TYPE_PDF,
  BMEPS_PDF_LEVEL_12,
  (
    BMEPS_ENCODING_ASCII85
    |BMEPS_ENCODING_DCT
    |BMEPS_ENCODING_FLATE
  ),
  (DKBIF_JFIF_SOF0 | DKBIF_JFIF_SOF1),
  (
    BMEPS_OPT_ALPHA_MIX
    |BMEPS_OPT_OPERATOR_DICTIONARY
    |BMEPS_OPT_COLOR_OUTPUT
    |BMEPS_OPT_DICTIONARY
    |BMEPS_OPT_INTERPOLATE
  ),
  0UL,
  1.0, 1.0, 1.0, 0.000001,
  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }
};

static BO bo_pdf13 = {
  BMEPS_OUTPUT_TYPE_PDF,
  BMEPS_PDF_LEVEL_13,
  (
    BMEPS_ENCODING_ASCII85
    |BMEPS_ENCODING_DCT
    |BMEPS_ENCODING_FLATE
  ),
  (DKBIF_JFIF_SOF0 | DKBIF_JFIF_SOF1),
  (
    BMEPS_OPT_ALPHA_MIX
    |BMEPS_OPT_OPERATOR_DICTIONARY
    |BMEPS_OPT_COLOR_OUTPUT
    |BMEPS_OPT_DICTIONARY
    |BMEPS_OPT_INTERPOLATE
  ),
  0UL,
  1.0, 1.0, 1.0, 0.000001,
  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }
};

static BO bo_pdf14 = {
  BMEPS_OUTPUT_TYPE_PDF,
  BMEPS_PDF_LEVEL_14,
  (
    BMEPS_ENCODING_ASCII85
    |BMEPS_ENCODING_DCT
    |BMEPS_ENCODING_FLATE
  ),
  (DKBIF_JFIF_SOF0 | DKBIF_JFIF_SOF1),
  (
    BMEPS_OPT_TRANSFER_ALPHA
    |BMEPS_OPT_OPERATOR_DICTIONARY
    |BMEPS_OPT_COLOR_OUTPUT
    |BMEPS_OPT_DICTIONARY
    |BMEPS_OPT_INTERPOLATE
  ),
  0UL,
  1.0, 1.0, 1.0, 0.000001,
  { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }
};

static BO bo_faxps2 = {
  BMEPS_OUTPUT_TYPE_EPS,
  BMEPS_PS_LEVEL_2,
  (
    BMEPS_ENCODING_ASCII85
    |BMEPS_ENCODING_DCT
    |BMEPS_ENCODING_RUNLENGTH
  ),
  (DKBIF_JFIF_SOF0 | DKBIF_JFIF_SOF1),
  (
    BMEPS_OPT_ALPHA_MIX
    |BMEPS_OPT_OPERATOR_DICTIONARY
    |BMEPS_OPT_COLOR_OUTPUT
    |BMEPS_OPT_DICTIONARY
    |BMEPS_OPT_INTERPOLATE
    |BMEPS_OPT_PAPER_SIZE
    |BMEPS_OPT_SHOWPAGE
    |BMEPS_OPT_DSC
    |BMEPS_OPT_SEPARATED_DATA
  ),
  0UL,
  1.0, 1.0, 1.0, 0.000001,
  { 0.0, 0.0, 595.0, 842.0, 0.0, 0.0, 595.0, 842.0 }
};

static BO bo_faxpdf = {
  BMEPS_OUTPUT_TYPE_PDF,
  BMEPS_PDF_LEVEL_14,
  (
    BMEPS_ENCODING_ASCII85
    |BMEPS_ENCODING_RUNLENGTH
    |BMEPS_ENCODING_DCT
    |BMEPS_ENCODING_FLATE
  ),
  (DKBIF_JFIF_SOF0 | DKBIF_JFIF_SOF1),
  (
    BMEPS_OPT_TRANSFER_ALPHA
    |BMEPS_OPT_OPERATOR_DICTIONARY
    |BMEPS_OPT_DICTIONARY
    |BMEPS_OPT_INTERPOLATE
    |BMEPS_OPT_PAPER_SIZE
  ),
  BMEPS_PDFOPT_FIT_WIDTH,
  1.0, 1.0, 1.0, 0.000001,
  { 0.0, 0.0, 595.0, 842.0, 0.0, 0.0, 595.0, 842.0 }
};

static BOENTRY boentry[] = {
  { "ps1",	&bo_ps1 },
  { "ps2",	&bo_ps2 },
  { "ps3",	&bo_ps3 },
  { "ps",	&bo_ps2 },
  { "eps1",	&bo_eps1 },
  { "eps2",	&bo_eps2 },
  { "eps3",	&bo_eps3 },
  { "eps",	&bo_eps2 },
  { "faxps",	&bo_faxps2 },
  { "pdf12",	&bo_pdf12 },
  { "pdf13",	&bo_pdf13 },
  { "pdf14",	&bo_pdf14 },
  { "pdf",	&bo_pdf14 },
  { "faxpdf",	&bo_faxpdf },
  { "bb",	&bo_bb },
  { NULL, NULL }
};



static
BO *
search_default_configuration DK_P1(char *,n)
{
  BO *back = NULL;
  BOENTRY *runner;
  runner = boentry;
  while((runner->n) && (back == NULL)) {
    if(dkstr_casecmp(runner->n, n) == 0) {
      back = runner->bo;
    } 
    runner++;
  }
  return back;
}



static
int
boe_compare DK_P3(void *,l, void *,r, int,cr)
{
  int back = 0;
  BOENTRY *pl, *pr;
  pl = (BOENTRY *)l; pr = (BOENTRY *)r;
  if(l) {
    if(r) {
      switch(cr) {
        case 1: {
	  if(pl->n) {
	    back = dkstr_casecmp(pl->n, (char *)r);
	  } else {
	    back = -1;
	  }
	} break;
	default: {
	  if(pl->n) {
	    if(pr->n) {
	      back = dkstr_casecmp(pl->n, pr->n);
	    } else {
	      back = 1;
	    }
	  } else {
	    if(pr->n) {
	      back = -1;
	    }
	  }
	} break;
      }
    } else {
      back = 1;
    }
  } else {
    if(r) {
      back = -1;
    }
  }
  return back;
}



static
void
boe_delete DK_P1(BOENTRY *,boe)
{
  if(boe) {
    if(boe->n) {
      char *x; x = boe->n; dk_delete(x);
    }
    if(boe->bo) {
      BO *bo; bo = boe->bo; dk_delete(bo);
    }
    boe->n = NULL; boe->bo = NULL;
    dk_delete(boe);
  }
}



static
BOENTRY *
boe_new DK_P1(char *,n)
{
  BOENTRY *back = NULL;
  back = dk_new(BOENTRY,1);
  if(back) {
    back->n = dkstr_dup(n);
    back->bo = dk_new(BO,1);
    if(!((back->n) && (back->bo))) {
      boe_delete(back); back = NULL;
    }
  }
  return back;
}



static
unsigned long
change_opt_set DK_P5(\
  unsigned long,ov, unsigned long, fl,\
  char *,s, int,d, int *,b\
)
{
  unsigned long back;
  int value;
  back = ov; value = d;
  if(s) {
  if(dkstr_is_bool(s)) {
    if(dkstr_is_on(s)) {
      value = 1;
    } else {
      value = 0;
    }
  }
  }
  if(value) {
    back = ov | fl;
  } else {
    back &= (~(fl));
  }
  return back;
}



static
void
set_media_size DK_P4(BJ *,bj, BO *,bo, char *,l, int *,back)
{
  char *p1 = NULL, *p2 = NULL, *p3 = NULL, *p4 = NULL;
  char *p5 = NULL, *p6 = NULL, *p7 = NULL, *p8 = NULL;
  double px0 = 0.0, py0 = 0.0, px1 = 0.0, py1 = 0.0;
  double bx0 = 0.0, by0 = 0.0, bx1 = 0.0, by1 = 0.0;
  MSENTRY *mptr = NULL;
  
  p1 = dkstr_start(l, colonsep);
  if(p1) {
    p2 = dkstr_next(p1, colonsep);
    if(p2) {
      p3 = dkstr_next(p2, colonsep);
      if(p3) {
        p4 = dkstr_next(p3, colonsep);
	if(p4) {
	  p5 = dkstr_next(p4, colonsep);
	  if(p5) {
	    p6 = dkstr_next(p5, colonsep);
	    if(p6) {
	      p7 = dkstr_next(p6, colonsep);
	      if(p7) {
	        p8 = dkstr_next(p7, colonsep);
		if(p8) {
		  
	          if(sscanf(p1, "%lf", &px0) == 1) {
	          if(sscanf(p1, "%lf", &py0) == 1) {
	          if(sscanf(p1, "%lf", &px1) == 1) {
	          if(sscanf(p1, "%lf", &py1) == 1) {
	          if(sscanf(p1, "%lf", &bx0) == 1) {
	          if(sscanf(p1, "%lf", &by0) == 1) {
	          if(sscanf(p1, "%lf", &bx1) == 1) {
	          if(sscanf(p1, "%lf", &by1) == 1) {
	            (bo->ms).px0 = px0;
	            (bo->ms).py0 = py0;
	            (bo->ms).px1 = px1;
	            (bo->ms).py1 = py1;
	            (bo->ms).bx0 = bx0;
	            (bo->ms).by0 = by0;
	            (bo->ms).bx1 = bx1;
	            (bo->ms).by1 = by1;
	            bo->opt |= BMEPS_OPT_PAPER_SIZE;
	            *back = 1;
		    
		  }
		  }
		  }
		  }
		  }
		  }
		  }
		  }
		} else {
		}
	      } else {
	      }
	    }
	  } else {
	    
	    if(sscanf(p1, "%lf", &px0) == 1) {
	    if(sscanf(p1, "%lf", &py0) == 1) {
	    if(sscanf(p1, "%lf", &px1) == 1) {
	    if(sscanf(p1, "%lf", &py1) == 1) {
	      (bo->ms).px0 = px0;
	      (bo->ms).py0 = py0;
	      (bo->ms).px1 = px1;
	      (bo->ms).py1 = py1;
	      (bo->ms).bx0 = px0;
	      (bo->ms).by0 = py0;
	      (bo->ms).bx1 = px1;
	      (bo->ms).by1 = py1;
	      bo->opt |= BMEPS_OPT_PAPER_SIZE;
	      *back = 1;
	      
	    }
	    }
	    }
	    }
	  }
	} else {
	}
      } else {
      }
    } else {
      int cc;
      
      mptr = media_sizes; cc = 1;
      while((mptr->name) && (cc)) {
        if(dkstr_casecmp(mptr->name, p1) == 0) {
	  cc = 0;
	  bo->opt |= BMEPS_OPT_PAPER_SIZE;
	  dkmem_cpy(&(bo->ms), &(mptr->ms), sizeof(MEDIASIZE));
	  *back = 1;
	  
	}
        mptr++;
      }
    }
  }
  
}



static char str_asterisk[] = { "*" };
static char str_all[] = { "all" };

static
dk_bif_sof_t
retrieve_jfif_sof_set DK_P1(char *,line)
{
  int i;
  char *p, *n;
  dk_bif_sof_t back = 0;
  if(line) {
    p = dkstr_start(line, colonsep);
    while(p) {
      n = dkstr_next(p, colonsep);
      if(sscanf(p, "%d", &i) == 1) {
        switch(i) {
	  case 0: { back = dkbif_jfif_set_sof(back, DKBIF_I_SOF0); } break;
	  case 1: { back = dkbif_jfif_set_sof(back, DKBIF_I_SOF1); } break;
	  case 2: { back = dkbif_jfif_set_sof(back, DKBIF_I_SOF2); } break;
	  case 3: { back = dkbif_jfif_set_sof(back, DKBIF_I_SOF3); } break;
	  case 5: { back = dkbif_jfif_set_sof(back, DKBIF_I_SOF5); } break;
	  case 6: { back = dkbif_jfif_set_sof(back, DKBIF_I_SOF6); } break;
	  case 7: { back = dkbif_jfif_set_sof(back, DKBIF_I_SOF7); } break;
	  case 8: { back = dkbif_jfif_set_sof(back, DKBIF_I_SOF8); } break;
	  case 9: { back = dkbif_jfif_set_sof(back, DKBIF_I_SOF9); } break;
	  case 10: { back = dkbif_jfif_set_sof(back, DKBIF_I_SOF10); } break;
	  case 11: { back = dkbif_jfif_set_sof(back, DKBIF_I_SOF11); } break;
	  case 13: { back = dkbif_jfif_set_sof(back, DKBIF_I_SOF13); } break;
	  case 14: { back = dkbif_jfif_set_sof(back, DKBIF_I_SOF14); } break;
	  case 15: { back = dkbif_jfif_set_sof(back, DKBIF_I_SOF15); } break;
	}
      } else {
        if(strcmp(p, str_asterisk) == 0) {
	  back = 0xFFFF;
	} else {
	  if(strcmp(p, str_all) == 0) {
	    back = 0xFFFF;
	  }
	}
      }
      p = n;
    }
  }
  return back;
}


int
bmeps_bo_add_line DK_P3(BJ *,bj, BO *,bo, char *,l)
{
  int back = 0;
  char *p1, *p2, *p3, *p4, *parts[16];
  size_t nparts;
  int is_removing = 0; int fl, act;
  double r, g, b;
  
  p1 = l;
  p2 = dkstr_chr(p1, '=');
  if(p2) {
    *(p2++) = '\0';
    dkstr_chomp(p1, NULL);
    p2 = dkstr_start(p2, NULL);
    if(p2) {
      dkstr_chomp(p2, NULL);
#if VERSION_BEFORE_2006_10_18
      nparts = dkstr_explode(parts, 15, p1, colonsep);
#else
      nparts = dkstr_explode(parts, 15, p1, dotsep);
#endif
      if(nparts > 0) {
        act = dkstr_find_multi_part_abbr(parts, cmd, '$', 0);
	
	switch(act) {
	  case 0: {	/* output type */
	    if(p2) {
	      switch(dkstr_array_index(str_output_types, p2, 0)) {
	        case 0: {
		  bo->ot = BMEPS_OUTPUT_TYPE_EPS; back = 1;
		} break;
		case 1: {
		  bo->ot = BMEPS_OUTPUT_TYPE_PDF; back = 1;
		} break;
		case 2: {
		  bo->ot = BMEPS_OUTPUT_TYPE_BB;  back = 1;
		} break;
		default: {
	          bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 73, 74, p2);
	          bj->exval = 1;
		} break;
	      }
	    }
	  } break;
	  case 1: {	/* ps level */
	    switch(bo->ot) {
	      case BMEPS_OUTPUT_TYPE_PDF: {
	        if(p2) {
	          switch(dkstr_array_index(str_pdf_levels, p2, 0)) {
		    case 0: { bo->l = BMEPS_PDF_LEVEL_12; back = 1; } break;
		    case 1: { bo->l = BMEPS_PDF_LEVEL_13; back = 1; } break;
		    case 2: { bo->l = BMEPS_PDF_LEVEL_14; back = 1; } break;
		    default: {
		     bo->l = BMEPS_PDF_LEVEL_14; 
	             bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 73, 74, p2);
		    } break;
		  }
		}
	      } break;
	      default: {
	        int i;
		if(p2) {
		  if(sscanf(p2, "%d", &i) == 1) {
		    if(i < 1) i = 1; if(i > 3) i = 3;
		    switch(i) {
		      case 1: { bo->l = BMEPS_PS_LEVEL_1; back = 1; } break;
		      case 2: { bo->l = BMEPS_PS_LEVEL_2; back = 1; } break;
		      case 3: { bo->l = BMEPS_PS_LEVEL_3; back = 1; } break;
		    }
		  } else {
		    bo->l = BMEPS_PS_LEVEL_2;
	            bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 73, 74, p2);
		  }
		}
	      } break;
	    }
	  } break;
	  case 2: {	/* encoding */
	    if(p2) {
	      is_removing = 0;
	      if(*p2 == '-') {
	        is_removing = 1;
		p2++;
	      } else {
	        if(*p2 == '+') {
		  p2++;
		} else {
		  bo->enc = 0;
		}
	      }
	      while(p2) {
	        p3 = dkstr_next(p2, colonsep);
		fl = 0;
		switch(dkstr_array_abbr(str_encodings, p2, '$', 0)) {
		  case 0: { fl = BMEPS_ENCODING_ASCII85; back = 1; } break;
		  case 1: { fl = BMEPS_ENCODING_RUNLENGTH; back = 1; } break;
		  case 2: {
		      bmeps_tool_msg_1(bj, DK_LOG_LEVEL_WARNING, 78);
		  } break;
		  case 3: { fl = BMEPS_ENCODING_FLATE; back = 1; } break;
		  case 4: { fl = BMEPS_ENCODING_DCT; back = 1; } break;
		}
		if(is_removing) {
		  bo->enc &= (~(fl));
		} else {
		  bo->enc |= fl;
		}
		p2 = p3;
	      }
	    }
	  } break;
	  case 3: {	/* background */
	    r = g = b = 0;
	    if(p2) {
	      p3 = dkstr_next(p2, colonsep);
	      if(p3) {
	        p4 = dkstr_next(p3, colonsep);
		if(p4) {
		  if(sscanf(p2, "%lf", &r) == 1) {
		  if(sscanf(p3, "%lf", &g) == 1) {
		  if(sscanf(p4, "%lf", &b) == 1) {
		    bo->dbgr = r;
		    bo->dbgg = g;
		    bo->dbgb = b;
		    back = 1;
		    
		  }
		  }
		  }
		}
	      }
	    }
	  } break;
	  case 4: {	/* image mask trigger level */
	    if(p2) {
	      if(sscanf(p2, "%lf", &r) == 1) {
	        bo->mtl = r; back = 1;
	      }
	    }
	  } break;
	  case 5: {	/* media size */
	    set_media_size(bj, bo, p2, &back);
	  } break;
	  case 6: {	/* separated dictionary */
	    bo->opt = change_opt_set(
	      bo->opt, BMEPS_OPT_DICTIONARY, p2, 1, &back
	    );
	  } break;
	  case 7: {	/* operator dictionary */
	    bo->opt = change_opt_set(
	      bo->opt, BMEPS_OPT_OPERATOR_DICTIONARY, p2, 1, &back
	    );
	  } break;
	  case 8: {	/* separated color streams */
	    bo->opt = change_opt_set(
	      bo->opt, BMEPS_OPT_SEPARATED_DATA, p2, 1, &back
	    );
	  } break;
	  case 9: {	/* always use default background */
	    bo->opt = change_opt_set(
	      bo->opt, BMEPS_OPT_PREFER_SPEC_BG, p2, 1, &back
	    );
	  } break;
	  case 10: {	/* mix */
	    bo->opt = change_opt_set(
	      bo->opt, BMEPS_OPT_ALPHA_MIX, p2, 1, &back
	    );
	  } break;
	  case 11: {	/* create image mask */
	    bo->opt = change_opt_set(
	      bo->opt, BMEPS_OPT_IMAGE_MASK, p2, 1, &back
	    );
	  } break;
	  case 12: {	/* dsc */
	    bo->opt = change_opt_set(
	      bo->opt, BMEPS_OPT_DSC, p2, 1, &back
	    );
	  } break;
	  case 13: {	/* showpage */
	    bo->opt = change_opt_set(
	      bo->opt, BMEPS_OPT_SHOWPAGE, p2, 1, &back
	    );
	  } break;
	  case 14: {	/* vmreclaim */
	    bo->opt = change_opt_set(
	      bo->opt, BMEPS_OPT_VMRECLAIM, p2, 1, &back
	    );
	  } break;
	  case 15: {	/* use resolution chunk */
	    
	    bo->opt = change_opt_set(
	      bo->opt, BMEPS_OPT_RESOLUTION, p2, 1, &back
	    );
	  } break;
	  case 16: {	/* transfer alpha channel */
	    bo->opt = change_opt_set(
	      bo->opt, BMEPS_OPT_TRANSFER_ALPHA, p2, 1, &back
	    );
	  } break;
	  case 17: {	/* paper size */
	    /* bo->opt = change_opt_set(bo->opt, BMEPS_OPT_DICTIONARY, p2, 1); */
	    set_media_size(bj, bo, p2, &back);
	  } break;
	  case 18: {	/* draft */
	    bo->opt = change_opt_set(
	      bo->opt, BMEPS_OPT_DRAFT, p2, 1, &back
	    );
	  } break;
	  case 19: {	/* interpolate */
	    bo->opt = change_opt_set(
	      bo->opt, BMEPS_OPT_INTERPOLATE, p2, 1, &back
	    );
	  } break;
	  case 20: {	/* color */
	    bo->opt = change_opt_set(
	      bo->opt, BMEPS_OPT_COLOR_OUTPUT, p2, 1, &back
	    );
	  } break;
	  case 21: {	/* jfif sof set */
	    bo->jfif_s = retrieve_jfif_sof_set(p2);
	  } break;
	  case 22: {
	    bo->opt = change_opt_set(
	      bo->opt, BMEPS_OPT_JPEG_INTERPOLATE, p2, 1, &back
	    );
	  } break;
	  case 23: {
	    if(p2) {
	      switch(dkstr_array_abbr(str_fit_methods, p2, '$', 0)) {
	        case 0: {
		  bo->pdfopt =
		  ((bo->pdfopt & (~(BMEPS_PDFOPT_FIT_MASK)))
		  | BMEPS_PDFOPT_FIT_WIDTH);
		} break;
		case 1: {
		  bo->pdfopt =
		  ((bo->pdfopt & (~(BMEPS_PDFOPT_FIT_MASK)))
		  | BMEPS_PDFOPT_FIT_HEIGHT);
		} break;
		case 2: {
		  bo->pdfopt =
		  ((bo->pdfopt & (~(BMEPS_PDFOPT_FIT_MASK)))
		  | BMEPS_PDFOPT_FIT_PAGE);
		} break;
	      }
	    }
	  } break;
	}
      } else {
        /* ERROR: Syntax (empty line) */
      }
    } else {
      bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 73, 74, p1);
    }
  } else {
    bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 73, 74, p1);
  } 
  return back;
}



static
int
read_configuration DK_P5(BJ *,bj, dk_app_t *,a, char *,n, dk_storage_t *,s, dk_storage_iterator_t *,si)
{
  dk_stream_t	*ipf = NULL;	/* input file */
  char inputline[256], *p1 = NULL, *p2 = NULL;
  int back = 0;
  BOENTRY *cboe = NULL, *baseboe = NULL;
  BO *cbo = NULL, *basebo = NULL;
  int cc = 0;
  
  ipf = dkapp_read_cfg(a, cfgfilename);
  if(ipf) {
    back = 1;
    cc = 1;
    while(cc) {
      if(dkstream_gets(ipf, inputline, sizeof(inputline))) {
        dkstr_delcomm(inputline, '#');
	p1 = dkstr_start(inputline, NULL);
	if(p1) {
	  dkstr_chomp(p1, NULL);
	  if(*p1 == '[') {			
	    cboe = NULL; cbo = NULL;
	    p1++;
	    p1 = dkstr_start(p1, NULL);
	    if(p1) {
	      p2 = dkstr_chr(p1, ']');
	      if(p2) {
	        *p2 = '\0';
		p2 = dkstr_chr(p1, ':');
		if(p2) {
		  *(p2++) = '\0';
		  dkstr_chomp(p2, NULL);
		}
		dkstr_chomp(p1, NULL);
		cboe = boe_new(p1);
		if(cboe) {
		  if(dksto_add(s, (void *)cboe)) {
		    cbo = cboe->bo;
		    dkmem_cpy(cbo, &bo_ps2, sizeof(BO));
		    if(p2) {
		      basebo = search_default_configuration(p2);
		      if(!basebo) {
		        baseboe = dksto_it_find_like(si, (void *)p2, 1);
			if(baseboe) {
			  basebo = baseboe->bo;
			}
		      }
		      if(basebo) {
			dkmem_cpy(cbo, basebo, sizeof(BO));
		      } else {
	                bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 75, 76, p2);
	                bj->exval = 1;
		      }
		    }
		  } else {
		    bmeps_tool_error_memory(bj); bj->exval = 1;
		    boe_delete(cboe);
		    cboe = NULL; cbo = NULL;
		  }
		} else {
		  bmeps_tool_error_memory(bj); bj->exval = 1;
		}
	      } else {
	        bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 73, 74, p1);
	      }
	    } else {
	      bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 73, 74, inputline);
	    }
	  } else {				
	    if(cbo) {
	      if(!bmeps_bo_add_line(bj, cbo, p1)) {	
	        back = 0;
	      }
	    }
	  }
	}
      } else {
        cc = 0;
      }
    }
    dkstream_close(ipf); ipf = NULL;
  } 
  return back;
}



static
void
search_config_file DK_P4(BJ *,bj, dk_app_t *,a, char *,n, BO *,bo)
{
  dk_storage_t	*conf;
  dk_storage_iterator_t	*confi;
  BOENTRY *boe;
  
  if((a) && (n)) {
    conf = dksto_open(0);
    if(conf) {
      dksto_set_comp(conf, boe_compare, 0);
      confi = dksto_it_open(conf);
      if(confi) {
        if(read_configuration(bj, a,n,conf,confi)) {
	  boe = dksto_it_find_like(confi, n, 1);
	  if(boe) {
	    if(boe->bo) {
	      dkmem_cpy(bo, boe->bo, sizeof(BO));
	    } else {
	      bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 75, 76, n);
	      bj->exval = 1;
	    }
	  }
	  dksto_it_reset(confi);
	  while((boe = (BOENTRY *)dksto_it_next(confi)) != NULL) {
	    
	    boe_delete(boe);
	  }
	}
        dksto_it_close(confi); confi = NULL;
      } else {
	bmeps_tool_error_memory(bj); bj->exval = 1;
      }
      dksto_close(conf); conf = NULL;
    } else {
      bmeps_tool_error_memory(bj); bj->exval = 1;
    }
  }
  
}



int
bmeps_bo_get_pref_lang DK_P3(BJ *,bj, char *,namebuffer,size_t,sz)
{
  int back = 0;
  back = dkapp_get_pref(bj->a, pk[0], namebuffer, sz, 0);
  return back;
}



void
bmeps_bo_get_configuration DK_P2(BJ *,bj, char *,langdef)
{
  BO bobuffer, *src = NULL;
  char *l = NULL, *myl = NULL, *confname = NULL, *p1, *p2;
  char namebuffer[NAME_BUFFER_SIZE];
  
  l = langdef;
  if(!l) {
    char *ptr; int i;
    if(bj->o1) {
      ptr = dksf_get_file_type_dot(bj->o1);
      if(ptr) {
        ptr++;
        i = dkstr_array_index(ft_suffixes, ptr, 0);
	if(i > -1) {
	  l = ft_suffixes[i];
	} else {
	  bmeps_tool_msg_3(bj, DK_LOG_LEVEL_WARNING, 83, 84, ptr);
	}
      } else {
	bmeps_tool_msg_1(bj, DK_LOG_LEVEL_WARNING, 82);
      }
    } else {
      bmeps_tool_msg_1(bj, DK_LOG_LEVEL_WARNING, 81);
    }
  }
  if(!l) {		
    l = getenv(str_epsoutput);
  }
  if(!l) {		
    if(bj->a) {
      if(dkapp_get_pref(bj->a, pk[0], namebuffer, sizeof(namebuffer), 0)) {
        l = namebuffer;
      }
    }
  }
  if(l) {		
    if(!langdef) {
      /* Configuration ... is used */
      bmeps_tool_msg_3(bj, DK_LOG_LEVEL_INFO, 85, 86, l);
    }
    myl = dkstr_dup(l);
    if(myl) {		
      confname = dkstr_start(myl, NULL);
      if(confname) {	
        p1 = dkstr_next(confname, commasep);
	/* if(p1) { *(p1++) = '\0'; } $? ". p1=\"%s\"", p1 */
	dkmem_cpy(&bobuffer, &bo_ps2, sizeof(BO));
	src = search_default_configuration(confname);
	if(src) {
	  dkmem_cpy(&bobuffer, src, sizeof(BO));
	} else {
	  search_config_file(bj, bj->a, confname, &bobuffer);
	}
	src = &bobuffer;
	if(p1) { 
	  while(p1) {
	    p2 = dkstr_next(p1, commasep);
	    
	    (void)bmeps_bo_add_line(bj, &bobuffer, p1);
	    p1 = p2;
	  }
	}
      } else {
	bmeps_tool_msg_3(bj, DK_LOG_LEVEL_ERROR, 73, 74, myl);
      }
      dk_delete(myl);
    } else {
      bmeps_tool_error_memory(bj); bj->exval = 1;
    }
  } else {
    bmeps_tool_msg_1(bj, DK_LOG_LEVEL_INFO, 77);
  }
  if(!src) {
    src = &bo_ps2;
  }
  if(src) {
    dkmem_cpy(bj->bo, src, sizeof(BO));
  }
  bmeps_tool_correct_bo(bj->bo);
  
}

#ifndef LINT
static char sccs_id[] = {
"@(#)b2bo.ctr 1.9 01/04/07\tbmeps2"
};
#endif

