/*
- * "$Id: type.c 4970 2006-01-24 14:05:45Z mike $"
+ * "$Id: type.c 10996 2013-05-29 11:51:34Z msweet $"
*
- * MIME typing routines for the Common UNIX Printing System (CUPS).
+ * MIME typing routines for CUPS.
*
+ * Copyright 2007-2012 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
- * property of Easy Software Products and are protected by Federal
- * copyright law. Distribution and use rights are outlined in the file
- * "LICENSE.txt" which should have been included with this file. If this
- * file is missing or damaged please contact Easy Software Products
- * at:
- *
- * Attn: CUPS Licensing Information
- * Easy Software Products
- * 44141 Airport View Drive, Suite 204
- * Hollywood, Maryland 20636 USA
- *
- * Voice: (301) 373-9600
- * EMail: cups-info@cups.org
- * WWW: http://www.cups.org
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * 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/".
*
* Contents:
*
- * mimeAddType() - Add a MIME type to a database.
- * mimeAddTypeRule() - Add a detection rule for a file type.
- * mimeFileType() - Determine the type of a file.
- * mimeType() - Lookup a file type.
- * compare_types() - Compare two MIME super/type names.
- * checkrules() - Check each rule in a list.
- * patmatch() - Pattern matching...
+ * mimeAddType() - Add a MIME type to a database.
+ * mimeAddTypeRule() - Add a detection rule for a file type.
+ * mimeFileType() - Determine the type of a file.
+ * mimeType() - Lookup a file type.
+ * mime_compare_types() - Compare two MIME super/type names.
+ * mime_check_rules() - Check each rule in a list.
+ * mime_patmatch() - Pattern matching.
*/
/*
* Include necessary headers...
*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
+#include <cups/string-private.h>
+#include <cups/debug-private.h>
#include <locale.h>
-
-#include <cups/string.h>
#include "mime.h"
-#include <cups/debug.h>
+
+
+/*
+ * Local types...
+ */
+
+typedef struct _mime_filebuf_s /**** File buffer for MIME typing ****/
+{
+ cups_file_t *fp; /* File pointer */
+ int offset, /* Offset in file */
+ length; /* Length of buffered data */
+ unsigned char buffer[MIME_MAX_BUFFER];/* Buffered data */
+} _mime_filebuf_t;
/*
* Local functions...
*/
-static int compare_types(mime_type_t *t0, mime_type_t *t1);
-static int checkrules(const char *, cups_file_t *, mime_magic_t *);
-static int patmatch(const char *, const char *);
+static int mime_compare_types(mime_type_t *t0, mime_type_t *t1);
+static int mime_check_rules(const char *filename, _mime_filebuf_t *fb,
+ mime_magic_t *rules);
+static int mime_patmatch(const char *s, const char *pat);
+
+
+/*
+ * Local globals...
+ */
+
+#ifdef DEBUG
+static const char * const debug_ops[] =
+ { /* Test names... */
+ "NOP", /* No operation */
+ "AND", /* Logical AND of all children */
+ "OR", /* Logical OR of all children */
+ "MATCH", /* Filename match */
+ "ASCII", /* ASCII characters in range */
+ "PRINTABLE", /* Printable characters (32-255) */
+ "STRING", /* String matches */
+ "CHAR", /* Character/byte matches */
+ "SHORT", /* Short/16-bit word matches */
+ "INT", /* Integer/32-bit word matches */
+ "LOCALE", /* Current locale matches string */
+ "CONTAINS", /* File contains a string */
+ "ISTRING" /* Case-insensitive string matches */
+ };
+#endif /* DEBUG */
/*
const char *type) /* I - Type name */
{
mime_type_t *temp; /* New MIME type */
+ size_t typelen; /* Length of type name */
+ DEBUG_printf(("mimeAddType(mime=%p, super=\"%s\", type=\"%s\")", mime, super,
+ type));
+
/*
* Range check input...
*/
if (!mime || !super || !type)
+ {
+ DEBUG_puts("1mimeAddType: Returning NULL (bad arguments).");
return (NULL);
+ }
/*
* See if the type already exists; if so, return the existing type...
*/
if ((temp = mimeType(mime, super, type)) != NULL)
+ {
+ DEBUG_printf(("1mimeAddType: Returning %p (existing).", temp));
return (temp);
+ }
/*
* The type doesn't exist; add it...
*/
if (!mime->types)
- mime->types = cupsArrayNew((cups_array_func_t)compare_types, NULL);
+ mime->types = cupsArrayNew((cups_array_func_t)mime_compare_types, NULL);
if (!mime->types)
+ {
+ DEBUG_puts("1mimeAddType: Returning NULL (no types).");
return (NULL);
+ }
- if ((temp = calloc(1, sizeof(mime_type_t) - MIME_MAX_TYPE +
- strlen(type) + 1)) == NULL)
+ typelen = strlen(type) + 1;
+
+ if ((temp = calloc(1, sizeof(mime_type_t) - MIME_MAX_TYPE + typelen)) == NULL)
+ {
+ DEBUG_puts("1mimeAddType: Returning NULL (out of memory).");
return (NULL);
+ }
strlcpy(temp->super, super, sizeof(temp->super));
- strcpy(temp->type, type); /* Safe: temp->type is allocated */
+ memcpy(temp->type, type, typelen);
+ temp->priority = 100;
cupsArrayAdd(mime->types, temp);
+ DEBUG_printf(("1mimeAddType: Returning %p (new).", temp));
return (temp);
}
*current; /* Current rule */
+ DEBUG_printf(("mimeAddTypeRule(mt=%p(%s/%s), rule=\"%s\")", mt,
+ mt ? mt->super : "???", mt ? mt->type : "???", rule));
+
/*
* Range check input...
*/
logic = MIME_MAGIC_NOP;
invert = 0;
- DEBUG_printf(("%s/%s: %s\n", mt->super, mt->type, rule));
-
while (*rule != '\0')
{
while (isspace(*rule & 255))
if (*rule == '(')
{
- DEBUG_puts("new parenthesis group");
+ DEBUG_puts("1mimeAddTypeRule: New parenthesis group");
logic = MIME_MAGIC_NOP;
rule ++;
}
else if (*rule == ')')
{
- DEBUG_puts("close paren...");
+ DEBUG_puts("1mimeAddTypeRule: Close paren...");
if (current == NULL || current->parent == NULL)
return (-1);
else if (*rule == '+' && current != NULL)
{
if (logic != MIME_MAGIC_AND &&
- current != NULL && current->prev != NULL && current->prev->prev != NULL)
+ current != NULL && current->prev != NULL)
{
/*
* OK, we have more than 1 rule in the current tree level... Make a
current->prev = NULL;
current->parent = temp;
- DEBUG_printf(("creating new AND group %p...\n", temp));
+ DEBUG_printf(("1mimeAddTypeRule: Creating new AND group %p.", temp));
}
- else
+ else if (current->parent)
{
- DEBUG_printf(("setting group %p op to AND...\n", current->parent));
+ DEBUG_printf(("1mimeAddTypeRule: Setting group %p op to AND.",
+ current->parent));
current->parent->op = MIME_MAGIC_AND;
}
if ((temp = calloc(1, sizeof(mime_magic_t))) == NULL)
return (-1);
- DEBUG_printf(("creating new AND group %p inside OR group\n", temp));
+ DEBUG_printf(("1mimeAddTypeRule: Creating new AND group %p inside OR "
+ "group.", temp));
while (current->prev != NULL)
{
* This isn't the top rule, so go up one level...
*/
- DEBUG_puts("going up one level");
+ DEBUG_puts("1mimeAddTypeRule: Going up one level.");
current = current->parent;
}
}
}
else if (*rule == '!')
{
- DEBUG_puts("NOT");
+ DEBUG_puts("1mimeAddTypeRule: NOT");
invert = 1;
rule ++;
}
* Read an extension name or a function...
*/
- for (ptr = name; isalnum(*rule & 255) && (ptr - name) < (sizeof(name) - 1);)
+ ptr = name;
+ while (isalnum(*rule & 255) && (ptr - name) < (sizeof(name) - 1))
*ptr++ = *rule++;
- *ptr = '\0';
- num_values = 0;
+ *ptr = '\0';
if (*rule == '(')
{
length[num_values] = ptr - value[num_values];
if (*rule != ',')
+ {
+ num_values ++;
break;
+ }
rule ++;
}
op = MIME_MAGIC_LOCALE;
else if (!strcmp(name, "contains"))
op = MIME_MAGIC_CONTAINS;
+ else if (!strcmp(name, "priority") && num_values == 1)
+ {
+ mt->priority = atoi(value[0]);
+ continue;
+ }
else
return (-1);
}
snprintf(value[0], sizeof(value[0]), "*.%s", name);
length[0] = strlen(value[0]);
- num_values = 1;
op = MIME_MAGIC_MATCH;
}
* Add parenthetical grouping...
*/
- DEBUG_printf(("making new OR group %p for parenthesis...\n", temp));
+ DEBUG_printf(("1mimeAddTypeRule: Making new OR group %p for "
+ "parenthesis.", temp));
temp->op = MIME_MAGIC_OR;
return (-1);
temp->child->parent = temp;
+ temp->child->invert = temp->invert;
+ temp->invert = 0;
temp = temp->child;
logic = MIME_MAGIC_OR;
}
- DEBUG_printf(("adding %p: %s, op = %d, logic = %d, invert = %d\n",
- temp, name, op, logic, invert));
+ DEBUG_printf(("1mimeAddTypeRule: Adding %p: %s, op=MIME_MAGIC_%s(%d), "
+ "logic=MIME_MAGIC_%s, invert=%d.", temp, name,
+ debug_ops[op], op, debug_ops[logic], invert));
/*
* Fill in data for the rule...
case MIME_MAGIC_MATCH :
if (length[0] > (sizeof(temp->value.matchv) - 1))
return (-1);
- strcpy(temp->value.matchv, value[0]);
+ strlcpy(temp->value.matchv, value[0], sizeof(temp->value.matchv));
break;
case MIME_MAGIC_ASCII :
case MIME_MAGIC_PRINTABLE :
if (length[1] == 1)
temp->value.charv = value[1][0];
else
- temp->value.charv = (char)strtol(value[1], NULL, 0);
+ temp->value.charv = (unsigned char)strtol(value[1], NULL, 0);
+
+ DEBUG_printf(("1mimeAddTypeRule: CHAR(%d,0x%02x)", temp->offset,
+ temp->value.charv));
break;
case MIME_MAGIC_SHORT :
temp->offset = strtol(value[0], NULL, 0);
- temp->value.shortv = (short)strtol(value[1], NULL, 0);
+ temp->value.shortv = (unsigned short)strtol(value[1], NULL, 0);
break;
case MIME_MAGIC_INT :
temp->offset = strtol(value[0], NULL, 0);
- temp->value.intv = (int)strtol(value[1], NULL, 0);
+ temp->value.intv = (unsigned)strtol(value[1], NULL, 0);
break;
case MIME_MAGIC_LOCALE :
if (length[0] > (sizeof(temp->value.localev) - 1))
return (-1);
- strcpy(temp->value.localev, value[0]);
+ strlcpy(temp->value.localev, value[0], sizeof(temp->value.localev));
break;
case MIME_MAGIC_CONTAINS :
temp->offset = strtol(value[0], NULL, 0);
mime_type_t * /* O - Type of file */
mimeFileType(mime_t *mime, /* I - MIME database */
- const char *pathname, /* I - Name of file to check */
+ const char *pathname, /* I - Name of file to check on disk */
+ const char *filename, /* I - Original filename or NULL */
int *compression) /* O - Is the file compressed? */
{
- cups_file_t *fp; /* File pointer */
- mime_type_t *type; /* File type */
- const char *filename; /* Base filename of file */
+ _mime_filebuf_t fb; /* File buffer */
+ const char *base; /* Base filename of file */
+ mime_type_t *type, /* File type */
+ *best; /* Best match */
- DEBUG_printf(("mimeFileType(mime=%p, pathname=\"%s\", compression=%p)\n",
- mime, pathname ? pathname : "(nil)", compression));
+ DEBUG_printf(("mimeFileType(mime=%p, pathname=\"%s\", filename=\"%s\", "
+ "compression=%p)", mime, pathname, filename, compression));
/*
* Range check input parameters...
*/
if (!mime || !pathname)
+ {
+ DEBUG_puts("1mimeFileType: Returning NULL.");
return (NULL);
+ }
/*
* Try to open the file...
*/
- if ((fp = cupsFileOpen(pathname, "r")) == NULL)
+ if ((fb.fp = cupsFileOpen(pathname, "r")) == NULL)
+ {
+ DEBUG_printf(("1mimeFileType: Unable to open \"%s\": %s", pathname,
+ strerror(errno)));
+ DEBUG_puts("1mimeFileType: Returning NULL.");
return (NULL);
+ }
+
+ fb.offset = -1;
+ fb.length = 0;
/*
- * Figure out the filename (without directory portion)...
+ * Figure out the base filename (without directory portion)...
*/
- if ((filename = strrchr(pathname, '/')) != NULL)
- filename ++;
+ if (filename)
+ {
+ if ((base = strrchr(filename, '/')) != NULL)
+ base ++;
+ else
+ base = filename;
+ }
+ else if ((base = strrchr(pathname, '/')) != NULL)
+ base ++;
else
- filename = pathname;
+ base = pathname;
/*
* Then check it against all known types...
*/
- for (type = (mime_type_t *)cupsArrayFirst(mime->types);
+ for (type = (mime_type_t *)cupsArrayFirst(mime->types), best = NULL;
type;
type = (mime_type_t *)cupsArrayNext(mime->types))
- if (checkrules(filename, fp, type->rules))
- break;
+ if (mime_check_rules(base, &fb, type->rules))
+ {
+ if (!best || type->priority > best->priority)
+ best = type;
+ }
/*
* Finally, close the file and return a match (if any)...
*/
if (compression)
- *compression = cupsFileCompression(fp);
+ {
+ *compression = cupsFileCompression(fb.fp);
+ DEBUG_printf(("1mimeFileType: *compression=%d", *compression));
+ }
- cupsFileClose(fp);
+ cupsFileClose(fb.fp);
- return (type);
+ DEBUG_printf(("1mimeFileType: Returning %p(%s/%s).", best,
+ best ? best->super : "???", best ? best->type : "???"));
+ return (best);
}
const char *super, /* I - Super-type name */
const char *type) /* I - Type name */
{
- mime_type_t key; /* MIME type search key*/
+ mime_type_t key, /* MIME type search key */
+ *mt; /* Matching type */
+
+ DEBUG_printf(("mimeType(mime=%p, super=\"%s\", type=\"%s\")", mime, super,
+ type));
/*
* Range check input...
*/
if (!mime || !super || !type)
+ {
+ DEBUG_puts("1mimeType: Returning NULL.");
return (NULL);
+ }
/*
* Lookup the type in the array...
strlcpy(key.super, super, sizeof(key.super));
strlcpy(key.type, type, sizeof(key.type));
- return ((mime_type_t *)cupsArrayFind(mime->types, &key));
+ mt = (mime_type_t *)cupsArrayFind(mime->types, &key);
+ DEBUG_printf(("1mimeType: Returning %p.", mt));
+ return (mt);
}
/*
- * 'compare_types()' - Compare two MIME super/type names.
+ * 'mime_compare_types()' - Compare two MIME super/type names.
*/
static int /* O - Result of comparison */
-compare_types(mime_type_t *t0, /* I - First type */
- mime_type_t *t1) /* I - Second type */
+mime_compare_types(mime_type_t *t0, /* I - First type */
+ mime_type_t *t1) /* I - Second type */
{
int i; /* Result of comparison */
- if ((i = strcmp(t0->super, t1->super)) == 0)
- i = strcmp(t0->type, t1->type);
+ if ((i = _cups_strcasecmp(t0->super, t1->super)) == 0)
+ i = _cups_strcasecmp(t0->type, t1->type);
return (i);
}
/*
- * 'checkrules()' - Check each rule in a list.
+ * 'mime_check_rules()' - Check each rule in a list.
*/
static int /* O - 1 if match, 0 if no match */
-checkrules(const char *filename, /* I - Filename */
- cups_file_t *fp, /* I - File to check */
- mime_magic_t *rules) /* I - Rules to check */
+mime_check_rules(
+ const char *filename, /* I - Filename */
+ _mime_filebuf_t *fb, /* I - File to check */
+ mime_magic_t *rules) /* I - Rules to check */
{
int n; /* Looping var */
int region; /* Region to look at */
result, /* Result of test */
intv; /* Integer value */
short shortv; /* Short value */
- unsigned char buffer[MIME_MAX_BUFFER],/* Input buffer */
- *bufptr; /* Current buffer position */
- int bufoffset, /* Offset in file for buffer */
- buflength; /* Length of data in buffer */
-#ifdef DEBUG
- const char * const debug_tests[] = /* Test names... */
- {
- "NOP", /* No operation */
- "AND", /* Logical AND of all children */
- "OR", /* Logical OR of all children */
- "MATCH", /* Filename match */
- "ASCII", /* ASCII characters in range */
- "PRINTABLE", /* Printable characters (32-255) in range */
- "STRING", /* String matches */
- "CHAR", /* Character/byte matches */
- "SHORT", /* Short/16-bit word matches */
- "INT", /* Integer/32-bit word matches */
- "LOCALE" /* Current locale matches string */
- "CONTAINS" /* File contains a string */
- "ISTRING" /* Case-insensitive string matches */
- };
-#endif /* DEBUG */
+ unsigned char *bufptr; /* Pointer into buffer */
- DEBUG_printf(("checkrules(filename=\"%s\", fp=%p, rules=%p)\n", filename,
- fp, rules));
+ DEBUG_printf(("4mime_check_rules(filename=\"%s\", fb=%p, rules=%p)", filename,
+ fb, rules));
if (rules == NULL)
return (0);
else
logic = rules->parent->op;
- bufoffset = -1;
- buflength = 0;
- result = 0;
+ result = 0;
while (rules != NULL)
{
switch (rules->op)
{
case MIME_MAGIC_MATCH :
- result = patmatch(filename, rules->value.matchv);
+ result = mime_patmatch(filename, rules->value.matchv);
break;
case MIME_MAGIC_ASCII :
* Load the buffer if necessary...
*/
- if (bufoffset < 0 || rules->offset < bufoffset ||
- (rules->offset + rules->length) > (bufoffset + buflength))
+ if (fb->offset < 0 || rules->offset < fb->offset ||
+ (rules->offset + rules->length) > (fb->offset + fb->length))
{
/*
* Reload file buffer...
*/
- cupsFileSeek(fp, rules->offset);
- buflength = cupsFileRead(fp, (char *)buffer, sizeof(buffer));
- bufoffset = rules->offset;
+ cupsFileSeek(fb->fp, rules->offset);
+ fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
+ sizeof(fb->buffer));
+ fb->offset = rules->offset;
}
/*
* Test for ASCII printable characters plus standard control chars.
*/
- if ((rules->offset + rules->length) > (bufoffset + buflength))
- n = bufoffset + buflength - rules->offset;
+ if ((rules->offset + rules->length) > (fb->offset + fb->length))
+ n = fb->offset + fb->length - rules->offset;
else
n = rules->length;
- bufptr = buffer + rules->offset - bufoffset;
+ bufptr = fb->buffer + rules->offset - fb->offset;
while (n > 0)
if ((*bufptr >= 32 && *bufptr <= 126) ||
(*bufptr >= 8 && *bufptr <= 13) ||
* Load the buffer if necessary...
*/
- if (bufoffset < 0 || rules->offset < bufoffset ||
- (rules->offset + rules->length) > (bufoffset + buflength))
+ if (fb->offset < 0 || rules->offset < fb->offset ||
+ (rules->offset + rules->length) > (fb->offset + fb->length))
{
/*
* Reload file buffer...
*/
- cupsFileSeek(fp, rules->offset);
- buflength = cupsFileRead(fp, (char *)buffer, sizeof(buffer));
- bufoffset = rules->offset;
+ cupsFileSeek(fb->fp, rules->offset);
+ fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
+ sizeof(fb->buffer));
+ fb->offset = rules->offset;
}
/*
* Test for 8-bit printable characters plus standard control chars.
*/
- if ((rules->offset + rules->length) > (bufoffset + buflength))
- n = bufoffset + buflength - rules->offset;
+ if ((rules->offset + rules->length) > (fb->offset + fb->length))
+ n = fb->offset + fb->length - rules->offset;
else
n = rules->length;
- bufptr = buffer + rules->offset - bufoffset;
+ bufptr = fb->buffer + rules->offset - fb->offset;
while (n > 0)
if (*bufptr >= 128 ||
break;
case MIME_MAGIC_STRING :
- DEBUG_printf((" string(%d, \"%s\")\n", rules->offset,
+ DEBUG_printf(("5mime_check_rules: string(%d, \"%s\")", rules->offset,
rules->value.stringv));
/*
* Load the buffer if necessary...
*/
- if (bufoffset < 0 || rules->offset < bufoffset ||
- (rules->offset + rules->length) > (bufoffset + buflength))
+ if (fb->offset < 0 || rules->offset < fb->offset ||
+ (rules->offset + rules->length) > (fb->offset + fb->length))
{
/*
* Reload file buffer...
*/
- cupsFileSeek(fp, rules->offset);
- buflength = cupsFileRead(fp, (char *)buffer, sizeof(buffer));
- bufoffset = rules->offset;
+ cupsFileSeek(fb->fp, rules->offset);
+ fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
+ sizeof(fb->buffer));
+ fb->offset = rules->offset;
- DEBUG_printf((" loaded %d byte buffer at %d, starts with \"%c%c%c%c\"...\n",
- buflength, bufoffset, buffer[0], buffer[1],
- buffer[2], buffer[3]));
+ DEBUG_printf(("5mime_check_rules: loaded %d byte fb->buffer at %d, starts "
+ "with \"%c%c%c%c\".",
+ fb->length, fb->offset, fb->buffer[0], fb->buffer[1],
+ fb->buffer[2], fb->buffer[3]));
}
/*
* short then don't compare - it can't match...
*/
- if ((rules->offset + rules->length) > (bufoffset + buflength))
+ if ((rules->offset + rules->length) > (fb->offset + fb->length))
result = 0;
else
- result = (memcmp(buffer + rules->offset - bufoffset,
+ result = (memcmp(fb->buffer + rules->offset - fb->offset,
rules->value.stringv, rules->length) == 0);
- DEBUG_printf((" result=%d\n", result));
+ DEBUG_printf(("5mime_check_rules: result=%d", result));
break;
case MIME_MAGIC_ISTRING :
* Load the buffer if necessary...
*/
- if (bufoffset < 0 || rules->offset < bufoffset ||
- (rules->offset + rules->length) > (bufoffset + buflength))
+ if (fb->offset < 0 || rules->offset < fb->offset ||
+ (rules->offset + rules->length) > (fb->offset + fb->length))
{
/*
* Reload file buffer...
*/
- cupsFileSeek(fp, rules->offset);
- buflength = cupsFileRead(fp, (char *)buffer, sizeof(buffer));
- bufoffset = rules->offset;
+ cupsFileSeek(fb->fp, rules->offset);
+ fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
+ sizeof(fb->buffer));
+ fb->offset = rules->offset;
}
/*
* short then don't compare - it can't match...
*/
- if ((rules->offset + rules->length) > (bufoffset + buflength))
+ if ((rules->offset + rules->length) > (fb->offset + fb->length))
result = 0;
else
- result = (strncasecmp((char *)buffer + rules->offset - bufoffset,
+ result = (_cups_strncasecmp((char *)fb->buffer + rules->offset -
+ fb->offset,
rules->value.stringv, rules->length) == 0);
break;
* Load the buffer if necessary...
*/
- if (bufoffset < 0 || rules->offset < bufoffset)
+ if (fb->offset < 0 || rules->offset < fb->offset)
{
/*
* Reload file buffer...
*/
- cupsFileSeek(fp, rules->offset);
- buflength = cupsFileRead(fp, (char *)buffer, sizeof(buffer));
- bufoffset = rules->offset;
+ cupsFileSeek(fb->fp, rules->offset);
+ fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
+ sizeof(fb->buffer));
+ fb->offset = rules->offset;
}
/*
* can't match...
*/
- if (buflength < 1)
+ if (fb->length < 1)
result = 0;
else
- result = (buffer[rules->offset - bufoffset] == rules->value.charv);
+ result = (fb->buffer[rules->offset - fb->offset] ==
+ rules->value.charv);
break;
case MIME_MAGIC_SHORT :
* Load the buffer if necessary...
*/
- if (bufoffset < 0 || rules->offset < bufoffset ||
- (rules->offset + 2) > (bufoffset + buflength))
+ if (fb->offset < 0 || rules->offset < fb->offset ||
+ (rules->offset + 2) > (fb->offset + fb->length))
{
/*
* Reload file buffer...
*/
- cupsFileSeek(fp, rules->offset);
- buflength = cupsFileRead(fp, (char *)buffer, sizeof(buffer));
- bufoffset = rules->offset;
+ cupsFileSeek(fb->fp, rules->offset);
+ fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
+ sizeof(fb->buffer));
+ fb->offset = rules->offset;
}
/*
* can't match...
*/
- if (buflength < 2)
+ if (fb->length < 2)
result = 0;
else
{
- bufptr = buffer + rules->offset - bufoffset;
+ bufptr = fb->buffer + rules->offset - fb->offset;
shortv = (bufptr[0] << 8) | bufptr[1];
result = (shortv == rules->value.shortv);
}
* Load the buffer if necessary...
*/
- if (bufoffset < 0 || rules->offset < bufoffset ||
- (rules->offset + 4) > (bufoffset + buflength))
+ if (fb->offset < 0 || rules->offset < fb->offset ||
+ (rules->offset + 4) > (fb->offset + fb->length))
{
/*
* Reload file buffer...
*/
- cupsFileSeek(fp, rules->offset);
- buflength = cupsFileRead(fp, (char *)buffer, sizeof(buffer));
- bufoffset = rules->offset;
+ cupsFileSeek(fb->fp, rules->offset);
+ fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
+ sizeof(fb->buffer));
+ fb->offset = rules->offset;
}
/*
* can't match...
*/
- if (buflength < 4)
+ if (fb->length < 4)
result = 0;
else
{
- bufptr = buffer + rules->offset - bufoffset;
- intv = (((((bufptr[0] << 8) | bufptr[1]) << 8) | bufptr[2]) << 8) |
- bufptr[3];;
+ bufptr = fb->buffer + rules->offset - fb->offset;
+ intv = (((((bufptr[0] << 8) | bufptr[1]) << 8) |
+ bufptr[2]) << 8) | bufptr[3];
result = (intv == rules->value.intv);
}
break;
case MIME_MAGIC_LOCALE :
#if defined(WIN32) || defined(__EMX__) || defined(__APPLE__)
- result = (strcmp(rules->value.localev, setlocale(LC_ALL, "")) == 0);
+ result = (strcmp(rules->value.localev,
+ setlocale(LC_ALL, "")) == 0);
#else
- result = (strcmp(rules->value.localev, setlocale(LC_MESSAGES, "")) == 0);
+ result = (strcmp(rules->value.localev,
+ setlocale(LC_MESSAGES, "")) == 0);
#endif /* __APPLE__ */
break;
* Load the buffer if necessary...
*/
- if (bufoffset < 0 || rules->offset < bufoffset ||
- (rules->offset + rules->region) > (bufoffset + buflength))
+ if (fb->offset < 0 || rules->offset < fb->offset ||
+ (rules->offset + rules->region) > (fb->offset + fb->length))
{
/*
* Reload file buffer...
*/
- cupsFileSeek(fp, rules->offset);
- buflength = cupsFileRead(fp, (char *)buffer, sizeof(buffer));
- bufoffset = rules->offset;
+ cupsFileSeek(fb->fp, rules->offset);
+ fb->length = cupsFileRead(fb->fp, (char *)fb->buffer,
+ sizeof(fb->buffer));
+ fb->offset = rules->offset;
}
/*
* short then don't compare - it can't match...
*/
- if ((rules->offset + rules->length) > (bufoffset + buflength))
+ if ((rules->offset + rules->length) > (fb->offset + fb->length))
result = 0;
else
{
- if (buflength > rules->region)
+ if (fb->length > rules->region)
region = rules->region - rules->length;
else
- region = buflength - rules->length;
+ region = fb->length - rules->length;
for (n = 0; n < region; n ++)
- if ((result = (memcmp(buffer + rules->offset - bufoffset + n,
- rules->value.stringv, rules->length) == 0)) != 0)
+ if ((result = (memcmp(fb->buffer + rules->offset - fb->offset + n,
+ rules->value.stringv,
+ rules->length) == 0)) != 0)
break;
}
break;
default :
if (rules->child != NULL)
- result = checkrules(filename, fp, rules->child);
+ result = mime_check_rules(filename, fb, rules->child);
else
result = 0;
break;
* the the rule set is false...
*/
- DEBUG_printf((" result of test %p (MIME_MAGIC_%s) is %d\n", rules,
- debug_tests[rules->op], result));
+ DEBUG_printf(("5mime_check_rules: result of test %p (MIME_MAGIC_%s) is %d",
+ rules, debug_ops[rules->op], result));
if ((result && logic == MIME_MAGIC_OR) ||
(!result && logic == MIME_MAGIC_AND))
/*
- * 'patmatch()' - Pattern matching...
+ * 'mime_patmatch()' - Pattern matching.
*/
-static int /* O - 1 if match, 0 if no match */
-patmatch(const char *s, /* I - String to match against */
- const char *pat) /* I - Pattern to match against */
+static int /* O - 1 if match, 0 if no match */
+mime_patmatch(const char *s, /* I - String to match against */
+ const char *pat) /* I - Pattern to match against */
{
/*
* Range check the input...
pat ++;
if (*pat == '\0')
- return (1); /* Last pattern char is *, so everything matches now... */
+ return (1); /* Last pattern char is *, so everything matches... */
/*
* Test all remaining combinations until we get to the end of the string.
while (*s != '\0')
{
- if (patmatch(s, pat))
+ if (mime_patmatch(s, pat))
return (1);
s ++;
}
/*
- * Done parsing the pattern and string; return 1 if the last character matches
- * and 0 otherwise...
+ * Done parsing the pattern and string; return 1 if the last character
+ * matches and 0 otherwise...
*/
return (*s == *pat);
/*
- * End of "$Id: type.c 4970 2006-01-24 14:05:45Z mike $".
+ * End of "$Id: type.c 10996 2013-05-29 11:51:34Z msweet $".
*/