git-svn-id: https://profuse.googlecode.com/svn/branches/v2@170 aa027e90-d47c-11dd-86d7-074df07e0730

This commit is contained in:
ksherlock 2009-12-14 03:32:57 +00:00
parent 777c1c3424
commit 102998ec66
2 changed files with 75 additions and 61 deletions

View File

@ -524,7 +524,7 @@ int FileEntry::textRead(uint8_t *buffer, unsigned size, unsigned offset)
// find the first page.
for (page = 1; page < l; ++page)
for (page = 0; page < l; ++page)
{
unsigned pageSize = (*_pageSize)[page];
if (to + pageSize > offset)
@ -535,7 +535,6 @@ int FileEntry::textRead(uint8_t *buffer, unsigned size, unsigned offset)
to += pageSize;
}
--page;
block = _firstBlock + 2 + (page * 2);
@ -582,27 +581,38 @@ unsigned FileEntry::textDecodePage(unsigned block, uint8_t *out)
{
uint8_t buffer[1024];
unsigned size = 0;
bool dle = false;
unsigned bytes = textReadPage(block, buffer);
for (unsigned i = 0; i < bytes; ++i)
{
uint8_t c = buffer[i];
if (!c) break;
if (c == 16 && i != bytes - 1)
if (!c) continue;
if (dle)
{
// DLE
// 16, n -> n-32 spaces.
unsigned x = buffer[++i] - 32;
if (out) for (unsigned i = 0; i < x; ++i) *out++ = ' ';
size += x;
}
else
{
if (out) *out++ = c;
size += 1;
if (c > 32)
{
unsigned x = c - 32;
size += x;
if (out) for (unsigned j = 0; j < x; ++j)
*out++ = ' ';
}
dle = false;
continue;
}
if (c == 16) { dle = true; continue; }
//if (c & 0x80) continue; // ascii only.
if (c == 0x0d) c = 0x0a; // convert to unix format.
if (out) *out++ = c;
size += 1;
}
return size;

View File

@ -210,57 +210,59 @@ static void pascal_readdir(fuse_req_t req, fuse_ino_t ino, size_t size, off_t of
// . && .. entries.
if (off == 0)
{
unsigned tmp;
st.st_mode = S_IFDIR | 0555;
st.st_ino = 1;
tmp = fuse_add_direntry(req, NULL, 0, ".", NULL, 0);
ERROR(tmp + currentSize > size, ERANGE)
fuse_add_direntry(req, (char *)buffer.get() + currentSize, size, ".", &st, ++off);
currentSize += tmp;
}
if (off == 1)
{
unsigned tmp;
st.st_mode = S_IFDIR | 0555;
st.st_ino = 1;
tmp = fuse_add_direntry(req, NULL, 0, "..", NULL, 0);
if (tmp + currentSize > size)
do {
if (off == 0)
{
fuse_reply_buf(req, (char *)buffer.get(), currentSize);
unsigned tmp;
st.st_mode = S_IFDIR | 0555;
st.st_ino = 1;
tmp = fuse_add_direntry(req, NULL, 0, ".", NULL, 0);
if (tmp + currentSize > size) break;
fuse_add_direntry(req, (char *)buffer.get() + currentSize, size, ".", &st, ++off);
currentSize += tmp;
}
fuse_add_direntry(req, (char *)buffer.get() + currentSize, size, "..", &st, ++off);
currentSize += tmp;
}
for (unsigned i = off - 2; i < count; ++i)
{
unsigned tmp;
FileEntry *file = volume->fileAtIndex(i);
if (file == NULL) break; //?
if (off == 1)
{
unsigned tmp;
st.st_mode = S_IFDIR | 0555;
st.st_ino = 1;
tmp = fuse_add_direntry(req, NULL, 0, "..", NULL, 0);
if (tmp + currentSize > size) break;
// only these fields are used.
st.st_mode = S_IFREG | 0444;
st.st_ino = file->inode();
fuse_add_direntry(req, (char *)buffer.get() + currentSize, size, "..", &st, ++off);
currentSize += tmp;
}
for (unsigned i = off - 2; i < count; ++i)
{
unsigned tmp;
FileEntry *file = volume->fileAtIndex(i);
if (file == NULL) break; //?
tmp = fuse_add_direntry(req, NULL, 0, file->name(), NULL, 0);
// only these fields are used.
st.st_mode = S_IFREG | 0444;
st.st_ino = file->inode();
if (tmp + currentSize > size) break;
tmp = fuse_add_direntry(req, NULL, 0, file->name(), NULL, 0);
if (tmp + currentSize > size) break;
fuse_add_direntry(req, (char *)buffer.get() + currentSize, size, file->name(), &st, ++off);
currentSize += tmp;
}
} while (false);
fuse_add_direntry(req, (char *)buffer.get() + currentSize, size, file->name(), &st, ++off);
currentSize += tmp;
}
fuse_reply_buf(req, (char *)buffer.get(), currentSize);
@ -401,7 +403,7 @@ static void pascal_release(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info
static void pascal_read(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, struct fuse_file_info *fi)
{
std::printf("pascal_read\n");
std::printf("pascal_read %u %u %u\n", (unsigned)ino, (unsigned)size, (unsigned)off);
//VolumeEntry *volume = (VolumeEntry *)fuse_req_userdata(req);
FileEntry *file = (FileEntry *)fi->fh;
@ -411,15 +413,17 @@ static void pascal_read(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off,
auto_array<uint8_t> buffer(new uint8_t[size]);
unsigned rsize = file->read(buffer.get(), size, off);
fuse_reply_buf(req, (const char *)(buffer.get()), rsize);
fuse_reply_buf(req, (char *)(buffer.get()), rsize);
return;
}
catch (ProFUSE::POSIXException &e)
{
printf("posix error...\n");
ERROR(true, e.error());
}
catch( ... )
{
printf("error...\n");
ERROR(true, EIO)
}