diff --git a/pascal/File.cpp b/pascal/File.cpp index 42a5b24..b305ae9 100644 --- a/pascal/File.cpp +++ b/pascal/File.cpp @@ -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; diff --git a/pascal/profuse_pascal_ops.cpp b/pascal/profuse_pascal_ops.cpp index ca8621c..7ead116 100644 --- a/pascal/profuse_pascal_ops.cpp +++ b/pascal/profuse_pascal_ops.cpp @@ -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 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) }