stag: write tag definition line as ex comment
[neatvi.git] / reg.c
blobdc5b6ea55938d921b37b7be89335874742539c8f
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 static char linno[16];
21 static char colno[16];
22 if (c == '"')
23 c = 0;
24 if (c == ';') {
25 char *s = lbuf_get(xb, xrow);
26 snprintf(ln, sizeof(ln), "%s", s ? s : "");
27 if (strchr(ln, '\n') != NULL)
28 *strchr(ln, '\n') = '\0';
29 if (lnmode != NULL)
30 *lnmode = 1;
31 return ln;
33 if (c == '#') {
34 snprintf(linno, sizeof(linno), "%d", xrow + 1);
35 return linno;
37 if (c == '^') {
38 snprintf(colno, sizeof(colno), "%d", xoff + 1);
39 return colno;
41 return reg_getraw(c, lnmode);
44 static void reg_putraw(int c, char *s, int ln)
46 char *pre = isupper(c) && bufs[tolower(c)] ? bufs[tolower(c)] : "";
47 char *buf = malloc(strlen(pre) + strlen(s) + 1);
48 strcpy(buf, pre);
49 strcat(buf, s);
50 free(bufs[tolower(c)]);
51 bufs[tolower(c)] = buf;
52 lnmode[tolower(c)] = ln;
55 void reg_put(int c, char *s, int ln)
57 int i, i_ln;
58 char *i_s;
59 if ((ln || strchr(s, '\n')) && (!c || isalpha(c))) {
60 for (i = 8; i > 0; i--)
61 if ((i_s = reg_get('0' + i, &i_ln)))
62 reg_putraw('0' + i + 1, i_s, i_ln);
63 reg_putraw('1', s, ln);
65 reg_putraw(c, s, ln);
68 void reg_done(void)
70 int i;
71 for (i = 0; i < LEN(bufs); i++)
72 free(bufs[i]);