]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - cups/mark.c
Remove svn:keywords since they cause svn_load_dirs.pl to complain about every file.
[thirdparty/cups.git] / cups / mark.c
index c901781db7230713e56e24a74be6a38b753e0e38..274e13745535ce81c075c85f2d46e5e3b7d02b46 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * "$Id: mark.c 5119 2006-02-16 15:52:06Z mike $"
+ * "$Id: mark.c 177 2006-06-21 00:20:03Z jlovell $"
  *
  *   Option marking routines for the Common UNIX Printing System (CUPS).
  *
@@ -43,7 +43,7 @@
  * Include necessary headers...
  */
 
-#include "ppd.h"
+#include "cups.h"
 #include "string.h"
 #include "debug.h"
 
@@ -241,9 +241,6 @@ ppd_option_t *                              /* O - Pointer to option or NULL */
 ppdFindOption(ppd_file_t *ppd,         /* I - PPD file data */
               const char *option)      /* I - Option/Keyword name */
 {
-  ppd_option_t key;                    /* Option search key */
-
-
  /*
   * Range check input...
   */
@@ -251,13 +248,39 @@ ppdFindOption(ppd_file_t *ppd,            /* I - PPD file data */
   if (!ppd || !option)
     return (NULL);
 
- /*
-  * Search...
-  */
+  if (ppd->options)
+  {
+   /*
+    * Search in the array...
+    */
+
+    ppd_option_t       key;            /* Option search key */
+
+
+    strlcpy(key.keyword, option, sizeof(key.keyword));
+
+    return ((ppd_option_t *)cupsArrayFind(ppd->options, &key));
+  }
+  else
+  {
+   /*
+    * Search in each group...
+    */
+
+    int                        i, j;           /* Looping vars */
+    ppd_group_t                *group;         /* Current group */
+    ppd_option_t       *optptr;        /* Current option */
 
-  strlcpy(key.keyword, option, sizeof(key.keyword));
 
-  return ((ppd_option_t *)cupsArrayFind(ppd->options, &key));
+    for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++)
+      for (j = group->num_options, optptr = group->options;
+           j > 0;
+          j --, optptr ++)
+        if (!strcasecmp(optptr->keyword, option))
+         return (optptr);
+
+    return (NULL);
+  }
 }
 
 
@@ -323,6 +346,7 @@ ppdMarkOption(ppd_file_t *ppd,              /* I - PPD file record */
   int          i, j;                   /* Looping vars */
   ppd_option_t *o;                     /* Option pointer */
   ppd_choice_t *c;                     /* Choice pointer */
+  struct lconv *loc;                   /* Locale data */
 
 
   DEBUG_printf(("ppdMarkOption(ppd=%p, option=\"%s\", choice=\"%s\")\n",
@@ -354,8 +378,9 @@ ppdMarkOption(ppd_file_t *ppd,              /* I - PPD file record */
   if ((o = ppdFindOption(ppd, option)) == NULL)
     return (0);
 
+  loc = localeconv();
 
-  if (!strncasecmp(choice, "Custom.", 7) /* TODO || strchr(choice, '=') */ )
+  if (!strncasecmp(choice, "Custom.", 7))
   {
    /*
     * Handle a custom option...
@@ -380,14 +405,7 @@ ppdMarkOption(ppd_file_t *ppd,             /* I - PPD file record */
 
       ppd_coption_t    *coption;       /* Custom option */
       ppd_cparam_t     *cparam;        /* Custom parameter */
-      char             units[33];      /* Custom points units */
-
-
-     /*
-      * TODO: Detect and support custom option values using the
-      * collection format "{Name1=foo Name2=bar}".  For now, just
-      * support Custom.value for single-valued custom options.
-      */
+      char             *units;         /* Custom points units */
 
       if ((coption = ppdFindCustomOption(ppd, option)) != NULL)
       {
@@ -399,24 +417,27 @@ ppdMarkOption(ppd_file_t *ppd,            /* I - PPD file record */
          case PPD_CUSTOM_CURVE :
          case PPD_CUSTOM_INVCURVE :
          case PPD_CUSTOM_REAL :
-             cparam->current.custom_real = atof(choice + 7);
+             cparam->current.custom_real = _cupsStrScand(choice + 7, NULL,
+                                                         loc);
              break;
 
          case PPD_CUSTOM_POINTS :
-             if (sscanf(choice + 7, "%f%s", &(cparam->current.custom_points),
-                        units) < 2)
-               strcpy(units, "pt");
-
-              if (!strcasecmp(units, "cm"))
-               cparam->current.custom_points *= 72.0 / 2.54;         
-              else if (!strcasecmp(units, "mm"))
-               cparam->current.custom_points *= 72.0 / 25.4;         
-              else if (!strcasecmp(units, "m"))
-               cparam->current.custom_points *= 72.0 / 0.0254;       
-              else if (!strcasecmp(units, "in"))
-               cparam->current.custom_points *= 72.0;        
-              else if (!strcasecmp(units, "ft"))
-               cparam->current.custom_points *= 12 * 72.0;           
+             cparam->current.custom_points = _cupsStrScand(choice + 7,
+                                                           &units, loc);
+
+              if (units)
+             {
+               if (!strcasecmp(units, "cm"))
+                 cparam->current.custom_points *= 72.0 / 2.54;       
+               else if (!strcasecmp(units, "mm"))
+                 cparam->current.custom_points *= 72.0 / 25.4;       
+               else if (!strcasecmp(units, "m"))
+                 cparam->current.custom_points *= 72.0 / 0.0254;             
+               else if (!strcasecmp(units, "in"))
+                 cparam->current.custom_points *= 72.0;              
+               else if (!strcasecmp(units, "ft"))
+                 cparam->current.custom_points *= 12 * 72.0;         
+              }
              break;
 
          case PPD_CUSTOM_INT :
@@ -435,6 +456,78 @@ ppdMarkOption(ppd_file_t *ppd,             /* I - PPD file record */
       }
     }
   }
+  else if (choice[0] == '{')
+  {
+   /*
+    * Handle multi-value custom options...
+    */
+
+    ppd_coption_t      *coption;       /* Custom option */
+    ppd_cparam_t       *cparam;        /* Custom parameter */
+    char               *units;         /* Custom points units */
+    int                        num_vals;       /* Number of values */
+    cups_option_t      *vals,          /* Values */
+                       *val;           /* Value */
+
+
+    if ((c = ppdFindChoice(o, "Custom")) == NULL)
+      return (0);
+
+    if ((coption = ppdFindCustomOption(ppd, option)) != NULL)
+    {
+      num_vals = cupsParseOptions(choice + 1, 0, &vals);
+
+      for (i = 0, val = vals; i < num_vals; i ++, val ++)
+      {
+        if ((cparam = ppdFindCustomParam(coption, val->name)) == NULL)
+         continue;
+
+       switch (cparam->type)
+       {
+         case PPD_CUSTOM_CURVE :
+         case PPD_CUSTOM_INVCURVE :
+         case PPD_CUSTOM_REAL :
+             cparam->current.custom_real = _cupsStrScand(val->value, NULL,
+                                                         loc);
+             break;
+
+         case PPD_CUSTOM_POINTS :
+             cparam->current.custom_points = _cupsStrScand(val->value, &units,
+                                                           loc);
+
+             if (units)
+             {
+               if (!strcasecmp(units, "cm"))
+                 cparam->current.custom_points *= 72.0 / 2.54;       
+               else if (!strcasecmp(units, "mm"))
+                 cparam->current.custom_points *= 72.0 / 25.4;       
+               else if (!strcasecmp(units, "m"))
+                 cparam->current.custom_points *= 72.0 / 0.0254;             
+               else if (!strcasecmp(units, "in"))
+                 cparam->current.custom_points *= 72.0;              
+               else if (!strcasecmp(units, "ft"))
+                 cparam->current.custom_points *= 12 * 72.0;         
+             }
+             break;
+
+         case PPD_CUSTOM_INT :
+             cparam->current.custom_int = atoi(val->value);
+             break;
+
+         case PPD_CUSTOM_PASSCODE :
+         case PPD_CUSTOM_PASSWORD :
+         case PPD_CUSTOM_STRING :
+             if (cparam->current.custom_string)
+               free(cparam->current.custom_string);
+
+             cparam->current.custom_string = strdup(val->value);
+             break;
+       }
+      }
+
+      cupsFreeOptions(num_vals, vals);
+    }
+  }
   else
   {
     for (i = o->num_choices, c = o->choices; i > 0; i --, c ++)
@@ -586,5 +679,5 @@ ppd_defaults(ppd_file_t  *ppd,      /* I - PPD file */
 
 
 /*
- * End of "$Id: mark.c 5119 2006-02-16 15:52:06Z mike $".
+ * End of "$Id: mark.c 177 2006-06-21 00:20:03Z jlovell $".
  */