shithub: riscv

Download patch

ref: c86561f6257fd865590caacb3a4ad709c848eb68
parent: 4d0343c9d2db502c162f5050385ba5528aef2a47
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Thu Mar 19 07:44:26 EDT 2015

db: fix unicode support (thanks giacomo)

from the unicode-db patch readme:

command() receives a char* that is assigned to lp, which is a Rune*,
and lp is incremented later in readchar(), so each read consumed 4 bytes.
The only time command() is called is in runpcs() with bkpt->comm,
which is a char* built in subpcs through a char*, so the string stored in
bkpt->comm was not a Rune string. A way to test the bug is:

db program
main:b argv/X
:r

--- a/sys/src/cmd/db/command.c
+++ b/sys/src/cmd/db/command.c
@@ -23,8 +23,8 @@
 int	adrflg, cntflg;
 
 /* command decoding */
-
-command(char *buf, int defcom)
+int
+command(Rune *buf, int defcom)
 {
 	char	*reg;
 	char	savc;
@@ -39,7 +39,7 @@
 		if (*buf==EOR)
 			return(FALSE);
 		clrinp();
-		lp=(Rune*)buf;
+		lp=buf;
 	}
 	do {
 		adrflg=expr(0);		/* first address */
--- a/sys/src/cmd/db/defs.h
+++ b/sys/src/cmd/db/defs.h
@@ -64,7 +64,7 @@
 	int	count;
 	int	initcnt;
 	int	flag;
-	char	comm[MAXCOM];
+	Rune	comm[MAXCOM];
 	BKPT	*nxtbkpt;
 };
 
--- a/sys/src/cmd/db/fns.h
+++ b/sys/src/cmd/db/fns.h
@@ -8,7 +8,7 @@
 void		cmdmap(Map*);
 void		cmdsrc(int, Map*);
 void		cmdwrite(int, Map*);
-int		command(char*, int);
+int		command(Rune*, int);
 int		convdig(int);
 void		ctrace(int);
 WORD		defval(WORD);
--- a/sys/src/cmd/db/pcs.c
+++ b/sys/src/cmd/db/pcs.c
@@ -20,7 +20,7 @@
 	int	n, r;
 	long line, curr;
 	BKPT *bk;
-	char *comptr;
+	Rune *comptr;
 
 	runmode=SINGLE;
 	r = 0;
--- a/sys/src/cmd/db/print.c
+++ b/sys/src/cmd/db/print.c
@@ -166,7 +166,7 @@
 				dprint(buf);
 				if (bk->count != 1)
 					dprint(",%d", bk->count);
-				dprint(":%c %s", bk->flag == BKPTTMP ? 'B' : 'b', bk->comm);
+				dprint(":%c %S", bk->flag == BKPTTMP ? 'B' : 'b', bk->comm);
 			}
 		break;