shithub: neatroff

Download patch

ref: 9b5448d2cc4b03f27285fd047b0fed9a596fac29
parent: e4cf02eeb714391259ef92b9660b37634440e13d
author: Ali Gholami Rudi <ali@rudi.ir>
date: Tue May 31 13:40:58 EDT 2016

draw: extend polygons to include arcs or splines

--- a/draw.c
+++ b/draw.c
@@ -134,16 +134,21 @@
 
 static int tok_num(char **s, int scale)
 {
-	char tok[ILNLEN];
-	char *d = tok;
-	while (isspace(**s))
+	while (**s == ' ' || **s == '\t')
 		(*s)++;
-	while (**s && !isspace(**s))
-		*d++ = *(*s)++;
-	*d = '\0';
-	return eval(tok, scale);
+	return eval_up(s, scale);
 }
 
+static int tok_numpt(char **s, int scale, int *i)
+{
+	char *o;
+	while (**s == ' ' || **s == '\t')
+		(*s)++;
+	o = *s;
+	*i = eval_up(s, scale);
+	return o == *s ? 1 : 0;
+}
+
 void ren_dcmd(struct wb *wb, char *s)
 {
 	int h1, h2, v1, v2;
@@ -174,9 +179,16 @@
 	case 'p':
 		wb_drawxbeg(wb, c);
 		while (*s) {
-			h1 = tok_num(&s, 'm');
-			v1 = tok_num(&s, 'v');
-			wb_drawxdot(wb, h1, v1);
+			if (tok_numpt(&s, 'm', &h1) || tok_numpt(&s, 'v', &v1)) {
+				char tok[64];
+				int i = 0;
+				while (i < sizeof(tok) - 1 && *s && *s != ' ')
+					tok[i++] = *s++;
+				tok[i] = '\0';
+				wb_drawxcmd(wb, tok);
+			} else {
+				wb_drawxdot(wb, h1, v1);
+			}
 		}
 		wb_drawxend(wb);
 		break;
--- a/out.c
+++ b/out.c
@@ -65,16 +65,21 @@
 
 static int tok_num(char **s, int scale)
 {
-	char tok[ILNLEN];
-	char *d = tok;
-	while (isspace(**s))
+	while (**s == ' ' || **s == '\t')
 		(*s)++;
-	while (**s && !isspace(**s))
-		*d++ = *(*s)++;
-	*d = '\0';
-	return eval(tok, scale);
+	return eval_up(s, scale);
 }
 
+static int tok_numpt(char **s, int scale, int *i)
+{
+	char *o;
+	while (**s == ' ' || **s == '\t')
+		(*s)++;
+	o = *s;
+	*i = eval_up(s, scale);
+	return o == *s ? 1 : 0;
+}
+
 static void out_draw(char *s)
 {
 	int c = *s++;
@@ -100,11 +105,16 @@
 		break;
 	case '~':
 	case 'p':
-		outnn(" %d", tok_num(&s, 'm'));
-		outnn(" %d", tok_num(&s, 'v'));
 		while (*s) {
-			outnn(" %d", tok_num(&s, 'm'));
-			outnn(" %d", tok_num(&s, 'v'));
+			int h, v;
+			if (tok_numpt(&s, 'm', &h) || tok_numpt(&s, 'v', &v)) {
+				outnn(" ");
+				while (*s && *s != ' ')
+					outnn("%c", *s++);
+			} else {
+				outnn(" %d", h);
+				outnn(" %d", v);
+			}
 		}
 		break;
 	}
--- a/roff.h
+++ b/roff.h
@@ -254,6 +254,7 @@
 void wb_drawa(struct wb *wb, int c, int h1, int v1, int h2, int v2);
 void wb_drawxbeg(struct wb *wb, int c);
 void wb_drawxdot(struct wb *wb, int h, int v);
+void wb_drawxcmd(struct wb *wb, char *cmd);
 void wb_drawxend(struct wb *wb);
 void wb_italiccorrection(struct wb *wb);
 void wb_italiccorrectionleft(struct wb *wb);
--- a/wb.c
+++ b/wb.c
@@ -347,6 +347,11 @@
 	wb_stsb(wb);
 }
 
+void wb_drawxcmd(struct wb *wb, char *cmd)
+{
+	sbuf_printf(&wb->sbuf, " %s", cmd);
+}
+
 void wb_drawxend(struct wb *wb)
 {
 	sbuf_printf(&wb->sbuf, "'");