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); }
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); } }
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); }
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); }
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); }