Ejemplo n.º 1
0
static char *
SkipAddress(char *s, int *count)
{
    char *base = s;
    int done;

    if (*count) {
	if (isComma(*s)) {
	    flt_putc(*s++);
	} else {
	    return s;
	}
    }

    if (isdigit(CharOf(*s))) {
	while (isdigit(CharOf(*s)))
	    s++;
	flt_puts(base, (int) (s - base), Number_attr);
    } else if (*s == '$') {
	flt_puts(s++, 1, Literal_attr);
    } else if (isSlash(*s)) {
	if (*s == BACKSLASH) {
	    flt_puts(s++, 1, Action_attr);
	}
	s = SkipPattern(s, &done, 0);
    } else {
	s = SkipError(s);
    }
    *count += 1;
    return s;
}
Ejemplo n.º 2
0
static char *
SkipLabel(char *s)
{
    if (*s == ':') {
	char *base;
	char *tail;

	flt_puts(s++, 1, Ident_attr);

	s = SkipBlanks(s);
	base = s;
	while (!isspace(CharOf(*s)))	/* FIXME: can a label have punctuation? */
	    s++;

	tail = s;
	while (isspace(CharOf(*s)))
	    s++;

	if (*s || tail == base) {
	    s = SkipRemaining(base, Error_attr);
	} else {
	    flt_puts(base, (int) (tail - base), Ident2_attr);
	    flt_puts(tail, (int) (s - tail), "");
	}
    }
    return s;
}
Ejemplo n.º 3
0
static void
ExecTable(char *param)
{
    char *t;

    VERBOSE(1, ("ExecTable(%s)\n", param));
    if (FltOptions('c')) {
	t = skip_ident(param);
	if (*skip_blanks(t) == '\0') {
	    int save = *t;

	    *t = 0;
	    if (*param) {
		flt_make_symtab(param);
		flt_read_keywords(MY_NAME);
	    } else {
		set_symbol_table(default_table);
	    }
	    *t = (char) save;
	}
    }

    t = skip_ident(param);
    flt_puts(param, (int) (t - param), Literal_attr);
    if (*skip_blanks(t) == '\0') {
	flt_puts(t, (int) strlen(t), "");
    } else {
	flt_error("unexpected tokens");
	flt_puts(t, (int) strlen(t), Error_attr);
    }
}
Ejemplo n.º 4
0
static void
parse_nondirective(char *s)
{
    char *base = s;
    char *t;
    const char *attr0 = Ident_attr;
    const char *attr1 = Ident2_attr;
    char *attr2 = Literal_attr;

    if (FltOptions('c')) {
	t = skip_ident(s = base);
	if (t != s) {
	    int save = *t;

	    /* this parses one of
	     * "name"
	     * "name:class"
	     * "name:color"
	     */
	    parse_keyword(s, 0);

	    *t = 0;
	    attr0 = actual_color(s, abbr_len(s), 0);
	    *t = (char) save;
	}
	if (skip_eqls_ch(&t)) {
	    s = skip_ident(t);
	    if (s != t) {
		attr1 = actual_color(t, (int) (s - t), 1);
	    }
	}
    }

    t = skip_ident(s = base);
    flt_puts(s, (int) (t - s), attr0);
    if (parse_eqls_ch(&t)) {
	s = skip_ident(t);
	if (s != t) {
	    int save = *s;
	    *s = 0;
	    if (!FltOptions('c')) {
		if (*(attr1 = color_of(t, 0)) == '\0')
		    attr1 = Action_attr;
	    }
	    flt_puts(t, (int) strlen(t), attr1);
	    *s = (char) save;
	}
	if (parse_eqls_ch(&s)) {
	    flt_puts(s, (int) strlen(s), attr2);
	} else if (*s) {
	    flt_puts(s, (int) strlen(s), Error_attr);
	}
    } else if (*t) {
	flt_puts(t, (int) strlen(t), Error_attr);
    }
}
Ejemplo n.º 5
0
/* the first character is the delimiter we'll search for */
static char *
SkipPattern(char *s, int *done, int join)
{
    char *base = s;
    int error = 0;
    int delim = *s++;
    int curly = 0;
    int round = 0;
    int square = 0;
    int ch;

    *done = 0;
    error = 0;
    while (*s != 0) {
	if (*s == BACKSLASH) {
	    ch = *++s;
	    RE_NEST(round, L_PAREN, R_PAREN);
	    RE_NEST(curly, L_CURLY, R_CURLY);
	    if (ch != 0)
		s++;
	} else {
	    ch = *s++;
	    if (!square && ch == delim) {
		if (curly || round || square)
		    error = 1;
		*done = 1;
		break;
	    }
	    if (ch == L_BLOCK) {
		square++;
	    } else if (ch == R_BLOCK) {
		if (square)
		    square--;
	    }
	}
    }

    if (s != base) {
	if (error) {
	    flt_puts(base, (int) (s - base), Error_attr);
	} else {
	    if (!join)
		flt_puts(base, 1, Action_attr);
	    base++;
	    if (done)
		s--;
	    flt_puts(base, (int) (s - base), Literal_attr);
	    if (done)
		flt_puts(s++, 1, Action_attr);
	}
    }
    return s;
}
Ejemplo n.º 6
0
static char *
SkipRemaining(char *s, const char *attr)
{
    char *base = s;
    size_t len = strlen(s);

    s += len;
    if (attr != Comment_attr && len > 1 && s[-2] == BACKSLASH) {
	flt_puts(base, (int) (s - base - 2), attr);
	flt_puts(s - 2, 1, Literal_attr);
    } else {
	flt_puts(base, (int) (s - base - 1), attr);
    }
    flt_putc('\n');
    return s;
}
Ejemplo n.º 7
0
static char *
SkipTwoPatterns(char *s, int flags)
{
    char *base;
    int done;

    s = SkipPattern(s, &done, 0);
    s = SkipPattern(done ? s - 1 : s, &done, 1);

    if (flags) {
	base = s;
	while (*s != 0 && !isspace(CharOf(*s))) {
	    if (isdigit(CharOf(*s))
		|| *s == 'g'
		|| *s == 'p')
		s++;
	    else if (*s == 'w') {
		s += strlen(s);
	    } else {
		break;
	    }
	}
	flt_puts(base, (int) (s - base), Ident2_attr);
	s = SkipBlanks(s);
	s = SkipError(s);
    }
    return s;
}
Ejemplo n.º 8
0
static char *
SkipRCurly(char *s)
{
    if (*s == R_CURLY) {
	flt_puts(s++, 1, Action_attr);
	s = SkipBlanks(s);
	s = SkipError(s);
    }
    return s;
}
Ejemplo n.º 9
0
static int
parse_directive(char *line)
{
    /* *INDENT-OFF* */
    static struct {
	const char *name;
	void (*func) (char *);
    } table[] = {
	{ "abbrev",  ExecAbbrev   },
	{ "brief",   ExecBrief    },
	{ "class",   ExecClass    },
	{ "default", ExecDefault  },
	{ "equals",  ExecEquals   },
	{ "include", ExecInclude  },
	{ "merge",   ExecSource   },
	{ "meta",    ExecMeta     },
	{ "source",  ExecSource   },
	{ "table",   ExecTable    },
    };
    /* *INDENT-ON* */

    unsigned n, len;
    char *s;

    VERBOSE(1, ("parse_directive(%s)\n", line));
    if (*(s = skip_blanks(line)) == meta_ch) {
	s = skip_blanks(s + 1);
	if ((len = (unsigned) (skip_ident(s) - s)) != 0) {
	    for (n = 0; n < sizeof(table) / sizeof(table[0]); n++) {
		if (!strncmp(s, table[n].name, len)) {
		    flt_puts(line, (int) (s + len - line), Ident_attr);
		    s = flt_put_blanks(s + len);
		    (*table[n].func) (s);
		    return 1;
		}
	    }
	}
	flt_error("unknown directive");
	flt_puts(line, (int) strlen(line), Error_attr);
    }
    return 0;
}
Ejemplo n.º 10
0
/* remaining nonblanks on the line are unexpected */
static char *
SkipError(char *s)
{
    char *base = s;
    size_t len = strlen(s);

    while (len > 0 && isspace(CharOf(s[len - 1])))
	len--;
    flt_puts(base, (int) len, Error_attr);
    return SkipBlanks(base + len);
}
Ejemplo n.º 11
0
void
flt_bfr_finish(void)
{
    if (flt_bfr_used) {
	flt_puts(flt_bfr_text, (int) flt_bfr_used,
		 (flt_bfr_attr
		  ? flt_bfr_attr
		  : ""));
    }
    flt_bfr_used = 0;
    flt_bfr_attr = "";
}
Ejemplo n.º 12
0
void
flt_bfr_embed(const char *text, int length, const char *attr)
{
    const char *save = flt_bfr_attr;

    if ((save == 0 && attr == 0) ||
	(save != 0 && attr != 0 && !strcmp(save, attr))) {
	flt_bfr_append(text, length);
    } else {
	flt_bfr_finish();
	flt_puts(text, length, attr);
	flt_bfr_attr = save;
    }
}
Ejemplo n.º 13
0
static void
ExecClass(char *param)
{
    char *t = strmalloc(param);
    char *s;
    const char *attr = "";

    parse_keyword(t, 1);
    free(t);
    t = flt_put_blanks(param);
    s = skip_ident(t);
    if (FltOptions('c')) {
	attr = actual_color(param, (int) (s - param), 1);
    } else {
	attr = Ident2_attr;
    }
    flt_puts(param, (int) (s - param), attr);
    if (parse_eqls_ch(&s)) {
	t = s;
	s = skip_ident(t);
	if (FltOptions('c')) {
	    attr = actual_color(t, (int) (s - t), 1);
	} else {
	    if (*(attr = color_of(t, 0)) == '\0')
		attr = Action_attr;
	}
	flt_puts(t, (int) (s - t), attr);
	if (parse_eqls_ch(&s)) {
	    flt_puts(s, (int) strlen(s), Literal_attr);
	} else if (*s) {
	    flt_puts(s, (int) strlen(s), Error_attr);
	}
    } else if (*s) {
	flt_puts(s, (int) strlen(s), Error_attr);
    }
}
Ejemplo n.º 14
0
/*
 * Include a symbol table from another key-file.
 */
static void
ExecSource(char *param)
{
    int save_meta = meta_ch;
    int save_eqls = eqls_ch;

    flt_make_symtab(param);
    flt_read_keywords(MY_NAME);
    flt_read_keywords(param);
    set_symbol_table(flt_name());

    meta_ch = save_meta;
    eqls_ch = save_eqls;

    flt_puts(param, (int) strlen(param), Literal_attr);
}
Ejemplo n.º 15
0
static void
ExecDefault(char *param)
{
    char *s = skip_ident(param);
    const char *t = param;
    const char *attr = Literal_attr;
    int save = *s;

    VERBOSE(1, ("ExecDefault(%s)\n", param));
    *s = 0;
    if (!*t)
	t = NAME_KEYWORD;
    if (is_class(t)) {
	free(default_attr);
	default_attr = strmalloc(t);
    }
    if (FltOptions('c')) {
	attr = actual_color(t, -1, 1);
	VERBOSE(2, ("actual_color(%s) = %s\n", t, attr));
    }
    *s = (char) save;
    flt_puts(param, (int) strlen(param), attr);
}
Ejemplo n.º 16
0
static void
ExecBrief(char *param)
{
    zero_or_all = *param;
    flt_puts(param, (int) strlen(param), Literal_attr);
}
Ejemplo n.º 17
0
static void
ExecAbbrev(char *param)
{
    zero_or_more = *param;
    flt_puts(param, (int) strlen(param), Literal_attr);
}
Ejemplo n.º 18
0
static void
ExecMeta(char *param)
{
    meta_ch = *param;
    flt_puts(param, (int) strlen(param), Literal_attr);
}
Ejemplo n.º 19
0
static void
ExecInclude(char *param)
{
    flt_read_keywords(param);
    flt_puts(param, (int) strlen(param), Literal_attr);
}
Ejemplo n.º 20
0
static void
ExecEquals(char *param)
{
    eqls_ch = *param;
    flt_puts(param, (int) strlen(param), Literal_attr);
}