+++ /dev/null
-#include <stdc.h>
-#include <utf.h>
-#include <edit.h>
-#include <unistd.h>
-#include <ctype.h>
-
-static int ChildIn = -1, ChildOut = -1;
-static char Buffer[32768];
-static char* DataBeg = Buffer;
-static char* DataEnd = Buffer;
-
-static SyntaxSpan* mkspan(size_t beg, size_t end, size_t clr, SyntaxSpan* span);
-static void write_chunk(Buf* buf, size_t beg, size_t end);
-static int read_byte(void);
-static int read_num(void);
-
-static void writefn(Job* job) {
- job->writefn = NULL;
-}
-
-static void readfn(Job* job) {
- job->readfn = NULL;
-}
-
-void colors_init(char* path) {
-// if (Syntax)
-// job_create((char*[]){ "tide-hl.rb", path, NULL }, readfn, writefn, 0);
-}
-
-SyntaxSpan* colors_scan(SyntaxSpan* spans, Buf* buf, size_t beg, size_t end) {
-#if 0
- SyntaxSpan* firstspan = spans;
- SyntaxSpan* currspan = spans;
- /* if the engine died, clear all highlights and quit */
- if (ChildIn < 0 || !buf->path)
- return colors_rewind(spans, 0);
- /* commence the highlighting */
- if (beg < end) {
- write_chunk(buf, beg, end);
- size_t b = 0, e = 0, c = 0;
- do {
- b = read_num();
- e = read_num();
- c = read_num();
- if (e > 0 && c > 0) {
- c = (c > 15 ? Colors[SynNormal + (c >> 4) - 1].fg : c);
- currspan = mkspan(beg+b, beg+e-1, c, currspan);
- }
- if (!firstspan)
- firstspan = currspan;
- } while (e > 0);
- fflush(stdout);
- DataBeg = DataEnd = Buffer;
- }
- return firstspan;
-#else
- return spans;
-#endif
-}
-
-SyntaxSpan* colors_rewind(SyntaxSpan* spans, size_t first) {
-#if 0
- SyntaxSpan *curr = spans, *next = (spans ? spans->next : NULL);
- while (curr && curr->end > first)
- next = curr, curr = curr->prev;
-
- if (curr) curr->next = NULL;
-
- for (SyntaxSpan* span = next; span;) {
- SyntaxSpan* dead = span;
- span = dead->next;
- if (span) span->prev = NULL;
- free(dead);
- }
- return curr;
-#else
- return spans;
-#endif
-}
-
-#if 0
-static SyntaxSpan* mkspan(size_t beg, size_t end, size_t clr, SyntaxSpan* span) {
- SyntaxSpan* newspan = malloc(sizeof(SyntaxSpan));
- newspan->beg = beg;
- newspan->end = end;
- newspan->color = clr;
- newspan->prev = span;
- newspan->next = NULL;
- if (span)
- span->next = newspan;
- return newspan;
-}
-
-static void write_chunk(Buf* buf, size_t beg, size_t end) {
- size_t len = end - beg, wlen = 0;
- char* wbuf = malloc(64 + len * 6u);
- if (len && wbuf) {
- wlen += sprintf(wbuf, "%lu\n", len);
- for (size_t i = beg; i < end; i++) {
- Rune r = buf_get(buf, i);
- if (r == RUNE_CRLF) {
- wbuf[wlen++] = '\n';
- } else if (buf->charset == BINARY) {
- wbuf[wlen++] = (char)r;
- } else {
- wlen += utf8encode((char*)&(wbuf[wlen]), r);
- }
- }
- long nwrite = write(ChildIn, wbuf, wlen);
- if (nwrite < 0) {
- /* child process probably died. shut everything down */
- close(ChildIn), ChildIn = -1;
- close(ChildOut), ChildOut = -1;
- }
- }
- free(wbuf);
-}
-
-static int read_byte(void) {
- if (DataBeg >= DataEnd) {
- DataBeg = DataEnd = Buffer;
- long nread = read(ChildOut, Buffer, sizeof(Buffer));
- if (nread <= 0) return EOF;
- DataEnd += nread;
- }
- return *(DataBeg++);
-}
-
-static int read_num(void) {
- int c, num = 0;
- while (isdigit(c = read_byte()))
- num = (num * 10) + (c - '0');
- return num;
-}
-#endif
static unsigned scroll_dn(View* view);
static void sync_center(View* view, size_t csr);
static size_t getoffset(View* view, size_t row, size_t col);
-static void sync_line_numbers(View* view, size_t pos);
-static void apply_colors(View* view);
void view_init(View* view, char* file, void (*errfn)(char*)) {
if (view->nrows) {
view_eol(view, false);
view_selctx(view);
}
- colors_init(view->buffer.path);
}
}
view_scrollto(view, csr);
/* locate the cursor if visible */
find_cursor(view, csrx, csry);
- /* synchronize, scan for, and apply highlighted regions */
- size_t first = view->rows[0]->off,
- last = view->rows[view->nrows-1]->off + view->rows[view->nrows-1]->rlen;
- view->spans = colors_rewind(view->spans, first);
- size_t start = (view->spans ? view->spans->end : 0);
- size_t scandist = MaxScanDist;
- if (scandist && first-start > scandist)
- start = first - scandist;
- view->spans = colors_scan(view->spans, &(view->buffer), start, last+1);
- apply_colors(view);
}
Row* view_getrow(View* view, size_t row) {
view->selection = sel;
}
unsigned newpos = buf_insert(&(view->buffer), indent, view->selection.end, rune);
- sync_line_numbers(view, newpos);
move_to(view, false, newpos);
}
(byword ? view_byword : view_byrune)(view, dir, true);
selswap(sel);
unsigned newpos = buf_delete(&(view->buffer), sel->beg, sel->end);
- sync_line_numbers(view, newpos);
move_to(view, false, newpos);
}
return buf_end(&(view->buffer));
return pos;
}
-
-static void sync_line_numbers(View* view, size_t newpos) {
- if (!view->nrows || newpos <= view->rows[0]->off) {
- if (view->nrows)
- view->rows[0]->off = buf_bol(&(view->buffer), newpos);
- }
-}
-
-static void apply_colors(View* view) {
- /* fast forward the span list to the first span that ends on screen if there
- is one. We take care to not go past the last item because we need to
- ensure newly scanned items are poperly appended next time around */
- size_t first = (view->nrows ? view->rows[0]->off : 0);
- SyntaxSpan* curr = view->spans;
- for (; curr && curr->next && curr->end < first; curr = curr->next);
- view->spans = curr;
-
- /* ok, now for each row, scan the columns and apply the colors for the span
- that each rune is a member of. */
- for (size_t r = 0; curr && r < view->nrows; r++) {
- Row* row = view->rows[r];
- size_t off = row->off, col = 0;
- while (col < row->len) {
- /* skip irrelevant highlight regions */
- for (; curr && curr->end < off; curr = curr->next);
- if (!curr) { r = -1; break; } // Break both loops if we're done
-
- /* check if we're in the current region */
- if (curr->beg <= off && off <= curr->end)
- row->cols[col].attr = (row->cols[col].attr & 0xFF00) | curr->color;
- off++, col++;
- while (col < row->len && row->cols[col].rune == '\0')
- col++;
- }
- }
-}