static imgtoolerr_t datapack_begin_enum(imgtool_directory *enumeration, const char *path) { psion_iter *iter = (psion_iter*)imgtool_directory_extrabytes(enumeration); iter->index = 0; return IMGTOOLERR_SUCCESS; }
static imgtoolerr_t vzdos_diskimage_nextenum(imgtool_directory *enumeration, imgtool_dirent *ent) { vz_iterator *iter = (vz_iterator *) imgtool_directory_extrabytes(enumeration); if (iter->eof == 1 || iter->index > MAX_DIRENTS) { ent->eof = 1; } else { const char *type; int ret, len; vzdos_dirent dirent; ret = vzdos_get_dirent(imgtool_directory_image(enumeration), iter->index - 1, &dirent); if (ret == IMGTOOLERR_FILENOTFOUND) { iter->eof = 1; ent->eof = 1; return IMGTOOLERR_SUCCESS; } if (ret == IMGTOOLERR_CORRUPTFILE) ent->corrupt = 1; /* kill trailing spaces */ for (len = 7; len > 0; len--) { if (dirent.fname[len] != 0x20) { break; } } memcpy(ent->filename, &dirent.fname, len + 1); ent->filesize = dirent.end_address - dirent.start_address; switch (dirent.ftype) { case 0x01: type = "Deleted"; break; case 'T': type = "Basic"; break; case 'B': type = "Binary"; break; case 'D': type = "Data"; break; case 'F': type = "Quickwrite"; break; case 'A': type = "Assembler"; break; case 'S': type = "Diskops"; break; case 'W': type = "Wordpro"; break; default: type = "Unknown"; } snprintf(ent->attr, ARRAY_LENGTH(ent->attr), "%s", type); iter->index++; } return IMGTOOLERR_SUCCESS; }
static imgtoolerr_t vzdos_diskimage_beginenum(imgtool_directory *enumeration, const char *path) { vz_iterator *iter; iter = (vz_iterator *) imgtool_directory_extrabytes(enumeration); if (!iter) return IMGTOOLERR_OUTOFMEMORY; iter->index = 1; iter->eof = 0; return IMGTOOLERR_SUCCESS; }
static imgtoolerr_t datapack_next_enum(imgtool_directory *enumeration, imgtool_dirent *ent) { imgtool_image *image = imgtool_directory_image(enumeration); psion_pack *pack = (psion_pack*)imgtool_image_extra_bytes(image); psion_iter *iter = (psion_iter*)imgtool_directory_extrabytes(enumeration); UINT8 data = 0; if (!pack->pack_index[iter->index].name_rec) { ent->eof = 1; return IMGTOOLERR_SUCCESS; } memcpy(ent->filename, pack->pack_index[iter->index].filename, 8); sprintf(ent->attr, "Type: %02x ID: %02x", pack->pack_index[iter->index].type, pack->pack_index[iter->index].id); if (pack->pack_index[iter->index].data_rec) { stream_seek(pack->stream, pack->pack_index[iter->index].data_rec + 2, SEEK_SET); ent->filesize = get_long_rec_size(pack->stream); } // seek all file's records if (pack->pack_index[iter->index].id >= 0x90) { stream_seek(pack->stream, 0x10, SEEK_SET); while (seek_next_record(pack->stream, pack->pack_index[iter->index].id)) { stream_read(pack->stream, &data, 1); stream_seek(pack->stream, data + 1, SEEK_CUR); ent->filesize +=data; } } iter->index++; return IMGTOOLERR_SUCCESS; }
static struct os9_direnum *os9_get_dirinfo(imgtool_directory *directory) { return (struct os9_direnum *) imgtool_directory_extrabytes(directory); }
static imgtoolerr_t rsdos_diskimage_nextenum(imgtool_directory *enumeration, imgtool_dirent *ent) { floperr_t ferr; imgtoolerr_t err; size_t filesize; struct rsdos_direnum *rsenum; struct rsdos_dirent rsent; char fname[13]; imgtool_image *image; image = imgtool_directory_image(enumeration); rsenum = (struct rsdos_direnum *) imgtool_directory_extrabytes(enumeration); /* Did we hit the end of file before? */ if (rsenum->eof) goto eof; do { if (rsenum->index >= MAX_DIRENTS) goto eof; ferr = get_rsdos_dirent(image, rsenum->index++, &rsent); if (ferr) return imgtool_floppy_error(ferr); } while(rsent.fname[0] == '\0'); /* Now are we at the eof point? */ if (rsent.fname[0] == -1) { rsenum->eof = 1; eof: ent->eof = 1; } else { /* Not the end of file */ err = process_rsdos_file(&rsent, image, NULL, &filesize); if (err) return err; if (filesize == ((size_t) -1)) { /* corrupt! */ ent->filesize = 0; ent->corrupt = 1; } else { ent->filesize = filesize; ent->corrupt = 0; } ent->eof = 0; get_dirent_fname(fname, &rsent); snprintf(ent->filename, ARRAY_LENGTH(ent->filename), "%s", fname); snprintf(ent->attr, ARRAY_LENGTH(ent->attr), "%d %c", (int) rsent.ftype, (char) (rsent.asciiflag + 'B')); } return IMGTOOLERR_SUCCESS; }