void QuantumFile::Open(String p_FileName, ArrayIndex p_BufferCount) { QuantumFileHeaderStruct QFHS; char *TempBlock; QuantumNumber *TempMainObjectBlock; QFreeSpaceEntry *TempFreeSpaceBlock; ArrayIndex i; int FileCreation; QFreeSpaceEntry TempFreeSpaceEntry; int ProgramVersion; int FileVersion; m_ReadCount = 0; m_WriteCount = 0; m_Block.SetSize(p_BufferCount); m_BlockNumber.SetSize(p_BufferCount); m_BufferModified.SetSize(p_BufferCount); m_TimeStamp.SetSize(p_BufferCount); if (p_FileName == "") { m_DosFilePtr = 0; return; } m_DosFilePtr = fopen(p_FileName,"r+b"); if (m_DosFilePtr == NULL) /* file does not exist */ { FileCreation = TRUE; m_DosFilePtr = fopen(p_FileName,"w+b"); /* create it */ TempBlock = new char[BlockSize]; TempMainObjectBlock = (QuantumNumber *)TempBlock; TempFreeSpaceBlock = (QFreeSpaceEntry *)TempBlock; memset((void *)&QFHS,0,sizeof(QuantumFileHeaderStruct)); QFHS.main_object_index_count = MainObjectIndexCount; QFHS.free_space_list_count = MaxFileQuantumCount; strcpy(QFHS.quantum_version_info,program_version_info); QFHS.main_object_index_offset = BlockSize; QFHS.free_space_list_offset = QFHS.main_object_index_offset+ BlockSize*((MainObjectIndexCount-1)/MainObjectEntriesPerBlock+1); QFHS.starting_quantum_offset = QFHS.free_space_list_offset+ BlockSize*((MaxFileQuantumCount-1)/FreeSpaceEntriesPerBlock+1); fseek(m_DosFilePtr,0,SEEK_SET); memset(TempBlock,0,BlockSize); fwrite(TempBlock,1,BlockSize,m_DosFilePtr); // clear block 0 fseek(m_DosFilePtr,0,SEEK_SET); fwrite(&QFHS,1,sizeof(QuantumFileHeaderStruct), m_DosFilePtr); /* clear the main object index */ memset(TempMainObjectBlock,0,BlockSize); TempMainObjectBlock[0] = NoQuantum; fseek(m_DosFilePtr,QFHS.main_object_index_offset,SEEK_SET); fwrite(TempMainObjectBlock,BlockSize,1,m_DosFilePtr); /* clear the free space list */ TempFreeSpaceEntry.m_FreeSpaceCode = AvailableQuantum; TempFreeSpaceEntry.m_ObjectNumber = 0; for (i = 0; i < FreeSpaceEntriesPerBlock; i ++) TempFreeSpaceBlock[i] = TempFreeSpaceEntry; TempFreeSpaceBlock[0].m_FreeSpaceCode = 0; /* Q #0 doesn't exist */ ArrayIndex FreeSpaceCount = (QFHS.free_space_list_count-1)/ FreeSpaceEntriesPerBlock+1; for (i = 0; i < FreeSpaceCount; i ++) { fseek(m_DosFilePtr,QFHS.free_space_list_offset+i*BlockSize,SEEK_SET); fwrite(TempFreeSpaceBlock,sizeof(QFreeSpaceEntry), FreeSpaceEntriesPerBlock,m_DosFilePtr); TempFreeSpaceBlock[0].m_FreeSpaceCode = AvailableQuantum; } delete [] TempBlock; } else { FileCreation = FALSE; fread(&QFHS,1,sizeof(QuantumFileHeaderStruct),m_DosFilePtr); ProgramVersion = atoi(program_version_info); FileVersion = atoi(QFHS.quantum_version_info); if (ProgramVersion != FileVersion) { printf("Program version %d does not match file version %d.\n", ProgramVersion,FileVersion); // exit(1); // file is newer than program, so forget it } } m_MainObjectStartingBlock = QFHS.main_object_index_offset / BlockSize; m_FreeSpaceListStartingBlock = QFHS.free_space_list_offset / BlockSize; m_QuantumStartingBlock = QFHS.starting_quantum_offset / BlockSize; m_MainObjectCount = QFHS.main_object_index_count; m_FreeSpaceListCount = QFHS.free_space_list_count; for (i = 0; i < p_BufferCount; i ++) { m_Block[i] = new Block; m_BlockNumber[i] = BadBlockNumber; m_BufferModified[i] = FALSE; m_TimeStamp[i] = 0; } m_FreeSpaceArray = new FreeSpaceArrayPtr(this); m_MainObjectArray = new MainObjectArrayPtr(this); if (FileCreation == TRUE) // set up main object name object (*m_MainObjectArray)->CreateMainObject("Directory", MainObjectDirectory, MainObjectIndexCount,MainObjectIndexCount); }