commit - 999b77b0e4e968871be7f0f9ff15a0e1e6685a55
commit + 6158c30acc3e7b210819177b293a428f50d1ede8
blob - 2274d20c9966d4dbd4e1448a7f7453a4976f8f73
blob + 2c496a21b300c03b6f3de6c6ecc0e5b1895ca187
--- und64.c
+++ und64.c
*/
#include <stdio.h>
+#include <stdbool.h>
#include <assert.h>
#define fromw(X) ((X).hi * 256 + (X).lo)
}
#define blkoff(BA) (blknum(BA) * 256)
-void
-putfstrn(int n, uchar *s)
+int
+putfstr_(int n, uchar *s, bool brk)
{
int i;
uchar c;
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 *
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;
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
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;
}