When we have input the patterns in the tracker-preferences which we want
to ignored, we also can get the results that match the patterns.

That's to say, the feature that "ignored patterns" hasn't been realized.

The patch and the two files (tracker-glob.c & tracker-glob.h) attached
to this email have been completed this feature.

Best wishes.
Index: /export/home/wendy/tracker/trunk/src/trackerd/tracker-utils.c
===================================================================
 	/* test prefixes */
 	for (st = ignore_prefix; *st; st++) {
 		if (g_str_has_prefix (name, *st)) {
@@ -2278,7 +2280,19 @@
 		}
 	}
 
+	/* test is no index file types */
+	if (tracker->no_index_file_types) {
+		static char **no_index_array = tracker_list_to_array (tracker->no_index_file_types);
 
+		for (st = no_index_array; *st; st++) {
+			Aglob *ptn = glob_parse (*st);
+			if (globsto (name, ptn)) {
+				g_free (name);
+				return TRUE;
+			}
+		}
+	}
+
 	g_free (name);
 	return FALSE;
 }
#include <glib.h>
#include "config.h"

#define GLOB_CHAR		0	/* literal character */
#define GLOB_RANGE	1	/* character range */
#define GLOB_STAR		2	/* asterisk */
#define GLOB_PTN		3	/* subpattern */

#define CHARSPERRANGE	((int) ( 1 << CHAR_BIT))
#define RANGESIZE		(CHARSPERRANGE / CHAR_BIT)

typedef struct Aglob Aglob;
typedef struct Aglob { 
	unsigned int invert: 1;
	unsigned int type: 2;
	union { 
		char	*cp;
		char	*rp;
		Aglob	*ptn;
		char	*str;
	} u;
};

static char *range(char *string, char **rpp);
static char *subglob_parse (char *string, int inner, Aglob **ptnp);
Aglob *glob_parse (char *string);
gboolean globsto (char *string, Aglob ptn[]);

#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif

#include "config.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "tracker-dbus.h"
#include "tracker-indexer.h"
#include "tracker-glob.h"

#define GPNULL ((Aglob *)NULL)

#define dispose(p) if (!(p)) ; else (free(p), (p) = (void*)0)

#define last_ptn(ptn)	((ptn).type == GLOB_CHAR && (ptn).u.cp == NULL)

#define inrange(rp,c)	((rp) == NULL || ( (rp) [(c) / CHAR_BIT] & (1 << ((c) % CHAR_BIT))) != 0)

extern Tracker	*tracker;


static char *
range(char *string, char **rpp)
{
	char	*rp;
	int	invert;
	int	i;

	if (rpp != NULL) { 
		rp = (char *) malloc (RANGESIZE);
		memset ((rp), 0, (RANGESIZE));	
	}	

	if ((invert = (*string == '^')))
		string++;

	while (*string != '\0' && *string != ']') {
		char	c1,c2;

		if (*string == '\\')
			if (*++string == '\0')
				break;
			else
				c1 = *string++;
		else
			if (*string == '-')
				c1=0;
			else
				c1 = *string++;

	
		if (*string != '-')
			c2=c1;
		else
			if (*++string == '\\')
				if (*++string == '\0')
					break;
				else
					c2 = *string++;
			else
				if (*string == '-' || *string == ']')
					c2 = CHARSPERRANGE - 1;
				else
					c2 = *string++;

		if (rpp != NULL) {
			for (i = c1; i <= c2; i++)
				rp[i / CHAR_BIT] |= (1 << (i % CHAR_BIT));
		}
	}

	if (*string != ']') {
		if (rpp != NULL)
			dispose (rp);
		return NULL;
	}
	else
		string++;

	if (invert && rpp != NULL) {
		for (i = 0; i < RANGESIZE; i++)
			rp[i] ^= ~0; 
	}

	if (rpp != NULL) {
		*rpp = rp;
	}
	
	return string;
}


static char *
subglob_parse (char *string, int inner, Aglob **ptnp) 
{
	char *cp, *cp2;
	int nptns;
	Aglob	*ptns, *ptnp2;
	int invert;

	cp = string;
	nptns = 1;	/* <-- allows for terminator */
	while (*cp != '\0' && (!inner || *cp != '}')) {
		switch (*cp) { 
			case '\\' : 
					if (*++cp != '\0')
						cp++;
					break;
		 	case '[' : 
					if ((cp2 = range (cp+1, NULL)) != NULL)
						cp = cp2;
					else
						cp++;
					break;
		  	case '!' : 
					if (*++cp != '\0')
						nptns--;
					break;
		   	case '?' :
		  	case '*' :
					cp++;
					break;
		 	case '{' :
					if ((cp2 = subglob_parse (cp+1, TRUE, GPNULL)) != NULL)
						cp = cp2;
					else
						cp++;
					break;
		    	default :
					cp++;
					break;
		  }
		nptns++;
	}

	/* not a sub-pattern */
	if (inner && *cp != '}')
		return NULL;

	if (ptnp == NULL) {
		if (inner)
			cp++;
		return cp;
	}

	ptns = ((Aglob *) malloc ((nptns) * sizeof (Aglob)));
	ptnp2 = ptns;
	cp = string;
	invert = FALSE;
	while (*cp != '\0' && (!inner || *cp != '}')) {
		Aglob	ptn;
		int is_invert;

		is_invert = FALSE;
		switch (*cp) {

			case '\\':
				if (cp[1] != '\0')
					cp++;

			 	ptn.type = GLOB_CHAR;
			 	ptn.u.cp = cp;
			 	cp++;
				break;

		    case '[': 
				if ((cp2 = range (cp+1, &ptn.u.rp)) != NULL) { 
					ptn.type = GLOB_RANGE;
					cp = cp2;
				}
				else {
					ptn.type = GLOB_CHAR;
			 		ptn.u.cp = cp;
				 	cp++;
				 }
				break;

		    case '!':
				if (*++cp != '\0') {
					invert ^= TRUE;
					is_invert = TRUE;
				}
				else { 
					ptn.type = GLOB_CHAR;
					ptn.u.cp = cp - 1;
				  }
				break;

		    case '?': 
				invert = FALSE;
				ptn.type = GLOB_RANGE;
				ptn.u.rp = NULL;
				cp++;
				break;

		    case '*':
				ptn.type = GLOB_STAR;
				cp++;
				break;

		    case '{': 
				if ((cp2 = subglob_parse (cp+1,TRUE, &ptn.u.ptn)) != NULL) {
					ptn.type = GLOB_PTN;
					cp = cp2;
				}
				else {
					ptn.type = GLOB_CHAR;
					ptn.u.cp = cp;
					cp++;
				}
				break;

		    default: 
				ptn.type = GLOB_CHAR;
				ptn.u.cp = cp;
				cp++;
				break;
		  }

		  if (!is_invert) {
			ptn.invert = invert;
			invert = FALSE;
			*ptnp2++ = ptn;
		}
	}

	ptnp2->type = GLOB_CHAR;
	ptnp2->u.cp = NULL;

	if (*cp != '\0' && inner)
		cp++;

	*ptnp = ptns;

	return cp;
}


Aglob *
glob_parse (char *string)
{
	Aglob	*ptn;
	char *cp;

	if ((cp = subglob_parse (string, FALSE, &ptn)) == NULL)
		return NULL;

	return ptn;
}


gboolean
globsto (char *string, Aglob ptn[])
{
	gboolean match;

	for (match = TRUE; match && !last_ptn(*ptn); ptn++)
		switch(ptn->type) {
	
			case GLOB_CHAR:
				match = ((*string == ptn->u.cp[0]) ^ ptn->invert);
				string++;
				break;
	
			case GLOB_RANGE:
				match = (inrange(ptn->u.rp,*string) ^ ptn->invert);
				string++;
				break;

			case GLOB_STAR: 
				if (ptn->invert)
					match = FALSE;
				else {
					char *tail;
					for (tail = string + strlen (string); tail >= string; tail--)
						if (globsto (tail, ptn+1))
							break;

					match = (tail >= string);
					while (!last_ptn(ptn[1]))
						ptn++;
					string += strlen (string);
				}
				break;

			case GLOB_PTN: 
				{
					char	*tail;
				 	for (tail = string + strlen (string); tail >= string; tail--)
						if (globsto (tail, ptn+1)) {
							char	c;
							c = *tail;
							*tail = '\0';
							match = (globsto (string, ptn->u.ptn) ^ ptn->invert);
							*tail = c;
							if (match)
								break;
						}

					match = (tail >= string);
					while (!last_ptn(ptn[1]))
						ptn++;
					string += strlen (string);
				}
				break;

			default: 
				break;
		}
	
	if (match && *string == '\0' && last_ptn(*ptn))
		return TRUE;
	else 
		return FALSE;
}

_______________________________________________
tracker-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/tracker-list

Reply via email to