stag: allow multiple tag patterns for each extension
[neatvi.git] / reg.c
blob73c6f1ec3e2f2a0ae5071d4213a37bfd5d6ba76c
1 #include <ctype.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include "vi.h"
7 static char *bufs[256];
8 static int lnmode[256];
10 static char *reg_getraw(int c, int *ln)
12 if (ln != NULL)
13 *ln = lnmode[c];
14 return bufs[c];
17 char *reg_get(int c, int *lnmode)
19 static char ln[1024];
20 if (c == '"')
21 c = 0;
22 if (c == ';') {
23 char *s = lbuf_get(xb, xrow);
24 snprintf(ln, sizeof(ln), "%s", s ? s : "");
25 if (strchr(ln, '\n') != NULL)
26 *strchr(ln, '\n') = '\0';
27 if (lnmode != NULL)
28 *lnmode = 1;
29 return ln;
31 return reg_getraw(c, lnmode);
34 static void reg_putraw(int c, char *s, int ln)
36 char *pre = isupper(c) && bufs[tolower(c)] ? bufs[tolower(c)] : "";
37 char *buf = malloc(strlen(pre) + strlen(s) + 1);
38 strcpy(buf, pre);
39 strcat(buf, s);
40 free(bufs[tolower(c)]);
41 bufs[tolower(c)] = buf;
42 lnmode[tolower(c)] = ln;
45 void reg_put(int c, char *s, int ln)
47 int i, i_ln;
48 char *i_s;
49 if ((ln || strchr(s, '\n')) && (!c || isalpha(c))) {
50 for (i = 8; i > 0; i--)
51 if ((i_s = reg_get('0' + i, &i_ln)))
52 reg_putraw('0' + i + 1, i_s, i_ln);
53 reg_putraw('1', s, ln);
55 reg_putraw(c, s, ln);
58 void reg_done(void)
60 int i;
61 for (i = 0; i < LEN(bufs); i++)
62 free(bufs[i]);