vi: use ren_noeol() in vc_replace()
[neatvi.git] / syn.c
blob586fc704091e4a33d9bede7651657e415db9859d
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "vi.h"
6 #define NFTS 16
8 /* mapping filetypes to regular expression sets */
9 static struct ftmap {
10 char ft[32];
11 struct rset *rs;
12 } ftmap[NFTS];
14 static struct rset *syn_ftrs;
16 static struct rset *syn_find(char *ft)
18 int i;
19 for (i = 0; i < LEN(ftmap); i++)
20 if (!strcmp(ft, ftmap[i].ft))
21 return ftmap[i].rs;
22 return NULL;
25 int *syn_highlight(char *ft, char *s)
27 int subs[16 * 2];
28 int n = uc_slen(s);
29 int *att = malloc(n * sizeof(att[0]));
30 int sidx = 0;
31 struct rset *rs = syn_find(ft);
32 int flg = 0;
33 int hl, j;
34 memset(att, 0, n * sizeof(att[0]));
35 if (!rs)
36 return att;
37 while ((hl = rset_find(rs, s + sidx, LEN(subs) / 2, subs, flg)) >= 0) {
38 int beg, end;
39 int catt, cgrp;
40 conf_highlight(hl, NULL, &catt, &cgrp, NULL);
41 beg = uc_off(s, sidx + subs[cgrp * 2 + 0]);
42 end = uc_off(s, sidx + subs[cgrp * 2 + 1]);
43 for (j = beg; j < end; j++)
44 att[j] = catt;
45 sidx += subs[cgrp * 2 + 1] ? subs[cgrp * 2 + 1] : 1;
46 flg = RE_NOTBOL;
48 return att;
51 static void syn_initft(char *name)
53 char *pats[128] = {NULL};
54 char *ft, *pat;
55 int i, n;
56 for (i = 0; !conf_highlight(i, &ft, NULL, NULL, &pat) && i < LEN(pats); i++)
57 if (!strcmp(ft, name))
58 pats[i] = pat;
59 n = i;
60 for (i = 0; i < LEN(ftmap); i++) {
61 if (!ftmap[i].ft[0]) {
62 strcpy(ftmap[i].ft, name);
63 ftmap[i].rs = rset_make(n, pats, 0);
64 return;
69 char *syn_filetype(char *path)
71 int hl = rset_find(syn_ftrs, path, 0, NULL, 0);
72 char *ft;
73 if (!conf_filetype(hl, &ft, NULL))
74 return ft;
75 return "";
78 void syn_init(void)
80 char *pats[128] = {NULL};
81 char *pat, *ft;
82 int i;
83 for (i = 0; !conf_highlight(i, &ft, NULL, NULL, NULL); i++)
84 if (!syn_find(ft))
85 syn_initft(ft);
86 for (i = 0; !conf_filetype(i, NULL, &pat) && i < LEN(pats); i++)
87 pats[i] = pat;
88 syn_ftrs = rset_make(i, pats, 0);
91 void syn_done(void)
93 int i;
94 for (i = 0; i < LEN(ftmap); i++)
95 if (ftmap[i].rs)
96 rset_free(ftmap[i].rs);
97 rset_free(syn_ftrs);