mirror of
https://github.com/ksherlock/profuse.git
synced 2024-12-25 23:33:15 +00:00
git-svn-id: https://profuse.googlecode.com/svn/branches/v2@149 aa027e90-d47c-11dd-86d7-074df07e0730
This commit is contained in:
parent
6bbeb86da3
commit
d0960d1266
@ -19,6 +19,46 @@
|
|||||||
#include "File.h"
|
#include "File.h"
|
||||||
#include "DateRec.h"
|
#include "DateRec.h"
|
||||||
#include "../BlockDevice.h"
|
#include "../BlockDevice.h"
|
||||||
|
#include "../DiskCopy42Image.h"
|
||||||
|
|
||||||
|
|
||||||
|
unsigned parseFormat(const char *type, unsigned defv = 0)
|
||||||
|
{
|
||||||
|
if (type == 0 || *type == 0) return defv;
|
||||||
|
|
||||||
|
if (::strcasecmp(type, "2mg") == 0)
|
||||||
|
return '2IMG';
|
||||||
|
if (::strcasecmp(type, "2img") == 0)
|
||||||
|
return '2IMG';
|
||||||
|
if (::strcasecmp(type, "dc42") == 0)
|
||||||
|
return 'DC42';
|
||||||
|
if (::strcasecmp(type, "po") == 0)
|
||||||
|
return 'PO__';
|
||||||
|
if (::strcasecmp(type, "do") == 0)
|
||||||
|
return 'DO__';
|
||||||
|
if (::strcasecmp(type, "dsk") == 0)
|
||||||
|
return 'DO__';
|
||||||
|
if (::strcasecmp(type, "davex") == 0)
|
||||||
|
return 'DVX_';
|
||||||
|
|
||||||
|
return defv;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the filename extension, NULL if none.
|
||||||
|
const char *extname(const char *src)
|
||||||
|
{
|
||||||
|
if (!src) return NULL;
|
||||||
|
unsigned l = std::strlen(src);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < l; ++i)
|
||||||
|
{
|
||||||
|
char c = src[l - 1 - i];
|
||||||
|
if (c == '/') return NULL;
|
||||||
|
if (c == '.') return src + l - i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const char *MonthName(unsigned m)
|
const char *MonthName(unsigned m)
|
||||||
@ -63,11 +103,42 @@ const char *FileType(unsigned ft)
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
void printUnusedRecord(unsigned block, unsigned size)
|
void printUnusedEntry(unsigned block, unsigned size)
|
||||||
{
|
{
|
||||||
std::printf("< UNUSED > %4u %4u\n", size, block);
|
std::printf("< UNUSED > %4u %4u\n", size, block);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void printFileEntry(Pascal::FileEntry *e, bool extended)
|
||||||
|
{
|
||||||
|
Pascal::DateRec dt = e->modification();
|
||||||
|
|
||||||
|
if (extended)
|
||||||
|
{
|
||||||
|
std::printf("%-15s %4u %2u-%s-%2u %5u %5u %s\n",
|
||||||
|
e->name(),
|
||||||
|
e->blocks(),
|
||||||
|
dt.day(),
|
||||||
|
MonthName(dt.month()),
|
||||||
|
dt.year() % 100,
|
||||||
|
e->firstBlock(),
|
||||||
|
e->lastByte(),
|
||||||
|
FileType(e->fileKind())
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::printf("%-15s %4u %2u-%s-%2u\n",
|
||||||
|
e->name(),
|
||||||
|
e->blocks(),
|
||||||
|
dt.day(),
|
||||||
|
MonthName(dt.month()),
|
||||||
|
dt.year() % 100
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
int list(Pascal::VolumeEntry *volume, bool extended)
|
int list(Pascal::VolumeEntry *volume, bool extended)
|
||||||
{
|
{
|
||||||
unsigned fileCount = volume->fileCount();
|
unsigned fileCount = volume->fileCount();
|
||||||
@ -83,9 +154,6 @@ int list(Pascal::VolumeEntry *volume, bool extended)
|
|||||||
Pascal::FileEntry *e = volume->fileAtIndex(i);
|
Pascal::FileEntry *e = volume->fileAtIndex(i);
|
||||||
if (!e) continue;
|
if (!e) continue;
|
||||||
|
|
||||||
Pascal::DateRec dt = e->modification();
|
|
||||||
|
|
||||||
//TODO -- include gaps.
|
|
||||||
|
|
||||||
if (lastBlock != e->firstBlock())
|
if (lastBlock != e->firstBlock())
|
||||||
{
|
{
|
||||||
@ -94,36 +162,13 @@ int list(Pascal::VolumeEntry *volume, bool extended)
|
|||||||
|
|
||||||
if (extended)
|
if (extended)
|
||||||
{
|
{
|
||||||
printUnusedRecord(lastBlock, size);
|
printUnusedEntry(lastBlock, size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printFileEntry(e, extended);
|
||||||
|
|
||||||
lastBlock = e->lastBlock();
|
lastBlock = e->lastBlock();
|
||||||
|
|
||||||
if (extended)
|
|
||||||
{
|
|
||||||
|
|
||||||
std::printf("%-15s %4u %2u-%s-%2u %5u %5u %s\n",
|
|
||||||
e->name(),
|
|
||||||
e->blocks(),
|
|
||||||
dt.day(),
|
|
||||||
MonthName(dt.month()),
|
|
||||||
dt.year() % 100,
|
|
||||||
e->firstBlock(),
|
|
||||||
e->lastByte(),
|
|
||||||
FileType(e->fileKind())
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
std::printf("%-15s %4u %2u-%s-%2u\n",
|
|
||||||
e->name(),
|
|
||||||
e->blocks(),
|
|
||||||
dt.day(),
|
|
||||||
MonthName(dt.month()),
|
|
||||||
dt.year() % 100
|
|
||||||
);
|
|
||||||
}
|
|
||||||
used += e->blocks();
|
used += e->blocks();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,7 +176,7 @@ int list(Pascal::VolumeEntry *volume, bool extended)
|
|||||||
{
|
{
|
||||||
unsigned size = volumeSize - lastBlock;
|
unsigned size = volumeSize - lastBlock;
|
||||||
max = std::max(max, size);
|
max = std::max(max, size);
|
||||||
printUnusedRecord(lastBlock, size);
|
printUnusedEntry(lastBlock, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -142,12 +187,11 @@ int list(Pascal::VolumeEntry *volume, bool extended)
|
|||||||
"%u in largest\n",
|
"%u in largest\n",
|
||||||
fileCount, fileCount,
|
fileCount, fileCount,
|
||||||
used,
|
used,
|
||||||
volumeSize- used,
|
volumeSize - used,
|
||||||
max
|
max
|
||||||
);
|
);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -155,7 +199,7 @@ void usage()
|
|||||||
{
|
{
|
||||||
std::printf(
|
std::printf(
|
||||||
"Pascal File Manager v 0.0\n\n"
|
"Pascal File Manager v 0.0\n\n"
|
||||||
"Usage: fileman [-h] [-f format] diskimage action\n"
|
"Usage: fileman [-h] [-f format] action diskimage\n"
|
||||||
"Options:\n"
|
"Options:\n"
|
||||||
" -h Show usage information.\n"
|
" -h Show usage information.\n"
|
||||||
" -f format Specify disk format. Valid values are:\n"
|
" -f format Specify disk format. Valid values are:\n"
|
||||||
@ -173,9 +217,13 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
std::auto_ptr<Pascal::VolumeEntry> volume;
|
std::auto_ptr<Pascal::VolumeEntry> volume;
|
||||||
std::auto_ptr<ProFUSE::BlockDevice> device;
|
std::auto_ptr<ProFUSE::BlockDevice> device;
|
||||||
|
|
||||||
|
const char *format = NULL;
|
||||||
|
unsigned fmt = 0;
|
||||||
|
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
std::string format;
|
|
||||||
|
|
||||||
while ((c = ::getopt(argc, argv, "f:h")) != -1)
|
while ((c = ::getopt(argc, argv, "f:h")) != -1)
|
||||||
{
|
{
|
||||||
@ -204,12 +252,33 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const char *file = argv[0];
|
const char *file = argv[1];
|
||||||
const char *action = argv[1];
|
const char *action = argv[0];
|
||||||
|
|
||||||
|
if (format == NULL) format = extname(file);
|
||||||
|
|
||||||
|
fmt = parseFormat(format, 'PO__');
|
||||||
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
device.reset( new ProFUSE::DOSOrderDiskImage(file, true));
|
switch(fmt)
|
||||||
|
{
|
||||||
|
case 'DO__':
|
||||||
|
device.reset( new ProFUSE::DOSOrderDiskImage(file, true) );
|
||||||
|
break;
|
||||||
|
case 'PO__':
|
||||||
|
device.reset( new ProFUSE::ProDOSOrderDiskImage(file, true) );
|
||||||
|
break;
|
||||||
|
case 'DC42':
|
||||||
|
device.reset( new ProFUSE::DiskCopy42Image(file, true) );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
std::fprintf(stderr, "Unable to determine format. Please use -f flag.\n");
|
||||||
|
exit(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
volume.reset( new Pascal::VolumeEntry(device.get()));
|
volume.reset( new Pascal::VolumeEntry(device.get()));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user