shithub: vexed

Download patch

ref: 59f58defd6196ae6aed046c34d97f72bcb0ecba0
parent: e26a76b6ab5d43048920b219edbfabf52266ffe6
author: phil9 <[email protected]>
date: Mon Feb 19 04:00:38 EST 2024

decode now applies to selection

	decode used to take 8 bytes starting at the beginning
	of selection.
	This behaviour might not be the expected one as there was
	no way to decode less than 8 bytes if need be.

--- a/a.h
+++ b/a.h
@@ -42,7 +42,7 @@
 void patchundo(uchar);
 
 /* DECODE */
-void showdec(Buffer*, int, Mousectl*, Keyboardctl*);
+void showdec(uchar[8], Mousectl*, Keyboardctl*);
 
 /* ERROR */
 void showerr(const char*, Mousectl*, Keyboardctl*);
--- a/dec.c
+++ b/dec.c
@@ -9,141 +9,137 @@
 enum { Padding = 12, };
 
 u8int
-u8(Buffer *buf, int index)
+u8(uchar buf[8])
 {
-	return (u8int)buf->data[index];
+	return (u8int)buf[7];
 }
 
 s8int
-s8(Buffer *buf, int index)
+s8(uchar b[8])
 {
-	return (s8int)buf->data[index];
+	return (s8int)b[7];
 }
 
 u16int
-u16(Buffer *buf, int index)
+u16(uchar b[8])
 {
-	int i;
 	u16int r;
+	int i;
 
 	r = 0;
-	for(i = 0; i < 2 && index + i < buf->count; i++)
-		r += ((u16int)buf->data[index+i]) << 8*i;
+	for(i = 0; i < 2; i++)
+		r += (u16int)(b[6 + i] << 8*i);
 	return r;
 }
 
 s16int
-s16(Buffer *buf, int index)
+s16(uchar b[8])
 {
-	int i;
 	s16int r;
+	int i;
 
 	r = 0;
-	for(i = 0; i < 2 && index + i < buf->count; i++)
-		r += ((s16int)buf->data[index+i]) << 8*i;
+	for(i = 0; i < 2; i++)
+		r += (s16int)(b[6 + i] << 8*i);
 	return r;
 }
 
 u32int
-u32(Buffer *buf, int index)
+u32(uchar b[8])
 {
-	int i;
 	u32int r;
+	int i;
 
 	r = 0;
-	for(i = 0; i < 4 && index + i < buf->count; i++)
-		r += ((u32int)buf->data[index+i]) << 8*i;
+	for(i = 0; i < 4; i++)
+		r += (u32int)(b[4 + i] << 8*i);
 	return r;
 }
 
 s32int
-s32(Buffer *buf, int index)
+s32(uchar b[8])
 {
-	int i;
 	s32int r;
+	int i;
 
 	r = 0;
-	for(i = 0; i < 4 && index + i < buf->count; i++)
-		r += ((s32int)buf->data[index+i]) << 8*i;
+	for(i = 0; i < 4; i++)
+		r += (s32int)(b[4 + i] << 8*i);
 	return r;
 }
 
 u64int
-u64(Buffer *buf, int index)
+u64(uchar b[8])
 {
-	int i;
 	u64int r;
+	int i;
 
 	r = 0;
-	for(i = 0; i < 8 && index + i < buf->count; i++)
-		r += ((u64int)buf->data[index+i]) << 8*i;
+	for(i = 0; i < 8; i++)
+		r += (u64int)(b[i] << 8*i); 
 	return r;
 }
 
 s64int
-s64(Buffer *buf, int index)
+s64(uchar b[8])
 {
-	int i;
 	s64int r;
+	int i;
 
 	r = 0;
-	for(i = 0; i < 8 && index + i < buf->count; i++)
-		r += ((s64int)buf->data[index+i]) << 8*i;
+	for(i = 0; i < 8; i++)
+		r += (s64int)(b[i] << 8*i);
 	return r;
 }
 
 float
-f32(Buffer *buf, int index)
+f32(uchar b[8])
 {
 	union { uchar b[4]; float f; } v;
-	int i;
 
-	for(i = 0; i < 4 && index + i < buf->count; i++)
-		v.b[i] = buf->data[index + i];
+	memcpy(v.b, &b[4], 4);
 	return v.f;
 }
 
 double
-f64(Buffer *buf, int index)
+f64(uchar b[8])
 {
 	union { uchar b[8]; double d; } v;
-	int i;
 
-	for(i = 0; i < 8 && index + i < buf->count; i++)
-		v.b[i] = buf->data[index + i];
+	memcpy(v.b, b, 8);
 	return v.d;
 }
 
 void
-dec(Buffer *buf, int index, Image *b, Point o, Point p, Image *fg)
+dec(uchar buf[8], Image *b, Point o, Point p, Image *fg)
 {
 	char tmp[64] = {0};
 	int n;
 
 	p = string(b, p, fg, ZP, font, "  in: ");
-	for(n = 0; n < 8 && index + n < buf->count; n++){
-		snprint(tmp, sizeof tmp, "%02X ", buf->data[index + n]);
+	for(n = 0; n < 8; n++){
+		snprint(tmp, sizeof tmp, "%02X ", buf[n]);
 		p = string(b, p, fg, ZP, font, tmp);
 	}
 	p = addpt(o, Pt(Padding, 2*Padding + font->height));
-	snprint(tmp, sizeof tmp, "%5s %-20ud %5s %-20d", "u8:", u8(buf, index), "s8:", s8(buf, index));
+	snprint(tmp, sizeof tmp, "%5s %-20ud %5s %-20d", "u8:", u8(buf), "s8:", s8(buf));
 	string(b, p, fg, ZP, font, tmp);
 	p.y += font->height;
-	snprint(tmp, sizeof tmp, "%5s %-20ud %5s %-20d", "u16:", u16(buf, index), "s16:", s16(buf, index));
+	snprint(tmp, sizeof tmp, "%5s %-20ud %5s %-20d", "u16:", u16(buf), "s16:", s16(buf));
 	string(b, p, fg, ZP, font, tmp);
 	p.y += font->height;
-	snprint(tmp, sizeof tmp, "%5s %-20ud %5s %-20d", "u32:", u32(buf, index), "s32:", s32(buf, index));
+	snprint(tmp, sizeof tmp, "%5s %-20ud %5s %-20d", "u32:", u32(buf), "s32:", s32(buf));
 	string(b, p, fg, ZP, font, tmp);
 	p.y += font->height;
-	snprint(tmp, sizeof tmp, "%5s %-20llud %5s %-20lld", "u64:", u64(buf, index), "s64:", s64(buf, index));
+	snprint(tmp, sizeof tmp, "%5s %-20llud %5s %-20lld", "u64:", u64(buf), "s64:", s64(buf));
 	string(b, p, fg, ZP, font, tmp);
 	p.y += font->height;
-	snprint(tmp, sizeof tmp, "%5s %-20e %5s %-20e", "f32:", f32(buf, index), "f64:", f64(buf, index));
+	snprint(tmp, sizeof tmp, "%5s %-20e %5s %-20e", "f32:", f32(buf), "f64:", f64(buf));
 	string(b, p, fg, ZP, font, tmp);
 }
 
 void
-showdec(Buffer *buf, int index, Mousectl *mctl, Keyboardctl *kctl)
+showdec(uchar buf[8], Mousectl *mctl, Keyboardctl *kctl)
 {
 	Alt alts[3];
 	Rectangle r, sc;
@@ -187,7 +183,7 @@
 		draw(b, r, bg, nil, ZP);
 		border(b, r, 2, bord, ZP);
 		p = addpt(o, Pt(Padding, Padding));
-		dec(buf, index, b, o, p, fg);
+		dec(buf, b, o, p, fg);
 		flushimage(display, 1);
 		if(b!=screen || !eqrect(screen->clipr, sc)){
 			freeimage(save);
--- a/vexed.c
+++ b/vexed.c
@@ -340,7 +340,22 @@
 void
 xdecode(void)
 {
-	showdec(&buf, sel, mctl, kctl);
+	uchar b[8] = {0};
+	int n, m, c;
+
+	if(sele == -1){
+		b[7] = buf.data[sel];
+	}else{
+		n = sel < sele ? sel : sele;
+		m = sel < sele ? sele : sel;
+		c = m - n + 1;
+		if(c > 8){
+			showerr("cannot decode more than 8 bytes", mctl, kctl);
+			return;
+		}
+		memcpy(&b[8 - c], &buf.data[n], c);
+	}
+	showdec(b, mctl, kctl);
 }
 
 void