9front - general discussion about 9front
 help / color / mirror / Atom feed
* patch: proof(1) runification
@ 2018-10-24  5:27 BurnZeZ
  0 siblings, 0 replies; only message in thread
From: BurnZeZ @ 2018-10-24  5:27 UTC (permalink / raw)
  To: 9front

[-- Attachment #1: Type: text/plain, Size: 144 bytes --]

It was already using runes, but in a dumb broken way.
Things added:
	left/right arrow key navigation
	Kesc to clear the command line
	Kdel exits

[-- Attachment #2: proof.diff --]
[-- Type: text/plain, Size: 6355 bytes --]

diff -r ff28f1376a7a sys/src/cmd/proof/htroff.c
--- a/sys/src/cmd/proof/htroff.c	Mon Oct 22 00:16:04 2018 +0200
+++ b/sys/src/cmd/proof/htroff.c	Wed Oct 24 05:14:50 2018 +0000
@@ -29,7 +29,7 @@
 
 int	curfont, cursize;
 
-char	*getcmdstr(void);
+Rune	*getcmdstr(void);
 
 static void	initpage(void);
 static void	view_setup(int);
@@ -335,8 +335,9 @@
 	char *p;
 	int i;
 
-	if (gotop == curp)
+/*	if (gotop == curp)
 		return 1;
+* is there a case where this works? */
 	for (i = 0; i < npagenums; i++)
 		if (pagenums[i].num == gotop) {
 			if (seekc(pagenums[i].adr) == Beof) {
@@ -484,18 +485,20 @@
 static int
 botpage(int np)	/* called at bottom of page np-1 == top of page np */
 {
-	char *p;
+	char buf[64];
+	Rune *r;
 	int n;
 
-	while (p = getcmdstr()) {
-		if (*p == '\0')
+	while (r = getcmdstr()) {
+		if (*r == '\0')
 			return 0;
-		if (*p == 'q')
-			exits(p);
-		if (*p == 'c')		/* nop */
+		if (*r == 'q')
+			exits(nil);
+		if (*r == 'c')		/* nop */
 			continue;
-		if (*p == 'm') {
-			mag = atof(p+1);
+		if (*r == 'm') {
+			snprint(buf, sizeof(buf), "%S", r+1);
+			mag = atof(buf);
 			if (mag <= .1 || mag >= 10)
 				mag = DEFMAG;
 			allfree();	/* zap fonts */
@@ -505,47 +508,52 @@
 			mag = res/(100.0*DIV);
 			return skipto(np-1, np);	/* reprint the page */
 		}
-		if (*p == 'x') {
-			xyoffset.x += atoi(p+1)*100;
+		if (*r == 'x') {
+			snprint(buf, sizeof(buf), "%S", r+1);
+			xyoffset.x += atoi(buf)*100;
 			skipto(np-1, np);
 			return 1;
 		}
-		if (*p == 'y') {
-			xyoffset.y += atoi(p+1)*100;
+		if (*r == 'y') {
+			snprint(buf, sizeof(buf), "%S", r+1);
+			xyoffset.y += atoi(buf)*100;
 			skipto(np-1, np);
 			return 1;
 		}
-		if (*p == '/') {	/* divide into n pieces */
-			nview = atoi(p+1);
+		if (*r == '/') {	/* divide into n pieces */
+			snprint(buf, sizeof(buf), "%S", r+1);
+			nview = atoi(buf);
 			if (nview < 1)
 				nview = 1;
 			else if (nview > MAXVIEW)
 				nview = MAXVIEW;
 			return skipto(np-1, np);
 		}
-		if (*p == 'p') {
-			if (p[1] == '\0'){	/* bare 'p' */
+		if (*r == 'p') {
+			if (r[1] == '\0'){	/* bare 'p' */
 				if(skipto(np-1, np))
 					return 1;
 				continue;
 			}
-			p++;
+			r++;
 		}
-		if ('0'<=*p && *p<='9') {
-			n = atoi(p);
+		if ('0'<=*r && *r<='9') {
+			snprint(buf, sizeof(buf), "%S", r);
+			n = atoi(buf);
 			if(skipto(n, np))
 				return 1;
 			continue;
 		}
-		if (*p == '-' || *p == '+') {
-			n = atoi(p);
+		if (*r == '-' || *r == '+') {
+			snprint(buf, sizeof(buf), "%S", r);
+			n = atoi(buf);
 			if (n == 0)
-				n = *p == '-' ? -1 : 1;
+				n = *r == '-' ? -1 : 1;
 			if(skipto(np - 1 + n, np))
 				return 1;
 			continue;
 		}
-		if (*p == 'd') {
+		if (*r == 'd') {
 			dbg = 1 - dbg;
 			continue;
 		}
diff -r ff28f1376a7a sys/src/cmd/proof/proof.h
--- a/sys/src/cmd/proof/proof.h	Mon Oct 22 00:16:04 2018 +0200
+++ b/sys/src/cmd/proof/proof.h	Wed Oct 24 05:14:50 2018 +0000
@@ -22,7 +22,7 @@
 
 void	mapscreen(void);
 void	clearscreen(void);
-char	*getcmdstr(void);
+Rune	*getcmdstr(void);
 
 void	readmapfile(char *);
 void	dochar(Rune*);
@@ -42,4 +42,4 @@
 #define	dprint	if (dbg) fprint
 
 extern	int	dbg;
-extern	int	resized;
\ No newline at end of file
+extern	int	resized;
diff -r ff28f1376a7a sys/src/cmd/proof/screen.c
--- a/sys/src/cmd/proof/screen.c	Mon Oct 22 00:16:04 2018 +0200
+++ b/sys/src/cmd/proof/screen.c	Wed Oct 24 05:14:50 2018 +0000
@@ -4,12 +4,13 @@
 #include <cursor.h>
 #include <event.h>
 #include <bio.h>
+#include <keyboard.h>
 #include "proof.h"
 
 static	int	checkmouse(void);
 static	int	buttondown(void);
-static	char	*getmousestr(void);
-static	char	*getkbdstr(int);
+static	Rune	*getmousestr(void);
+static	Rune	*getkbdstr(Rune);
 
 extern	Cursor	blot;
 extern	char	*track;
@@ -46,9 +47,7 @@
 	string(screen, p, display->black, ZP, font, buf);
 }
 
-#define	Viewkey	0xb2
-
-char *
+Rune *
 getcmdstr(void)
 {
 	Event ev;
@@ -70,7 +69,7 @@
 		e = event(&ev);
 		if(resized){
 			resized = 0;
-			return "p";
+			return L"p";
 		}
 		if ((e & Emouse) && ev.mouse.buttons) {
 			mouse = ev.mouse;
@@ -81,7 +80,7 @@
 			if((dir = dirstat(track)) != nil){
 				if(tracktm < dir->mtime){
 					free(dir);
-					return "q";
+					return L"q";
 				}
 				free(dir);
 			}
@@ -89,28 +88,31 @@
 	}
 }
 
-static char *
-getkbdstr(int c0)
+static Rune *
+getkbdstr(Rune r)
 {
-	static char buf[100];
-	char *p;
-	int c;
+	static Rune buf[100];
+	int i;
 
-	if (c0 == '\n')
-		return "";
-	buf[0] = c0;
-	buf[1] = 0;
-	screenprint("%s", buf);
-	for (p = buf+1; (c = ekbd()) != '\n' && c != '\r' && c != -1 && c != Viewkey; ) {
-		if (c == '\b' && p > buf) {
-			*--p = ' ';
-		} else {
-			*p++ = c;
-			*p = 0;
+	buf[0] = '\0';
+	for (i=0; r != '\n'; r=ekbd()) {
+		switch(r){
+		case '\b':
+			if(i == 0)
+				continue;
+			buf[--i] = '\0';
+			break;
+		case Kdel: exits(nil);
+		case Kesc: return L"p";
+		case Kleft: return L"-1";
+		case Kright: return L"+1";
+		case Runeerror: continue;
+		default:
+			buf[i++] = r;
+			buf[i] = '\0';
 		}
-		screenprint("%s", buf);
+		screenprint("%S", buf);
 	}
-	*p = 0;
 	return buf;
 }
 
@@ -148,7 +150,8 @@
 int	last_hit;
 int	last_but;
 
-char *pan(void)
+Rune *
+pan(void)
 {
 	Point dd, xy, lastxy, min, max;
 
@@ -181,45 +184,45 @@
 	xyoffset = addpt(xyoffset, subpt(mouse.xy, xy));
 
 	esetcursor(0);
-	return "p";
+	return L"p";
 }
 
-static char *
+static Rune *
 getmousestr(void)
 {
-	static char buf[64];
+	static Rune buf[64];
 
 	checkmouse();
 	if (last_but == 1)
-		return "p";	/* repaint after panning */
+		return L"p";	/* repaint after panning */
 	if (last_but == 2) {
-		return "c";
+		return L"c";
 	} else if (last_but == 3) {
 		switch (last_hit) {
 		case Next:
-			return "";
+			return L"";
 		case Prev:
-			return "-1";
+			return L"-1";
 		case Page:
 			screenprint("page? ");
-			return "c";
+			return L"c";
 		case Again:
-			return "p";
+			return L"p";
 		case Bigger:
-			snprint(buf, sizeof buf, "m%g", mag * 1.1);
+			runesnprint(buf, sizeof buf, "m%g", mag * 1.1);
 			return buf;
 		case Smaller:
-			snprint(buf, sizeof buf, "m%g", mag / 1.1);
+			runesnprint(buf, sizeof buf, "m%g", mag / 1.1);
 			return buf;
 		case Pan:
 			return pan();
 		case Quit:
-			return "q";
+			return L"q";
 		default:
-			return "c";
+			return L"c";
 		}
 	} else {		/* button 1 or bail out */
-		return "c";
+		return L"c";
 	}
 }
 

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2018-10-24  5:27 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-24  5:27 patch: proof(1) runification BurnZeZ

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).