Exemplo n.º 1
0
static int
vsl_IX_arg(struct VSL_data *vsl, int opt, const char *arg)
{
	int i, l, off;
	const char *b, *e, *err;
	vre_t *vre;
	struct vslf *vslf;
	struct vbitmap *tags = NULL;

	CHECK_OBJ_NOTNULL(vsl, VSL_MAGIC);
	vsl->flags |= F_SEEN_ixIX;

	b = arg;
	e = strchr(b, ':');
	if (e) {
		tags = vbit_init(SLT__MAX);
		AN(tags);
		l = e - b;
		i = VSL_List2Tags(b, l, vsl_vbm_bitset, tags);
		if (i < 0)
			vbit_destroy(tags);
		if (i == -1)
			return (vsl_diag(vsl,
				"-%c: \"%*.*s\" matches zero tags",
				(char)opt, l, l, b));
		else if (i == -2)
			return (vsl_diag(vsl,
				"-%c: \"%*.*s\" is ambiguous",
				(char)opt, l, l, b));
		else if (i <= -3)
			return (vsl_diag(vsl,
				"-%c: Syntax error in \"%*.*s\"",
				(char)opt, l, l, b));
		b = e + 1;
	}

	vre = VRE_compile(b, vsl->C_opt ? VRE_CASELESS : 0, &err, &off);
	if (vre == NULL) {
		if (tags)
			vbit_destroy(tags);
		return (vsl_diag(vsl, "-%c: Regex error at position %d (%s)\n",
			(char)opt, off, err));
	}

	ALLOC_OBJ(vslf, VSLF_MAGIC);
	AN(vslf);
	vslf->tags = tags;
	vslf->vre = vre;

	if (opt == 'I')
		VTAILQ_INSERT_TAIL(&vsl->vslf_select, vslf, list);
	else {
		assert(opt == 'X');
		VTAILQ_INSERT_TAIL(&vsl->vslf_suppress, vslf, list);
	}

	return (1);
}
Exemplo n.º 2
0
int
VSL_Arg(struct VSL_data *vsl, int opt, const char *arg)
{
	int i;
	char *p;
	double d;
	long l;

	CHECK_OBJ_NOTNULL(vsl, VSL_MAGIC);
	/* If first option is 'i', set all bits for supression */
	if ((opt == 'i' || opt == 'I') && !(vsl->flags & F_SEEN_ixIX))
		for (i = 0; i < SLT__MAX; i++)
			vbit_set(vsl->vbm_supress, i);

	switch (opt) {
	case 'b': vsl->b_opt = 1; return (1);
	case 'c': vsl->c_opt = 1; return (1);
	case 'C':
		/* Caseless regular expressions */
		vsl->C_opt = 1;
		return (1);
	case 'i': case 'x': return (vsl_ix_arg(vsl, opt, arg));
	case 'I': case 'X': return (vsl_IX_arg(vsl, opt, arg));
	case 'L':
		l = strtol(arg, &p, 0);
		while (isspace(*p))
			p++;
		if (*p != '\0')
			return (vsl_diag(vsl, "-L: Syntax error"));
		if (l < 0 || l > INT_MAX)
			return (vsl_diag(vsl, "-L: Range error"));
		vsl->L_opt = (int)l;
		return (1);
	case 'T':
		d = strtod(arg, &p);
		while (isspace(*p))
			p++;
		if (*p != '\0')
			return (vsl_diag(vsl, "-P: Syntax error"));
		if (d < 0.)
			return (vsl_diag(vsl, "-L: Range error"));
		vsl->T_opt = d;
		return (1);
	case 'v': vsl->v_opt = 1; return (1);
	default:
		return (0);
	}
}
Exemplo n.º 3
0
static int
vsl_ix_arg(struct VSL_data *vsl, int opt, const char *arg)
{
    int i, l;
    const char *b, *e;

    CHECK_OBJ_NOTNULL(vsl, VSL_MAGIC);
    /* If first option is 'i', set all bits for supression */
    if (opt == 'i' && !(vsl->flags & F_SEEN_ix))
        for (i = 0; i < 256; i++)
            vbit_set(vsl->vbm_supress, i);
    vsl->flags |= F_SEEN_ix;

    for (b = arg; *b; b = e) {
        while (isspace(*b))
            b++;
        e = strchr(b, ',');
        if (e == NULL)
            e = strchr(b, '\0');
        l = e - b;
        if (*e == ',')
            e++;
        while (isspace(b[l - 1]))
            l--;
        i = VSL_Name2Tag(b, l);
        if (i >= 0) {
            if (opt == 'x')
                vbit_set(vsl->vbm_supress, i);
            else
                vbit_clr(vsl->vbm_supress, i);
        } else if (i == -2) {
            return (vsl_diag(vsl,
                             "-%c: \"%*.*s\" matches multiple tags\n",
                             (char)opt, l, l, b));
        } else {
            return (vsl_diag(vsl,
                             "-%c: Could not match \"%*.*s\" to any tag\n",
                             (char)opt, l, l, b));
        }
    }
    return (1);
}
Exemplo n.º 4
0
static int
vsl_ix_arg(struct VSL_data *vsl, int opt, const char *arg)
{
	int i;

	CHECK_OBJ_NOTNULL(vsl, VSL_MAGIC);
	vsl->flags |= F_SEEN_ixIX;

	i = VSL_List2Tags(arg, -1, opt == 'x' ? vsl_vbm_bitset : vsl_vbm_bitclr,
	    vsl->vbm_supress);
	if (i == -1)
		return (vsl_diag(vsl, "-%c: \"%s\" matches zero tags",
			(char)opt, arg));
	else if (i == -2)
		return (vsl_diag(vsl, "-%c: \"%s\" is ambiguous",
			(char)opt, arg));
	else if (i == -3)
		return (vsl_diag(vsl, "-%c: Syntax error in \"%s\"",
			(char)opt, arg));

	return (1);
}
Exemplo n.º 5
0
struct vslq_query *
vslq_newquery(struct VSL_data *vsl, enum VSL_grouping_e grouping,
    const char *querystring)
{
	struct vslq_query *query;
	const char *error;
	int pos;
	vre_t *regex;

	(void)grouping;
	AN(querystring);
	regex = VRE_compile(querystring, 0, &error, &pos);
	if (regex == NULL) {
		vsl_diag(vsl, "failed to compile regex at pos %d: %s",
		    pos, error);
		return (NULL);
	}

	ALLOC_OBJ(query, VSLQ_QUERY_MAGIC);
	if (query != NULL)
		query->regex = regex;
	return (query);
}