git-svn-id: https://profuse.googlecode.com/svn/branches/v2@170 aa027e90-d47c-11dd-86d7-074df07e0730
This commit is contained in:
parent
777c1c3424
commit
102998ec66
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue