ref: c0958e44843f678a014c3ede1b5f4d857fa10784
parent: 246326f41195d0ccf1f5c88c8e8884b2cacd1103
author: Ali Gholami Rudi <ali@rudi.ir>
date: Sat Sep 30 11:35:03 EDT 2017
dev: finding font position automatically for .fp request In Neatroff, if instead of the position of the font to be mounted, the second argument of .fp is a dash, the position of the font is decided automatically: if a font with the same name is already mounted, the same position is reused. Otherwise the font is mounted on the first available font position.
--- a/dev.c
+++ b/dev.c
@@ -37,6 +37,19 @@
out("x init\n");
}
+/* find a position for the given font */
+static int dev_position(char *id)
+{
+ int i;
+ for (i = 1; i < NFONTS; i++) /* already mounted */
+ if (!strcmp(fn_name[i], id))
+ return i;
+ for (i = 1; i < NFONTS; i++) /* the first empty position */
+ if (!fn_font[i])
+ return i;
+ return 0; /* no room left */
+}
+
int dev_mnt(int pos, char *id, char *name)
{
char path[PATHLEN];
@@ -50,6 +63,8 @@
fn = font_open(path);
if (!fn)
return -1;
+ if (pos < 0)
+ pos = dev_position(id);
if (fn_font[pos])
font_close(fn_font[pos]);
if (fn_name[pos] != name) /* ignore if fn_name[pos] is passed */
--- a/ren.c
+++ b/ren.c
@@ -564,9 +564,11 @@
void tr_fp(char **args)
{
+ int pos;
if (!args[2])
return;
- if (dev_mnt(atoi(args[1]), args[2], args[3] ? args[3] : args[2]) < 0)
+ pos = isdigit((unsigned char) args[1][0]) ? atoi(args[1]) : -1;
+ if (dev_mnt(pos, args[2], args[3] ? args[3] : args[2]) < 0)
errmsg("neatroff: failed to mount <%s>\n", args[2]);
}