From 7e98017cb93c145a151c525003e998e3ab3a991b Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sun, 31 May 2020 02:57:29 -0400 Subject: [PATCH] Moved creation of filelist[] into separate function. Fixed FS corruption bug. --- sortdir.c | 81 +++++++++++++++++++++++------------------------------ sortdir.po | Bin 143360 -> 143360 bytes 2 files changed, 35 insertions(+), 46 deletions(-) diff --git a/sortdir.c b/sortdir.c index 1047559..183409a 100644 --- a/sortdir.c +++ b/sortdir.c @@ -3,6 +3,8 @@ * * Bobbi January-March 2020 * + * TODO: Obsolete MAXFILES is hardcoded - need a better way to do this + * TODO: Check for no memory when allocating aux memory * TODO: Enable free list functionality on ProDOS-8 * TODO: Get both ProDOS-8 and GNO versions to build from this source * TODO: Trimming unused directory blocks @@ -17,6 +19,7 @@ * v0.56 Minor improvements to conditional compilation * v0.57 Fixed bugs in aux memory allocation, memory zeroing bug * v0.58 Fixed more bugs. Now working properly using aux memory + * v0.59 Moved creation of filelist[] into buildsorttable(). More bugfix. */ //#pragma debug 9 @@ -39,7 +42,6 @@ #include #include -#undef DEBUG /* Enable additional debug printout */ #define CHECK /* Perform additional integrity checking */ #define SORT /* Enable sorting code */ #undef FREELIST /* Checking of free list */ @@ -291,8 +293,9 @@ void copyaux(char *src, char *dst, uint len, uchar dir) { /* Extremely simple aux memory allocator */ /* TODO: Check for overflow!!!! */ char *auxalloc(uint bytes) { + char *p = auxp; auxp += bytes; - return auxp; + return p; } /* TODO: Will need something better */ @@ -386,9 +389,6 @@ void flushall(void) { */ int readdiskblock(uchar device, uint blocknum, char *buf) { int rc; -#ifdef DEBUG - printf("Reading dev %2u block %5u\n", device, blocknum); -#endif #ifdef CHECK #ifdef FREELIST if (flloaded) @@ -418,9 +418,6 @@ int readdiskblock(uchar device, uint blocknum, char *buf) { */ int writediskblock(uchar device, uint blocknum, char *buf) { int rc; -#ifdef DEBUG - printf("Writing dev %2u blk %5u\n", device, blocknum); -#endif if ((strcmp(currdir, "LIB") == 0) || (strcmp(currdir, "LIBRARIES") == 0)) { printf("Not writing library directory %s\n", currdir); @@ -1073,9 +1070,6 @@ int readdir(uint device, uint blocknum) { #ifdef AUXMEM curblk->data = auxalloc(BLKSZ); curblk->sorteddata = auxalloc(BLKSZ); - // TODO ZERO sorteddata -#else - bzero(curblk->sorteddata, BLKSZ); #endif #ifdef FREELIST @@ -1203,8 +1197,9 @@ int readdir(uint device, uint blocknum) { #endif blks = ent->blksused[0] + 256U * ent->blksused[1]; eof = ent->eof[0] + 256L * ent->eof[1] + 65536L * ent->eof[2]; - for (i = 0; i < NMLEN + 1; ++i) - filelist[numfiles].name[i] = '\0'; + +/*** + bzero(filelist[numfiles].name, NMLEN + 1); for (i = 0; i < (ent->typ_len & 0x0f); ++i) filelist[numfiles].name[i] = namebuf[i]; filelist[numfiles].type = ent->type; @@ -1218,6 +1213,7 @@ int readdir(uint device, uint blocknum) { "%04d-%02d-%02d %02d:%02d %s", dt.year, dt.month, dt.day, dt.hour, dt.minute, (dt.ispd25format ? "*" : " ")); +***/ keyblk = ent->keyptr[0] + 256U * ent->keyptr[1]; hdrblk = ent->hdrptr[0] + 256U * ent->hdrptr[1]; @@ -1297,16 +1293,18 @@ int readdir(uint device, uint blocknum) { ++entries; } if (blkentries == entperblk) { + blocknum = dirblkbuf[0x02] + 256U * dirblkbuf[0x03]; #ifdef AUXMEM copyaux(dirblkbuf, curblk->data, BLKSZ, TOAUX); -/// bzero(dirblkbuf + PTRSZ, BLKSZ - PTRSZ); - copyaux(dirblkbuf, curblk->sorteddata, BLKSZ, TOAUX); + bzero(buf, BLKSZ); + memcpy(buf, dirblkbuf, PTRSZ); + copyaux(buf, curblk->sorteddata, BLKSZ, TOAUX); #else memcpy(curblk->data, dirblkbuf, BLKSZ); -////// bzero(dirblkbuf + PTRSZ, BLKSZ - PTRSZ); - memcpy(curblk->sorteddata, dirblkbuf, PTRSZ); + bzero(buf, BLKSZ); + memcpy(buf, dirblkbuf, PTRSZ); + memcpy(curblk->sorteddata, buf, BLKSZ); #endif - blocknum = dirblkbuf[0x02] + 256U * dirblkbuf[0x03]; if (blocknum == 0) { break; } @@ -1321,9 +1319,6 @@ int readdir(uint device, uint blocknum) { #ifdef AUXMEM curblk->data = auxalloc(BLKSZ); curblk->sorteddata = auxalloc(BLKSZ); - // TODO: Zero sorteddata -#else - bzero(curblk->sorteddata, BLKSZ); #endif #ifdef FREELIST @@ -1352,21 +1347,22 @@ int readdir(uint device, uint blocknum) { } #ifdef AUXMEM copyaux(dirblkbuf, curblk->data, BLKSZ, TOAUX); -/// bzero(dirblkbuf + PTRSZ, BLKSZ - PTRSZ); - copyaux(dirblkbuf, curblk->sorteddata, BLKSZ, TOAUX); + bzero(buf, BLKSZ); + memcpy(buf, dirblkbuf, PTRSZ); + copyaux(buf, curblk->sorteddata, BLKSZ, TOAUX); #else memcpy(curblk->data, dirblkbuf, BLKSZ); -//// bzero(dirblkbuf + PTRSZ, BLKSZ - PTRSZ); - memcpy(curblk->sorteddata, dirblkbuf, PTRSZ); + bzero(buf, BLKSZ); + memcpy(buf, dirblkbuf, PTRSZ); + memcpy(curblk->sorteddata, buf, BLKSZ); #endif return errcount - errsbefore; } /* - * Build filelist[] which the table used by the sorting algorithm. + * Build filelist[], the table used by the sorting algorithm. */ -#if 0 void buildsorttable() { static char namebuf[NMLEN+1]; uint off, blks, eof; @@ -1375,8 +1371,8 @@ void buildsorttable() { struct pd_dirent *ent; uint idx = 0; struct block *b = blocks; - uchar firstent = 1; /* Skip first entry of first block */ - uchar blkidx = 0; + uchar firstent = 2; /* Skip first entry of first block */ + uchar blkidx = 1; while (b) { #ifdef AUXMEM @@ -1384,9 +1380,8 @@ void buildsorttable() { #else memcpy(dirblkbuf, b->data, BLKSZ); #endif - for (entry = firstent; entry < ENTPERBLK; ++entry) { -printf("blk %u entry %u\n", blkidx, entry); - off = PTRSZ + entry * ENTSZ; + for (entry = firstent; entry <= ENTPERBLK; ++entry) { + off = PTRSZ + (entry - 1) * entsz; ent = (struct pd_dirent*)(dirblkbuf + off); if (ent->typ_len != 0) { @@ -1396,13 +1391,7 @@ printf("blk %u entry %u\n", blkidx, entry); fixcase(ent->name, namebuf, ent->vers, ent->minvers, ent->typ_len & 0x0f); - printf("%u %u - ", blkidx, entry); - fputs(namebuf,stdout); - printf(" %u %u\n", blks, eof); - - for (i = 0; i < NMLEN + 1; ++i) - filelist[idx].name[i] = '\0'; - //bzero(filelist[idx].name, NMLEN + 1); + bzero(filelist[idx].name, NMLEN + 1); for (i = 0; i < (ent->typ_len & 0x0f); ++i) filelist[idx].name[i] = namebuf[i]; filelist[idx].type = ent->type; @@ -1421,14 +1410,13 @@ printf("blk %u entry %u\n", blkidx, entry); } b = b->next; ++blkidx; - firstent = 0; + firstent = 1; } - numfiles = idx - 1; + numfiles = idx; } -#endif - #ifdef SORT + /* * Compare - filename sort in ascending order */ @@ -1584,6 +1572,7 @@ int cmp_noop(const void *a, const void *b) { struct fileent *bb = (struct fileent*)b; return aa->order - bb->order; } + #endif /* @@ -1734,7 +1723,7 @@ void copyent(uint srcblk, uint srcent, uint dstblk, uint dstent, uint device) { dstptr = dest->sorteddata + PTRSZ + (dstent-1) * entsz; #ifdef AUXMEM copyaux(srcptr, buf2, entsz, FROMAUX); - copyaux(buf2, dstptr, entsz, TOAUX); + copyaux(buf2, dstptr, entsz-1, TOAUX); // USING SIZE-1 MAKES IT WORK!!!!! #else memcpy(dstptr, srcptr, entsz); #endif @@ -1820,7 +1809,7 @@ void interactive(void) { doverbose = 1; - puts("S O R T D I R v0.58 alpha Use ^ to return to previous question"); + puts("S O R T D I R v0.59 alpha Use ^ to return to previous question"); q1: fputs("\nEnter path (e.g.: /H1) of starting directory> ", stdout); @@ -1939,7 +1928,7 @@ void processdir(uint device, uint blocknum) { uchar i, errs; flushall(); errs = readdir(device, blocknum); - //buildsorttable(); + buildsorttable(); // if (doverbose) { // printlist(); // } diff --git a/sortdir.po b/sortdir.po index f7781f5441ea45c67d350de866969bbde541de74..dbe3cc014e262adb05cc7960e9e65d2ee2e7e824 100644 GIT binary patch delta 24270 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 delta 24472 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