From d2a7328b09499a4d1dc2ef3dac9e69d877c83540 Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Mon, 5 Aug 2019 12:02:39 -0400 Subject: [PATCH] highlight keywords --- kilo.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/kilo.c b/kilo.c index c1e6539..141f41e 100644 --- a/kilo.c +++ b/kilo.c @@ -38,6 +38,9 @@ enum editorKey { enum editorHighlight { HL_NORMAL = 0, + HL_COMMENT, + HL_KEYWORD1, + HL_KEYWORD2, HL_STRING, HL_NUMBER, HL_MATCH @@ -51,6 +54,8 @@ enum editorHighlight { struct editorSyntax { char *filetype; char **filematch; + char **keywords; + char *singleline_comment_start; int flags; }; @@ -84,11 +89,19 @@ struct editorConfig E; /*** filetypes ***/ char *C_HL_extensions[] = { ".c", ".h", ".cpp", NULL }; +char *C_HL_keywords[] = { + "switch", "if", "while", "for", "break", "continue", "return", "else", + "struct", "union", "typedef", "static", "enum", "class", "case", + "int|", "long|", "double|", "float|", "char|" , "unsigned|", "signed|", + "void|", NULL +}; struct editorSyntax HLDB[] = { { "c", C_HL_extensions, + C_HL_keywords, + "//", HL_HIGHLIGHT_NUMBERS | HL_HIGHLIGHT_STRINGS }, }; @@ -243,6 +256,11 @@ void editorUpdateSyntax(erow *row) { if (E.syntax == NULL) return; + char **keywords = E.syntax->keywords; + + char *scs = E.syntax->singleline_comment_start; + int scs_len = scs ? strlen(scs) : 0; + int prev_sep = 1; int in_string = 0; @@ -251,6 +269,13 @@ void editorUpdateSyntax(erow *row) { char c = row->render[i]; unsigned char prev_hl = (i > 0) ? row->hl[i - 1] : HL_NORMAL; + if (scs_len && !in_string) { + if (!strncmp(&row->render[i], scs, scs_len)) { + memset(&row->hl[i], HL_COMMENT, row->rsize - 1); + break; + } + } + if (E.syntax->flags & HL_HIGHLIGHT_STRINGS) { if (in_string) { row->hl[i] = HL_STRING; @@ -284,6 +309,26 @@ void editorUpdateSyntax(erow *row) { } } + if (prev_sep) { + int j; + for (j = 0; keywords[j]; j++) { + int klen = strlen(keywords[j]); + int kw2 = keywords[j][klen - 1] == '|'; + if (kw2) klen--; + + if (!strncmp(&row->render[i], keywords[j], klen) && + is_separator(row->render[i + klen])) { + memset(&row->hl[i], kw2 ? HL_KEYWORD2 : HL_KEYWORD1, klen); + i += klen; + break; + } + } + if (keywords[j] != NULL) { + prev_sep = 0; + continue; + } + } + prev_sep = is_separator(c); i++; } @@ -291,6 +336,9 @@ void editorUpdateSyntax(erow *row) { int editorSyntaxToColor(int hl) { switch (hl) { + case HL_COMMENT: return 36; + case HL_KEYWORD1: return 33; + case HL_KEYWORD2: return 32; case HL_STRING: return 35; case HL_NUMBER: return 31; case HL_NORMAL: return 34;