125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * PPD code emission routines for CUPS.
325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copyright 2007-2015 by Apple Inc.
525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copyright 1997-2007 by Easy Software Products, all rights reserved.
625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * These coded instructions, statements, and computer programs are the
825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * property of Apple Inc. and are protected by Federal copyright
925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
1025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * which should have been included with this file.  If this file is
111fa6c247571d74dfd48aeb585c950ff095d115cdPhilip P. Moltmann * missing or damaged, see the license at "http://www.cups.org/".
1225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
1325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * PostScript is a trademark of Adobe Systems, Inc.
1425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
1525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This file is subject to the Apple OS-Developed Software exception.
1625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
1725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
1825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
1925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Include necessary headers...
2025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
2125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
2225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include "cups-private.h"
2325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include "ppd.h"
2425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#if defined(WIN32) || defined(__EMX__)
2525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  include <io.h>
2625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else
2725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  include <unistd.h>
2825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 || __EMX__ */
2925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
3025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
3125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
3225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Local functions...
3325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
3425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
3525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int	ppd_compare_cparams(ppd_cparam_t *a, ppd_cparam_t *b);
3625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void	ppd_handle_media(ppd_file_t *ppd);
3725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
3825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
3925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
4025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Local globals...
4125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
4225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
4325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic const char ppd_custom_code[] =
4425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		"pop pop pop\n"
4525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		"<</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice\n";
4625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
4725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
4825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
4925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'ppdCollect()' - Collect all marked options that reside in the specified
5025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *                  section.
5125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
5225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The choices array should be freed using @code free@ when you are
5325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * finished with it.
5425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
5525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
5625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint					/* O - Number of options marked */
5725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannppdCollect(ppd_file_t    *ppd,		/* I - PPD file data */
5825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann           ppd_section_t section,	/* I - Section to collect */
5925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann           ppd_choice_t  ***choices)	/* O - Pointers to choices */
6025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
6125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (ppdCollect2(ppd, section, 0.0, choices));
6225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
6325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
6425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
6525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
6625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'ppdCollect2()' - Collect all marked options that reside in the
6725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *                   specified section and minimum order.
6825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
6925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The choices array should be freed using @code free@ when you are
7025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * finished with it.
7125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
7225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
7325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
7425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
7525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint					/* O - Number of options marked */
7625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannppdCollect2(ppd_file_t    *ppd,		/* I - PPD file data */
7725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann            ppd_section_t section,	/* I - Section to collect */
7825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    float         min_order,	/* I - Minimum OrderDependency value */
7925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann            ppd_choice_t  ***choices)	/* O - Pointers to choices */
8025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
8125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ppd_choice_t	*c;			/* Current choice */
8225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ppd_section_t	csection;		/* Current section */
8325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  float		corder;			/* Current OrderDependency value */
8425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int		count;			/* Number of choices collected */
8525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ppd_choice_t	**collect;		/* Collected choices */
8625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  float		*orders;		/* Collected order values */
8725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
8825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
8925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  DEBUG_printf(("ppdCollect2(ppd=%p, section=%d, min_order=%f, choices=%p)",
9025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                ppd, section, min_order, choices));
9125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
9225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!ppd || !choices)
9325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
9425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (choices)
9525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      *choices = NULL;
9625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
9725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
9825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
9925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
10025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
10125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Allocate memory for up to N selected choices...
10225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
10325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
10425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  count = 0;
10525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if ((collect = calloc(sizeof(ppd_choice_t *),
10625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                        (size_t)cupsArrayCount(ppd->marked))) == NULL)
10725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
10825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    *choices = NULL;
10925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
11025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
11125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
11225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if ((orders = calloc(sizeof(float), (size_t)cupsArrayCount(ppd->marked))) == NULL)
11325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
11425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    *choices = NULL;
11525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    free(collect);
11625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
11725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
11825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
11925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
12025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Loop through all options and add choices as needed...
12125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
12225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
12325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  for (c = (ppd_choice_t *)cupsArrayFirst(ppd->marked);
12425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       c;
12525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       c = (ppd_choice_t *)cupsArrayNext(ppd->marked))
12625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
12725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    csection = c->option->section;
12825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    corder   = c->option->order;
12925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
13025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (!strcmp(c->choice, "Custom"))
13125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
13225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      ppd_attr_t	*attr;		/* NonUIOrderDependency value */
13325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      float		aorder;		/* Order value */
13425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      char		asection[17],	/* Section name */
13525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			amain[PPD_MAX_NAME + 1],
13625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			aoption[PPD_MAX_NAME];
13725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann					/* *CustomFoo and True */
13825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
13925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
14025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      for (attr = ppdFindAttr(ppd, "NonUIOrderDependency", NULL);
14125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann           attr;
14225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	   attr = ppdFindNextAttr(ppd, "NonUIOrderDependency", NULL))
14325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        if (attr->value &&
14425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    sscanf(attr->value, "%f%16s%41s%40s", &aorder, asection, amain,
14525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	           aoption) == 4 &&
14625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    !strncmp(amain, "*Custom", 7) &&
14725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    !strcmp(amain + 7, c->option->keyword) && !strcmp(aoption, "True"))
14825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
14925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	 /*
15025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  * Use this NonUIOrderDependency...
15125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  */
15225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
15325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          corder = aorder;
15425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
15525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  if (!strcmp(asection, "DocumentSetup"))
15625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    csection = PPD_ORDER_DOCUMENT;
15725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  else if (!strcmp(asection, "ExitServer"))
15825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    csection = PPD_ORDER_EXIT;
15925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  else if (!strcmp(asection, "JCLSetup"))
16025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    csection = PPD_ORDER_JCL;
16125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  else if (!strcmp(asection, "PageSetup"))
16225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    csection = PPD_ORDER_PAGE;
16325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  else if (!strcmp(asection, "Prolog"))
16425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    csection = PPD_ORDER_PROLOG;
16525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  else
16625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    csection = PPD_ORDER_ANY;
16725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
16825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  break;
16925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
17025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
17125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
17225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (csection == section && corder >= min_order)
17325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
17425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      collect[count] = c;
17525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      orders[count]  = corder;
17625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      count ++;
17725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
17825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
17925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
18025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
18125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * If we have more than 1 marked choice, sort them...
18225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
18325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
18425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (count > 1)
18525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
18625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    int i, j;				/* Looping vars */
18725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
18825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    for (i = 0; i < (count - 1); i ++)
18925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      for (j = i + 1; j < count; j ++)
19025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        if (orders[i] > orders[j])
19125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
19225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  c          = collect[i];
19325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  corder     = orders[i];
19425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  collect[i] = collect[j];
19525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  orders[i]  = orders[j];
19625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  collect[j] = c;
19725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  orders[j]  = corder;
19825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
19925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
20025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
20125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  free(orders);
20225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
20325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  DEBUG_printf(("2ppdCollect2: %d marked choices...", count));
20425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
20525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
20625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Return the array and number of choices; if 0, free the array since
20725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * it isn't needed.
20825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
20925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
21025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (count > 0)
21125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
21225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    *choices = collect;
21325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (count);
21425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
21525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
21625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
21725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    *choices = NULL;
21825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    free(collect);
21925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
22025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
22125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
22225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
22325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
22425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
22525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'ppdEmit()' - Emit code for marked options to a file.
22625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
22725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
22825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint					/* O - 0 on success, -1 on failure */
22925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannppdEmit(ppd_file_t    *ppd,		/* I - PPD file record */
23025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        FILE          *fp,		/* I - File to write to */
23125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        ppd_section_t section)		/* I - Section to write */
23225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
23325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (ppdEmitAfterOrder(ppd, fp, section, 0, 0.0));
23425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
23525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
23625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
23725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
23825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'ppdEmitAfterOrder()' - Emit a subset of the code for marked options to a file.
23925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
24025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * When "limit" is non-zero, this function only emits options whose
24125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * OrderDependency value is greater than or equal to "min_order".
24225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
24325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * When "limit" is zero, this function is identical to ppdEmit().
24425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
24525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
24625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
24725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
24825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint					/* O - 0 on success, -1 on failure */
24925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannppdEmitAfterOrder(
25025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    ppd_file_t    *ppd,			/* I - PPD file record */
25125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    FILE          *fp,			/* I - File to write to */
25225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    ppd_section_t section,		/* I - Section to write */
25325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    int		  limit,		/* I - Non-zero to use min_order */
25425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    float         min_order)		/* I - Lowest OrderDependency */
25525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
25625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  char	*buffer;			/* Option code */
25725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int	status;				/* Return status */
25825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
25925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
26025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
26125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check input...
26225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
26325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
26425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!ppd || !fp)
26525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (-1);
26625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
26725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
26825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Get the string...
26925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
27025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
27125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  buffer = ppdEmitString(ppd, section, limit ? min_order : 0.0f);
27225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
27325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
27425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Write it as needed and return...
27525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
27625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
27725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (buffer)
27825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
27925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    status = fputs(buffer, fp) < 0 ? -1 : 0;
28025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
28125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    free(buffer);
28225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
28325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
28425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    status = 0;
28525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
28625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (status);
28725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
28825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
28925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
29025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
29125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'ppdEmitFd()' - Emit code for marked options to a file.
29225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
29325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
29425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint					/* O - 0 on success, -1 on failure */
29525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannppdEmitFd(ppd_file_t    *ppd,		/* I - PPD file record */
29625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          int           fd,		/* I - File to write to */
29725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          ppd_section_t section)	/* I - Section to write */
29825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
29925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  char		*buffer,		/* Option code */
30025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		*bufptr;		/* Pointer into code */
30125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  size_t	buflength;		/* Length of option code */
30225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ssize_t	bytes;			/* Bytes written */
30325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int		status;			/* Return status */
30425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
30525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
30625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
30725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check input...
30825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
30925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
31025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!ppd || fd < 0)
31125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (-1);
31225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
31325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
31425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Get the string...
31525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
31625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
31725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  buffer = ppdEmitString(ppd, section, 0.0);
31825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
31925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
32025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Write it as needed and return...
32125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
32225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
32325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (buffer)
32425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
32525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    buflength = strlen(buffer);
32625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    bufptr    = buffer;
32725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    bytes     = 0;
32825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
32925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    while (buflength > 0)
33025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
33125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32
33225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if ((bytes = (ssize_t)write(fd, bufptr, (unsigned)buflength)) < 0)
33325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else
33425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if ((bytes = write(fd, bufptr, buflength)) < 0)
33525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */
33625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
33725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        if (errno == EAGAIN || errno == EINTR)
33825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  continue;
33925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
34025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	break;
34125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
34225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
34325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      buflength -= (size_t)bytes;
34425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      bufptr    += bytes;
34525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
34625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
34725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    status = bytes < 0 ? -1 : 0;
34825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
34925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    free(buffer);
35025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
35125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
35225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    status = 0;
35325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
35425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (status);
35525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
35625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
35725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
35825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
35925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'ppdEmitJCL()' - Emit code for JCL options to a file.
36025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
36125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
36225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint					/* O - 0 on success, -1 on failure */
36325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannppdEmitJCL(ppd_file_t *ppd,		/* I - PPD file record */
36425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann           FILE       *fp,		/* I - File to write to */
36525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann           int        job_id,		/* I - Job ID */
36625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	   const char *user,		/* I - Username */
36725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	   const char *title)		/* I - Title */
36825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
36925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  char		*ptr;			/* Pointer into JCL string */
37025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  char		temp[65],		/* Local title string */
37125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		displaymsg[33];		/* Local display string */
37225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
37325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
37425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
37525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check the input...
37625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
37725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
37825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!ppd || !ppd->jcl_begin || !ppd->jcl_ps)
37925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
38025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
38125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
38225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * See if the printer supports HP PJL...
38325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
38425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
38525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!strncmp(ppd->jcl_begin, "\033%-12345X@", 10))
38625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
38725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
38825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * This printer uses HP PJL commands for output; filter the output
38925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * so that we only have a single "@PJL JOB" command in the header...
39025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    *
39125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * To avoid bugs in the PJL implementation of certain vendors' products
39225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * (Xerox in particular), we add a dummy "@PJL" command at the beginning
39325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * of the PJL commands to initialize PJL processing.
39425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
39525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
39625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    ppd_attr_t	*charset;		/* PJL charset */
39725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    ppd_attr_t	*display;		/* PJL display command */
39825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
39925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
40025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if ((charset = ppdFindAttr(ppd, "cupsPJLCharset", NULL)) != NULL)
40125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
40225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (!charset->value || _cups_strcasecmp(charset->value, "UTF-8"))
40325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        charset = NULL;
40425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
40525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
40625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if ((display = ppdFindAttr(ppd, "cupsPJLDisplay", NULL)) != NULL)
40725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
40825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (!display->value)
40925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        display = NULL;
41025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
41125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
41225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    fputs("\033%-12345X@PJL\n", fp);
41325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    for (ptr = ppd->jcl_begin + 9; *ptr;)
41425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (!strncmp(ptr, "@PJL JOB", 8))
41525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
41625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
41725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Skip job command...
41825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
41925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
42025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        for (;*ptr; ptr ++)
42125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  if (*ptr == '\n')
42225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    break;
42325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
42425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	if (*ptr)
42525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  ptr ++;
42625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
42725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else
42825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
42925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
43025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Copy line...
43125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
43225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
43325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        for (;*ptr; ptr ++)
43425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
43525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  putc(*ptr, fp);
43625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  if (*ptr == '\n')
43725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    break;
43825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
43925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
44025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	if (*ptr)
44125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  ptr ++;
44225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
44325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
44425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
44525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Clean up the job title...
44625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
44725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
44825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if ((ptr = strrchr(title, '/')) != NULL)
44925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
45025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
45125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Only show basename of file path...
45225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
45325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
45425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      title = ptr + 1;
45525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
45625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
45725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (!strncmp(title, "smbprn.", 7))
45825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
45925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
46025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Skip leading smbprn.######## from Samba jobs...
46125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
46225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
46325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      for (title += 7; *title && isdigit(*title & 255); title ++);
46425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      while (_cups_isspace(*title))
46525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        title ++;
46625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
46725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if ((ptr = strstr(title, " - ")) != NULL)
46825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
46925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
47025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* Skip application name in "Some Application - Title of job"...
47125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
47225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
47325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	title = ptr + 3;
47425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
47525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
47625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
47725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
47825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Replace double quotes with single quotes and UTF-8 characters with
47925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * question marks so that the title does not cause a PJL syntax error.
48025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
48125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
48225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    strlcpy(temp, title, sizeof(temp));
48325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
48425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    for (ptr = temp; *ptr; ptr ++)
48525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (*ptr == '\"')
48625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        *ptr = '\'';
48725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else if (!charset && (*ptr & 128))
48825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        *ptr = '?';
48925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
49025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
49125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * CUPS STR #3125: Long PJL JOB NAME causes problems with some printers
49225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    *
49325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Generate the display message, truncating at 32 characters + nul to avoid
49425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * issues with some printer's PJL implementations...
49525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
49625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
49725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    snprintf(displaymsg, sizeof(displaymsg), "%d %s %s", job_id, user, temp);
49825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
49925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
50025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Send PJL JOB and PJL RDYMSG commands before we enter PostScript mode...
50125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
50225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
50325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (display && strcmp(display->value, "job"))
50425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      fprintf(fp, "@PJL JOB NAME = \"%s\"\n", temp);
50525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else if (display && !strcmp(display->value, "rdymsg"))
50625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      fprintf(fp, "@PJL RDYMSG DISPLAY = \"%s\"\n", displaymsg);
50725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else
50825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      fprintf(fp, "@PJL JOB NAME = \"%s\" DISPLAY = \"%s\"\n", temp,
50925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      displaymsg);
51025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
51125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
51225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Replace double quotes with single quotes and UTF-8 characters with
51325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * question marks so that the user does not cause a PJL syntax error.
51425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
51525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
51625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    strlcpy(temp, user, sizeof(temp));
51725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
51825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    for (ptr = temp; *ptr; ptr ++)
51925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (*ptr == '\"')
52025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        *ptr = '\'';
52125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else if (!charset && (*ptr & 128))
52225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        *ptr = '?';
52325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
52425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    fprintf(fp, "@PJL SET USERNAME = \"%s\"\n", temp);
52525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
52625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
52725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    fputs(ppd->jcl_begin, fp);
52825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
52925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ppdEmit(ppd, fp, PPD_ORDER_JCL);
53025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fputs(ppd->jcl_ps, fp);
53125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
53225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (0);
53325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
53425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
53525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
53625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
53725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'ppdEmitJCLEnd()' - Emit JCLEnd code to a file.
53825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
53925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
54025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
54125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
54225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint					/* O - 0 on success, -1 on failure */
54325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannppdEmitJCLEnd(ppd_file_t *ppd,		/* I - PPD file record */
54425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann              FILE       *fp)		/* I - File to write to */
54525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
54625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
54725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check the input...
54825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
54925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
55025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!ppd)
55125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
55225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
55325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!ppd->jcl_end)
55425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
55525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (ppd->num_filters == 0)
55625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      putc(0x04, fp);
55725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
55825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (0);
55925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
56025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
56125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
56225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * See if the printer supports HP PJL...
56325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
56425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
56525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!strncmp(ppd->jcl_end, "\033%-12345X@", 10))
56625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
56725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
56825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * This printer uses HP PJL commands for output; filter the output
56925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * so that we only have a single "@PJL JOB" command in the header...
57025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    *
57125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * To avoid bugs in the PJL implementation of certain vendors' products
57225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * (Xerox in particular), we add a dummy "@PJL" command at the beginning
57325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * of the PJL commands to initialize PJL processing.
57425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
57525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
57625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    fputs("\033%-12345X@PJL\n", fp);
57725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    fputs("@PJL RDYMSG DISPLAY = \"\"\n", fp);
57825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    fputs(ppd->jcl_end + 9, fp);
57925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
58025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
58125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    fputs(ppd->jcl_end, fp);
58225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
58325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (0);
58425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
58525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
58625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
58725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
58825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'ppdEmitString()' - Get a string containing the code for marked options.
58925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
59025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * When "min_order" is greater than zero, this function only includes options
59125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * whose OrderDependency value is greater than or equal to "min_order".
59225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Otherwise, all options in the specified section are included in the
59325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * returned string.
59425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
59525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The return string is allocated on the heap and should be freed using
59625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @code free@ when you are done with it.
59725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
59825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
59925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
60025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
60125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannchar *					/* O - String containing option code or @code NULL@ if there is no option code */
60225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannppdEmitString(ppd_file_t    *ppd,	/* I - PPD file record */
60325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann              ppd_section_t section,	/* I - Section to write */
60425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      float         min_order)	/* I - Lowest OrderDependency */
60525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
60625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int		i, j,			/* Looping vars */
60725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		count;			/* Number of choices */
60825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ppd_choice_t	**choices;		/* Choices */
60925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ppd_size_t	*size;			/* Custom page size */
61025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ppd_coption_t	*coption;		/* Custom option */
61125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ppd_cparam_t	*cparam;		/* Custom parameter */
61225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  size_t	bufsize;		/* Size of string buffer needed */
61325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  char		*buffer,		/* String buffer */
61425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		*bufptr,		/* Pointer into buffer */
61525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		*bufend;		/* End of buffer */
61625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  struct lconv	*loc;			/* Locale data */
61725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
61825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
61925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  DEBUG_printf(("ppdEmitString(ppd=%p, section=%d, min_order=%f)",
62025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                ppd, section, min_order));
62125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
62225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
62325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Range check input...
62425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
62525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
62625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!ppd)
62725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
62825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
62925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
63025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Use PageSize or PageRegion as required...
63125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
63225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
63325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ppd_handle_media(ppd);
63425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
63525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
63625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Collect the options we need to emit...
63725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
63825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
63925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if ((count = ppdCollect2(ppd, section, min_order, &choices)) == 0)
64025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
64125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
64225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
64325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Count the number of bytes that are required to hold all of the
64425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * option code...
64525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
64625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
64725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  for (i = 0, bufsize = 1; i < count; i ++)
64825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
64925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (section == PPD_ORDER_JCL)
65025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
65125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (!_cups_strcasecmp(choices[i]->choice, "Custom") &&
65225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  (coption = ppdFindCustomOption(ppd, choices[i]->option->keyword))
65325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      != NULL)
65425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
65525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
65625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Add space to account for custom parameter substitution...
65725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
65825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
65925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params);
66025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	     cparam;
66125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	     cparam = (ppd_cparam_t *)cupsArrayNext(coption->params))
66225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
66325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          switch (cparam->type)
66425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  {
66525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_CURVE :
66625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_INVCURVE :
66725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_POINTS :
66825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_REAL :
66925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_INT :
67025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        bufsize += 10;
67125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        break;
67225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
67325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_PASSCODE :
67425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_PASSWORD :
67525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_STRING :
67625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        if (cparam->current.custom_string)
67725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		  bufsize += strlen(cparam->current.custom_string);
67825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        break;
67925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          }
68025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
68125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
68225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
68325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else if (section != PPD_ORDER_EXIT)
68425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
68525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      bufsize += 3;			/* [{\n */
68625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
68725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if ((!_cups_strcasecmp(choices[i]->option->keyword, "PageSize") ||
68825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann           !_cups_strcasecmp(choices[i]->option->keyword, "PageRegion")) &&
68925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          !_cups_strcasecmp(choices[i]->choice, "Custom"))
69025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
69125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        DEBUG_puts("2ppdEmitString: Custom size set!");
69225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
69325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        bufsize += 37;			/* %%BeginFeature: *CustomPageSize True\n */
69425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        bufsize += 50;			/* Five 9-digit numbers + newline */
69525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
69625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else if (!_cups_strcasecmp(choices[i]->choice, "Custom") &&
69725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann               (coption = ppdFindCustomOption(ppd,
69825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	                                      choices[i]->option->keyword))
69925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	           != NULL)
70025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
70125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        bufsize += 23 + strlen(choices[i]->option->keyword) + 6;
70225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann					/* %%BeginFeature: *Customkeyword True\n */
70325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
70425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
70525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params);
70625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	     cparam;
70725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	     cparam = (ppd_cparam_t *)cupsArrayNext(coption->params))
70825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
70925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          switch (cparam->type)
71025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  {
71125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_CURVE :
71225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_INVCURVE :
71325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_POINTS :
71425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_REAL :
71525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_INT :
71625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        bufsize += 10;
71725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        break;
71825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
71925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_PASSCODE :
72025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_PASSWORD :
72125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_STRING :
72225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		bufsize += 3;
72325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        if (cparam->current.custom_string)
72425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		  bufsize += 4 * strlen(cparam->current.custom_string);
72525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        break;
72625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          }
72725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
72825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
72925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else
73025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        bufsize += 17 + strlen(choices[i]->option->keyword) + 1 +
73125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	           strlen(choices[i]->choice) + 1;
73225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann					/* %%BeginFeature: *keyword choice\n */
73325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
73425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      bufsize += 13;			/* %%EndFeature\n */
73525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      bufsize += 22;			/* } stopped cleartomark\n */
73625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
73725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
73825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (choices[i]->code)
73925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      bufsize += strlen(choices[i]->code) + 1;
74025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else
74125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      bufsize += strlen(ppd_custom_code);
74225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
74325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
74425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
74525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Allocate memory...
74625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
74725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
74825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  DEBUG_printf(("2ppdEmitString: Allocating %d bytes for string...",
74925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                (int)bufsize));
75025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
75125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if ((buffer = calloc(1, bufsize)) == NULL)
75225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
75325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    free(choices);
75425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
75525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
75625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
75725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  bufend = buffer + bufsize - 1;
75825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  loc    = localeconv();
75925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
76025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
76125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Copy the option code to the buffer...
76225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
76325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
76425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  for (i = 0, bufptr = buffer; i < count; i ++, bufptr += strlen(bufptr))
76525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (section == PPD_ORDER_JCL)
76625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
76725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (!_cups_strcasecmp(choices[i]->choice, "Custom") &&
76825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  choices[i]->code &&
76925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          (coption = ppdFindCustomOption(ppd, choices[i]->option->keyword))
77025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      != NULL)
77125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
77225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
77325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Handle substitutions in custom JCL options...
77425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
77525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
77625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	char	*cptr;			/* Pointer into code */
77725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	int	pnum;			/* Parameter number */
77825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
77925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
78025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        for (cptr = choices[i]->code; *cptr && bufptr < bufend;)
78125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
78225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  if (*cptr == '\\')
78325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  {
78425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    cptr ++;
78525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
78625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    if (isdigit(*cptr & 255))
78725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    {
78825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	     /*
78925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      * Substitute parameter...
79025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      */
79125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
79225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann              pnum = *cptr++ - '0';
79325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      while (isdigit(*cptr & 255))
79425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        pnum = pnum * 10 + *cptr++ - '0';
79525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
79625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann              for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params);
79725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	           cparam;
79825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		   cparam = (ppd_cparam_t *)cupsArrayNext(coption->params))
79925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		if (cparam->order == pnum)
80025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		  break;
80125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
80225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann              if (cparam)
80325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      {
80425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        switch (cparam->type)
80525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		{
80625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		  case PPD_CUSTOM_CURVE :
80725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		  case PPD_CUSTOM_INVCURVE :
80825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		  case PPD_CUSTOM_POINTS :
80925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		  case PPD_CUSTOM_REAL :
81025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		      bufptr = _cupsStrFormatd(bufptr, bufend,
81125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann					       cparam->current.custom_real,
81225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann					       loc);
81325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		      break;
81425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
81525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		  case PPD_CUSTOM_INT :
81625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		      snprintf(bufptr, (size_t)(bufend - bufptr), "%d", cparam->current.custom_int);
81725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		      bufptr += strlen(bufptr);
81825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		      break;
81925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
82025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		  case PPD_CUSTOM_PASSCODE :
82125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		  case PPD_CUSTOM_PASSWORD :
82225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		  case PPD_CUSTOM_STRING :
82325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		      if (cparam->current.custom_string)
82425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		      {
82525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			strlcpy(bufptr, cparam->current.custom_string, (size_t)(bufend - bufptr));
82625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			bufptr += strlen(bufptr);
82725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		      }
82825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		      break;
82925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		}
83025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      }
83125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    }
83225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    else if (*cptr)
83325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      *bufptr++ = *cptr++;
83425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  }
83525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  else
83625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    *bufptr++ = *cptr++;
83725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
83825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
83925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else
84025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
84125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
84225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Otherwise just copy the option code directly...
84325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
84425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
84525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        strlcpy(bufptr, choices[i]->code, (size_t)(bufend - bufptr + 1));
84625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        bufptr += strlen(bufptr);
84725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
84825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
84925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else if (section != PPD_ORDER_EXIT)
85025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
85125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
85225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Add wrapper commands to prevent printer errors for unsupported
85325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * options...
85425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
85525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
85625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      strlcpy(bufptr, "[{\n", (size_t)(bufend - bufptr + 1));
85725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      bufptr += 3;
85825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
85925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
86025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Send DSC comments with option...
86125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
86225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
86325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      DEBUG_printf(("2ppdEmitString: Adding code for %s=%s...",
86425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		    choices[i]->option->keyword, choices[i]->choice));
86525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
86625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if ((!_cups_strcasecmp(choices[i]->option->keyword, "PageSize") ||
86725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann           !_cups_strcasecmp(choices[i]->option->keyword, "PageRegion")) &&
86825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          !_cups_strcasecmp(choices[i]->choice, "Custom"))
86925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
87025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
87125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Variable size; write out standard size options, using the
87225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* parameter positions defined in the PPD file...
87325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
87425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
87525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        ppd_attr_t	*attr;		/* PPD attribute */
87625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	int		pos,		/* Position of custom value */
87725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			orientation;	/* Orientation to use */
87825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	float		values[5];	/* Values for custom command */
87925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
88025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
88125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        strlcpy(bufptr, "%%BeginFeature: *CustomPageSize True\n", (size_t)(bufend - bufptr + 1));
88225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        bufptr += 37;
88325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
88425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        size = ppdPageSize(ppd, "Custom");
88525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
88625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        memset(values, 0, sizeof(values));
88725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
88825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize", "Width")) != NULL)
88925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
89025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  pos = atoi(attr->value) - 1;
89125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
89225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          if (pos < 0 || pos > 4)
89325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    pos = 0;
89425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
89525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	else
89625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  pos = 0;
89725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
89825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	values[pos] = size->width;
89925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
90025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize", "Height")) != NULL)
90125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
90225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  pos = atoi(attr->value) - 1;
90325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
90425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          if (pos < 0 || pos > 4)
90525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    pos = 1;
90625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
90725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	else
90825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  pos = 1;
90925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
91025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	values[pos] = size->length;
91125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
91225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
91325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * According to the Adobe PPD specification, an orientation of 1
91425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* will produce a print that comes out upside-down with the X
91525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* axis perpendicular to the direction of feed, which is exactly
91625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* what we want to be consistent with non-PS printers.
91725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*
91825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* We could also use an orientation of 3 to produce output that
91925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* comes out rightside-up (this is the default for many large format
92025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* printer PPDs), however for consistency we will stick with the
92125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* value 1.
92225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*
92325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* If we wanted to get fancy, we could use orientations of 0 or
92425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* 2 and swap the width and length, however we don't want to get
92525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* fancy, we just want it to work consistently.
92625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*
92725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* The orientation value is range limited by the Orientation
92825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* parameter definition, so certain non-PS printer drivers that
92925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* only support an Orientation of 0 will get the value 0 as
93025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* expected.
93125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
93225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
93325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        orientation = 1;
93425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
93525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize",
93625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	                        "Orientation")) != NULL)
93725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
93825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  int min_orient, max_orient;	/* Minimum and maximum orientations */
93925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
94025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
94125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          if (sscanf(attr->value, "%d%*s%d%d", &pos, &min_orient,
94225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	             &max_orient) != 3)
94325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    pos = 4;
94425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  else
94525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  {
94625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    pos --;
94725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
94825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann            if (pos < 0 || pos > 4)
94925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      pos = 4;
95025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
95125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann            if (orientation > max_orient)
95225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      orientation = max_orient;
95325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    else if (orientation < min_orient)
95425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	      orientation = min_orient;
95525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  }
95625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
95725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	else
95825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  pos = 4;
95925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
96025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	values[pos] = (float)orientation;
96125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
96225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        for (pos = 0; pos < 5; pos ++)
96325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
96425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  bufptr    = _cupsStrFormatd(bufptr, bufend, values[pos], loc);
96525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  *bufptr++ = '\n';
96625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        }
96725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
96825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	if (!choices[i]->code)
96925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
97025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	 /*
97125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  * This can happen with certain buggy PPD files that don't include
97225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  * a CustomPageSize command sequence...  We just use a generic
97325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  * Level 2 command sequence...
97425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  */
97525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
97625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  strlcpy(bufptr, ppd_custom_code, (size_t)(bufend - bufptr + 1));
97725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          bufptr += strlen(bufptr);
97825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
97925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
98025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else if (!_cups_strcasecmp(choices[i]->choice, "Custom") &&
98125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann               (coption = ppdFindCustomOption(ppd, choices[i]->option->keyword))
98225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	           != NULL)
98325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
98425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
98525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Custom option...
98625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
98725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
98825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        const char	*s;		/* Pointer into string value */
98925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        cups_array_t	*params;	/* Parameters in the correct output order */
99025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
99125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
99225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        params = cupsArrayNew((cups_array_func_t)ppd_compare_cparams, NULL);
99325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
99425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params);
99525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	     cparam;
99625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	     cparam = (ppd_cparam_t *)cupsArrayNext(coption->params))
99725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          cupsArrayAdd(params, cparam);
99825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
99925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%%%%BeginFeature: *Custom%s True\n", coption->keyword);
100025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        bufptr += strlen(bufptr);
100125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
100225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        for (cparam = (ppd_cparam_t *)cupsArrayFirst(params);
100325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	     cparam;
100425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	     cparam = (ppd_cparam_t *)cupsArrayNext(params))
100525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
100625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          switch (cparam->type)
100725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  {
100825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_CURVE :
100925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_INVCURVE :
101025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_POINTS :
101125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_REAL :
101225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        bufptr    = _cupsStrFormatd(bufptr, bufend,
101325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		                            cparam->current.custom_real, loc);
101425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                *bufptr++ = '\n';
101525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        break;
101625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
101725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_INT :
101825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%d\n", cparam->current.custom_int);
101925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		bufptr += strlen(bufptr);
102025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        break;
102125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
102225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_PASSCODE :
102325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_PASSWORD :
102425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    case PPD_CUSTOM_STRING :
102525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        *bufptr++ = '(';
102625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
102725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		if (cparam->current.custom_string)
102825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		{
102925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		  for (s = cparam->current.custom_string; *s; s ++)
103025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		  {
103125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		    if (*s < ' ' || *s == '(' || *s == ')' || *s >= 127)
103225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		    {
103325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		      snprintf(bufptr, (size_t)(bufend - bufptr + 1), "\\%03o", *s & 255);
103425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		      bufptr += strlen(bufptr);
103525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		    }
103625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		    else
103725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		      *bufptr++ = *s;
103825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		  }
103925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		}
104025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
104125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        *bufptr++ = ')';
104225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		*bufptr++ = '\n';
104325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	        break;
104425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          }
104525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
104625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
104725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	cupsArrayDelete(params);
104825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
104925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else
105025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
105125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        snprintf(bufptr, (size_t)(bufend - bufptr + 1), "%%%%BeginFeature: *%s %s\n", choices[i]->option->keyword, choices[i]->choice);
105225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	bufptr += strlen(bufptr);
105325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
105425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
105525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (choices[i]->code && choices[i]->code[0])
105625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
105725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        j = (int)strlen(choices[i]->code);
105825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	memcpy(bufptr, choices[i]->code, (size_t)j);
105925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	bufptr += j;
106025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
106125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	if (choices[i]->code[j - 1] != '\n')
106225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  *bufptr++ = '\n';
106325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
106425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
106525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      strlcpy(bufptr, "%%EndFeature\n"
106625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		      "} stopped cleartomark\n", (size_t)(bufend - bufptr + 1));
106725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      bufptr += strlen(bufptr);
106825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
106925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      DEBUG_printf(("2ppdEmitString: Offset in string is %d...",
107025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                    (int)(bufptr - buffer)));
107125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
107225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else
107325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
107425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      strlcpy(bufptr, choices[i]->code, (size_t)(bufend - bufptr + 1));
107525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      bufptr += strlen(bufptr);
107625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
107725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
107825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
107925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Nul-terminate, free, and return...
108025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
108125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
108225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  *bufptr = '\0';
108325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
108425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  free(choices);
108525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
108625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (buffer);
108725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
108825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
108925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
109025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
109125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'ppd_compare_cparams()' - Compare the order of two custom parameters.
109225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
109325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
109425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int				/* O - Result of comparison */
109525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannppd_compare_cparams(ppd_cparam_t *a,	/* I - First parameter */
109625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                    ppd_cparam_t *b)	/* I - Second parameter */
109725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
109825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (a->order - b->order);
109925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
110025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
110125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
110225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
110325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'ppd_handle_media()' - Handle media selection...
110425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
110525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
110625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void
110725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannppd_handle_media(ppd_file_t *ppd)	/* I - PPD file */
110825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
110925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ppd_choice_t	*manual_feed,		/* ManualFeed choice, if any */
111025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		*input_slot;		/* InputSlot choice, if any */
111125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ppd_size_t	*size;			/* Current media size */
111225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  ppd_attr_t	*rpr;			/* RequiresPageRegion value */
111325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
111425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
111525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
111625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * This function determines what page size code to use, if any, for the
111725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * current media size, InputSlot, and ManualFeed selections.
111825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  *
111925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * We use the PageSize code if:
112025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  *
112125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * 1. A custom media size is selected.
112225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * 2. ManualFeed and InputSlot are not selected (or do not exist).
112325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * 3. ManualFeed is selected but is False and InputSlot is not selected or
112425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  *    the selection has no code - the latter check done to support "auto" or
112525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  *    "printer default" InputSlot options.
112625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  *
112725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * We use the PageRegion code if:
112825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  *
112925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * 4. RequiresPageRegion does not exist and the PPD contains cupsFilter
113025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  *    keywords, indicating this is a CUPS-based driver.
113125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * 5. RequiresPageRegion exists for the selected InputSlot (or "All" for any
113225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  *    InputSlot or ManualFeed selection) and is True.
113325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  *
113425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * If none of the 5 conditions are true, no page size code is used and we
113525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * unmark any existing PageSize or PageRegion choices.
113625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
113725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
113825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if ((size = ppdPageSize(ppd, NULL)) == NULL)
113925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return;
114025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
114125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  manual_feed = ppdFindMarkedChoice(ppd, "ManualFeed");
114225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  input_slot  = ppdFindMarkedChoice(ppd, "InputSlot");
114325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
114425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (input_slot != NULL)
114525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    rpr = ppdFindAttr(ppd, "RequiresPageRegion", input_slot->choice);
114625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
114725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    rpr = NULL;
114825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
114925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!rpr)
115025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    rpr = ppdFindAttr(ppd, "RequiresPageRegion", "All");
115125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
115225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!_cups_strcasecmp(size->name, "Custom") ||
115325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      (!manual_feed && !input_slot) ||
115425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      (manual_feed && !_cups_strcasecmp(manual_feed->choice, "False") &&
115525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       (!input_slot || (input_slot->code && !input_slot->code[0]))) ||
115625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      (!rpr && ppd->num_filters > 0))
115725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
115825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
115925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Use PageSize code...
116025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
116125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
116225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    ppdMarkOption(ppd, "PageSize", size->name);
116325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
116425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else if (rpr && rpr->value && !_cups_strcasecmp(rpr->value, "True"))
116525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
116625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
116725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Use PageRegion code...
116825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
116925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
117025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    ppdMarkOption(ppd, "PageRegion", size->name);
117125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
117225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
117325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
117425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
117525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Do not use PageSize or PageRegion code...
117625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
117725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
117825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    ppd_choice_t	*page;		/* PageSize/Region choice, if any */
117925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
118025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if ((page = ppdFindMarkedChoice(ppd, "PageSize")) != NULL)
118125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
118225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
118325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Unmark PageSize...
118425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
118525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
118625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      page->marked = 0;
118725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      cupsArrayRemove(ppd->marked, page);
118825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
118925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
119025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if ((page = ppdFindMarkedChoice(ppd, "PageRegion")) != NULL)
119125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
119225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
119325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Unmark PageRegion...
119425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
119525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
119625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      page->marked = 0;
119725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      cupsArrayRemove(ppd->marked, page);
119825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
119925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
120025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
1201