Commit Diff


commit - 999b77b0e4e968871be7f0f9ff15a0e1e6685a55
commit + 6158c30acc3e7b210819177b293a428f50d1ede8
blob - 2274d20c9966d4dbd4e1448a7f7453a4976f8f73
blob + 2c496a21b300c03b6f3de6c6ecc0e5b1895ca187
--- und64.c
+++ und64.c
@@ -54,6 +54,7 @@ struct direntry {
  */
 
 #include <stdio.h>
+#include <stdbool.h>
 #include <assert.h>
 
 #define fromw(X) ((X).hi * 256 + (X).lo)
@@ -85,8 +86,8 @@ blknum(blkaddr ba)
 }
 #define blkoff(BA) (blknum(BA) * 256)
 
-void
-putfstrn(int n, uchar *s)
+int
+putfstr_(int n, uchar *s, bool brk)
 {
 	int i;
 	uchar c;
@@ -94,17 +95,22 @@ putfstrn(int n, uchar *s)
 	for (i = 0; i < n; i++) {
 		c = s[i];
 
-		if (c > 127)
-			break;
+		if (c > 127) {
+			if (brk)
+				break;
+			else
+				c = c - 128;
+		}
 		if (c >= 32 && c < 127)	/* ASCII SPC and DEL */
 			putchar(c);
 		else
 			putchar('~');
 	}
-	for (; i < n; i++)
-		putchar(' ');
+
+	return i;
 }
-#define putfstr(X) putfstrn(sizeof (X), (X))
+#define putfstr(X) putfstr_(sizeof (X), (X), true)
+#define putfstrend(X,I) putfstr_(sizeof (X) - (I), (X) + (I), false)
 
 #define STRSZ 24
 char *
@@ -210,17 +216,20 @@ listdir(void)
 	struct datablk *db;
 	struct direntry *de;
 	blkaddr ba;
-	int i;
+	int i, j, nfree;
 	ftype t;
 
 	dh = image + blkoff(hdrloc);
+	fputs("0 ", stdout);
+	fputs("\e[7m", stdout);			/* reverse video on */
 	putchar('"');
-	putfstr(dh->dh_name);
+	putfstrend(dh->dh_name, 0);
 	putchar('"');
 	putchar(' ');
-	putfstr(dh->dh_diskid);
+	putfstrend(dh->dh_diskid, 0);
 	putchar(' ');
-	putfstr(dh->dh_dosver);
+	putfstrend(dh->dh_dosver, 0);
+	fputs("\e[27m", stdout);		/* reverse video off */
 	putchar('\n');
 
 	ba = dh->dh_dir;
@@ -233,10 +242,12 @@ listdir(void)
 			if (!de->de_closed && t == DEL)
 				continue;
 
-			printf("%3d \"", fromw(de->de_nblocks));
-			putfstr(de->de_name);
+			printf("%-4d \"", fromw(de->de_nblocks));
+			j = putfstr(de->de_name);
 			putchar('"');
+			putfstrend(de->de_name, j);
 			putchar(' ');
+			putchar(' ');
 			if (de->de_closed)
 				putchar(' ');
 			else
@@ -252,6 +263,12 @@ listdir(void)
 		ba = db->db_next;
 	}
 
+	nfree = 0;
+	for (i = 0; i < sizeof dh->dh_bam; i++)
+		for (j = 0; j < 8; j++)
+			nfree += (dh->dh_bam[i] >> j) & 1;
+	printf("%d BLOCKS FREE.\n", nfree);
+
 	return 0;
 }