tsyn.c - neatvi - [fork] simple vi-type editor with UTF-8 support
 (HTM) git clone git://src.adamsgaard.dk/neatvi
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
       tsyn.c (2469B)
       ---
            1 #include <stdio.h>
            2 #include <stdlib.h>
            3 #include <string.h>
            4 #include "vi.h"
            5 
            6 #define NFTS                16
            7 
            8 /* mapping filetypes to regular expression sets */
            9 static struct ftmap {
           10         char ft[32];
           11         struct rset *rs;
           12 } ftmap[NFTS];
           13 
           14 static struct rset *syn_ftrs;
           15 static int syn_ctx;
           16 
           17 static struct rset *syn_find(char *ft)
           18 {
           19         int i;
           20         for (i = 0; i < LEN(ftmap); i++)
           21                 if (!strcmp(ft, ftmap[i].ft))
           22                         return ftmap[i].rs;
           23         return NULL;
           24 }
           25 
           26 int syn_merge(int old, int new)
           27 {
           28         int fg = SYN_FGSET(new) ? SYN_FG(new) : SYN_FG(old);
           29         int bg = SYN_BGSET(new) ? SYN_BG(new) : SYN_BG(old);
           30         return ((old | new) & SYN_FLG) | (bg << 8) | fg;
           31 }
           32 
           33 void syn_context(int att)
           34 {
           35         syn_ctx = att;
           36 }
           37 
           38 int *syn_highlight(char *ft, char *s)
           39 {
           40         int subs[16 * 2];
           41         int n = uc_slen(s);
           42         int *att = malloc(n * sizeof(att[0]));
           43         int sidx = 0;
           44         struct rset *rs = syn_find(ft);
           45         int flg = 0;
           46         int hl, j, i;
           47         memset(att, 0, n * sizeof(att[0]));
           48         if (!rs)
           49                 return att;
           50         while ((hl = rset_find(rs, s + sidx, LEN(subs) / 2, subs, flg)) >= 0) {
           51                 int grp = 0;
           52                 int cend = 1;
           53                 int *catt;
           54                 conf_highlight(hl, NULL, &catt, NULL, &grp);
           55                 for (i = 0; i < LEN(subs) / 2; i++) {
           56                         if (subs[i * 2] >= 0) {
           57                                 int beg = uc_off(s, sidx + subs[i * 2 + 0]);
           58                                 int end = uc_off(s, sidx + subs[i * 2 + 1]);
           59                                 for (j = beg; j < end; j++)
           60                                         att[j] = syn_merge(att[j], catt[i]);
           61                                 if (i == grp)
           62                                         cend = MAX(cend, subs[i * 2 + 1]);
           63                         }
           64                 }
           65                 sidx += cend;
           66                 flg = RE_NOTBOL;
           67         }
           68         for (i = 0; i < n; i++)
           69                 att[i] = syn_merge(att[i], syn_ctx);
           70         return att;
           71 }
           72 
           73 static void syn_initft(char *name)
           74 {
           75         char *pats[128] = {NULL};
           76         char *ft, *pat;
           77         int i, n;
           78         for (i = 0; !conf_highlight(i, &ft, NULL, &pat, NULL) && i < LEN(pats); i++)
           79                 if (!strcmp(ft, name))
           80                         pats[i] = pat;
           81         n = i;
           82         for (i = 0; i < LEN(ftmap); i++) {
           83                 if (!ftmap[i].ft[0]) {
           84                         strcpy(ftmap[i].ft, name);
           85                         ftmap[i].rs = rset_make(n, pats, 0);
           86                         return;
           87                 }
           88         }
           89 }
           90 
           91 char *syn_filetype(char *path)
           92 {
           93         int hl = rset_find(syn_ftrs, path, 0, NULL, 0);
           94         char *ft;
           95         if (!conf_filetype(hl, &ft, NULL))
           96                 return ft;
           97         return "";
           98 }
           99 
          100 void syn_init(void)
          101 {
          102         char *pats[128] = {NULL};
          103         char *pat, *ft;
          104         int i;
          105         for (i = 0; !conf_highlight(i, &ft, NULL, NULL, NULL); i++)
          106                 if (!syn_find(ft))
          107                         syn_initft(ft);
          108         for (i = 0; !conf_filetype(i, NULL, &pat) && i < LEN(pats); i++)
          109                 pats[i] = pat;
          110         syn_ftrs = rset_make(i, pats, 0);
          111 }
          112 
          113 void syn_done(void)
          114 {
          115         int i;
          116         for (i = 0; i < LEN(ftmap); i++)
          117                 if (ftmap[i].rs)
          118                         rset_free(ftmap[i].rs);
          119         rset_free(syn_ftrs);
          120 }