From aa8d1b069900ead2a3572d385c5c25e2bd88cac6 Mon Sep 17 00:00:00 2001
From: ksherlock <ksherlock@aa027e90-d47c-11dd-86d7-074df07e0730>
Date: Sun, 25 Jan 2009 17:29:17 +0000
Subject: [PATCH] sparse files, namespacing, $B0 ftype

git-svn-id: https://profuse.googlecode.com/svn/trunk@28 aa027e90-d47c-11dd-86d7-074df07e0730
---
 Disk.cpp                         |  53 ++-
 Disk.h                           |  16 +-
 File.cpp                         |  47 +--
 File.h                           |  24 +-
 profuse.xcodeproj/kelvin.mode1v3 |  76 +++--
 profuse.xcodeproj/kelvin.pbxuser | 548 +++++++++++++------------------
 profuse_dirent.cpp               |   6 +-
 profuse_file.cpp                 |   3 +-
 profuse_stat.cpp                 |  12 +-
 profuse_xattr.cpp                |   7 +-
 10 files changed, 359 insertions(+), 433 deletions(-)

diff --git a/Disk.cpp b/Disk.cpp
index 4f9fa45..a22f5c8 100644
--- a/Disk.cpp
+++ b/Disk.cpp
@@ -41,6 +41,7 @@ Disk::Disk()
     _blocks = 0;
     _offset = 0;
     _size = 0;
+    _flags = 0;
 }
 
 Disk::~Disk()
@@ -50,7 +51,7 @@ Disk::~Disk()
 }
 
 
-Disk *Disk::OpenFile(const char *file, bool dos_order)
+Disk *Disk::OpenFile(const char *file, unsigned flags)
 {
     int fd;
     struct stat st;
@@ -106,6 +107,7 @@ Disk *Disk::OpenFile(const char *file, bool dos_order)
                         offset = 84;
                         blocks = dc.data_size >> 9;
                         ok = true;
+                        flags |= P8_DC42;
                         break;
                     }
                     
@@ -119,6 +121,7 @@ Disk *Disk::OpenFile(const char *file, bool dos_order)
                         blocks = udi.data_blocks;
                         offset = udi.data_offset;
                         ok = true;
+                        flags |= P8_2MG;
                         break;
                     }
 
@@ -141,7 +144,7 @@ Disk *Disk::OpenFile(const char *file, bool dos_order)
                 d->_data = (uint8_t *)map;
                 d->_blocks = blocks;
                 d->_offset = offset;
-                d->_dosorder = dos_order;
+                d->_flags = flags;
             }
 
         }
@@ -168,7 +171,8 @@ int Disk::Normalize(FileEntry &f, unsigned fork, ExtendedEntry *ee)
     ok = Read(f.key_pointer, buffer);
     if (ok < 0) return ok;
     
-    ExtendedEntry e(buffer);
+    ExtendedEntry e;
+    e.Load(buffer);
     
     if (fork == 0)
     {
@@ -197,7 +201,7 @@ int Disk::Read(unsigned block, void *buffer)
     if (block > _blocks) return -P8_INVALID_BLOCK;
     
     
-    if (_dosorder)
+    if (_flags & P8_DOS_ORDER)
     {
         static unsigned do_map[] = {0x00, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x0f };
                 
@@ -233,7 +237,7 @@ void *Disk::ReadFile(const FileEntry &f, unsigned fork, uint32_t *size, int *err
     SET_ERROR(0);
     SET_SIZE(0);
         
-    if (fork != DATA_FORK && fork != RESOURCE_FORK)
+    if (fork != P8_DATA_FORK && fork != P8_RESOURCE_FORK)
     {
         SET_ERROR(-P8_INVALID_FORK);
         return NULL;
@@ -252,7 +256,7 @@ void *Disk::ReadFile(const FileEntry &f, unsigned fork, uint32_t *size, int *err
         case SEEDLING_FILE:
         case SAPLING_FILE:
         case TREE_FILE:
-            if (fork != DATA_FORK)
+            if (fork != P8_DATA_FORK)
             {
                 SET_ERROR(1);
                 return NULL;
@@ -271,9 +275,10 @@ void *Disk::ReadFile(const FileEntry &f, unsigned fork, uint32_t *size, int *err
                     return NULL;
                 }
                 
-                ExtendedEntry entry(buffer);
+                ExtendedEntry entry;
+                entry.Load(buffer);
                 
-                if (fork == DATA_FORK)
+                if (fork == P8_DATA_FORK)
                 {
                     storage_type = entry.dataFork.storage_type;
                     eof = entry.dataFork.eof;
@@ -362,9 +367,7 @@ int Disk::ReadFile(const FileEntry &f, void *buffer)
 
 
 int Disk::ReadIndex(unsigned block, void *buffer, unsigned level, off_t offset, unsigned blocks)
-{
-    // does not yet handle sparse files (completely).
-    
+{    
     if (level == 0)
     {
         // data level
@@ -401,12 +404,22 @@ int Disk::ReadIndex(unsigned block, void *buffer, unsigned level, off_t offset,
             return -P8_INTERNAL_ERROR;
     }
     
+    
+
+    
     int ok;
-    
     uint8_t key[BLOCK_SIZE];
-    ok = Read(block, key);
-    if (ok < 0 ) return ok;
     
+    if (block) // not sparse.
+    {
+        ok = Read(block, key);
+        if (ok < 0 ) return ok;
+    }
+    else
+    {
+        // sparse -- zero it out so code below works w/o special cases.
+        bzero(key, BLOCK_SIZE);
+    }
     
     for (unsigned i = first; blocks; i++)
     {
@@ -446,7 +459,8 @@ int Disk::ReadVolume(VolumeEntry *volume, std::vector<FileEntry> *files)
     prev = load16(&buffer[0x00]);
     next = load16(&buffer[0x02]);
     
-    VolumeEntry v(buffer + 0x04);
+    VolumeEntry v;
+    v.Load(buffer + 0x04);
     
     if (v.storage_type != VOLUME_HEADER) return -P8_INVALID_STORAGE_TYPE;
     
@@ -467,7 +481,8 @@ int Disk::ReadVolume(VolumeEntry *volume, std::vector<FileEntry> *files)
             if ( (buffer[0x04 + v.entry_length * index] >> 4) != DELETED_FILE)
             {
                 unsigned offset = v.entry_length * index + 0x4;
-                FileEntry f(buffer + offset);
+                FileEntry f;
+                f.Load(buffer + offset);
                 f.address = (block << 9) + offset;
                 
                 files->push_back(f);
@@ -521,7 +536,8 @@ int Disk::ReadDirectory(unsigned block, SubdirEntry *dir, std::vector<FileEntry>
     prev = load16(&buffer[0x00]);
     next = load16(&buffer[0x02]);
     
-    SubdirEntry v(buffer + 0x04);
+    SubdirEntry v;
+    v.Load(buffer + 0x04);
     
     if (v.storage_type != SUBDIR_HEADER) return -P8_INVALID_STORAGE_TYPE;
 
@@ -543,7 +559,8 @@ int Disk::ReadDirectory(unsigned block, SubdirEntry *dir, std::vector<FileEntry>
             if ( (buffer[0x04 + v.entry_length * index] >> 4) != DELETED_FILE)
             {
                 unsigned offset = v.entry_length * index + 0x4;
-                FileEntry f(buffer + offset);
+                FileEntry f;
+                f.Load(buffer + offset);
                 f.address = (block << 9) + offset;
                 
                 files->push_back(f);
diff --git a/Disk.h b/Disk.h
index dbda672..5f2f622 100644
--- a/Disk.h
+++ b/Disk.h
@@ -27,11 +27,19 @@ enum {
 };
 
 enum {
-    DATA_FORK = 0,
-    RESOURCE_FORK = 1
+    P8_DATA_FORK = 0,
+    P8_RESOURCE_FORK = 1
 };
 
 
+/* flags */
+enum {
+    P8_DOS_ORDER = 1,
+    P8_2MG = 2,
+    P8_DC42 = 4
+    
+};
+
 
 class Disk {
 
@@ -39,7 +47,7 @@ public:
     ~Disk();
     
     //static Disk *Open2MG(const char *file);
-    static Disk *OpenFile(const char *file, bool dos_order);
+    static Disk *OpenFile(const char *file, unsigned flags);
     
 
     int Normalize(FileEntry &f, unsigned fork, ExtendedEntry *ee = NULL);
@@ -62,7 +70,7 @@ private:
     unsigned _blocks;
     size_t _size;
     
-    bool _dosorder;
+    unsigned _flags;
 };
 
 #endif
diff --git a/File.cpp b/File.cpp
index 58a326c..37e6943 100644
--- a/File.cpp
+++ b/File.cpp
@@ -25,7 +25,7 @@
  * o  Year values from 40 to 99 represent 1940 through 1999
  * o  Year values from 0 to 39 represent 2000 through 2039
  */
-inline time_t timeToUnix(unsigned yymmdd, unsigned hhmm)
+static time_t timeToUnix(unsigned yymmdd, unsigned hhmm)
 {
     if (yymmdd == 0) return 0;
     
@@ -46,21 +46,7 @@ inline time_t timeToUnix(unsigned yymmdd, unsigned hhmm)
 
 
 
-FileEntry::FileEntry()
-{
-    bzero(this, sizeof(FileEntry));
-}
-FileEntry::FileEntry(const FileEntry& f)
-{
-    *this = f;
-}
-FileEntry::FileEntry(const FileEntry *f)
-{
-    if (f) *this = *f;
-    else bzero(this, sizeof(FileEntry));
-}
-
-FileEntry::FileEntry(const void *data)
+bool FileEntry::Load(const void *data)
 {
     const uint8_t *cp = (const uint8_t *)data;
     
@@ -107,15 +93,14 @@ FileEntry::FileEntry(const void *data)
     last_mod = timeToUnix(load16(&cp[0x21]), load16(&cp[0x23]));
     
     header_pointer = load16(&cp[0x25]);
+    
+    return true;
 }
 
 
-ExtendedEntry::ExtendedEntry()
-{
-    bzero(this, sizeof(ExtendedEntry));
-}
 
-ExtendedEntry::ExtendedEntry(const void *data)
+
+bool ExtendedEntry::Load(const void *data)
 {
     const uint8_t *cp = (const uint8_t *)data;
     
@@ -159,17 +144,12 @@ ExtendedEntry::ExtendedEntry(const void *data)
         }
     }
     //
+    return true;
 }
 
 
 
-VolumeEntry::VolumeEntry()
-{
-    bzero(this, sizeof(VolumeEntry));
-}
-
-
-VolumeEntry::VolumeEntry(const void *data)
+bool VolumeEntry::Load(const void *data)
 {
     const uint8_t *cp = (const uint8_t *)data;
 
@@ -216,17 +196,14 @@ VolumeEntry::VolumeEntry(const void *data)
     bit_map_pointer = load16(&cp[0x23]);
     
     total_blocks = load16(&cp[0x25]);
+    
+    return true;
 }
 
 
 
-SubdirEntry::SubdirEntry()
-{
-    bzero(this, sizeof(SubdirEntry));
-}
 
-
-SubdirEntry::SubdirEntry(const void *data)
+bool SubdirEntry::Load(const void *data)
 {
     const uint8_t *cp = (const uint8_t *)data;
     
@@ -275,4 +252,6 @@ SubdirEntry::SubdirEntry(const void *data)
     parent_entry = cp[0x25];
     
     parent_entry_length = cp[0x26];
+    
+    return true;
 }
diff --git a/File.h b/File.h
index c69d22e..1492e99 100644
--- a/File.h
+++ b/File.h
@@ -42,11 +42,7 @@ enum {
 class FileEntry {
 public:
     
-    FileEntry();
-    FileEntry(const FileEntry& f);
-    FileEntry(const FileEntry *f);
-    
-    FileEntry(const void *data);
+    bool Load(const void *data);
     
     unsigned storage_type;
     unsigned name_length;
@@ -66,13 +62,6 @@ public:
     uint32_t address;
 };
 
-#if 0
-class BlockList {
-public:
-    unsigned prev_block;
-    unsigned next_block;
-};
-#endif
 
 
 struct MiniEntry {
@@ -86,8 +75,8 @@ struct MiniEntry {
 
 class ExtendedEntry {
 public:
-    ExtendedEntry();
-    ExtendedEntry(const void *data);
+    
+    bool Load(const void *data);
     
     MiniEntry dataFork;
     MiniEntry resourceFork;
@@ -99,8 +88,8 @@ public:
 
 class VolumeEntry {
 public:
-    VolumeEntry();
-    VolumeEntry(const void *data);
+    
+    bool Load(const void *data);
     
     unsigned storage_type;
     unsigned name_length;
@@ -123,8 +112,7 @@ public:
 class SubdirEntry {
 public:
     
-    SubdirEntry();
-    SubdirEntry(const void *data);
+    bool Load(const void *data);
     
     unsigned storage_type;
     unsigned name_length;
diff --git a/profuse.xcodeproj/kelvin.mode1v3 b/profuse.xcodeproj/kelvin.mode1v3
index ccbbfdf..39046fb 100644
--- a/profuse.xcodeproj/kelvin.mode1v3
+++ b/profuse.xcodeproj/kelvin.mode1v3
@@ -282,7 +282,8 @@
 							<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
 							<array>
 								<array>
-									<integer>17</integer>
+									<integer>7</integer>
+									<integer>1</integer>
 									<integer>0</integer>
 								</array>
 							</array>
@@ -308,7 +309,7 @@
 							<real>224</real>
 						</array>
 						<key>RubberWindowFrame</key>
-						<string>189 537 1212 568 0 0 1920 1178 </string>
+						<string>75 119 1212 568 0 0 1920 1178 </string>
 					</dict>
 					<key>Module</key>
 					<string>PBXSmartGroupTreeModule</string>
@@ -324,7 +325,7 @@
 								<key>PBXProjectModuleGUID</key>
 								<string>1CE0B20306471E060097A5F4</string>
 								<key>PBXProjectModuleLabel</key>
-								<string>DiskCopy42.cpp</string>
+								<string>File.h</string>
 								<key>PBXSplitModuleInNavigatorKey</key>
 								<dict>
 									<key>Split0</key>
@@ -332,27 +333,29 @@
 										<key>PBXProjectModuleGUID</key>
 										<string>1CE0B20406471E060097A5F4</string>
 										<key>PBXProjectModuleLabel</key>
-										<string>DiskCopy42.cpp</string>
+										<string>File.h</string>
 										<key>_historyCapacity</key>
 										<integer>0</integer>
 										<key>bookmark</key>
-										<string>B6C786F40F2A612600053681</string>
+										<string>B64E30810F2C0D2F000543FE</string>
 										<key>history</key>
 										<array>
-											<string>B6614B050EFF5F280073C4E7</string>
-											<string>B679E4B60F02EFA200FB3F0C</string>
 											<string>B6B767C80F0FFA3900D819C9</string>
-											<string>B642F1530F133632001F7696</string>
 											<string>B642F1540F133632001F7696</string>
 											<string>B642F16A0F1341D4001F7696</string>
-											<string>B61B78A20F16EA8700C3E140</string>
 											<string>B6C786E50F2A5FF300053681</string>
-											<string>B6C786E60F2A5FF300053681</string>
-											<string>B6C786E70F2A5FF300053681</string>
 											<string>B6C786EE0F2A612600053681</string>
 											<string>B6C786EF0F2A612600053681</string>
-											<string>B6C786F00F2A612600053681</string>
-											<string>B6B7A85F0F140BBB001024D2</string>
+											<string>B6C786F70F2A64CC00053681</string>
+											<string>B6C786F80F2A64CC00053681</string>
+											<string>B6C786F90F2A64CC00053681</string>
+											<string>B6C786FA0F2A64CC00053681</string>
+											<string>B6F4740F0F2ACB4700CB75DA</string>
+											<string>B6E345420F2BB60B00B7FC78</string>
+											<string>B6E345610F2BC07F00B7FC78</string>
+											<string>B64E307D0F2C0D2F000543FE</string>
+											<string>B64E307E0F2C0D2F000543FE</string>
+											<string>B6614B050EFF5F280073C4E7</string>
 										</array>
 										<key>prevStack</key>
 										<array>
@@ -366,12 +369,14 @@
 											<string>B6B17F950F1136550060F7AA</string>
 											<string>B6B17FA80F1140160060F7AA</string>
 											<string>B6B7A8600F140BBB001024D2</string>
-											<string>B6C786E80F2A5FF300053681</string>
 											<string>B6C786E90F2A5FF300053681</string>
 											<string>B6C786EA0F2A5FF300053681</string>
-											<string>B6C786F10F2A612600053681</string>
 											<string>B6C786F20F2A612600053681</string>
 											<string>B6C786F30F2A612600053681</string>
+											<string>B6C786FD0F2A64CC00053681</string>
+											<string>B6F474110F2ACB4700CB75DA</string>
+											<string>B64E307F0F2C0D2F000543FE</string>
+											<string>B64E30800F2C0D2F000543FE</string>
 										</array>
 									</dict>
 									<key>SplitCount</key>
@@ -385,7 +390,7 @@
 								<key>Frame</key>
 								<string>{{0, 0}, {944, 349}}</string>
 								<key>RubberWindowFrame</key>
-								<string>189 537 1212 568 0 0 1920 1178 </string>
+								<string>75 119 1212 568 0 0 1920 1178 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXNavigatorGroup</string>
@@ -405,7 +410,7 @@
 								<key>Frame</key>
 								<string>{{0, 354}, {944, 173}}</string>
 								<key>RubberWindowFrame</key>
-								<string>189 537 1212 568 0 0 1920 1178 </string>
+								<string>75 119 1212 568 0 0 1920 1178 </string>
 							</dict>
 							<key>Module</key>
 							<string>XCDetailModule</string>
@@ -429,9 +434,9 @@
 			</array>
 			<key>TableOfContents</key>
 			<array>
-				<string>B6C786AB0F2A598F00053681</string>
+				<string>B64E30820F2C0D2F000543FE</string>
 				<string>1CE0B1FE06471DED0097A5F4</string>
-				<string>B6C786AC0F2A598F00053681</string>
+				<string>B64E30830F2C0D2F000543FE</string>
 				<string>1CE0B20306471E060097A5F4</string>
 				<string>1CE0B20506471E060097A5F4</string>
 			</array>
@@ -565,12 +570,11 @@
 	<integer>5</integer>
 	<key>WindowOrderList</key>
 	<array>
-		<string>B60E918C0EFD7E1E000E4348</string>
-		<string>1CD10A99069EF8BA00B06720</string>
 		<string>/Users/kelvin/Projects/profuse/profuse.xcodeproj</string>
+		<string>B64E30840F2C0D2F000543FE</string>
 	</array>
 	<key>WindowString</key>
-	<string>189 537 1212 568 0 0 1920 1178 </string>
+	<string>75 119 1212 568 0 0 1920 1178 </string>
 	<key>WindowToolsV3</key>
 	<array>
 		<dict>
@@ -593,7 +597,7 @@
 								<key>PBXProjectModuleGUID</key>
 								<string>1CD0528F0623707200166675</string>
 								<key>PBXProjectModuleLabel</key>
-								<string>profuse_xattr.cpp</string>
+								<string>profuse_file.cpp</string>
 								<key>StatusBarVisibility</key>
 								<true/>
 							</dict>
@@ -602,7 +606,7 @@
 								<key>Frame</key>
 								<string>{{0, 0}, {857, 500}}</string>
 								<key>RubberWindowFrame</key>
-								<string>352 195 857 922 0 0 1920 1178 </string>
+								<string>621 136 857 922 0 0 1920 1178 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXNavigatorGroup</string>
@@ -628,7 +632,7 @@
 								<key>Frame</key>
 								<string>{{0, 505}, {857, 376}}</string>
 								<key>RubberWindowFrame</key>
-								<string>352 195 857 922 0 0 1920 1178 </string>
+								<string>621 136 857 922 0 0 1920 1178 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXBuildResultsModule</string>
@@ -651,14 +655,14 @@
 			<key>TableOfContents</key>
 			<array>
 				<string>B60E918C0EFD7E1E000E4348</string>
-				<string>B6C786CB0F2A5E8000053681</string>
+				<string>B64E30630F2C08EF000543FE</string>
 				<string>1CD0528F0623707200166675</string>
 				<string>XCMainBuildResultsModuleGUID</string>
 			</array>
 			<key>ToolbarConfiguration</key>
 			<string>xcode.toolbar.config.buildV3</string>
 			<key>WindowString</key>
-			<string>352 195 857 922 0 0 1920 1178 </string>
+			<string>621 136 857 922 0 0 1920 1178 </string>
 			<key>WindowToolGUID</key>
 			<string>B60E918C0EFD7E1E000E4348</string>
 			<key>WindowToolIsVisible</key>
@@ -771,13 +775,13 @@
 			<key>TableOfContents</key>
 			<array>
 				<string>1CD10A99069EF8BA00B06720</string>
-				<string>B6C786AD0F2A598F00053681</string>
+				<string>B64E30640F2C08EF000543FE</string>
 				<string>1C162984064C10D400B95A72</string>
-				<string>B6C786AE0F2A598F00053681</string>
-				<string>B6C786AF0F2A598F00053681</string>
-				<string>B6C786B00F2A598F00053681</string>
-				<string>B6C786B10F2A598F00053681</string>
-				<string>B6C786B20F2A598F00053681</string>
+				<string>B64E30650F2C08EF000543FE</string>
+				<string>B64E30660F2C08EF000543FE</string>
+				<string>B64E30670F2C08EF000543FE</string>
+				<string>B64E30680F2C08EF000543FE</string>
+				<string>B64E30690F2C08EF000543FE</string>
 			</array>
 			<key>ToolbarConfiguration</key>
 			<string>xcode.toolbar.config.debugV3</string>
@@ -1003,7 +1007,7 @@
 								<key>PBXProjectModuleGUID</key>
 								<string>1C78EAB2065D492600B07095</string>
 								<key>PBXProjectModuleLabel</key>
-								<string>main.cpp</string>
+								<string>File.cpp</string>
 								<key>StatusBarVisibility</key>
 								<true/>
 							</dict>
@@ -1080,7 +1084,7 @@
 			<key>TableOfContents</key>
 			<array>
 				<string>B60E929F0EFDA500000E4348</string>
-				<string>B61B78A60F16EA8700C3E140</string>
+				<string>B6E345600F2BC07D00B7FC78</string>
 				<string>1C78EAB2065D492600B07095</string>
 				<string>1CD052920623707200166675</string>
 			</array>
@@ -1091,7 +1095,7 @@
 			<key>WindowToolGUID</key>
 			<string>B60E929F0EFDA500000E4348</string>
 			<key>WindowToolIsVisible</key>
-			<true/>
+			<false/>
 		</dict>
 		<dict>
 			<key>Identifier</key>
diff --git a/profuse.xcodeproj/kelvin.pbxuser b/profuse.xcodeproj/kelvin.pbxuser
index 3a8f97e..6697b70 100644
--- a/profuse.xcodeproj/kelvin.pbxuser
+++ b/profuse.xcodeproj/kelvin.pbxuser
@@ -10,7 +10,7 @@
 		);
 		breakpoints = (
 			B60E91C10EFD8049000E4348 /* xmain.cpp:129 */,
-			B60E92720EFDA086000E4348 /* File.cpp:88 */,
+			B60E92720EFDA086000E4348 /* File.cpp:74 */,
 			B6D81E5B0EFDE859000219B7 /* xmain.cpp:163 */,
 			B6AE1CFF0F0335FC00D36ADB /* main.cpp:20 */,
 		);
@@ -115,8 +115,8 @@
 					PBXFileDataSource_Warnings_ColumnID,
 				);
 			};
-			PBXPerProjectTemplateStateSaveDate = 254433671;
-			PBXWorkspaceStateSaveDate = 254433671;
+			PBXPerProjectTemplateStateSaveDate = 254545182;
+			PBXWorkspaceStateSaveDate = 254545182;
 		};
 		perUserProjectItems = {
 			B60E917F0EFD7E1E000E4348 = B60E917F0EFD7E1E000E4348 /* PBXTextBookmark */;
@@ -124,47 +124,40 @@
 			B60E91810EFD7E1E000E4348 = B60E91810EFD7E1E000E4348 /* PBXTextBookmark */;
 			B60E922B0EFD94CA000E4348 = B60E922B0EFD94CA000E4348 /* PBXTextBookmark */;
 			B60E929C0EFDA500000E4348 = B60E929C0EFDA500000E4348 /* PBXTextBookmark */;
-			B61B78A20F16EA8700C3E140 = B61B78A20F16EA8700C3E140 /* PBXTextBookmark */;
-			B61B78A40F16EA8700C3E140 = B61B78A40F16EA8700C3E140 /* PBXTextBookmark */;
-			B6340C7B0F22C271008931E1 = B6340C7B0F22C271008931E1 /* PBXTextBookmark */;
-			B642F1530F133632001F7696 = B642F1530F133632001F7696 /* PBXTextBookmark */;
 			B642F1540F133632001F7696 = B642F1540F133632001F7696 /* PBXTextBookmark */;
 			B642F16A0F1341D4001F7696 = B642F16A0F1341D4001F7696 /* PBXTextBookmark */;
+			B64E306A0F2C08F3000543FE = B64E306A0F2C08F3000543FE /* PBXTextBookmark */;
+			B64E306B0F2C08F3000543FE = B64E306B0F2C08F3000543FE /* PBXTextBookmark */;
+			B64E306C0F2C08F3000543FE = B64E306C0F2C08F3000543FE /* PBXTextBookmark */;
+			B64E306F0F2C0900000543FE = B64E306F0F2C0900000543FE /* PBXTextBookmark */;
+			B64E307D0F2C0D2F000543FE /* PBXTextBookmark */ = B64E307D0F2C0D2F000543FE /* PBXTextBookmark */;
+			B64E307E0F2C0D2F000543FE /* PBXTextBookmark */ = B64E307E0F2C0D2F000543FE /* PBXTextBookmark */;
+			B64E307F0F2C0D2F000543FE /* PBXTextBookmark */ = B64E307F0F2C0D2F000543FE /* PBXTextBookmark */;
+			B64E30800F2C0D2F000543FE /* PBXTextBookmark */ = B64E30800F2C0D2F000543FE /* PBXTextBookmark */;
+			B64E30810F2C0D2F000543FE /* PBXTextBookmark */ = B64E30810F2C0D2F000543FE /* PBXTextBookmark */;
 			B6614B050EFF5F280073C4E7 = B6614B050EFF5F280073C4E7 /* PBXTextBookmark */;
-			B679E4B60F02EFA200FB3F0C = B679E4B60F02EFA200FB3F0C /* PBXTextBookmark */;
 			B679E4BB0F02EFA200FB3F0C = B679E4BB0F02EFA200FB3F0C /* PBXTextBookmark */;
-			B6B17F940F1136550060F7AA = B6B17F940F1136550060F7AA /* PBXTextBookmark */;
 			B6B17F950F1136550060F7AA = B6B17F950F1136550060F7AA /* PBXTextBookmark */;
 			B6B17FA80F1140160060F7AA = B6B17FA80F1140160060F7AA /* PBXTextBookmark */;
 			B6B767C80F0FFA3900D819C9 = B6B767C80F0FFA3900D819C9 /* PBXTextBookmark */;
 			B6B767CB0F0FFA3900D819C9 = B6B767CB0F0FFA3900D819C9 /* PBXTextBookmark */;
-			B6B7A85F0F140BBB001024D2 = B6B7A85F0F140BBB001024D2 /* PBXTextBookmark */;
 			B6B7A8600F140BBB001024D2 = B6B7A8600F140BBB001024D2 /* PBXTextBookmark */;
-			B6C786AA0F2A598F00053681 /* PBXTextBookmark */ = B6C786AA0F2A598F00053681 /* PBXTextBookmark */;
-			B6C786C90F2A5E8000053681 /* PBXTextBookmark */ = B6C786C90F2A5E8000053681 /* PBXTextBookmark */;
-			B6C786CA0F2A5E8000053681 /* PBXTextBookmark */ = B6C786CA0F2A5E8000053681 /* PBXTextBookmark */;
-			B6C786DD0F2A5FED00053681 /* PBXTextBookmark */ = B6C786DD0F2A5FED00053681 /* PBXTextBookmark */;
-			B6C786DE0F2A5FED00053681 /* PBXTextBookmark */ = B6C786DE0F2A5FED00053681 /* PBXTextBookmark */;
-			B6C786DF0F2A5FED00053681 /* PBXTextBookmark */ = B6C786DF0F2A5FED00053681 /* PBXTextBookmark */;
-			B6C786E00F2A5FED00053681 /* PBXTextBookmark */ = B6C786E00F2A5FED00053681 /* PBXTextBookmark */;
-			B6C786E10F2A5FED00053681 /* PBXTextBookmark */ = B6C786E10F2A5FED00053681 /* PBXTextBookmark */;
-			B6C786E20F2A5FED00053681 /* PBXTextBookmark */ = B6C786E20F2A5FED00053681 /* PBXTextBookmark */;
-			B6C786E30F2A5FED00053681 /* PBXTextBookmark */ = B6C786E30F2A5FED00053681 /* PBXTextBookmark */;
-			B6C786E40F2A5FED00053681 /* PBXTextBookmark */ = B6C786E40F2A5FED00053681 /* PBXTextBookmark */;
-			B6C786E50F2A5FF300053681 /* PBXTextBookmark */ = B6C786E50F2A5FF300053681 /* PBXTextBookmark */;
-			B6C786E60F2A5FF300053681 /* PBXTextBookmark */ = B6C786E60F2A5FF300053681 /* PBXTextBookmark */;
-			B6C786E70F2A5FF300053681 /* PBXTextBookmark */ = B6C786E70F2A5FF300053681 /* PBXTextBookmark */;
-			B6C786E80F2A5FF300053681 /* PBXTextBookmark */ = B6C786E80F2A5FF300053681 /* PBXTextBookmark */;
-			B6C786E90F2A5FF300053681 /* PBXTextBookmark */ = B6C786E90F2A5FF300053681 /* PBXTextBookmark */;
-			B6C786EA0F2A5FF300053681 /* PBXTextBookmark */ = B6C786EA0F2A5FF300053681 /* PBXTextBookmark */;
-			B6C786EB0F2A5FF300053681 /* PBXTextBookmark */ = B6C786EB0F2A5FF300053681 /* PBXTextBookmark */;
-			B6C786EE0F2A612600053681 /* PBXTextBookmark */ = B6C786EE0F2A612600053681 /* PBXTextBookmark */;
-			B6C786EF0F2A612600053681 /* PBXTextBookmark */ = B6C786EF0F2A612600053681 /* PBXTextBookmark */;
-			B6C786F00F2A612600053681 /* PBXTextBookmark */ = B6C786F00F2A612600053681 /* PBXTextBookmark */;
-			B6C786F10F2A612600053681 /* PBXTextBookmark */ = B6C786F10F2A612600053681 /* PBXTextBookmark */;
-			B6C786F20F2A612600053681 /* PBXTextBookmark */ = B6C786F20F2A612600053681 /* PBXTextBookmark */;
-			B6C786F30F2A612600053681 /* PBXTextBookmark */ = B6C786F30F2A612600053681 /* PBXTextBookmark */;
-			B6C786F40F2A612600053681 /* PBXTextBookmark */ = B6C786F40F2A612600053681 /* PBXTextBookmark */;
+			B6C786E50F2A5FF300053681 = B6C786E50F2A5FF300053681 /* PBXTextBookmark */;
+			B6C786E90F2A5FF300053681 = B6C786E90F2A5FF300053681 /* PBXTextBookmark */;
+			B6C786EA0F2A5FF300053681 = B6C786EA0F2A5FF300053681 /* PBXTextBookmark */;
+			B6C786EE0F2A612600053681 = B6C786EE0F2A612600053681 /* PBXTextBookmark */;
+			B6C786EF0F2A612600053681 = B6C786EF0F2A612600053681 /* PBXTextBookmark */;
+			B6C786F20F2A612600053681 = B6C786F20F2A612600053681 /* PBXTextBookmark */;
+			B6C786F30F2A612600053681 = B6C786F30F2A612600053681 /* PBXTextBookmark */;
+			B6C786F70F2A64CC00053681 = B6C786F70F2A64CC00053681 /* PBXTextBookmark */;
+			B6C786F80F2A64CC00053681 = B6C786F80F2A64CC00053681 /* PBXTextBookmark */;
+			B6C786F90F2A64CC00053681 = B6C786F90F2A64CC00053681 /* PBXTextBookmark */;
+			B6C786FA0F2A64CC00053681 = B6C786FA0F2A64CC00053681 /* PBXTextBookmark */;
+			B6C786FD0F2A64CC00053681 = B6C786FD0F2A64CC00053681 /* PBXTextBookmark */;
+			B6E345420F2BB60B00B7FC78 = B6E345420F2BB60B00B7FC78 /* PBXTextBookmark */;
+			B6E345610F2BC07F00B7FC78 = B6E345610F2BC07F00B7FC78 /* PBXTextBookmark */;
+			B6F4740F0F2ACB4700CB75DA = B6F4740F0F2ACB4700CB75DA /* PBXTextBookmark */;
+			B6F474110F2ACB4700CB75DA = B6F474110F2ACB4700CB75DA /* PBXTextBookmark */;
 		};
 		sourceControlManager = B60E91500EFB3628000E4348 /* Source Control */;
 		userBuildSettings = {
@@ -217,17 +210,17 @@
 	};
 	B60E914D0EFB3627000E4348 /* File.h */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {496, 2030}}";
-			sepNavSelRange = "{25, 0}";
-			sepNavVisRange = "{1119, 1284}";
+			sepNavIntBoundsRect = "{{0, 0}, {883, 1792}}";
+			sepNavSelRange = "{414, 0}";
+			sepNavVisRange = "{1197, 440}";
 			sepNavWindowFrame = "{{95, -86}, {555, 1173}}";
 		};
 	};
 	B60E914E0EFB3628000E4348 /* File.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {883, 3822}}";
-			sepNavSelRange = "{3668, 0}";
-			sepNavVisRange = "{1287, 532}";
+			sepNavIntBoundsRect = "{{0, 0}, {883, 3682}}";
+			sepNavSelRange = "{3323, 0}";
+			sepNavVisRange = "{1285, 523}";
 			sepNavWindowFrame = "{{667, -9}, {555, 1173}}";
 		};
 	};
@@ -245,17 +238,17 @@
 	};
 	B60E91530EFB51FE000E4348 /* Disk.h */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {633, 1043}}";
-			sepNavSelRange = "{25, 0}";
-			sepNavVisRange = "{0, 1184}";
+			sepNavIntBoundsRect = "{{0, 0}, {1250, 1092}}";
+			sepNavSelRange = "{1300, 0}";
+			sepNavVisRange = "{178, 1128}";
 			sepNavWindowFrame = "{{77, 7}, {692, 1171}}";
 		};
 	};
 	B60E91540EFB51FE000E4348 /* Disk.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {633, 7826}}";
-			sepNavSelRange = "{9022, 68}";
-			sepNavVisRange = "{8353, 1853}";
+			sepNavIntBoundsRect = "{{0, 0}, {883, 8652}}";
+			sepNavSelRange = "{5288, 0}";
+			sepNavVisRange = "{5127, 457}";
 			sepNavWindowFrame = "{{943, -6}, {692, 1171}}";
 		};
 	};
@@ -324,7 +317,7 @@
 		vrLen = 327;
 		vrLoc = 0;
 	};
-	B60E92720EFDA086000E4348 /* File.cpp:88 */ = {
+	B60E92720EFDA086000E4348 /* File.cpp:74 */ = {
 		isa = PBXFileBreakpoint;
 		actions = (
 		);
@@ -336,7 +329,7 @@
 		functionName = "FileEntry::FileEntry(const void *data)";
 		hitCount = 0;
 		ignoreCount = 0;
-		lineNumber = 88;
+		lineNumber = 74;
 		location = "ProDOS-Fuse";
 		modificationTime = 251949619.113693;
 		state = 2;
@@ -346,67 +339,27 @@
 		fRef = B60E914E0EFB3628000E4348 /* File.cpp */;
 		name = "File.cpp: 106";
 		rLen = 0;
-		rLoc = 3668;
+		rLoc = 3323;
 		rType = 0;
 		vrLen = 345;
 		vrLoc = 1359;
 	};
-	B61B78A20F16EA8700C3E140 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B60E91540EFB51FE000E4348 /* Disk.cpp */;
-		name = "Disk.cpp: 328";
-		rLen = 0;
-		rLoc = 7422;
-		rType = 0;
-		vrLen = 351;
-		vrLoc = 31;
-	};
-	B61B78A40F16EA8700C3E140 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B679E4A70F02E79300FB3F0C /* main.cpp */;
-		name = "main.cpp: 33";
-		rLen = 0;
-		rLoc = 323;
-		rType = 0;
-		vrLen = 330;
-		vrLoc = 441;
-	};
-	B6340C7B0F22C271008931E1 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B679E4A70F02E79300FB3F0C /* main.cpp */;
-		name = "main.cpp: 33";
-		rLen = 0;
-		rLoc = 323;
-		rType = 0;
-		vrLen = 330;
-		vrLoc = 441;
-	};
 	B642F1290F132FA3001F7696 /* UniversalDiskImage.h */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1353, 796}}";
+			sepNavIntBoundsRect = "{{0, 0}, {1250, 831}}";
 			sepNavSelRange = "{217, 34}";
-			sepNavVisRange = "{0, 707}";
+			sepNavVisRange = "{0, 708}";
 			sepNavWindowFrame = "{{15, 249}, {1412, 924}}";
 		};
 	};
 	B642F12A0F132FA3001F7696 /* UniversalDiskImage.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {883, 728}}";
+			sepNavIntBoundsRect = "{{0, 0}, {1250, 831}}";
 			sepNavSelRange = "{820, 0}";
-			sepNavVisRange = "{500, 463}";
+			sepNavVisRange = "{0, 966}";
 			sepNavWindowFrame = "{{668, 219}, {1412, 924}}";
 		};
 	};
-	B642F1530F133632001F7696 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B60E914E0EFB3628000E4348 /* File.cpp */;
-		name = "File.cpp: 176";
-		rLen = 0;
-		rLoc = 3668;
-		rType = 0;
-		vrLen = 532;
-		vrLoc = 1287;
-	};
 	B642F1540F133632001F7696 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = B6B17FA00F1138830060F7AA /* DiskCopy42.h */;
@@ -427,6 +380,94 @@
 		vrLen = 313;
 		vrLoc = 0;
 	};
+	B64E306A0F2C08F3000543FE /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = B60E914E0EFB3628000E4348 /* File.cpp */;
+		name = "File.cpp: 176";
+		rLen = 0;
+		rLoc = 3323;
+		rType = 0;
+		vrLen = 532;
+		vrLoc = 1287;
+	};
+	B64E306B0F2C08F3000543FE /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		comments = "error: 'DATA_FORK' was not declared in this scope";
+		fRef = B60E91540EFB51FE000E4348 /* Disk.cpp */;
+		rLen = 1;
+		rLoc = 239;
+		rType = 1;
+	};
+	B64E306C0F2C08F3000543FE /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = B60E914E0EFB3628000E4348 /* File.cpp */;
+		name = "File.cpp: 176";
+		rLen = 0;
+		rLoc = 3323;
+		rType = 0;
+		vrLen = 532;
+		vrLoc = 1287;
+	};
+	B64E306F0F2C0900000543FE /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = B60E91540EFB51FE000E4348 /* Disk.cpp */;
+		name = "Disk.cpp: 240";
+		rLen = 0;
+		rLoc = 5288;
+		rType = 0;
+		vrLen = 457;
+		vrLoc = 5127;
+	};
+	B64E307D0F2C0D2F000543FE /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = B60E91540EFB51FE000E4348 /* Disk.cpp */;
+		name = "Disk.cpp: 240";
+		rLen = 0;
+		rLoc = 5288;
+		rType = 0;
+		vrLen = 457;
+		vrLoc = 5127;
+	};
+	B64E307E0F2C0D2F000543FE /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = B60E914E0EFB3628000E4348 /* File.cpp */;
+		name = "File.cpp: 156";
+		rLen = 0;
+		rLoc = 3323;
+		rType = 0;
+		vrLen = 523;
+		vrLoc = 1285;
+	};
+	B64E307F0F2C0D2F000543FE /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = B60E91540EFB51FE000E4348 /* Disk.cpp */;
+		name = "Disk.cpp: 240";
+		rLen = 0;
+		rLoc = 5288;
+		rType = 0;
+		vrLen = 457;
+		vrLoc = 5127;
+	};
+	B64E30800F2C0D2F000543FE /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = B60E914E0EFB3628000E4348 /* File.cpp */;
+		name = "File.cpp: 156";
+		rLen = 0;
+		rLoc = 3323;
+		rType = 0;
+		vrLen = 523;
+		vrLoc = 1285;
+	};
+	B64E30810F2C0D2F000543FE /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = B60E914D0EFB3627000E4348 /* File.h */;
+		name = "File.h: 30";
+		rLen = 0;
+		rLoc = 414;
+		rType = 0;
+		vrLen = 440;
+		vrLoc = 1197;
+	};
 	B6614B050EFF5F280073C4E7 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = B60E914D0EFB3627000E4348 /* File.h */;
@@ -439,22 +480,12 @@
 	};
 	B679E4A70F02E79300FB3F0C /* main.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1250, 3864}}";
-			sepNavSelRange = "{284, 0}";
-			sepNavVisRange = "{0, 950}";
+			sepNavIntBoundsRect = "{{0, 0}, {759, 3948}}";
+			sepNavSelRange = "{1950, 0}";
+			sepNavVisRange = "{3049, 226}";
 			sepNavWindowFrame = "{{342, 156}, {1412, 924}}";
 		};
 	};
-	B679E4B60F02EFA200FB3F0C /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B60E91530EFB51FE000E4348 /* Disk.h */;
-		name = "Disk.h: 1";
-		rLen = 0;
-		rLoc = 0;
-		rType = 0;
-		vrLen = 342;
-		vrLoc = 0;
-	};
 	B679E4BB0F02EFA200FB3F0C /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = B679E4A70F02E79300FB3F0C /* main.cpp */;
@@ -488,21 +519,6 @@
 		name = fuse_common.h;
 		path = /usr/local/include/fuse/fuse_common.h;
 		sourceTree = "<absolute>";
-		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {883, 4032}}";
-			sepNavSelRange = "{6850, 63}";
-			sepNavVisRange = "{5837, 708}";
-		};
-	};
-	B6B17F940F1136550060F7AA /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B6B17F820F103AA70060F7AA /* fuse_common.h */;
-		name = "fuse_common.h: 36";
-		rLen = 0;
-		rLoc = 921;
-		rType = 0;
-		vrLen = 579;
-		vrLoc = 535;
 	};
 	B6B17F950F1136550060F7AA /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
@@ -560,16 +576,6 @@
 		vrLen = 722;
 		vrLoc = 2400;
 	};
-	B6B7A85F0F140BBB001024D2 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B6B17FA10F1138830060F7AA /* DiskCopy42.cpp */;
-		name = "DiskCopy42.cpp: 11";
-		rLen = 0;
-		rLoc = 150;
-		rType = 0;
-		vrLen = 333;
-		vrLoc = 0;
-	};
 	B6B7A8600F140BBB001024D2 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = B6B17FA10F1138830060F7AA /* DiskCopy42.cpp */;
@@ -580,147 +586,41 @@
 		vrLen = 333;
 		vrLoc = 0;
 	};
-	B6C786AA0F2A598F00053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B679E4A70F02E79300FB3F0C /* main.cpp */;
-		name = "main.cpp: 33";
-		rLen = 0;
-		rLoc = 323;
-		rType = 0;
-		vrLen = 330;
-		vrLoc = 441;
-	};
 	B6C786B30F2A59AF00053681 /* profuse.h */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1250, 831}}";
-			sepNavSelRange = "{185, 0}";
-			sepNavVisRange = "{0, 1380}";
+			sepNavIntBoundsRect = "{{0, 0}, {796, 728}}";
+			sepNavSelRange = "{1382, 0}";
+			sepNavVisRange = "{243, 1139}";
 		};
 	};
 	B6C786B40F2A59FE00053681 /* profuse_xattr.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {796, 5194}}";
-			sepNavSelRange = "{2396, 68}";
-			sepNavVisRange = "{0, 546}";
+			sepNavIntBoundsRect = "{{0, 0}, {1250, 5138}}";
+			sepNavSelRange = "{3730, 0}";
+			sepNavVisRange = "{3045, 1256}";
 		};
 	};
 	B6C786BB0F2A5C0800053681 /* profuse_dirent.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1250, 1806}}";
-			sepNavSelRange = "{193, 0}";
-			sepNavVisRange = "{0, 1150}";
+			sepNavIntBoundsRect = "{{0, 0}, {796, 1792}}";
+			sepNavSelRange = "{974, 0}";
+			sepNavVisRange = "{1797, 951}";
 		};
 	};
 	B6C786BF0F2A5CC000053681 /* profuse_stat.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1250, 3010}}";
-			sepNavSelRange = "{181, 0}";
-			sepNavVisRange = "{0, 1136}";
+			sepNavIntBoundsRect = "{{0, 0}, {1250, 3038}}";
+			sepNavSelRange = "{3676, 0}";
+			sepNavVisRange = "{3020, 1612}";
 		};
 	};
 	B6C786C30F2A5DCE00053681 /* profuse_file.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {883, 1974}}";
-			sepNavSelRange = "{132, 0}";
-			sepNavVisRange = "{0, 365}";
+			sepNavIntBoundsRect = "{{0, 0}, {796, 1988}}";
+			sepNavSelRange = "{502, 0}";
+			sepNavVisRange = "{1178, 692}";
 		};
 	};
-	B6C786C90F2A5E8000053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		comments = "error: #error On FreeBSD API version 25 or greater must be used";
-		fRef = B6B17F820F103AA70060F7AA /* fuse_common.h */;
-		rLen = 1;
-		rLoc = 265;
-		rType = 1;
-	};
-	B6C786CA0F2A5E8000053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B6B17F820F103AA70060F7AA /* fuse_common.h */;
-		name = "fuse_common.h: 266";
-		rLen = 63;
-		rLoc = 6850;
-		rType = 0;
-		vrLen = 1208;
-		vrLoc = 6380;
-	};
-	B6C786DD0F2A5FED00053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B6B17F820F103AA70060F7AA /* fuse_common.h */;
-		name = "fuse_common.h: 266";
-		rLen = 63;
-		rLoc = 6850;
-		rType = 0;
-		vrLen = 1208;
-		vrLoc = 6380;
-	};
-	B6C786DE0F2A5FED00053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B6C786B40F2A59FE00053681 /* profuse_xattr.cpp */;
-		name = "profuse_xattr.cpp: 120";
-		rLen = 68;
-		rLoc = 2396;
-		rType = 0;
-		vrLen = 546;
-		vrLoc = 0;
-	};
-	B6C786DF0F2A5FED00053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B6C786BB0F2A5C0800053681 /* profuse_dirent.cpp */;
-		name = "profuse_dirent.cpp: 12";
-		rLen = 0;
-		rLoc = 135;
-		rType = 0;
-		vrLen = 610;
-		vrLoc = 38;
-	};
-	B6C786E00F2A5FED00053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		comments = "error: 'EISDIR' was not declared in this scope";
-		fRef = B6C786C30F2A5DCE00053681 /* profuse_file.cpp */;
-		rLen = 1;
-		rLoc = 24;
-		rType = 1;
-	};
-	B6C786E10F2A5FED00053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B6B17F820F103AA70060F7AA /* fuse_common.h */;
-		name = "fuse_common.h: 266";
-		rLen = 63;
-		rLoc = 6850;
-		rType = 0;
-		vrLen = 1208;
-		vrLoc = 6380;
-	};
-	B6C786E20F2A5FED00053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B6C786B40F2A59FE00053681 /* profuse_xattr.cpp */;
-		name = "profuse_xattr.cpp: 120";
-		rLen = 68;
-		rLoc = 2396;
-		rType = 0;
-		vrLen = 546;
-		vrLoc = 0;
-	};
-	B6C786E30F2A5FED00053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B6C786BB0F2A5C0800053681 /* profuse_dirent.cpp */;
-		name = "profuse_dirent.cpp: 12";
-		rLen = 0;
-		rLoc = 135;
-		rType = 0;
-		vrLen = 610;
-		vrLoc = 38;
-	};
-	B6C786E40F2A5FED00053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B6C786C30F2A5DCE00053681 /* profuse_file.cpp */;
-		name = "profuse_file.cpp: 11";
-		rLen = 0;
-		rLoc = 132;
-		rType = 0;
-		vrLen = 607;
-		vrLoc = 0;
-	};
 	B6C786E50F2A5FF300053681 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = B679E4A70F02E79300FB3F0C /* main.cpp */;
@@ -731,36 +631,6 @@
 		vrLen = 330;
 		vrLoc = 441;
 	};
-	B6C786E60F2A5FF300053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B6C786B30F2A59AF00053681 /* profuse.h */;
-		name = "profuse.h: 15";
-		rLen = 0;
-		rLoc = 592;
-		rType = 0;
-		vrLen = 176;
-		vrLoc = 0;
-	};
-	B6C786E70F2A5FF300053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B6C786B40F2A59FE00053681 /* profuse_xattr.cpp */;
-		name = "profuse_xattr.cpp: 1";
-		rLen = 0;
-		rLoc = 0;
-		rType = 0;
-		vrLen = 360;
-		vrLoc = 0;
-	};
-	B6C786E80F2A5FF300053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B679E4A70F02E79300FB3F0C /* main.cpp */;
-		name = "main.cpp: 33";
-		rLen = 0;
-		rLoc = 323;
-		rType = 0;
-		vrLen = 330;
-		vrLoc = 441;
-	};
 	B6C786E90F2A5FF300053681 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = B6C786B30F2A59AF00053681 /* profuse.h */;
@@ -781,16 +651,6 @@
 		vrLen = 360;
 		vrLoc = 0;
 	};
-	B6C786EB0F2A5FF300053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B6B17F820F103AA70060F7AA /* fuse_common.h */;
-		name = "fuse_common.h: 266";
-		rLen = 63;
-		rLoc = 6850;
-		rType = 0;
-		vrLen = 789;
-		vrLoc = 6545;
-	};
 	B6C786EE0F2A612600053681 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = B6B17F820F103AA70060F7AA /* fuse_common.h */;
@@ -811,26 +671,6 @@
 		vrLen = 463;
 		vrLoc = 500;
 	};
-	B6C786F00F2A612600053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B6C786C30F2A5DCE00053681 /* profuse_file.cpp */;
-		name = "profuse_file.cpp: 11";
-		rLen = 0;
-		rLoc = 132;
-		rType = 0;
-		vrLen = 365;
-		vrLoc = 0;
-	};
-	B6C786F10F2A612600053681 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = B6B17F820F103AA70060F7AA /* fuse_common.h */;
-		name = "fuse_common.h: 266";
-		rLen = 63;
-		rLoc = 6850;
-		rType = 0;
-		vrLen = 708;
-		vrLoc = 5837;
-	};
 	B6C786F20F2A612600053681 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = B642F12A0F132FA3001F7696 /* UniversalDiskImage.cpp */;
@@ -851,7 +691,7 @@
 		vrLen = 365;
 		vrLoc = 0;
 	};
-	B6C786F40F2A612600053681 /* PBXTextBookmark */ = {
+	B6C786F70F2A64CC00053681 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = B6B17FA10F1138830060F7AA /* DiskCopy42.cpp */;
 		name = "DiskCopy42.cpp: 11";
@@ -861,6 +701,46 @@
 		vrLen = 333;
 		vrLoc = 0;
 	};
+	B6C786F80F2A64CC00053681 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = B6C786B40F2A59FE00053681 /* profuse_xattr.cpp */;
+		name = "profuse_xattr.cpp: 1";
+		rLen = 0;
+		rLoc = 0;
+		rType = 0;
+		vrLen = 371;
+		vrLoc = 3;
+	};
+	B6C786F90F2A64CC00053681 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = B6C786BF0F2A5CC000053681 /* profuse_stat.cpp */;
+		name = "profuse_stat.cpp: 15";
+		rLen = 0;
+		rLoc = 181;
+		rType = 0;
+		vrLen = 303;
+		vrLoc = 0;
+	};
+	B6C786FA0F2A64CC00053681 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = B6C786C30F2A5DCE00053681 /* profuse_file.cpp */;
+		name = "profuse_file.cpp: 11";
+		rLen = 0;
+		rLoc = 132;
+		rType = 0;
+		vrLen = 365;
+		vrLoc = 0;
+	};
+	B6C786FD0F2A64CC00053681 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = B6C786BF0F2A5CC000053681 /* profuse_stat.cpp */;
+		name = "profuse_stat.cpp: 15";
+		rLen = 0;
+		rLoc = 181;
+		rType = 0;
+		vrLen = 303;
+		vrLoc = 0;
+	};
 	B6D81E5B0EFDE859000219B7 /* xmain.cpp:163 */ = {
 		isa = PBXFileBreakpoint;
 		actions = (
@@ -886,4 +766,44 @@
 			sepNavWindowFrame = "{{15, 249}, {1412, 924}}";
 		};
 	};
+	B6E345420F2BB60B00B7FC78 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = B60E91530EFB51FE000E4348 /* Disk.h */;
+		name = "Disk.h: 65";
+		rLen = 21;
+		rLoc = 1281;
+		rType = 0;
+		vrLen = 597;
+		vrLoc = 627;
+	};
+	B6E345610F2BC07F00B7FC78 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = B6C786B30F2A59AF00053681 /* profuse.h */;
+		name = "profuse.h: 48";
+		rLen = 0;
+		rLoc = 1372;
+		rType = 0;
+		vrLen = 973;
+		vrLoc = 409;
+	};
+	B6F4740F0F2ACB4700CB75DA /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = B6C786BB0F2A5C0800053681 /* profuse_dirent.cpp */;
+		name = "profuse_dirent.cpp: 16";
+		rLen = 0;
+		rLoc = 193;
+		rType = 0;
+		vrLen = 368;
+		vrLoc = 0;
+	};
+	B6F474110F2ACB4700CB75DA /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = B6C786BB0F2A5C0800053681 /* profuse_dirent.cpp */;
+		name = "profuse_dirent.cpp: 16";
+		rLen = 0;
+		rLoc = 193;
+		rType = 0;
+		vrLen = 368;
+		vrLoc = 0;
+	};
 }
diff --git a/profuse_dirent.cpp b/profuse_dirent.cpp
index 5571ab3..1536685 100644
--- a/profuse_dirent.cpp
+++ b/profuse_dirent.cpp
@@ -41,7 +41,8 @@ void prodos_opendir(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi)
     
     if (ino == 1)
     {
-        VolumeEntry v(buffer + 0x04);
+        VolumeEntry v;
+        v.Load(buffer + 0x04);
         
         ok = disk->ReadVolume(&v, &files);
         
@@ -50,7 +51,8 @@ void prodos_opendir(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi)
     else
     {
         
-        FileEntry e(buffer + (ino & 0x1ff));
+        FileEntry e;
+        e.Load(buffer + (ino & 0x1ff));
         
         ERROR(e.storage_type != DIRECTORY_FILE, ENOTDIR)
         
diff --git a/profuse_file.cpp b/profuse_file.cpp
index 73d22d5..2135cf9 100644
--- a/profuse_file.cpp
+++ b/profuse_file.cpp
@@ -27,7 +27,8 @@ void prodos_open(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi)
     ok = disk->Read(ino >> 9, buffer);
     ERROR(ok < 0, EIO)
     
-    e = new FileEntry(buffer + (ino & 0x1ff));
+    e = new FileEntry();
+    e->Load(buffer + (ino & 0x1ff));
     
     if (e->storage_type == EXTENDED_FILE)
     {
diff --git a/profuse_stat.cpp b/profuse_stat.cpp
index 1e8a6f3..496b6eb 100644
--- a/profuse_stat.cpp
+++ b/profuse_stat.cpp
@@ -51,7 +51,8 @@ int prodos_stat(FileEntry& e, struct stat *st)
         ok = disk->Read(e.key_pointer, buffer);
         if (ok < 0) return -1;
         
-        SubdirEntry se(buffer + 0x04);            
+        SubdirEntry se;
+        se.Load(buffer + 0x04);            
         
         if (se.storage_type != SUBDIR_HEADER) return -1;
         
@@ -123,7 +124,8 @@ void prodos_getattr(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi)
     // ino 1 is the volume header.
     if (ino == 1)
     {
-        VolumeEntry v(buffer + 0x04);
+        VolumeEntry v;
+        v.Load(buffer + 0x04);
         ok = prodos_stat(v, &st);
         ERROR(ok < 0, EIO);
         
@@ -136,7 +138,8 @@ void prodos_getattr(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi)
     {
         
         
-        FileEntry e(buffer + (ino & 0x1ff));
+        FileEntry e;
+        e.Load(buffer + (ino & 0x1ff));
         ok = prodos_stat(e, &st);
         
         ERROR(ok < 0, EIO);
@@ -180,7 +183,8 @@ void prodos_lookup(fuse_req_t req, fuse_ino_t parent, const char *name)
     }
     else
     {
-        FileEntry e(buffer + (parent & 0x1ff));
+        FileEntry e;
+        e.Load(buffer + (parent & 0x1ff));
         ERROR(e.storage_type != DIRECTORY_FILE, ENOENT);
         
         ok = disk->ReadDirectory(e.key_pointer, NULL, &files);
diff --git a/profuse_xattr.cpp b/profuse_xattr.cpp
index ce79d6a..6603feb 100644
--- a/profuse_xattr.cpp
+++ b/profuse_xattr.cpp
@@ -180,6 +180,7 @@ static void xattr_finfo(FileEntry& e, fuse_req_t req, size_t size, off_t off)
 static bool isTextFile(unsigned ftype, unsigned auxtype)
 {
     if (ftype == 0x04) return true; // ascii text
+    if (ftype == 0x80) return true; // source code.
     if (ftype == 0x50 && auxtype == 0x5445) return true; // teach text
     
     return false;
@@ -214,7 +215,8 @@ return; \
     ERROR(ok < 0, EIO)
     
     
-    FileEntry e(buffer + (ino & 0x1ff));
+    FileEntry e;
+    e.Load(buffer + (ino & 0x1ff));
     
     
     attr += "prodos.FileType";
@@ -306,7 +308,8 @@ void prodos_getxattr(fuse_req_t req, fuse_ino_t ino, const char *name, size_t si
     ERROR(ok < 0, EIO)
     
     
-    FileEntry e(buffer + (ino & 0x1ff));
+    FileEntry e;
+    e.Load(buffer + (ino & 0x1ff));
     
     switch(e.storage_type)
     {