static gchar * xmms_magic_match (xmms_magic_checker_t *c, const gchar *uri) { const GList *l; gchar *u, *dump; int i; g_return_val_if_fail (c, NULL); /* only one of the contained sets has to match */ for (l = magic_list; l; l = g_list_next (l)) { GNode *tree = l->data; if (tree_match (c, tree)) { gpointer *data = tree->data; XMMS_DBG ("magic plugin detected '%s' (%s)", (char *)data[1], (char *)data[0]); return (char *) (data[1]); } } if (!uri) return NULL; u = g_ascii_strdown (uri, -1); for (l = ext_list; l; l = g_list_next (l)) { xmms_magic_ext_data_t *e = l->data; if (g_pattern_match_simple (e->pattern, u)) { XMMS_DBG ("magic plugin detected '%s' (by extension '%s')", e->type, e->pattern); g_free (u); return e->type; } } g_free (u); if (c->dumpcount > 0) { dump = g_malloc ((MIN (c->read, c->dumpcount) * 3) + 1); u = dump; XMMS_DBG ("Magic didn't match anything..."); for (i = 0; i < c->dumpcount && i < c->read; i++) { g_sprintf (u, "%02X ", (unsigned char)c->buf[i]); u += 3; } XMMS_DBG ("%s", dump); g_free (dump); } return NULL; }
static gboolean tree_match (xmms_magic_checker_t *c, GNode *tree) { GNode *n; /* empty subtrees match anything */ if (!tree->children) { return TRUE; } for (n = tree->children; n; n = n->next) { if (node_match (c, n) && tree_match (c, n)) { return TRUE; } } return FALSE; }
static gchar * xmms_magic_match (xmms_magic_checker_t *c, const gchar *uri) { const GList *l; gchar *u; g_return_val_if_fail (c, NULL); /* only one of the contained sets has to match */ for (l = magic_list; l; l = g_list_next (l)) { GNode *tree = l->data; if (tree_match (c, tree)) { gpointer *data = tree->data; XMMS_DBG ("magic plugin detected '%s' (%s)", (char *)data[1], (char *)data[0]); return (char *) (data[1]); } } if (!uri) return NULL; u = g_ascii_strdown (uri, -1); for (l = ext_list; l; l = g_list_next (l)) { xmms_magic_ext_data_t *e = l->data; if (g_pattern_match_simple (e->pattern, u)) { XMMS_DBG ("magic plugin detected '%s' (by extension '%s')", e->type, e->pattern); g_free (u); return e->type; } } g_free (u); return NULL; }