ref: d1259f4af92f110f5025b0071872ff0e135f2513
parent: 5a3cf696ed2c10ebacf756f1d7b721a1c5ae82e3
author: Ali Gholami Rudi <ali@rudi.ir>
date: Wed Jul 24 14:33:00 EDT 2013
ren: add .ss
--- a/dev.c
+++ b/dev.c
@@ -149,11 +149,6 @@
return 0;
}
-int dev_spacewid(void)
-{
- return fn_font[n_f]->spacewid;
-}
-
/* return the mounted position of font */
int dev_pos(char *id)
{
@@ -178,10 +173,4 @@
struct font *dev_font(int pos)
{
return pos >= 0 && pos < fn_n ? fn_font[pos] : NULL;
-}
-
-int charwid(int wid, int sz)
-{
- /* the original troff rounds the widths up */
- return (wid * sz + dev_uwid / 2) / dev_uwid;
}
--- a/draw.c
+++ b/draw.c
@@ -30,7 +30,7 @@
static int cwid(char *c)
{
struct glyph *g = dev_glyph(c, n_f);
- return charwid(g ? g->wid : SC_DW, n_s);
+ return charwid(n_f, n_s, g ? g->wid : SC_DW);
}
static int hchar(char *c)
--- a/out.c
+++ b/out.c
@@ -228,7 +228,7 @@
outnn("c%s%s", c, c[1] ? "\n" : "");
else
out("C%s\n", c[0] == c_ec && c[1] == '(' ? c + 2 : c);
- outnn("h%d", charwid(g ? g->wid : SC_DW, o_s));
+ outnn("h%d", charwid(o_f, o_s, g ? g->wid : SC_DW));
continue;
}
switch (t) {
--- a/reg.c
+++ b/reg.c
@@ -43,6 +43,7 @@
REG(0, 'L'),
REG(0, 'n'),
REG(0, 'm'),
+ REG(0, 'p'),
REG(0, 's'),
REG(0, 't'),
REG(0, 'T'),
@@ -195,6 +196,7 @@
n_na = 0;
n_lt = SC_IN * 65 / 10;
n_hy = 1;
+ n_ss = 12;
strcpy(env->hc, "\\%");
adj_ll(env->adj, n_l);
adj_in(env->adj, n_i);
--- a/ren.c
+++ b/ren.c
@@ -85,6 +85,17 @@
}
}
+int charwid(int fn, int sz, int wid)
+{
+ /* the original troff rounds the widths up */
+ return (wid * sz + dev_uwid / 2) / dev_uwid;
+}
+
+int spacewid(int fn, int sz)
+{
+ return charwid(fn, sz, (dev_font(fn)->spacewid * n_ss + 6) / 12);
+}
+
int f_divreg(void)
{
return cdiv ? cdiv->reg : -1;
@@ -559,7 +570,7 @@
struct glyph *g;
switch (c) {
case ' ':
- wb_hmov(wb, charwid(dev_spacewid(), n_s));
+ wb_hmov(wb, spacewid(n_f, n_s));
break;
case 'b':
ren_bracket(wb, arg);
@@ -618,7 +629,7 @@
break;
case '0':
g = dev_glyph("0", n_f);
- wb_hmov(wb, charwid(g ? g->wid : SC_DW, n_s));
+ wb_hmov(wb, charwid(n_f, n_s, g ? g->wid : SC_DW));
break;
case '|':
wb_hmov(wb, SC_EM / 6);
@@ -851,7 +862,7 @@
fillreq = 0;
/* add wb (the current word) to cadj */
if (c == ' ' || c == '\n') {
- adj_swid(cadj, charwid(dev_spacewid(), n_s));
+ adj_swid(cadj, spacewid(n_f, n_s));
if (!wb_part(wb)) { /* not after a \c */
adj_wb(cadj, wb);
fillreq = ren_fillreq;
--- a/roff.h
+++ b/roff.h
@@ -112,7 +112,6 @@
int dev_mnt(int pos, char *id, char *name);
int dev_pos(char *id);
struct font *dev_font(int pos);
-int charwid(int wid, int sz);
/* font-related functions */
struct font *font_open(char *path);
@@ -125,7 +124,8 @@
/* glyph handling functions */
struct glyph *dev_glyph(char *c, int fn);
struct glyph *dev_glyph_byid(char *id, int fn);
-int dev_spacewid(void);
+int charwid(int fn, int sz, int wid);
+int spacewid(int fn, int sz);
/* different layers of neatroff */
int in_next(void); /* input layer */
@@ -357,6 +357,7 @@
#define n_na (*nreg(REG(0, 'n'))) /* .na mode */
#define n_ns (*nreg(REG(0, 'N'))) /* .ns mode */
#define n_o0 (*nreg(REG(0, 'o'))) /* last .o */
+#define n_ss (*nreg(REG(0, 'p'))) /* .ss value */
#define n_s0 (*nreg(REG(0, 's'))) /* last .s */
#define n_sv (*nreg(REG(0, 'S'))) /* .sv value */
#define n_lt (*nreg(REG(0, 't'))) /* .lt value */
--- a/tr.c
+++ b/tr.c
@@ -440,6 +440,12 @@
n_cp = atoi(args[1]);
}
+static void tr_ss(char **args)
+{
+ if (args[1])
+ n_ss = eval_re(args[1], n_ss, 0);
+}
+
static char *arg_regname(char *s, int len)
{
char *e = n_cp ? s + 2 : s + len;
@@ -670,6 +676,7 @@
{"rt", tr_rt},
{"so", tr_so},
{"sp", tr_sp},
+ {"ss", tr_ss},
{"sv", tr_sv},
{"sy", tr_sy, mkargs_eol},
{"ta", tr_ta},
--- a/wb.c
+++ b/wb.c
@@ -84,7 +84,7 @@
return;
}
if (c[0] == ' ') {
- wb_hmov(wb, charwid(dev_spacewid(), R_S(wb)));
+ wb_hmov(wb, spacewid(R_F(wb), R_S(wb)));
return;
}
if (c[0] == '\t' || c[0] == '' ||
@@ -110,7 +110,7 @@
strcpy(wb->prev_c, c);
wb->prev_l = sbuf_len(&wb->sbuf);
wb->prev_h = wb->h;
- wb->h += charwid(g ? g->wid : SC_DW, R_S(wb));
+ wb->h += charwid(R_F(wb), R_S(wb), g ? g->wid : SC_DW);
wb->ct |= g ? g->type : 0;
wb_stsb(wb);
}
@@ -140,7 +140,7 @@
return 1;
val = font_kern(dev_font(R_F(wb)), wb->prev_c, c);
if (val)
- wb_hmov(wb, charwid(val, R_S(wb)));
+ wb_hmov(wb, charwid(R_F(wb), R_S(wb), val));
return !val;
}
@@ -313,7 +313,7 @@
static int wb_dashwid(struct wb *wb)
{
struct glyph *g = dev_glyph("hy", R_F(wb));
- return charwid(g ? g->wid : SC_DW, R_S(wb));
+ return charwid(R_F(wb), R_S(wb), g ? g->wid : SC_DW);
}
static char *indicatorpos(char *s, int w, struct wb *w1, int flg)