shithub: neatroff

Download patch

ref: 3325081e41360a5dfc98ee155456d89c1e34822a
parent: a9772f9e5984dc19f9de0930c9fc74529477c70c
author: Ali Gholami Rudi <ali@rudi.ir>
date: Sat Sep 7 17:38:37 EDT 2013

roff: add -F and -M to change font and macro directories

--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,9 @@
+# neatroff's default font and macro directories
+FDIR=/root/troff/home/font
+MDIR=/root/troff/home/tmac
+
 CC = cc
-CFLAGS = -Wall -O2 -DTROFFROOT=\"/root/troff/home\"
+CFLAGS = -Wall -O2 "-DTROFFFDIR=\"$(FDIR)\"" "-DTROFFMDIR=\"$(MDIR)\""
 LDFLAGS =
 
 all: roff
--- a/dev.c
+++ b/dev.c
@@ -5,6 +5,7 @@
 #include "roff.h"
 
 char dev_dir[PATHLEN];	/* device directory */
+char dev_dev[PATHLEN];	/* output device name */
 int dev_res;		/* device resolution */
 int dev_uwid;		/* device unitwidth */
 int dev_hor;		/* minimum horizontal movement */
@@ -25,7 +26,7 @@
 
 static void dev_prologue(void)
 {
-	out("x T utf\n");
+	out("x T %s\n", dev_dev);
 	out("x res %d %d %d\n", dev_res, dev_hor, dev_ver);
 	out("x init\n");
 }
@@ -34,7 +35,7 @@
 {
 	char path[PATHLEN];
 	struct font *fn;
-	sprintf(path, "%s/%s", dev_dir, name);
+	sprintf(path, "%s/dev%s/%s", dev_dir, dev_dev, name);
 	fn = font_open(path);
 	if (!fn)
 		return -1;
@@ -47,7 +48,7 @@
 	return pos;
 }
 
-int dev_open(char *dir)
+int dev_open(char *dir, char *dev)
 {
 	char path[PATHLEN];
 	char tok[ILNLEN];
@@ -54,7 +55,8 @@
 	int i;
 	FILE *desc;
 	strcpy(dev_dir, dir);
-	sprintf(path, "%s/DESC", dir);
+	strcpy(dev_dev, dev);
+	sprintf(path, "%s/dev%s/DESC", dir, dev);
 	desc = fopen(path, "r");
 	while (fscanf(desc, "%s", tok) == 1) {
 		if (tok[0] == '#') {
--- a/roff.c
+++ b/roff.c
@@ -26,30 +26,57 @@
 	va_end(ap);
 }
 
+static char *usage =
+	"Usage: neatcc [options] input\n"
+	"Options:\n"
+	"  -mx   \tinclude macro x\n"
+	"  -C    \tenable compatibility mode\n"
+	"  -Tdev \tset output device\n"
+	"  -Fdir \tset font directory (" TROFFFDIR ")\n"
+	"  -Mdir \tset macro directory (" TROFFMDIR ")\n";
+
 int main(int argc, char **argv)
 {
-	int i;
+	char fontdir[PATHLEN] = TROFFFDIR;
+	char macrodir[PATHLEN] = TROFFMDIR;
+	char dev[PATHLEN] = "utf";
 	char path[PATHLEN];
+	int i;
 	int ret;
-	dev_open(TROFFROOT "/font/devutf");
-	env_init();
-	tr_init();
-	g_init();
 	for (i = 1; i < argc; i++) {
-		if (argv[i][0] != '-' || !argv[i][0])
+		if (argv[i][0] != '-' || !argv[i][1])
 			break;
-		if (argv[i][1] == 'C')
+		switch (argv[i][1]) {
+		case 'C':
 			n_cp = 1;
-		if (argv[i][1] == 'm') {
-			sprintf(path, TROFFROOT "/tmac/tmac.%s", argv[i] + 2);
+			break;
+		case 'm':
+			sprintf(path, "%s/tmac.%s", macrodir, argv[i] + 2);
 			in_queue(path);
+			break;
+		case 'F':
+			strcpy(fontdir, argv[i][2] ? argv[i] + 2 : argv[++i]);
+			break;
+		case 'M':
+			strcpy(macrodir, argv[i][2] ? argv[i] + 2 : argv[++i]);
+			break;
+		case 'T':
+			strcpy(dev, argv[i][2] ? argv[i] + 2 : argv[++i]);
+			break;
+		default:
+			printf("%s", usage);
+			return 0;
 		}
 	}
+	dev_open(fontdir, dev);
+	env_init();
+	tr_init();
+	g_init();
 	if (i == argc)
 		in_queue(NULL);	/* reading from standard input */
 	for (; i < argc; i++)
 		in_queue(!strcmp("-", argv[i]) ? NULL : argv[i]);
-	str_set(REG('.', 'P'), TROFFROOT);
+	str_set(REG('.', 'P'), macrodir);
 	out("s%d\n", n_s);
 	out("f%d\n", n_f);
 	ret = render();
--- a/roff.h
+++ b/roff.h
@@ -124,7 +124,7 @@
 };
 
 /* output device functions */
-int dev_open(char *path);
+int dev_open(char *dir, char *dev);
 void dev_close(void);
 int dev_mnt(int pos, char *id, char *name);
 int dev_pos(char *id);