ref: 4e0c1829c7b5e17414f453fc22e6533978632d4c
parent: 867f1772c21359c2577857c6ca22bf3365271a34
author: Ali Gholami Rudi <ali@rudi.ir>
date: Mon Oct 14 07:19:22 EDT 2013
tr: use cdef_*() for char definition and cmap_*() for char translation
--- a/dev.c
+++ b/dev.c
@@ -133,7 +133,7 @@
c++;
if (c[0] == c_ec && c[1] == '(')
c += 2;
- c = tr_map(c);
+ c = cmap_map(c);
g = font_find(fn_font[fn], c);
if (g)
return g;
--- a/out.c
+++ b/out.c
@@ -148,7 +148,7 @@
}
if (c[0] == '\t' || c[0] == '' || !strcmp(c_hc, c))
continue;
- outc(tr_map(c));
+ outc(cmap_map(c));
continue;
}
switch (t) {
--- a/ren.c
+++ b/ren.c
@@ -730,13 +730,14 @@
strcpy(c, g ? g->name : "cnull");
}
}
+ if (!ren_div && cdef_map(c)) { /* .char characters */
+ wb_putexpand(wb, c);
+ return;
+ }
if (!n_lg || ren_div || wb_lig(wb, c)) {
if (n_kn && !ren_div)
wb_kern(wb, c);
- if (ren_div)
- wb_put(wb, c); /* disable .char for diverted text */
- else
- wb_putexpand(wb, c);
+ wb_put(wb, c);
}
}
@@ -899,28 +900,21 @@
wb_done(&t);
}
-static int ren_expanding; /* expanding the definition of a character */
-
-/* expand the given defined character */
-int ren_expand(struct wb *wb, char *n)
+/* parse characters and troff requests of s and append them to wb */
+int ren_parse(struct wb *wb, char *s)
{
- char *s = chdef_map(n);
int c;
- if (!s || ren_expanding)
- return 1;
- ren_expanding = 1;
odiv_beg();
sstr_push(s);
c = sstr_next();
while (c >= 0) {
sstr_back(c);
- if (ren_chardel(wb, sstr_next, sstr_back, NULL, NULL))
+ if (ren_char(wb, sstr_next, sstr_back))
break;
c = sstr_next();
}
sstr_pop();
odiv_end();
- ren_expanding = 0;
return 0;
}
--- a/roff.h
+++ b/roff.h
@@ -24,12 +24,12 @@
#define NTRAPS 1024 /* number of traps per page */
#define NIES 128 /* number of nested .ie commands */
#define NTABS 16 /* number of tab stops */
-#define NTR 512 /* number of character translations (.tr) */
+#define NCMAPS 512 /* number of character translations (.tr) */
#define NSSTR 32 /* number of nested sstr_push() calls */
#define NFIELDS 32 /* number of fields */
#define MAXFRAC 100000 /* maximum value of the fractional part */
#define LIGLEN 4 /* length of ligatures */
-#define NCHDEF 128 /* number of character definitions (.char) */
+#define NCDEFS 128 /* number of character definitions (.char) */
/* escape sequences */
#define ESC_Q "bCDhHlLNoSvwxX" /* \X'ccc' quoted escape sequences */
@@ -175,12 +175,6 @@
#define cp_back in_back /* cp.c is stateless */
void tr_first(void); /* read until the first non-command line */
-/* character translation (.tr) */
-void tr_add(char *c1, char *c2);
-char *tr_map(char *c);
-/* character definition (.char) */
-char *chdef_map(char *c);
-
/* variable length string buffer */
struct sbuf {
char *s; /* allocated buffer */
@@ -242,6 +236,13 @@
int wb_lig(struct wb *wb, char *c);
int wb_kern(struct wb *wb, char *c);
+/* character translation (.tr) */
+void cmap_add(char *c1, char *c2);
+char *cmap_map(char *c);
+/* character definition (.char) */
+char *cdef_map(char *c);
+int cdef_expand(struct wb *wb, char *c);
+
/* hyphenation flags */
#define HY_MASK 0x0f /* enable hyphenation */
#define HY_LAST 0x02 /* do not hyphenate last lines */
@@ -275,6 +276,7 @@
/* rendering */
int render(void); /* the main loop */
+int ren_parse(struct wb *wb, char *c);
int ren_char(struct wb *wb, int (*next)(void), void (*back)(int));
int ren_wid(int (*next)(void), void (*back)(int));
void ren_tl(int (*next)(void), void (*back)(int));
@@ -284,7 +286,6 @@
void ren_bcmd(struct wb *wb, char *arg); /* \b */
void ren_ocmd(struct wb *wb, char *arg); /* \o */
void ren_dcmd(struct wb *wb, char *arg); /* \D */
-int ren_expand(struct wb *wb, char *c); /* .char expansion */
/* out.c */
void out_line(char *s); /* output rendered line */
--- a/tr.c
+++ b/tr.c
@@ -493,35 +493,35 @@
in_lf(args[2], eval(args[1], 0));
}
-/* character translation */
-static char tr_src[NTR][GNLEN];
-static char tr_dst[NTR][GNLEN];
-static int tr_n;
+/* character translation (.tr) */
+static char cmap_src[NCMAPS][GNLEN]; /* source character */
+static char cmap_dst[NCMAPS][GNLEN]; /* character mapping */
+static int cmap_n; /* number of translated character */
static int tr_find(char *c)
{
int i;
- for (i = 0; i < tr_n; i++)
- if (!strcmp(c, tr_src[i]))
+ for (i = 0; i < cmap_n; i++)
+ if (!strcmp(c, cmap_src[i]))
return i;
return -1;
}
-void tr_add(char *c1, char *c2)
+void cmap_add(char *c1, char *c2)
{
int i = tr_find(c1);
- if (i < 0 && tr_n < NTR)
- i = tr_n++;
+ if (i < 0 && cmap_n < NCMAPS)
+ i = cmap_n++;
if (i >= 0) {
- strcpy(tr_src[i], c1);
- strcpy(tr_dst[i], c2);
+ strcpy(cmap_src[i], c1);
+ strcpy(cmap_dst[i], c2);
}
}
-char *tr_map(char *c)
+char *cmap_map(char *c)
{
int i = tr_find(c);
- return i >= 0 ? tr_dst[i] : c;
+ return i >= 0 ? cmap_dst[i] : c;
}
static void tr_tr(char **args)
@@ -531,31 +531,43 @@
while (s && charread(&s, c1) >= 0) {
if (charread(&s, c2) < 0)
strcpy(c2, " ");
- tr_add(c1, c2);
+ cmap_add(c1, c2);
}
}
-/* character definitions */
-static char chdef_src[NCHDEF][GNLEN];
-static char *chdef_dst[NCHDEF];
-static int chdef_n;
+/* character definition (.char) */
+static char cdef_src[NCDEFS][GNLEN]; /* source character */
+static char *cdef_dst[NCDEFS]; /* character definition */
+static int cdef_n; /* number of defined characters */
+static int cdef_expanding; /* inside cdef_expand() call */
-static int chdef_find(char *c)
+static int cdef_find(char *c)
{
int i;
- for (i = 0; i < chdef_n; i++)
- if (!strcmp(chdef_src[i], c))
+ for (i = 0; i < cdef_n; i++)
+ if (!strcmp(cdef_src[i], c))
return i;
return -1;
}
/* return the definition of the given character */
-char *chdef_map(char *c)
+char *cdef_map(char *c)
{
- int i = chdef_find(c);
- return i >= 0 ? chdef_dst[i] : NULL;
+ int i = cdef_find(c);
+ return !cdef_expanding && i >= 0 ? cdef_dst[i] : NULL;
}
+int cdef_expand(struct wb *wb, char *s)
+{
+ char *d = cdef_map(s);
+ if (!d)
+ return 1;
+ cdef_expanding = 1;
+ ren_parse(wb, d);
+ cdef_expanding = 0;
+ return 0;
+}
+
static void tr_char(char **args)
{
char c[GNLEN];
@@ -563,13 +575,13 @@
int i;
if (!args[2] || charread(&s, c) < 0)
return;
- i = chdef_find(c);
- if (i < 0 && chdef_n < NCHDEF)
- i = chdef_n++;
+ i = cdef_find(c);
+ if (i < 0 && cdef_n < NCDEFS)
+ i = cdef_n++;
if (i >= 0) {
- strncpy(chdef_src[i], c, sizeof(chdef_src[i]) - 1);
- chdef_dst[i] = malloc(strlen(args[2]) + 1);
- strcpy(chdef_dst[i], args[2]);
+ strncpy(cdef_src[i], c, sizeof(cdef_src[i]) - 1);
+ cdef_dst[i] = malloc(strlen(args[2]) + 1);
+ strcpy(cdef_dst[i], args[2]);
}
}
@@ -581,9 +593,9 @@
for (i = 1; i <= NARGS; i++) {
s = args[i];
if (s && charread(&s, c) >= 0) {
- if (chdef_find(c) >= 0) {
- free(chdef_dst[chdef_find(c)]);
- chdef_dst[chdef_find(c)] = NULL;
+ if (cdef_find(c) >= 0) {
+ free(cdef_dst[cdef_find(c)]);
+ cdef_dst[cdef_find(c)] = NULL;
}
}
}
--- a/wb.c
+++ b/wb.c
@@ -164,10 +164,10 @@
}
}
-/* just like wb_put(), but call chdef_expand() if c is defined */
+/* just like wb_put(), but call cdef_expand() if c is defined */
void wb_putexpand(struct wb *wb, char *c)
{
- if (ren_expand(wb, c))
+ if (cdef_expand(wb, c))
wb_put(wb, c);
}