From 682d102c88abc2161d9d309ddb8002ca5f93299b Mon Sep 17 00:00:00 2001 From: Tyrel Souza <923113+tyrelsouza@users.noreply.github.com> Date: Sun, 24 Oct 2021 10:55:56 -0400 Subject: [PATCH] done syntax highlighting --- tted.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/tted.c b/tted.c index 08c998b..ae4390b 100644 --- a/tted.c +++ b/tted.c @@ -38,6 +38,7 @@ enum editorKey { enum editorHighlight { HL_NORMAL = 0, HL_COMMENT, + HL_MLCOMMENT, HL_KEYWORD1, HL_KEYWORD2, HL_STRING, @@ -54,15 +55,19 @@ struct editorSyntax { char **filematch; char **keywords; char *singleline_comment_start; + char *multiline_comment_start; + char *multiline_comment_end; int flags; }; typedef struct erow { + int idx; int size; int rsize; char *chars; char *render; unsigned char *hl; + int hl_open_comment; } erow; struct editorConfig { @@ -97,7 +102,7 @@ struct editorSyntax HLDB[] = { "c", C_HL_extensions, C_HL_keywords, - "//", + "//", "/*", "*/", HL_HIGHLIGHT_NUMBERS | HL_HIGHLIGHT_STRINGS }, }; @@ -234,9 +239,12 @@ int getWindowSize(int *rows, int *cols) { int is_separator(int c){ return isspace(c) || c == '\0' || strchr(",.()+-/*=~%<>[];\"", c) != NULL; - } +/* +hello +*/ + void editorUpdateSyntax(erow *row){ row->hl = realloc(row->hl, row->rsize); memset(row->hl, HL_NORMAL, row->rsize); @@ -246,23 +254,48 @@ void editorUpdateSyntax(erow *row){ char **keywords = E.syntax->keywords; char *scs = E.syntax->singleline_comment_start; + char *mcs = E.syntax->multiline_comment_start; + char *mce = E.syntax->multiline_comment_end; + int scs_len = scs ? strlen(scs) : 0; + int mcs_len = mcs ? strlen(mcs) : 0; + int mce_len = mce ? strlen(mce) : 0; int prev_sep = 1; int in_string = 0; + int in_comment = (row->idx > 0 && E.row[row->idx - 1].hl_open_comment); int i = 0; while(i < row->rsize){ char c = row->render[i]; unsigned char prev_hl = (i>0) ? row->hl[i-1] : HL_NORMAL; - if (scs_len && !in_string){ + if (scs_len && !in_string && !in_comment){ if (!strncmp(&row->render[i], scs, scs_len)) { memset(&row->hl[i], HL_COMMENT, row->rsize - i); break; } } - + if (mcs_len && mce_len && !in_string) { + if (in_comment) { + row->hl[i] = HL_MLCOMMENT; + if (!strncmp(&row->render[i], mce, mce_len)) { + memset(&row->hl[i], HL_MLCOMMENT, mce_len); + i += mce_len; + in_comment = 0; + prev_sep = 1; + continue; + } else { + i++; + continue; + } + } else if (!strncmp(&row->render[i], mcs, mcs_len)) { + memset(&row->hl[i], HL_MLCOMMENT, mcs_len); + i += mcs_len; + in_comment = 1; + continue; + } + } if (E.syntax->flags & HL_HIGHLIGHT_STRINGS) { if (in_string) { row->hl[i] = HL_STRING; @@ -320,10 +353,17 @@ void editorUpdateSyntax(erow *row){ prev_sep = is_separator(c); i++; } + + int changed = (row->hl_open_comment != in_comment); + row->hl_open_comment = in_comment; + if (changed && row->idx + 1< E.numrows){ + editorUpdateSyntax(&E.row[row->idx+1]); + } } int editorSyntaxToColor(int hl){ switch(hl){ + case HL_MLCOMMENT: case HL_COMMENT: return 36; case HL_KEYWORD1: return 33; case HL_KEYWORD2: return 32; @@ -418,6 +458,9 @@ void editorInsertRow(int at, char *s, size_t len) { if (at < 0 || at > E.numrows) return; E.row = realloc(E.row, sizeof(erow) * (E.numrows + 1)); memmove(&E.row[at +1], &E.row[at], sizeof(erow) * (E.numrows-at)); + for (int j = at + 1; j <= E.numrows; j++) E.row[j].idx++; + + E.row[at].idx = at; E.row[at].size = len; E.row[at].chars = malloc(len + 1); @@ -426,6 +469,7 @@ void editorInsertRow(int at, char *s, size_t len) { E.row[at].rsize = 0; E.row[at].render = NULL; E.row[at].hl = NULL; + E.row[at].hl_open_comment = 0; editorUpdateRow(&E.row[at]); E.numrows++; E.dirty++; @@ -442,6 +486,7 @@ void editorDelRow(int at) { editorFreeRow(&E.row[at]); memmove(&E.row[at], &E.row[at + 1], sizeof(erow) * (E.numrows - at - 1)); + for (int j = at; j = E.numrows -1; j++) E.row[j].idx--; E.numrows--; E.dirty++; }