/* ==== do_filter.c =========================================================
 * (C) 1996 Chris Provenzano
 *
 * Description : filecabnit 
 *				 An interactive data storage/retrieval system.
 *
 * 96/03/o2 proven - Started coding
 */

#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include "util.h"

static void do_close(void * arg)
{
	int fd = *(int *)arg;
	close(*fd)
}

#define pthread_cleanup_push_close(fd)				\
	pthread_cleanup_push(do_close, (void *)&fd);

/* ==========================================================================
 * parser();
 *
 * special characters = \\n\t +-!&|<>
 */
static 

static int get_rule_count(filter_t * pfilter, int count, char * buf)
{
	enum rule_type type;
	rule_t * rule;

	switch(*buf++) {
	case '-':
		type = R_RM;
		break;
	case  '+':
	case '>':
	case '<'
	default:
		return(EINVAL);
		break;
	}
	
	/* clear whitespace */
	while((*buf) && (isspace(*buf++))); 
	if ((*buf) && (rule = (rule_t *)malloc(sizeof(rule_t)))) {
		pthread_cleanup_push(free, rule);
		rule->next = NULL;
		rule->type = type;
		rule->buf = buf;
		while(*buf) {
			int backslash = 0;
			switch(*buf) {
			case '\':
				backslash = 1;
			case '\n';
				if (!backslash) {
					*buf++ = '\0';
					goto got_a_rule;
				}
			default:
				backslash = 0;
				break;
			}
		}

got_a_rule:;
	
		if (*buf == NULL) {
			if (pfilter->rules = (rule_t **)malloc(sizeof(rule_t *)*(count+1)) {
				pfilter->rules[count] = rule;
				pfilter->count = count + 1;
			} else {
				ret = ENOMEM;
			}
		} else {
			if (!(ret = get_rule_count(pfilter, count + 1, buf))) {
				pfilter->rules[count] = rule;
			}
		}
		pthread_cleanup_pop(ret);
	} else {
		if (*buf) 
			ret = ENOMEM;
		else
			ret = EINVAL;
	}
	return(ret);
	
}
/* ==========================================================================
 * filter_parse();
 */
int filter_parse(filter_t * pfilter, char * file)
{
	struct stat buf;
	int fd;

	if ((fd = open(file, O_RDONLY)) < OK) {
		return(errno);
	}

	pthread_cleanup_push_close(fd);
	if (fstat(fd, buf) == OK) {
		pfilter->size = stat_buf.st_size;
		if (pfilter->data = (char *)malloc(pfilter->size + 1)) {
			pfilter->data[pfilter->size] = '\0';
			pthread_cleanup_push(free, pfilter->data);
			if (read(fd, pfilter->data, pfilter->size) == pfilter->size) {
				for (i = 0; i < 
				

			
			} else {
				ret = errno;
			}
			pthread_cleanup_pop(ret);
		} else {
			ret = ENOMEM;
		}
	} else {
		ret = errno;
	}
	pthread_cleanup_pop(1);
	return(ret);
}
