From 2667b1025835d4bedd9e124fbffcad51090e406f Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sun, 14 Jun 2020 22:47:19 -0400 Subject: [PATCH] Improved directory listing printout --- sortdir.c | 99 +++++++++++++++++++++++++++++++++++++++-------------- sortdir.po | Bin 143360 -> 143360 bytes 2 files changed, 74 insertions(+), 25 deletions(-) diff --git a/sortdir.c b/sortdir.c index e29f9a4..08630b9 100644 --- a/sortdir.c +++ b/sortdir.c @@ -3,9 +3,11 @@ * * Bobbi January-June 2020 * - * TODO: EOF length for directories - * 1) Check this in readir() if I am not doing so already + * TODO: EOF validation / fix: + * 1) Check this in readir() taking account of sparse files * 2) When trimming a directory, need to update EOF for parent entry + * TODO: Print indication when a file is sparse + * TODO: Only write freelist if there were changes * TODO: Get both ProDOS-8 and GNO versions to build from this source * * Revision History @@ -42,6 +44,7 @@ * v0.80 Reinstated no-op sort (useful for compacting dir without reordering). * v0.81 Do not trim volume directory to <4 blocks. * v0.82 Minor fix to TRIMDIR conditional compilation. + * v0.83 Print additional info on each file. */ //#pragma debug 9 @@ -183,6 +186,7 @@ struct datetime { uchar hour; uchar minute; uchar ispd25format; + uchar nodatetime; }; /* @@ -249,6 +253,7 @@ static const char err_entsz2[] = "Bad entry size %u, should be %u"; static const char err_entblk2[] = "Bad entries/blk %u, should be %u"; static const char err_parblk3[] = "Bad parent %s %u, should be %u"; static const char err_hdrblk2[] = "Bad hdr blk %u, should be %u"; +static const char err_access[] = "Bad access"; static const char err_forksz3[] = "%s fork size %u is wrong, should be %u"; static const char err_used2[] = "Blks used %u is wrong, should be %u"; static const char err_many[] = "Too many files to sort"; @@ -291,7 +296,8 @@ void uppercase(char *p, uchar len, uchar *minvers, uchar *vers); void initialcase(uchar mode, char *p, uchar len, uchar *minvers, uchar *vers); void firstblk(char *dirname, uchar *device, uint *block); void readdatetime(uchar time[4], struct datetime *dt); -void writedatetime(uchar pd25, struct datetime *dt, uchar time[4]); +void writedatetime(struct datetime *dt, uchar time[4]); +void printdatetime(struct datetime *dt); uint askfix(void); #ifdef FREELIST int readfreelist(uchar device); @@ -727,6 +733,11 @@ ret: void readdatetime(uchar time[4], struct datetime *dt) { uint d = time[0] + 256U * time[1]; uint t = time[2] + 256U * time[3]; + if ((d == 0) && (t == 0)) { + dt->nodatetime = 1; + return; + } + dt->nodatetime = 0; if (!(t & 0xe000)) { /* ProDOS 1.0 to 2.4.2 date format */ dt->year = (d & 0xfe00) >> 9; @@ -752,13 +763,17 @@ void readdatetime(uchar time[4], struct datetime *dt) { /* * Write the date and time stored in struct datetime in ProDOS on disk format, - * storing the bytes in array time[]. If pd25 is 0 then use legacy format - * (ProDOS 1.0-2.4.2) otherwise use the new date and time format introduced + * storing the bytes in array time[]. Supports both legacy format + * (ProDOS 1.0-2.4.2) and the new date and time format introduced * with ProDOS 2.5 */ -void writedatetime(uchar pd25, struct datetime *dt, uchar time[4]) { +void writedatetime(struct datetime *dt, uchar time[4]) { uint d, t; - if (pd25 == 0) { + if (dt->nodatetime == 1) { + time[0] = time[1] = time[2] = time[3] = 0; + return; + } + if (dt->ispd25format == 0) { /* ProDOS 1.0 to 2.4.2 date format */ uint year = dt->year; if (year > 2039) /* 2039 is last year */ @@ -782,6 +797,18 @@ void writedatetime(uchar pd25, struct datetime *dt, uchar time[4]) { time[3] = (t >> 8) & 0xff; } +/* + * Print date/time value for directory listing + */ +void printdatetime(struct datetime *dt) { + if (dt->nodatetime) + fputs(" -------- --:-- ", stderr); + else + printf(" %02d%02d%02d %02d:%02d%c", + dt->year, dt->month, dt->day, dt->hour, dt->minute, + dt->ispd25format ? '*' : ' '); +} + /* * Determine whether or not to perform a fix * Return 0 not to perform fix, 1 to perform fix @@ -1186,9 +1213,10 @@ int readdir(uint device, uint blocknum) { static char namebuf[NMLEN+1]; struct pd_dirhdr *hdr; struct block *curblk; + struct datetime dt; ulong eof; - uint filecount, idx, subdirs, blks, keyblk, hdrblk, count, entries; - uchar blkentries, pd25, i; + uint filecount, idx, subdirs, blks, keyblk, hdrblk, count, entries, auxtype; + uchar blkentries, i; uint errsbefore = errcount; uint blkcnt = 1; uint hdrblknum = blocknum; @@ -1227,6 +1255,7 @@ int readdir(uint device, uint blocknum) { printf("Directory %s (%u", currdir, filecount); printf(" %s)\n", filecount == 1 ? "entry" : "entries"); hline(); + puts(" Name Blk EOF Typ Aux Perm Modified Created OK"); #ifdef CHECK if (entsz != ENTSZ) { @@ -1288,16 +1317,18 @@ int readdir(uint device, uint blocknum) { readdatetime(ent->mtime, &mtime); switch (dateopts[0]) { case 'n': - pd25 = 1; + ctime.ispd25format = 1; + mtime.ispd25format = 1; break; case 'o': - pd25 = 0; + ctime.ispd25format = 0; + mtime.ispd25format = 0; break; default: err(FATALBADARG, err_invopt, "date"); } - writedatetime(pd25, &ctime, ent->ctime); - writedatetime(pd25, &mtime, ent->mtime); + writedatetime(&ctime, ent->ctime); + writedatetime(&mtime, ent->mtime); } fixcase(ent->name, namebuf, @@ -1305,35 +1336,55 @@ int readdir(uint device, uint blocknum) { switch (ent->typ_len & 0xf0) { case 0x10: - fputs("Seed ", stdout); + fputs("s ", stdout); break; case 0x20: - fputs("Sapl ", stdout); + fputs("S ", stdout); break; case 0x30: - fputs("Tree ", stdout); + fputs("T ", stdout); break; case 0x40: - fputs("Pasc ", stdout); + fputs("P ", stdout); break; case 0x50: - fputs("Fork ", stdout); + fputs("F ", stdout); break; case 0xd0: - fputs("Dir ", stdout); + fputs("D ", stdout); break; default: - fputs("???? ", stdout); + fputs("? ", stdout); break; } fputs(namebuf, stdout); + for (i = 0; i < 16 - strlen(namebuf); ++i) + putchar(' '); blks = ent->blksused[0] + 256U * ent->blksused[1]; eof = ent->eof[0] + 256L * ent->eof[1] + 65536L * ent->eof[2]; + auxtype = ent->auxtype[0] + 256L * ent->auxtype[1]; + printf("%4d %8ld %02x %04x %c%c%c%c%c", + blks, eof, ent->type,auxtype, + (ent->access & 0x80) ? 'D' : '-', + (ent->access & 0x40) ? 'R' : '-', + (ent->access & 0x20) ? 'B' : '-', + (ent->access & 0x02) ? 'w' : '-', + (ent->access & 0x01) ? 'r' : '-'); + + readdatetime(ent->ctime, &dt); + printdatetime(&dt); + readdatetime(ent->mtime, &dt); + printdatetime(&dt); keyblk = ent->keyptr[0] + 256U * ent->keyptr[1]; hdrblk = ent->hdrptr[0] + 256U * ent->hdrptr[1]; #ifdef CHECK + if (ent->access & 0x1c) { + err(NONFATAL, err_access); + if (askfix() == 1) + ent->access &= 0xe3; + } if (hdrblk != hdrblknum) { err(NONFATAL, err_hdrblk2, hdrblk, hdrblknum); if (askfix() == 1) { @@ -1392,12 +1443,10 @@ int readdir(uint device, uint blocknum) { #endif ++numfiles; if (errcount == errsbeforeent) { - for (i = 0; i < 53 - strlen(namebuf); ++i) - putchar(' '); #ifdef CHECK - printf("%5u blocks [ OK ]", blks); + puts(" *"); #else - printf("%5u blocks\n", blks); + putchar('\n'); #endif } else putchar('\n'); @@ -1982,7 +2031,7 @@ void interactive(void) { revers(1); hlinechar(' '); - fputs("S O R T D I R v0.82 alpha Use ^ to return to previous question", stdout); + fputs("S O R T D I R v0.83 alpha Use ^ to return to previous question", stdout); hlinechar(' '); revers(0); diff --git a/sortdir.po b/sortdir.po index 32b3daba908ed19092232414e138aa3d1683f284..4356960653b9b613191f409822ac3e00230d14d0 100644 GIT binary patch delta 28577 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 G`hNgjtTfR8 delta 28112 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