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; }
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; }
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); } }
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); } }
/* 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; }
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; }
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; }
static char * SkipRCurly(char *s) { if (*s == R_CURLY) { flt_puts(s++, 1, Action_attr); s = SkipBlanks(s); s = SkipError(s); } return s; }
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; }
/* 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); }
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 = ""; }
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; } }
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); } }
/* * 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); }
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); }
static void ExecBrief(char *param) { zero_or_all = *param; flt_puts(param, (int) strlen(param), Literal_attr); }
static void ExecAbbrev(char *param) { zero_or_more = *param; flt_puts(param, (int) strlen(param), Literal_attr); }
static void ExecMeta(char *param) { meta_ch = *param; flt_puts(param, (int) strlen(param), Literal_attr); }
static void ExecInclude(char *param) { flt_read_keywords(param); flt_puts(param, (int) strlen(param), Literal_attr); }
static void ExecEquals(char *param) { eqls_ch = *param; flt_puts(param, (int) strlen(param), Literal_attr); }