use Endian/Endian.h code

git-svn-id: https://profuse.googlecode.com/svn/branches/profuse_interim@349 aa027e90-d47c-11dd-86d7-074df07e0730
This commit is contained in:
ksherlock 2011-02-24 03:21:17 +00:00
parent c9b260b753
commit 8550923cb3
3 changed files with 37 additions and 168 deletions

127
Disk.cpp
View File

@ -7,8 +7,7 @@
*/ */
#include "Disk.h" #include "Disk.h"
#include "DiskCopy42.h"
#include "UniversalDiskImage.h"
#include "common.h" #include "common.h"
@ -24,6 +23,7 @@
#include <set> #include <set>
#include <vector> #include <vector>
#include <Endian/Endian.h>
struct ucmp struct ucmp
{ {
@ -36,6 +36,8 @@ struct ucmp
using std::set; using std::set;
using std::vector; using std::vector;
using namespace LittleEndian;
typedef set<unsigned, ucmp> uset; typedef set<unsigned, ucmp> uset;
Disk::Disk() Disk::Disk()
@ -61,111 +63,6 @@ DiskPointer Disk::OpenFile(Device::BlockDevicePointer device)
return disk; return disk;
} }
#if 0
Disk *Disk::OpenFile(const char *file, unsigned flags)
{
int fd;
struct stat st;
size_t size;
unsigned blocks;
unsigned offset;
void *map;
Disk *d = NULL;
fd = open(file, O_RDONLY);
if (fd >= 0)
{
if (fstat(fd, &st) == 0)
{
size = st.st_size;
// raw disk images must be a blocksize multiple and <= 32 Meg.
if ( (size & 0x1ff) == 0
&& size > 0
&& size <= 32 * 1024 * 1024
)
{
blocks = size >> 9;
offset = 0;
}
else {
// check for disk copy4.2 / universal disk image.
uint8_t buffer[1024];
if (read(fd, buffer, 1024) != 1024)
{
close(fd);
return NULL;
}
bool ok = false;
do {
DiskCopy42 dc;
if (dc.Load(buffer)
&& size == 84 + dc.data_size + dc.tag_size
&& (dc.data_size & 0x1ff) == 0)
{
offset = 84;
blocks = dc.data_size >> 9;
ok = true;
flags |= P8_DC42;
break;
}
UniversalDiskImage udi;
if (udi.Load(buffer)
//&& udi.version == 1
&& udi.image_format == UDI_FORMAT_PRODOS_ORDER)
{
blocks = udi.data_blocks;
offset = udi.data_offset;
ok = true;
flags |= P8_2MG;
break;
}
} while (false);
if (!ok)
{
close(fd);
return NULL;
}
lseek(fd, 0, SEEK_SET);
}
map = mmap(NULL, size, PROT_READ, MAP_FILE | MAP_PRIVATE, fd, 0);
if (map != (void *)-1)
{
d = new Disk();
d->_size = size;
d->_data = (uint8_t *)map;
d->_blocks = blocks;
d->_offset = offset;
d->_flags = flags;
}
}
close(fd);
}
return d;
}
#endif
// load the mini entry into the regular entry. // load the mini entry into the regular entry.
int Disk::Normalize(FileEntry &f, unsigned fork, ExtendedEntry *ee) int Disk::Normalize(FileEntry &f, unsigned fork, ExtendedEntry *ee)
{ {
@ -447,8 +344,8 @@ int Disk::ReadVolume(VolumeEntry *volume, std::vector<FileEntry> *files)
if (ok < 0) return ok; if (ok < 0) return ok;
prev = load16(&buffer[0x00]); prev = Read16(&buffer[0x00]);
next = load16(&buffer[0x02]); next = Read16(&buffer[0x02]);
VolumeEntry v; VolumeEntry v;
v.Load(buffer + 0x04); v.Load(buffer + 0x04);
@ -494,8 +391,8 @@ int Disk::ReadVolume(VolumeEntry *volume, std::vector<FileEntry> *files)
if (ok < 0) return ok; if (ok < 0) return ok;
block = next; block = next;
prev = load16(&buffer[0x00]); prev = Read16(&buffer[0x00]);
next = load16(&buffer[0x02]); next = Read16(&buffer[0x02]);
index = 0; index = 0;
} }
@ -524,8 +421,8 @@ int Disk::ReadDirectory(unsigned block, SubdirEntry *dir, std::vector<FileEntry>
if (ok < 0) return ok; if (ok < 0) return ok;
prev = load16(&buffer[0x00]); prev = Read16(&buffer[0x00]);
next = load16(&buffer[0x02]); next = Read16(&buffer[0x02]);
SubdirEntry v; SubdirEntry v;
v.Load(buffer + 0x04); v.Load(buffer + 0x04);
@ -574,8 +471,8 @@ int Disk::ReadDirectory(unsigned block, SubdirEntry *dir, std::vector<FileEntry>
block = next; block = next;
prev = load16(&buffer[0x00]); prev = Read16(&buffer[0x00]);
next = load16(&buffer[0x02]); next = Read16(&buffer[0x02]);
index = 0; index = 0;
} }

View File

@ -8,6 +8,7 @@
#include <ProDOS/File.h> #include <ProDOS/File.h>
#include <ProDOS/DateTime.h> #include <ProDOS/DateTime.h>
#include <Endian/Endian.h>
#include "common.h" #include "common.h"
#include <string.h> #include <string.h>
@ -15,6 +16,7 @@
#include <ctype.h> #include <ctype.h>
#include <stdio.h> #include <stdio.h>
using namespace LittleEndian;
bool FileEntry::Load(const void *data) bool FileEntry::Load(const void *data)
@ -31,18 +33,18 @@ bool FileEntry::Load(const void *data)
file_type = cp[0x10]; file_type = cp[0x10];
key_pointer = load16(&cp[0x11]); key_pointer = Read16(&cp[0x11]);
blocks_used = load16(&cp[0x13]); blocks_used = Read16(&cp[0x13]);
eof = load24(&cp[0x15]); eof = Read24(&cp[0x15]);
creation = ProDOS::DateTime(load16(&cp[0x18]), load16(&cp[0x1a])); creation = ProDOS::DateTime(Read16(&cp[0x18]), Read16(&cp[0x1a]));
//version = cp[0x1c]; //version = cp[0x1c];
//min_version = cp[0x1d]; //min_version = cp[0x1d];
unsigned xcase = load16(&cp[0x1c]); unsigned xcase = Read16(&cp[0x1c]);
if (xcase & 0x8000) if (xcase & 0x8000)
{ {
// gsos technote #8 // gsos technote #8
@ -59,11 +61,11 @@ bool FileEntry::Load(const void *data)
access = cp[0x1e]; access = cp[0x1e];
aux_type = load16(&cp[0x1f]); aux_type = Read16(&cp[0x1f]);
last_mod = ProDOS::DateTime(load16(&cp[0x21]), load16(&cp[0x23])); last_mod = ProDOS::DateTime(Read16(&cp[0x21]), Read16(&cp[0x23]));
header_pointer = load16(&cp[0x25]); header_pointer = Read16(&cp[0x25]);
return true; return true;
} }
@ -79,16 +81,16 @@ bool ExtendedEntry::Load(const void *data)
// offset 0 - mini entry for data fork // offset 0 - mini entry for data fork
dataFork.storage_type = cp[0x00] & 0x0f; dataFork.storage_type = cp[0x00] & 0x0f;
dataFork.key_block = load16(&cp[0x01]); dataFork.key_block = Read16(&cp[0x01]);
dataFork.blocks_used = load16(&cp[0x03]); dataFork.blocks_used = Read16(&cp[0x03]);
dataFork.eof = load24(&cp[0x05]); dataFork.eof = Read24(&cp[0x05]);
// offset 256 - mini entry for resource fork. // offset 256 - mini entry for resource fork.
resourceFork.storage_type = cp[256 + 0x00] & 0x0f; resourceFork.storage_type = cp[256 + 0x00] & 0x0f;
resourceFork.key_block = load16(&cp[256 + 0x01]); resourceFork.key_block = Read16(&cp[256 + 0x01]);
resourceFork.blocks_used = load16(&cp[256 + 0x03]); resourceFork.blocks_used = Read16(&cp[256 + 0x03]);
resourceFork.eof = load24(&cp[256 + 0x05]); resourceFork.eof = Read24(&cp[256 + 0x05]);
// xFInfo may be missing. // xFInfo may be missing.
bzero(FInfo, sizeof(FInfo)); bzero(FInfo, sizeof(FInfo));
@ -135,15 +137,15 @@ bool VolumeEntry::Load(const void *data)
// 0x14--0x1b reserved // 0x14--0x1b reserved
creation = ProDOS::DateTime(load16(&cp[0x18]), load16(&cp[0x1a])); creation = ProDOS::DateTime(Read16(&cp[0x18]), Read16(&cp[0x1a]));
last_mod = ProDOS::DateTime(load16(&cp[0x12]), load16(&cp[0x14])); last_mod = ProDOS::DateTime(Read16(&cp[0x12]), Read16(&cp[0x14]));
if (last_mod == 0) last_mod = creation; if (last_mod == 0) last_mod = creation;
//version = cp[0x1c]; //version = cp[0x1c];
//min_version = cp[0x1d]; //min_version = cp[0x1d];
unsigned xcase = load16(&cp[0x16]); unsigned xcase = Read16(&cp[0x16]);
if (xcase & 0x8000) if (xcase & 0x8000)
{ {
// gsos technote #8 // gsos technote #8
@ -162,11 +164,11 @@ bool VolumeEntry::Load(const void *data)
entries_per_block = cp[0x20]; entries_per_block = cp[0x20];
file_count = load16(&cp[0x21]); file_count = Read16(&cp[0x21]);
bit_map_pointer = load16(&cp[0x23]); bit_map_pointer = Read16(&cp[0x23]);
total_blocks = load16(&cp[0x25]); total_blocks = Read16(&cp[0x25]);
return true; return true;
} }
@ -192,7 +194,7 @@ bool SubdirEntry::Load(const void *data)
// 0x145-0x1b reserved // 0x145-0x1b reserved
creation = ProDOS::DateTime(load16(&cp[0x18]), load16(&cp[0x1a])); creation = ProDOS::DateTime(Read16(&cp[0x18]), Read16(&cp[0x1a]));
//version = cp[0x1c]; //version = cp[0x1c];
//min_version = cp[0x1d]; //min_version = cp[0x1d];
@ -216,9 +218,9 @@ bool SubdirEntry::Load(const void *data)
entries_per_block = cp[0x20]; entries_per_block = cp[0x20];
file_count = load16(&cp[0x21]); file_count = Read16(&cp[0x21]);
parent_pointer = load16(&cp[0x23]); parent_pointer = Read16(&cp[0x23]);
parent_entry = cp[0x25]; parent_entry = cp[0x25];

View File

@ -13,36 +13,6 @@
#define BLOCK_SIZE 512 #define BLOCK_SIZE 512
// little endian.
inline unsigned load16(const uint8_t *cp)
{
return (cp[1] << 8 ) | cp[0];
}
inline unsigned load24(const uint8_t *cp)
{
return (cp[2] << 16 ) | (cp[1] << 8) | (cp[0]);
}
inline unsigned load32(const uint8_t *cp)
{
return (cp[3] << 24) | (cp[2] << 16 ) | (cp[1] << 8) | (cp[0]);
}
// big endian format.
inline unsigned load16_be(const uint8_t *cp)
{
return (cp[0] << 8) | (cp[1]);
}
inline unsigned load32_be(const uint8_t *cp)
{
return (cp[0] << 24) | (cp[1] << 16) | (cp[2] << 8) | (cp[3]);
}
#endif #endif