From ec1c4700203b8068902345810a45c8cbb033da27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Strohh=C3=A4cker?= Date: Wed, 5 Jul 2006 21:18:14 +0000 Subject: [PATCH] some more drive_fat fixes, cleanups and removal of some compiler warnings Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2667 --- src/dos/drive_fat.cpp | 159 ++++++++++++++++++++++++------------------ 1 file changed, 91 insertions(+), 68 deletions(-) diff --git a/src/dos/drive_fat.cpp b/src/dos/drive_fat.cpp index 90d168c2..9ec8d786 100644 --- a/src/dos/drive_fat.cpp +++ b/src/dos/drive_fat.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: drive_fat.cpp,v 1.17 2006-06-30 12:47:07 c2woody Exp $ */ +/* $Id: drive_fat.cpp,v 1.18 2006-07-05 21:18:14 c2woody Exp $ */ #include #include @@ -72,9 +72,8 @@ private: /* OUT - char * filearray: Name in DOS directory format, eleven char, e.g. bob txt */ static void convToDirFile(char *filename, char *filearray) { Bit32u charidx = 0; - Bit32u flen; - int i; - flen = strlen(filename); + Bit32u flen,i; + flen = (Bit32u)strlen(filename); memset(filearray, 32, 11); for(i=0;i= 11) break; @@ -87,7 +86,7 @@ static void convToDirFile(char *filename, char *filearray) { } } -fatFile::fatFile(const char* name, Bit32u startCluster, Bit32u fileLen, fatDrive *useDrive) { +fatFile::fatFile(const char* /*name*/, Bit32u startCluster, Bit32u fileLen, fatDrive *useDrive) { Bit32u seekto = 0; firstCluster = startCluster; myDrive = useDrive; @@ -98,8 +97,8 @@ fatFile::fatFile(const char* name, Bit32u startCluster, Bit32u fileLen, fatDrive memset(§orBuffer[0], 0, sizeof(sectorBuffer)); if(filelength > 0) { - Seek(&seekto, DOS_SEEK_SET); - myDrive->loadedDisk->Read_AbsoluteSector(currentSector, sectorBuffer); + Seek(&seekto, DOS_SEEK_SET); + myDrive->loadedDisk->Read_AbsoluteSector(currentSector, sectorBuffer); loadedSector = true; } } @@ -111,6 +110,19 @@ bool fatFile::Read(Bit8u * data, Bit16u *size) { return true; } + if (!loadedSector) { + currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); + if(currentSector == 0) { + /* EOC reached before EOF */ + *size = 0; + loadedSector = false; + return true; + } + curSectOff = 0; + myDrive->loadedDisk->Read_AbsoluteSector(currentSector, sectorBuffer); + loadedSector = true; + } + sizedec = *size; sizecount = 0; while(sizedec != 0) { @@ -118,8 +130,7 @@ bool fatFile::Read(Bit8u * data, Bit16u *size) { *size = sizecount; return true; } - data[sizecount] = sectorBuffer[curSectOff]; - curSectOff++; + data[sizecount++] = sectorBuffer[curSectOff++]; seekpos++; if(curSectOff >= myDrive->getSectorSize()) { currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); @@ -127,14 +138,15 @@ bool fatFile::Read(Bit8u * data, Bit16u *size) { /* EOC reached before EOF */ //LOG_MSG("EOC reached before EOF, seekpos %d, filelen %d", seekpos, filelength); *size = sizecount; + loadedSector = false; return true; } curSectOff = 0; myDrive->loadedDisk->Read_AbsoluteSector(currentSector, sectorBuffer); + loadedSector = true; //LOG_MSG("Reading absolute sector at %d for seekpos %d", currentSector, seekpos); } --sizedec; - sizecount++; } *size =sizecount; return true; @@ -159,9 +171,25 @@ bool fatFile::Write(Bit8u * data, Bit16u *size) { loadedSector = true; } filelength = seekpos+1; + if (!loadedSector) { + currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); + if(currentSector == 0) { + /* EOC reached before EOF - try to increase file allocation */ + myDrive->appendCluster(firstCluster); + /* Try getting sector again */ + currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); + if(currentSector == 0) { + /* No can do. lets give up and go home. We must be out of room */ + goto finalizeWrite; + } + } + curSectOff = 0; + myDrive->loadedDisk->Read_AbsoluteSector(currentSector, sectorBuffer); + + loadedSector = true; + } } - sectorBuffer[curSectOff] = data[sizecount]; - curSectOff++; + sectorBuffer[curSectOff++] = data[sizecount++]; seekpos++; if(curSectOff >= myDrive->getSectorSize()) { if(loadedSector) myDrive->loadedDisk->Write_AbsoluteSector(currentSector, sectorBuffer); @@ -174,8 +202,8 @@ bool fatFile::Write(Bit8u * data, Bit16u *size) { currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); if(currentSector == 0) { /* No can do. lets give up and go home. We must be out of room */ + loadedSector = false; goto finalizeWrite; - } } curSectOff = 0; @@ -184,14 +212,13 @@ bool fatFile::Write(Bit8u * data, Bit16u *size) { loadedSector = true; } --sizedec; - sizecount++; } if(curSectOff>0 && loadedSector) myDrive->loadedDisk->Write_AbsoluteSector(currentSector, sectorBuffer); finalizeWrite: myDrive->directoryBrowse(dirCluster, &tmpentry, dirIndex); tmpentry.entrysize = filelength; - tmpentry.loFirstClust = firstCluster; + tmpentry.loFirstClust = (Bit16u)firstCluster; myDrive->directoryChange(dirCluster, &tmpentry, dirIndex); *size =sizecount; @@ -199,7 +226,7 @@ finalizeWrite: } bool fatFile::Seek(Bit32u *pos, Bit32u type) { - Bit32s seekto; + Bit32s seekto=0; switch(type) { case DOS_SEEK_SET: @@ -213,14 +240,19 @@ bool fatFile::Seek(Bit32u *pos, Bit32u type) { seekto = (Bit32s)filelength + (Bit32s)*pos; break; } - LOG_MSG("Seek to %d with type %d (absolute value %d)", *pos, type, seekto); +// LOG_MSG("Seek to %d with type %d (absolute value %d)", *pos, type, seekto); if((Bit32u)seekto > filelength) seekto = (Bit32s)filelength; if(seekto<0) seekto = 0; seekpos = (Bit32u)seekto; currentSector = myDrive->getAbsoluteSectFromBytePos(firstCluster, seekpos); - curSectOff = seekpos % myDrive->getSectorSize(); - myDrive->loadedDisk->Read_AbsoluteSector(currentSector, sectorBuffer); + if (currentSector == 0) { + /* not within file size, thus no sector is available */ + loadedSector = false; + } else { + curSectOff = seekpos % myDrive->getSectorSize(); + myDrive->loadedDisk->Read_AbsoluteSector(currentSector, sectorBuffer); + } *pos = seekpos; return true; } @@ -245,10 +277,10 @@ Bit32u fatDrive::getClustFirstSect(Bit32u clustNum) { } Bit32u fatDrive::getClusterValue(Bit32u clustNum) { - Bit32u fatoffset; + Bit32u fatoffset=0; Bit32u fatsectnum; Bit32u fatentoff; - Bit32u clustValue; + Bit32u clustValue=0; switch(fattype) { case FAT12: @@ -292,10 +324,9 @@ Bit32u fatDrive::getClusterValue(Bit32u clustNum) { } void fatDrive::setClusterValue(Bit32u clustNum, Bit32u clustValue) { - Bit32u fatoffset; + Bit32u fatoffset=0; Bit32u fatsectnum; Bit32u fatentoff; - Bit32u tmpValue; switch(fattype) { case FAT12: @@ -319,23 +350,24 @@ void fatDrive::setClusterValue(Bit32u clustNum, Bit32u clustValue) { } switch(fattype) { - case FAT12: - tmpValue = *((Bit16u *)&fatSectBuffer[fatentoff]); + case FAT12: { + Bit16u tmpValue = *((Bit16u *)&fatSectBuffer[fatentoff]); if(clustNum & 0x1) { clustValue &= 0xfff; clustValue <<= 4; tmpValue &= 0xf; - tmpValue |= clustValue; + tmpValue |= (Bit16u)clustValue; } else { clustValue &= 0xfff; tmpValue &= 0xf000; - tmpValue |= clustValue; + tmpValue |= (Bit16u)clustValue; } *((Bit16u *)&fatSectBuffer[fatentoff]) = tmpValue; break; + } case FAT16: - *((Bit16u *)&fatSectBuffer[fatentoff]) = clustValue; + *((Bit16u *)&fatSectBuffer[fatentoff]) = (Bit16u)clustValue; break; case FAT32: *((Bit32u *)&fatSectBuffer[fatentoff]) = clustValue; @@ -349,11 +381,8 @@ void fatDrive::setClusterValue(Bit32u clustNum, Bit32u clustValue) { } bool fatDrive::getEntryName(char *fullname, char *entname) { - Bit16u len = strlen(fullname); char dirtoken[DOS_PATHLENGTH]; - Bit32u currentClust = 0; - direntry foundEntry; char * findDir; char * findFile; strcpy(dirtoken,fullname); @@ -370,7 +399,7 @@ bool fatDrive::getEntryName(char *fullname, char *entname) { } bool fatDrive::getFileDirEntry(char * filename, direntry * useEntry, Bit32u * dirClust, Bit32u * subEntry) { - Bit16u len = strlen(filename); + Bit32u len = (Bit32u)strlen(filename); char dirtoken[DOS_PATHLENGTH]; Bit32u currentClust = 0; @@ -405,7 +434,7 @@ bool fatDrive::getFileDirEntry(char * filename, direntry * useEntry, Bit32u * di } /* Search found directory for our file */ - imgDTA->SetupSearch(0,0x5,findFile); + imgDTA->SetupSearch(0,0x7,findFile); imgDTA->SetDirID(0); if(!FindNextInternal(currentClust, *imgDTA, &foundEntry)) return false; @@ -416,7 +445,7 @@ bool fatDrive::getFileDirEntry(char * filename, direntry * useEntry, Bit32u * di } bool fatDrive::getDirClustNum(char *dir, Bit32u *clustNum, bool parDir) { - Bit16u len = strlen(dir); + Bit32u len = (Bit32u)strlen(dir); char dirtoken[DOS_PATHLENGTH]; Bit32u currentClust = 0; direntry foundEntry; @@ -444,13 +473,11 @@ bool fatDrive::getDirClustNum(char *dir, Bit32u *clustNum, bool parDir) { } *clustNum = currentClust; - return true; } else { /* Set to root directory */ *clustNum = 0; - return true; } - return false; + return true; } Bit32u fatDrive::getSectorSize(void) { @@ -685,14 +712,22 @@ fatDrive::fatDrive(const char *sysFilename, Bit32u bytesector, Bit32u cylsector, bool fatDrive::AllocationInfo(Bit16u *_bytes_sector, Bit8u *_sectors_cluster, Bit16u *_total_clusters, Bit16u *_free_clusters) { Bit32u hs, cy, sect,sectsize; Bit32u countFree = 0; - int i; + Bit32u i; loadedDisk->Get_Geometry(&hs, &cy, §, §size); *_bytes_sector = (Bit16u)sectsize; *_sectors_cluster = bootbuffer.sectorspercluster; - *_total_clusters = CountOfClusters; + if (CountOfClusters<65536) *_total_clusters = (Bit16u)CountOfClusters; + else { + // maybe some special handling needed for fat32 + *_total_clusters = 65535; + } for(i=0;i=0) { @@ -978,15 +1009,11 @@ bool fatDrive::directoryBrowse(Bit32u dirClustNumber, direntry *useEntry, Bit32s } bool fatDrive::directoryChange(Bit32u dirClustNumber, direntry *useEntry, Bit32s entNum) { - direntry sectbuf[16]; /* 16 directory entries per sector */ - Bit32u logentsector; /* Logical entry sector */ - Bit32u entryoffset; /* Index offset within sector */ + direntry sectbuf[16]; /* 16 directory entries per sector */ + Bit32u logentsector; /* Logical entry sector */ + Bit32u entryoffset = 0; /* Index offset within sector */ Bit32u tmpsector = 0; - Bit8u attrs; Bit16u dirPos = 0; - char srch_pattern[DOS_NAMELENGTH_ASCII]; - char find_name[DOS_NAMELENGTH_ASCII]; - char extension[4]; while(entNum>=0) { @@ -1024,13 +1051,9 @@ bool fatDrive::addDirectoryEntry(Bit32u dirClustNumber, direntry useEntry) { Bit32u logentsector; /* Logical entry sector */ Bit32u entryoffset; /* Index offset within sector */ Bit32u tmpsector; - Bit8u attrs; Bit16u dirPos = 0; - char srch_pattern[DOS_NAMELENGTH_ASCII]; - char find_name[DOS_NAMELENGTH_ASCII]; - char extension[4]; - while(true) { + for(;;) { logentsector = dirPos / 16; entryoffset = dirPos % 16; @@ -1058,11 +1081,11 @@ bool fatDrive::addDirectoryEntry(Bit32u dirClustNumber, direntry useEntry) { if ((sectbuf[entryoffset].entryname[0] == 0xe5) || (sectbuf[entryoffset].entryname[0] == 0x00)) { sectbuf[entryoffset] = useEntry; loadedDisk->Write_AbsoluteSector(tmpsector,sectbuf); - return true; + break; } } - return false; + return true; } void fatDrive::zeroOutCluster(Bit32u clustNumber) { @@ -1151,7 +1174,6 @@ bool fatDrive::RemoveDir(char *dir) { Bit32u filecount = 0; /* Set to 2 to skip first 2 entries, [.] and [..] */ Bit32s fileidx = 2; - if (dirClust==0) fileidx = 0; // root directory while(directoryBrowse(dummyClust, &tmpentry, fileidx)) { /* Check for non-deleted files */ if(tmpentry.entryname[0] != 0xe5) filecount++; @@ -1162,7 +1184,8 @@ bool fatDrive::RemoveDir(char *dir) { if(filecount > 0) return false; /* Find directory entry in parent directory */ - fileidx = 2; + if (dirClust==0) fileidx = 0; // root directory + else fileidx = 2; bool found = false; while(directoryBrowse(dirClust, &tmpentry, fileidx)) { if(memcmp(&tmpentry.entryname, &pathName[0], 11) == 0) { @@ -1181,7 +1204,7 @@ bool fatDrive::RemoveDir(char *dir) { return true; } -bool fatDrive::Rename(char *oldname, char*newname) { +bool fatDrive::Rename(char * /*oldname*/, char * /*newname*/) { return false; }