Allow partial matches for WITH-VALUE "/regex/"? #3949

Closed
michaelrsweet opened this Issue Sep 30, 2011 · 2 comments

Comments

Projects
None yet
1 participant
Collaborator

michaelrsweet commented Sep 30, 2011

Version: 1.6-current
CUPS.org User: mike

Currently WITH-VALUE "/regex/" requires all values to match. Maybe we can add a modifier character after the trailing slash to get different behavior?

Collaborator

michaelrsweet commented Feb 29, 2012

CUPS.org User: mike

Fixed in Subversion repository.

Collaborator

michaelrsweet commented Feb 29, 2012

"str3949.patch":

Index: doc/help/man-ipptoolfile.html

--- doc/help/man-ipptoolfile.html (revision 10312)
+++ doc/help/man-ipptoolfile.html (working copy)
@@ -338,14 +338,55 @@

WITH-VALUE "literal string"
-
Requires at least one value of the EXPECT attribute to match the literal string. -Comparisons are case-sensitive. +
+
WITH-ALL-VALUES "literal string" +
+
Requires that one/all values of the EXPECT attribute to match the literal string. Comparisons are case-sensitive.
+
WITH-VALUE "<number" +
+
+
WITH-VALUE "=number" +
+
+
WITH-VALUE ">number" +
+
+
WITH-VALUE "number[,number,...]" +
+
+
WITH-ALL-VALUES "<number" +
+
+
WITH-ALL-VALUES "=number" +
+
+
WITH-ALL-VALUES ">number" +
+
+
WITH-ALL-VALUES "number[,number,...]" +
+
Requires that one/all values of the EXPECT attribute to match the number(s) or numeric comparisons. When comparing rangeOfInteger values, the "<" and ">" operators only check the upper bound of the range. +
+
WITH-VALUE "false" +
+
+
WITH-VALUE "true" +
+
+
WITH-ALL-VALUES "false" +
+
+
WITH-ALL-VALUES "true" +
+
Requires that one/all values of the EXPECT attribute to match the boolean value given. +
WITH-VALUE "/regular expression/"
-
Requires that all values of the EXPECT attribute match the regular expression, -which must conform to the POSIX regular expression syntax. -Comparisons are case-sensitive. +
+
WITH-ALL-VALUES "/regular expression/" +
+
Requires that one/all values of the EXPECT attribute match the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.
@@ -413,6 +454,7 @@ Get-Subscriptions Hold-Job Hold-New-Jobs - Identify-Printer Pause-Printer Pause-Printer-After-Current-Job Print-Job @@ -437,6 +479,7 @@ Shutdown-Printer Startup-Printer Suspend-Current-Job - Validate-Document Validate-Job

@@ -454,6 +497,10 @@
client-error-document-access-error
client-error-document-format-error
client-error-document-format-not-supported

  • client-error-document-password-error
  • client-error-document-permission-error
  • client-error-document-security-error
  • client-error-document-unprintable-error
    client-error-forbidden
    client-error-gone
    client-error-ignored-all-notifications
    @@ -601,7 +648,7 @@
    http://localhost:631/help

Copyright

-Copyright 2007-2011 by Apple Inc.
+Copyright 2007-2012 by Apple Inc.

Index: cups/ipp.h

--- cups/ipp.h (revision 10312)
+++ cups/ipp.h (working copy)
@@ -3,7 +3,7 @@
*

  • Internet Printing Protocol definitions for CUPS.
  • * Copyright 2007-2011 by Apple Inc.

  • * Copyright 2007-2012 by Apple Inc.

    • Copyright 1997-2006 by Easy Software Products.
    • These coded instructions, statements, and computer programs are the
      @@ -188,6 +188,7 @@
      IPP_RESUBMIT_JOB, /* Resubmit-Job /
      IPP_CLOSE_JOB, /
      Close-Job /
      IPP_IDENTIFY_PRINTER, /
      Identify-Printer (proposed IPP JPS3) */
  • IPP_VALIDATE_DOCUMENT, /* Validate-Document (proposed IPP JPS3) /
    IPP_PRIVATE = 0x4000, /
    Reserved @Private@ /
    CUPS_GET_DEFAULT, /
    Get the default printer /
    CUPS_GET_PRINTERS, /
    Get a list of printers and/or classes */
    Index: cups/ipp-support.c
    ===================================================================
    --- cups/ipp-support.c (revision 10312)
    +++ cups/ipp-support.c (working copy)
    @@ -78,7 +78,11 @@
    "client-error-ignored-all-subscriptions",
    "client-error-too-many-subscriptions",
    "(client-error-ignored-all-notifications)",

  •     "(client-error-client-print-support-file-not-found)"
    
  •     "(client-error-client-print-support-file-not-found)",
    
  •     "client-error-document-password-error",
    
  •     "client-error-document-permission-error",
    
  •     "client-error-document-security-error",
    
  •     "client-error-document-unprintable-error"
    },
    * const ipp_status_500s[] =     /* Server errors */
    {
    

    @@ -158,7 +162,7 @@
    "Suspend-Current-Job",
    "Resume-Job",

  •     /* 0x0030 - 0x003b */
    
  •     /\* 0x0030 - 0x003d */
      "Promote-Job",
      "Schedule-Job-After",
      "0x32",
    

    @@ -171,7 +175,8 @@
    "Cancel-My-Jobs",
    "Resubmit-Job",
    "Close-Job",

  •     "Identify-Printer"
    
  •     "Identify-Printer",
    
  •     "Validate-Document"
    },
    \* const ipp_cups_ops[] =
    {
    

    Index: man/ipptoolfile.man

    --- man/ipptoolfile.man (revision 10312)
    +++ man/ipptoolfile.man (working copy)
    @@ -3,7 +3,7 @@
    ."
    ." ipptoolfile man page for CUPS.
    ."
    -." Copyright 2010-2011 by Apple Inc.
    +." Copyright 2010-2012 by Apple Inc.
    ."
    ." These coded instructions, statements, and computer programs are the
    ." property of Apple Inc. and are protected by Federal copyright
    @@ -11,7 +11,7 @@
    ." which should have been included with this file. If this file is
    ." file is missing or damaged, see the license at "http://www.cups.org/".
    ."
    -.TH ipptoolfile 5 "CUPS" "28 September 2011" "Apple Inc."
    +.TH ipptoolfile 5 "CUPS" "28 February 2012" "Apple Inc."
    .SH NAME
    ipptoolfile - ipptool file format

@@ -277,13 +277,40 @@
parallel attribute.
.TP 5
WITH-VALUE "literal string"
-Requires at least one value of the EXPECT attribute to match the literal string.
-Comparisons are case-sensitive.
.TP 5
+WITH-ALL-VALUES "literal string"
+Requires that one/all values of the EXPECT attribute to match the literal string. Comparisons are case-sensitive.
+.TP 5
+WITH-VALUE "<number"
+.TP 5
+WITH-VALUE "=number"
+.TP 5
+WITH-VALUE ">number"
+.TP 5
+WITH-VALUE "number[,number,...]"
+.TP 5
+WITH-ALL-VALUES "<number"
+.TP 5
+WITH-ALL-VALUES "=number"
+.TP 5
+WITH-ALL-VALUES ">number"
+.TP 5
+WITH-ALL-VALUES "number[,number,...]"
+Requires that one/all values of the EXPECT attribute to match the number(s) or numeric comparisons. When comparing rangeOfInteger values, the "<" and ">" operators only check the upper bound of the range.
+.TP 5
+WITH-VALUE "false"
+.TP 5
+WITH-VALUE "true"
+.TP 5
+WITH-ALL-VALUES "false"
+.TP 5
+WITH-ALL-VALUES "true"
+Requires that one/all values of the EXPECT attribute to match the boolean value given.
+.TP 5
WITH-VALUE "/regular expression/"
-Requires that all values of the EXPECT attribute match the regular expression,
-which must conform to the POSIX regular expression syntax.
-Comparisons are case-sensitive.
+.TP 5
+WITH-ALL-VALUES "/regular expression/"
+Requires that one/all values of the EXPECT attribute match the regular expression, which must conform to the POSIX regular expression syntax. Comparisons are case-sensitive.

.SH STATUS PREDICATES
The following predicates are understood following the STATUS test directive:
@@ -343,6 +370,7 @@
Get-Subscriptions
Hold-Job
Hold-New-Jobs

  • Identify-Printer
    Pause-Printer
    Pause-Printer-After-Current-Job
    Print-Job
    @@ -367,6 +395,7 @@
    Shutdown-Printer
    Startup-Printer
    Suspend-Current-Job
  • Validate-Document
    Validate-Job
    .fi

@@ -384,6 +413,10 @@
client-error-document-access-error
client-error-document-format-error
client-error-document-format-not-supported

  • client-error-document-password-error
  • client-error-document-permission-error
  • client-error-document-security-error
  • client-error-document-unprintable-error
    client-error-forbidden
    client-error-gone
    client-error-ignored-all-notifications
    @@ -517,7 +550,7 @@
    http://localhost:631/help

.SH COPYRIGHT
-Copyright 2007-2011 by Apple Inc.
+Copyright 2007-2012 by Apple Inc.
."
." End of "$Id$".
."

Index: test/ipp-2.0.test

--- test/ipp-2.0.test (revision 10312)
+++ test/ipp-2.0.test (working copy)
@@ -3,7 +3,7 @@

IPP/2.0 test suite.

-# Copyright 2007-2011 by Apple Inc.
+# Copyright 2007-2012 by Apple Inc.

Copyright 2001-2006 by Easy Software Products. All rights reserved.

These coded instructions, statements, and computer programs are the

@@ -24,7 +24,7 @@

Regular expression for PWG media size names (eek!)

-DEFINE MEDIA_REGEX "/^((custom|na|asme|roc|oe)[a-z0-9][-a-z0-9]*([1-9][0-9](.[0-9][1-9])?|0.[0-9][1-9])x([1-9][0-9](.[0-9][1-9])?|0.[0-9][1-9])in|(custom|iso|jis|jpn|prc|om)[a-z0-9][-a-z0-9]*([1-9][0-9](.[0-9][1-9])?|0.[0-9][1-9])x([1-9][0-9](.[0-9][1-9])?|0.[0-9][1-9])mm)$$/"
+DEFINE MEDIA_REGEX "/^(choice(((custom|na|asme|roc|oe|roll)[a-z0-9][-a-z0-9]([1-9][0-9](.[0-9][1-9])?|0.[0-9][1-9])x([1-9][0-9](.[0-9][1-9])?|0.[0-9][1-9])in|(custom|iso|jis|jpn|prc|om|roll)_[a-z0-9][-a-z0-9]([1-9][0-9](.[0-9][1-9])?|0.[0-9][1-9])x([1-9][0-9](.[0-9][1-9])?|0.[0-9][1-9])mm)){2,}|(custom|na|asme|roc|oe|roll)[a-z0-9][-a-z0-9]__([1-9][0-9](.[0-9][1-9])?|0.[0-9][1-9])x([1-9][0-9](.[0-9][1-9])?|0.[0-9][1-9])in|(custom|iso|jis|jpn|prc|om|roll)[a-z0-9][-a-z0-9]__([1-9][0-9](.[0-9][1-9])?|0.[0-9][1-9])x([1-9][0-9](.[0-9][1-9])?|0.[0-9][1-9])mm)$$/"

Test required printer description attribute support.

@@ -51,8 +51,8 @@
EXPECT finishings-default OF-TYPE enum IN-GROUP printer-attributes-tag
EXPECT finishings-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3
EXPECT media-default OF-TYPE no-value|keyword|name IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "$MEDIA_REGEX"

  • EXPECT ?media-ready OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-VALUE "$MEDIA_REGEX"
  • EXPECT media-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-VALUE "$MEDIA_REGEX"
  • EXPECT ?media-ready OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-ALL-VALUES "$MEDIA_REGEX"
  • EXPECT media-supported OF-TYPE keyword|name IN-GROUP printer-attributes-tag WITH-ALL-VALUES "$MEDIA_REGEX"
    EXPECT orientation-requested-default OF-TYPE no-value|enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 3,4,5,6
    EXPECT orientation-requested-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3,4,5,6
    EXPECT output-bin-default OF-TYPE keyword|name IN-GROUP printer-attributes-tag COUNT 1
    @@ -61,8 +61,8 @@
    EXPECT print-quality-supported OF-TYPE enum IN-GROUP printer-attributes-tag WITH-VALUE 3,4,5
    EXPECT printer-resolution-default OF-TYPE resolution IN-GROUP printer-attributes-tag COUNT 1
    EXPECT printer-resolution-supported OF-TYPE resolution IN-GROUP printer-attributes-tag
  • EXPECT sides-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
  • EXPECT sides-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-VALUE "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
  • EXPECT sides-default OF-TYPE keyword IN-GROUP printer-attributes-tag COUNT 1 WITH-ALL-VALUES "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"
  • EXPECT sides-supported OF-TYPE keyword IN-GROUP printer-attributes-tag WITH-ALL-VALUES "/^(one-sided|two-sided-long-edge|two-sided-short-edge)$$/"

Optional media-col support

EXPECT ?media-col-default OF-TYPE collection IN-GROUP printer-attributes-tag COUNT 1

Index: test/ipp-1.1.test

--- test/ipp-1.1.test (revision 10312)
+++ test/ipp-1.1.test (working copy)
@@ -95,7 +95,7 @@
ATTR uri printer-uri $uri

STATUS successful-ok

  • EXPECT printer-uri-supported OF-TYPE uri WITH-VALUE "$IPP_URI_SCHEME"
  • EXPECT printer-uri-supported OF-TYPE uri WITH-ALL-VALUES "$IPP_URI_SCHEME"
    }

@@ -325,7 +325,7 @@
EXPECT printer-state OF-TYPE enum IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE 3,4,5
EXPECT printer-state-reasons OF-TYPE keyword IN-GROUP printer-attributes-tag
EXPECT printer-up-time OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1 WITH-VALUE >0

  • EXPECT printer-uri-supported OF-TYPE uri IN-GROUP printer-attributes-tag SAME-COUNT-AS uri-security-supported WITH-VALUE "$IPP_URI_SCHEME"
  • EXPECT printer-uri-supported OF-TYPE uri IN-GROUP printer-attributes-tag SAME-COUNT-AS uri-security-supported WITH-ALL-VALUES "$IPP_URI_SCHEME"
    EXPECT queued-job-count OF-TYPE integer IN-GROUP printer-attributes-tag COUNT 1
    EXPECT uri-authentication-supported OF-TYPE keyword IN-GROUP printer-attributes-tag
    EXPECT uri-security-supported OF-TYPE keyword IN-GROUP printer-attributes-tag SAME-COUNT-AS uri-authentication-supported
    @@ -348,7 +348,7 @@

STATUS successful-ok

  • EXPECT printer-uri-supported OF-TYPE uri IN-GROUP printer-attributes-tag WITH-VALUE "$IPP_URI_SCHEME"
  • EXPECT printer-uri-supported OF-TYPE uri IN-GROUP printer-attributes-tag WITH-ALL-VALUES "$IPP_URI_SCHEME"
    EXPECT !printer-name
    }

Index: test/ipptool.c

--- test/ipptool.c (revision 10312)
+++ test/ipptool.c (working copy)
@@ -81,6 +81,13 @@
_CUPS_OUTPUT_CSV /* Comma-separated values output */
} _cups_output_t;

+typedef enum _cups_with_e /**** WITH flags ****/
+{

  • _CUPS_WITH_LITERAL = 0, /* Match string is a literal value */
  • _CUPS_WITH_ALL = 1, /* Must match all values */
  • _CUPS_WITH_REGEX = 2 /* Match string is a regular expression _/
    +} _cups_with_t;

typedef struct cups_expect_s /*** Expected attribute info ***/
{
int optional, /
Optional attribute? /
@@ -96,7 +103,7 @@
*define_value; /
Variable to define with value /
int repeat_match, /
Repeat test on match /
repeat_no_match, /
Repeat test on no match */

  •   with_regex,     /\* WITH-VALUE is a regular expression */
    
  •   with_flags,     /\* WITH flags  _/
    count;          /_ Expected count if > 0 _/
    
    ipp_tag_t in_group; /_ IN-GROUP value */
    } _cups_expect_t;
    @@ -205,7 +212,7 @@
    static int timeout_cb(http_t *http, void *user_data);
    static void usage(void) attribute((noreturn));
    static int validate_attr(cups_array_t *errors, ipp_attribute_t *attr);
    -static int with_value(cups_array_t *errors, char *value, int regex,
    +static int with_value(cups_array_t *errors, char *value, int flags,
    ipp_attribute_t *attr, char *matchbuf,
    size_t matchlen);

@@ -1164,6 +1171,7 @@
_cups_strcasecmp(token, "REPEAT-MATCH") &&
_cups_strcasecmp(token, "REPEAT-NO-MATCH") &&
_cups_strcasecmp(token, "SAME-COUNT-AS") &&

  •      _cups_strcasecmp(token, "WITH-ALL-VALUES") &&
       _cups_strcasecmp(token, "WITH-VALUE"))
     last_expect = NULL;
    

@@ -2049,11 +2057,12 @@
goto test_exit;
}
}

  •  else if (!_cups_strcasecmp(token, "WITH-VALUE"))
    
  •  else if (!_cups_strcasecmp(token, "WITH-ALL-VALUES") ||
    
  •           !_cups_strcasecmp(token, "WITH-VALUE"))
    

    {
    if (!get_token(fp, temp, sizeof(temp), &linenum))
    {

  • print_fatal_error("Missing WITH-VALUE value on line %d.", linenum);
    
  • print_fatal_error("Missing %s value on line %d.", token, linenum);
    

    pass = 0;
    goto test_exit;
    }
    @@ -2075,7 +2084,7 @@
    */

    last_expect->with_value = calloc(1, tokenptr - token);
    
  •   last_expect->with_regex = 1;
    
  •   last_expect->with_flags = _CUPS_WITH_REGEX;
    
    if (last_expect->with_value)
      memcpy(last_expect->with_value, token + 1, tokenptr - token - 1);
    

    @@ -2087,11 +2096,15 @@
    */

    last_expect->with_value = strdup(token);
    
  •   last_expect->with_flags = _CUPS_WITH_LITERAL;
    

    }
    +

  •      if (!_cups_strcasecmp(token, "WITH-ALL-VALUES"))
    
  •        last_expect->with_flags |= _CUPS_WITH_ALL;
    

    }
    else
    {

  • print_fatal_error("WITH-VALUE without a preceding EXPECT on line %d.",
    
  • print_fatal_error("%s without a preceding EXPECT on line %d.", token,
                linenum);
    

    pass = 0;
    goto test_exit;
    @@ -2660,21 +2673,27 @@
    ippAttributeString(found, buffer, sizeof(buffer));

    if (found &&

  •     !with_value(NULL, expect->with_value, expect->with_regex, found,
    
  •     !with_value(NULL, expect->with_value, expect->with_flags, found,
          buffer, sizeof(buffer)))
    

    {
    if (expect->define_no_match)
    set_variable(vars, expect->define_no_match, "1");
    else if (!expect->define_match && !expect->define_value)
    {

  •     if (expect->with_regex)
    
  •   add_stringf(errors, "EXPECTED: %s WITH-VALUE /%s/",
    
  •           expect->name, expect->with_value);
    
  •     if (expect->with_flags & _CUPS_WITH_REGEX)
    
  •   add_stringf(errors, "EXPECTED: %s %s /%s/",
    
  •           expect->name,
    
  •           (expect->with_flags & _CUPS_WITH_ALL) ?
    
  •               "WITH-ALL-VALUES" : "WITH-VALUE",
    
  •           expect->with_value);
      else
    
  •   add_stringf(errors, "EXPECTED: %s WITH-VALUE \"%s\"",
    
  •           expect->name, expect->with_value);
    
  •   add_stringf(errors, "EXPECTED: %s %s \"%s\"",
    
  •           expect->name,
    
  •           (expect->with_flags & _CUPS_WITH_ALL) ?
    
  •               "WITH-ALL-VALUES" : "WITH-VALUE",
    
  •           expect->with_value);
    
  •     with_value(errors, expect->with_value, expect->with_regex, found,
    
  •     with_value(errors, expect->with_value, expect->with_flags, found,
                 buffer, sizeof(buffer));
    }
    

@@ -5018,16 +5037,18 @@
static int /* O - 1 on match, 0 on non-match /
with_value(cups_array_t *errors, /
I - Errors array /
char *value, /
I - Value string */

  •       int             regex,  /\* I - Value is a regular expression */
    
  •       int             flags,  /\* I - Flags for match _/
        ipp_attribute_t *attr,  /_ I - Attribute to compare _/
    
    char *matchbuf, /_ I - Buffer to hold matching value /
    size_t matchlen) /
    I - Length of match buffer */
    {
  • int i; /* Looping var */
  • int i, /* Looping var */
  • match; /* Match? /
    char *valptr; /
    Pointer into value */

*matchbuf = '\0';

  • match = (flags & _CUPS_WITH_ALL) ? 1 : 0;

/*

  • NULL matches everything.
    @@ -5048,9 +5069,9 @@
    {
    char op, /* Comparison operator /
    *nextptr; /
    Next pointer */
  • int   intvalue;       /\* Integer value */
    
  • int   intvalue,       /\* Integer value */
    
  •   valmatch = 0;       /\* Does the current value match? */
    

       valptr = value;

  while (isspace(*valptr & 255) || isdigit(*valptr & 255) ||

@@ -5073,34 +5094,35 @@
break;
valptr = nextptr;

  •   switch (op)
    
  •        if ((op == '=' && attr->values[i].integer == intvalue) ||
    
  •            (op == '<' && attr->values[i].integer < intvalue) ||
    
  •            (op == '>' && attr->values[i].integer > intvalue))
    {
    
  •     case '=' :
    
  •         if (attr->values[i].integer == intvalue)
    
  •         {
    
  •           snprintf(matchbuf, matchlen, "%d", attr->values[i].integer);
    
  •       return (1);
    
  •     }
    
  •     break;
    
  •     case '<' :
    
  •         if (attr->values[i].integer < intvalue)
    
  •         {
    
  •           snprintf(matchbuf, matchlen, "%d", attr->values[i].integer);
    
  •       return (1);
    
  •     }
    
  •     break;
    
  •     case '>' :
    
  •         if (attr->values[i].integer > intvalue)
    
  •         {
    
  •           snprintf(matchbuf, matchlen, "%d", attr->values[i].integer);
    
  •       return (1);
    
  •     }
    
  •     break;
    
  •     if (!matchbuf[0])
    
  •   snprintf(matchbuf, matchlen, "%d",
    
  •        attr->values[i].integer);
    
  •     valmatch = 1;
    
  •     break;
    }
    
    }
    +
  •      if (flags & _CUPS_WITH_ALL)
    
  •      {
    
  •        if (!valmatch)
    
  •        {
    
  •          match = 0;
    
  •          break;
    
  •        }
    
  •      }
    
  •      else if (valmatch)
    
  •      {
    
  •        match = 1;
    
  •        break;
    
  •      }
     }
    
  • if (errors)
  •    if (!match && errors)
    
    {
    for (i = 0; i < attr->num_values; i ++)
    add_stringf(errors, "GOT: %s=%d", attr->name,
    @@ -5113,9 +5135,9 @@
    {
    char op, /* Comparison operator /
    *nextptr; /
    Next pointer */
  • int   intvalue;       /\* Integer value */
    
  • int   intvalue,       /\* Integer value */
    
  •   valmatch = 0;       /\* Does the current value match? */
    

       valptr = value;

  while (isspace(*valptr & 255) || isdigit(*valptr & 255) ||

@@ -5138,41 +5160,37 @@
break;
valptr = nextptr;

  •   switch (op)
    
  •        if ((op == '=' && (attr->values[i].range.lower == intvalue ||
    
  •              attr->values[i].range.upper == intvalue)) ||
    
  •   (op == '<' && attr->values[i].range.upper < intvalue) ||
    
  •   (op == '>' && attr->values[i].range.upper > intvalue))
    {
    
  •     case '=' :
    
  •         if (attr->values[i].range.lower == intvalue ||
    
  •         attr->values[i].range.upper == intvalue)
    
  •         {
    
  •           snprintf(matchbuf, matchlen, "%d-%d",
    
  •                    attr->values[i].range.lower,
    
  •                    attr->values[i].range.upper);
    
  •       return (1);
    
  •     }
    
  •     break;
    
  •     case '<' :
    
  •         if (attr->values[i].range.upper < intvalue)
    
  •         {
    
  •           snprintf(matchbuf, matchlen, "%d-%d",
    
  •                    attr->values[i].range.lower,
    
  •                    attr->values[i].range.upper);
    
  •       return (1);
    
  •     }
    
  •     break;
    
  •     case '>' :
    
  •         if (attr->values[i].range.upper > intvalue)
    
  •         {
    
  •           snprintf(matchbuf, matchlen, "%d-%d",
    
  •                    attr->values[i].range.lower,
    
  •                    attr->values[i].range.upper);
    
  •       return (1);
    
  •     }
    
  •     break;
    
  •     if (!matchbuf[0])
    
  •   snprintf(matchbuf, matchlen, "%d-%d",
    
  •        attr->values[0].range.lower,
    
  •        attr->values[0].range.upper);
    
  •     valmatch = 1;
    
  •     break;
    }
    

    }
    +

  •      if (flags & _CUPS_WITH_ALL)
    
  •      {
    
  •        if (!valmatch)
    
  •        {
    
  •          match = 0;
    
  •          break;
    
  •        }
    
  •      }
    
  •      else if (valmatch)
    
  •      {
    
  •        match = 1;
    
  •        break;
    
  •      }
     }
    
  • if (errors)

  •    if (!match && errors)
    

    {
    for (i = 0; i < attr->num_values; i ++)
    add_stringf(errors, "GOT: %s=%d-%d", attr->name,
    @@ -5186,12 +5204,23 @@
    {
    if (!strcmp(value, "true") == attr->values[i].boolean)
    {

  •        strlcpy(matchbuf, value, matchlen);
    
  •   return (1);
    
  •        if (!matchbuf[0])
    
  •     strlcpy(matchbuf, value, matchlen);
    
  •   if (!(flags & _CUPS_WITH_ALL))
    
  •   {
    
  •     match = 1;
    
  •     break;
    
  •   }
    

    }

  • else if (flags & _CUPS_WITH_ALL)
    
  • {
    
  •   match = 0;
    
  •   break;
    
  • }
    

    }

  • if (errors)

  • if (!match && errors)
    {
    for (i = 0; i < attr->num_values; i ++)
    add_stringf(errors, "GOT: %s=%s", attr->name,
    @@ -5213,7 +5242,7 @@
    case IPP_TAG_TEXTLANG :
    case IPP_TAG_URI :
    case IPP_TAG_URISCHEME :

  •    if (regex)
    
  •    if (flags & _CUPS_WITH_REGEX)
    

    {
    /*

    • Value is an extended, case-sensitive POSIX regular expression...
      @@ -5238,53 +5267,66 @@

      for (i = 0; i < attr->num_values; i ++)
      {

  •   if (regexec(&re, attr->values[i].string.text, 0, NULL, 0))
    
  •   if (!regexec(&re, attr->values[i].string.text, 0, NULL, 0))
    {
    
  •     if (errors)
    
  •       add_stringf(errors, "GOT: %s=\"%s\"", attr->name,
    
  •                    attr->values[i].string.text);
    
  •     else
    
  •     if (!matchbuf[0])
    
  •   strlcpy(matchbuf, attr->values[i].string.text, matchlen);
    
  •     if (!(flags & _CUPS_WITH_ALL))
    
  •     {
    
  •       match = 1;
        break;
    
  •     }
    }
    
  •   else if (flags & _CUPS_WITH_ALL)
    
  •   {
    
  •     match = 0;
    
  •     break;
    
  •   }
    

    }

    regfree(&re);

  •      if (i == attr->num_values)
    

- strlcpy(matchbuf, attr->values[0].string.text, matchlen);

  •      return (i == attr->num_values);
    

    }
    else
    {
    /*

  • \* Value is a literal string, see if at least one value matches the
    
  • \* literal string...
    
  • * Value is a literal string, see if the value(s) match...
    

    */

    for (i = 0; i < attr->num_values; i ++)
    {
    if (!strcmp(value, attr->values[i].string.text))
    {

  •     strlcpy(matchbuf, attr->values[i].string.text, matchlen);
    
  •     return (1);
    
  •     if (!matchbuf[0])
    
  •   strlcpy(matchbuf, attr->values[i].string.text, matchlen);
    
  •     if (!(flags & _CUPS_WITH_ALL))
    
  •     {
    
  •       match = 1;
    
  •       break;
    
  •     }
    }
    
  •   else if (flags & _CUPS_WITH_ALL)
    
  •   {
    
  •     match = 0;
    
  •     break;
    
  •   }
    

    }

  • }

  • if (errors)
    
  • {
    
  •   for (i = 0; i < attr->num_values; i ++)
    
  •     add_stringf(errors, "GOT: %s=\"%s\"", attr->name,
    
  •              attr->values[i].string.text);
    
  • }
    
  • }

  •    if (!match && errors)
    
  •    {
    
  • for (i = 0; i < attr->num_values; i ++)
    
  •   add_stringf(errors, "GOT: %s=\"%s\"", attr->name,
    
  •            attr->values[i].string.text);
    
  •    }
    

    break;

    default :
    break;
    }

  • return (0);

  • return (match);
    }

Index: CHANGES-IPPTOOL.txt

--- CHANGES-IPPTOOL.txt (revision 10312)
+++ CHANGES-IPPTOOL.txt (working copy)
@@ -1,10 +1,21 @@
-CHANGES-IPPTOOL.txt - 2012-02-06
+CHANGES-IPPTOOL.txt - 2012-02-28


This file provides a list of changes to the ipptool binary distribution posted
on cups.org.

+2012-02-28
+

    • Changed behavior of WITH-VALUES "/regex/" to not require all values to
  • match.
    
    • Added WITH-ALL-VALUES directive for EXPECT predicates that require all
  • values to match.
    
    • Updated test files to use WITH-ALL-VALUES where necessary.
    • Updated test files to use new ABNF for media names from PWG Media
  • Names 2.0.
    

    2012-02-06

    • Fixed the packaging of ipptool on Windows (removed unnecessary DLLs)

@michaelrsweet michaelrsweet added this to the Stable milestone Mar 17, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment