diff --git a/src/com/webcodepro/applecommander/storage/ProdosFileEntry.java b/src/com/webcodepro/applecommander/storage/ProdosFileEntry.java index 5033f60..f4dd06d 100644 --- a/src/com/webcodepro/applecommander/storage/ProdosFileEntry.java +++ b/src/com/webcodepro/applecommander/storage/ProdosFileEntry.java @@ -254,6 +254,15 @@ public class ProdosFileEntry extends ProdosCommonEntry implements FileEntry { return AppleUtil.getWordValue(readFileEntry(), 0x25); } + /** + * Set the block number of the block for the directory which describes this file. + */ + public void setHeaderPointer(int headerPointer) { + byte[] entry = readFileEntry(); + AppleUtil.setWordValue(entry, 0x25, headerPointer); + writeFileEntry(entry); + } + /** * Identify if this file is locked. */ @@ -296,7 +305,19 @@ public class ProdosFileEntry extends ProdosCommonEntry implements FileEntry { */ public void delete() { getDisk().freeBlocks(this); - setStorageType(0); + + //decrement file count in header block + int headerBlock = getHeaderPointer(); + byte[] data = getDisk().readBlock(headerBlock); + int fileCount = AppleUtil.getWordValue(data, 0x25); + if (fileCount != 0) fileCount--; + AppleUtil.setWordValue(data, 0x25, fileCount); + getDisk().writeBlock(headerBlock, data); + + //clear storage type and name length + data = readFileEntry(); + data[0] = 0; + writeFileEntry(data); } /** diff --git a/src/com/webcodepro/applecommander/storage/ProdosFileTypes.properties b/src/com/webcodepro/applecommander/storage/ProdosFileTypes.properties index 5004aee..34564ad 100644 --- a/src/com/webcodepro/applecommander/storage/ProdosFileTypes.properties +++ b/src/com/webcodepro/applecommander/storage/ProdosFileTypes.properties @@ -127,6 +127,7 @@ filetype.f9=P16 filetype.fa=INT filetype.fb=IVR filetype.fc=BAS +filetype.fc.address=true filetype.fd=VAR filetype.fe=REL filetype.ff=SYS diff --git a/src/com/webcodepro/applecommander/storage/ProdosFormatDisk.java b/src/com/webcodepro/applecommander/storage/ProdosFormatDisk.java index 1493fde..c7b1ecb 100644 --- a/src/com/webcodepro/applecommander/storage/ProdosFormatDisk.java +++ b/src/com/webcodepro/applecommander/storage/ProdosFormatDisk.java @@ -189,6 +189,7 @@ public class ProdosFormatDisk extends FormattedDisk { throws DiskFullException { int blockNumber = directory.getFileEntryBlock(); + int headerBlock = blockNumber; while (blockNumber != 0) { byte[] block = readBlock(blockNumber); int offset = 4; @@ -197,6 +198,7 @@ public class ProdosFormatDisk extends FormattedDisk { if ((value & 0xf0) == 0) { ProdosFileEntry fileEntry = new ProdosFileEntry(this, blockNumber, offset); + fileEntry.setKeyPointer(0); //may have been recycled fileEntry.setCreationDate(new Date()); fileEntry.setProdosVersion(0); fileEntry.setMinimumProdosVersion(0); @@ -204,7 +206,8 @@ public class ProdosFormatDisk extends FormattedDisk { fileEntry.setCanRead(true); fileEntry.setCanRename(true); fileEntry.setCanWrite(true); - fileEntry.setSaplingFile(); + fileEntry.setSeedlingFile(); + fileEntry.setHeaderPointer(headerBlock); fileEntry.setFilename("BLANK"); directory.incrementFileCount(); return fileEntry; diff --git a/src/com/webcodepro/applecommander/storage/TextFileFilter.java b/src/com/webcodepro/applecommander/storage/TextFileFilter.java index b5a16b5..da0f209 100644 --- a/src/com/webcodepro/applecommander/storage/TextFileFilter.java +++ b/src/com/webcodepro/applecommander/storage/TextFileFilter.java @@ -19,6 +19,9 @@ */ package com.webcodepro.applecommander.storage; +import java.io.ByteArrayOutputStream; +import java.io.PrintWriter; + /** * Filter the given file data for text. *

@@ -34,28 +37,31 @@ public class TextFileFilter implements FileFilter { } /** - * Process the given FileEntry and return a byte array with filtered data. - * @see com.webcodepro.applecommander.storage.FileFilter#filter(byte[]) + * Process the given FileEntry and return a byte array + * with filtered data; use PrintWriter to get platform + * agnostic line endings. */ public byte[] filter(FileEntry fileEntry) { byte[] fileData = fileEntry.getFileData(); - byte[] workingData = new byte[fileData.length]; - int position = 0; - for (int i=0; i= 2000) { + year -= 2000; + } else { + year -= 1900; + } } int ymd = ((year & 0x7f) << 9) | ((month & 0xf) << 5) | (day & 0x1f); int hm = ((hour & 0x1f) << 8) | (minute & 0x3f);