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