ref: 888606f23b59720a5e76500b8681caf34c2c60c8
parent: c562fdffeebe2eceafdf4deb51ad96bc993fbf35
author: Ali Gholami Rudi <ali@rudi.ir>
date: Thu Oct 24 07:34:51 EDT 2013
dev: add .fspecial
--- a/dev.c
+++ b/dev.c
@@ -16,6 +16,11 @@
static struct font *fn_font[NFONTS]; /* font structs */
static int fn_n; /* number of mounted fonts */
+/* .fspecial request */
+static char fspecial_fn[NFONTS][FNLEN]; /* .fspecial first arguments */
+static char fspecial_sp[NFONTS][FNLEN]; /* .fspecial special fonts */
+static int fspecial_n; /* number of fonts in fspecial_sp[] */
+
static void skipline(FILE* filp)
{
int c;
@@ -137,6 +142,10 @@
g = font_find(fn_font[fn], c);
if (g)
return g;
+ for (i = 0; i < fspecial_n; i++)
+ if (dev_pos(fspecial_fn[i]) == fn && dev_pos(fspecial_sp[i]) >= 0)
+ if ((g = font_find(dev_font(dev_pos(fspecial_sp[i])), c)))
+ return g;
for (i = 0; i < fn_n; i++)
if (fn_font[i] && fn_font[i]->special)
if ((g = font_find(fn_font[i], c)))
@@ -154,7 +163,7 @@
return 0;
}
-/* return the mounted position of font */
+/* return the mounted position of a font */
int dev_pos(char *id)
{
int i;
@@ -174,6 +183,16 @@
return dev_mnt(0, id, id);
}
+/* return the mounted position of a font struct */
+int dev_fontpos(struct font *fn)
+{
+ int i;
+ for (i = 0; i < fn_n; i++)
+ if (fn_font[i] == fn)
+ return i;
+ return 0;
+}
+
/* return the font struct at pos */
struct font *dev_font(int pos)
{
@@ -200,4 +219,21 @@
{
if (fn >= 0)
dev_font(fn)->bd = bd;
+}
+
+void tr_fspecial(char **args)
+{
+ char *fn = args[1];
+ int i;
+ if (!fn) {
+ fspecial_n = 0;
+ return;
+ }
+ for (i = 2; i < NARGS; i++) {
+ if (args[i] && fspecial_n < LEN(fspecial_fn)) {
+ strcpy(fspecial_fn[fspecial_n], fn);
+ strcpy(fspecial_sp[fspecial_n], args[i]);
+ fspecial_n++;
+ }
+ }
}
--- a/out.c
+++ b/out.c
@@ -110,12 +110,15 @@
outnn("\n");
}
-static void outg(char *c)
+static void outg(char *c, int fn)
{
+ int ofn = o_f;
+ out_ft(fn);
if (utf8one(c))
outnn("c%s%s", c, c[1] ? "\n" : "");
else
out("C%s\n", c[0] == c_ec && c[1] == '(' ? c + 2 : c);
+ out_ft(ofn);
}
static void outc(char *c)
@@ -125,10 +128,10 @@
int bwid = charwid_base(o_f, o_s, g ? g->wid : SC_DW);
if (dev_getcs(o_f))
outnn("h%d", (cwid - bwid) / 2);
- outg(c);
+ outg(c, g ? dev_fontpos(g->font) : o_f);
if (dev_getbd(o_f)) {
outnn("h%d", dev_getbd(o_f) - 1);
- outg(c);
+ outg(c, g ? dev_fontpos(g->font) : o_f);
outnn("h%d", -dev_getbd(o_f) + 1);
}
if (dev_getcs(o_f))
--- a/roff.h
+++ b/roff.h
@@ -130,6 +130,7 @@
int dev_mnt(int pos, char *id, char *name);
int dev_pos(char *id);
struct font *dev_font(int pos);
+int dev_fontpos(struct font *fn);
void dev_setcs(int fn, int cs);
int dev_getcs(int fn);
void dev_setbd(int fn, int bd);
@@ -307,6 +308,7 @@
void tr_fc(char **args);
void tr_fi(char **args);
void tr_fp(char **args);
+void tr_fspecial(char **args);
void tr_ft(char **args);
void tr_hw(char **args);
void tr_in(char **args);
--- a/tr.c
+++ b/tr.c
@@ -820,6 +820,7 @@
{"fc", tr_fc},
{"fi", tr_fi},
{"fp", tr_fp},
+ {"fspecial", tr_fspecial},
{"ft", tr_ft},
{"hc", tr_hc},
{"hy", tr_hy},