summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/tools/imgtool/library.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/tools/imgtool/library.h')
-rw-r--r--src/mess/tools/imgtool/library.h409
1 files changed, 409 insertions, 0 deletions
diff --git a/src/mess/tools/imgtool/library.h b/src/mess/tools/imgtool/library.h
new file mode 100644
index 00000000000..d7853bf5d08
--- /dev/null
+++ b/src/mess/tools/imgtool/library.h
@@ -0,0 +1,409 @@
+/****************************************************************************
+
+ library.h
+
+ Code relevant to the Imgtool library; analgous to the MESS/MAME driver
+ list.
+
+ Unlike MESS and MAME which have static driver lists, Imgtool has a
+ concept of a library and this library is built at startup time.
+ dynamic for which modules are added to. This makes "dynamic" modules
+ much easier
+
+****************************************************************************/
+
+#ifndef LIBRARY_H
+#define LIBRARY_H
+
+#include <time.h>
+#include <assert.h>
+
+#include "corestr.h"
+#include "opresolv.h"
+#include "stream.h"
+#include "unicode.h"
+#include "charconv.h"
+
+
+typedef struct _imgtool_image imgtool_image;
+typedef struct _imgtool_partition imgtool_partition;
+typedef struct _imgtool_directory imgtool_directory;
+typedef struct _imgtool_library imgtool_library;
+
+typedef enum
+{
+ SUGGESTION_END,
+ SUGGESTION_POSSIBLE,
+ SUGGESTION_RECOMMENDED
+} imgtool_suggestion_viability_t;
+
+union filterinfo
+{
+ INT64 i; /* generic integers */
+ void * p; /* generic pointers */
+ void * f; /* generic function pointers */
+ const char *s; /* generic strings */
+
+ imgtoolerr_t (*read_file)(imgtool_partition *partition, const char *filename, const char *fork, imgtool_stream *destf);
+ imgtoolerr_t (*write_file)(imgtool_partition *partition, const char *filename, const char *fork, imgtool_stream *sourcef, option_resolution *opts);
+ imgtoolerr_t (*check_stream)(imgtool_stream *stream, imgtool_suggestion_viability_t *viability);
+};
+
+typedef void (*filter_getinfoproc)(UINT32 state, union filterinfo *info);
+
+typedef enum
+{
+ ITLS_NAME,
+ ITLS_DESCRIPTION
+} imgtool_libsort_t;
+
+typedef struct
+{
+ char filename[1024];
+ char attr[64];
+ UINT64 filesize;
+
+ time_t creation_time;
+ time_t lastmodified_time;
+ time_t lastaccess_time;
+
+ char softlink[1024];
+ char comment[256];
+
+ /* flags */
+ unsigned int eof : 1;
+ unsigned int corrupt : 1;
+ unsigned int directory : 1;
+ unsigned int hardlink : 1;
+} imgtool_dirent;
+
+typedef struct
+{
+ UINT8 level;
+ UINT64 block;
+} imgtool_chainent;
+
+typedef enum
+{
+ FORK_END,
+ FORK_DATA,
+ FORK_RESOURCE,
+ FORK_ALTERNATE
+} imgtool_forktype_t;
+
+typedef struct
+{
+ imgtool_forktype_t type;
+ UINT64 size;
+ char forkname[64];
+} imgtool_forkent;
+
+typedef struct
+{
+ imgtool_suggestion_viability_t viability;
+ filter_getinfoproc filter;
+ const char *fork;
+ const char *description;
+} imgtool_transfer_suggestion;
+
+enum
+{
+ /* --- the following bits of info are returned as 64-bit signed integers --- */
+ IMGTOOLATTR_INT_FIRST = 0x00000,
+ IMGTOOLATTR_INT_MAC_TYPE,
+ IMGTOOLATTR_INT_MAC_CREATOR,
+ IMGTOOLATTR_INT_MAC_FINDERFLAGS,
+ IMGTOOLATTR_INT_MAC_COORDX,
+ IMGTOOLATTR_INT_MAC_COORDY,
+ IMGTOOLATTR_INT_MAC_FINDERFOLDER,
+ IMGTOOLATTR_INT_MAC_ICONID,
+ IMGTOOLATTR_INT_MAC_SCRIPTCODE,
+ IMGTOOLATTR_INT_MAC_EXTENDEDFLAGS,
+ IMGTOOLATTR_INT_MAC_COMMENTID,
+ IMGTOOLATTR_INT_MAC_PUTAWAYDIRECTORY,
+
+ /* --- the following bits of info are returned as pointers to data or functions --- */
+ IMGTOOLATTR_PTR_FIRST = 0x10000,
+
+ /* --- the following bits of info are returned as NULL-terminated strings --- */
+ IMGTOOLATTR_STR_FIRST = 0x20000,
+
+ /* --- the following bits of info are returned as time_t values --- */
+ IMGTOOLATTR_TIME_FIRST = 0x30000,
+ IMGTOOLATTR_TIME_CREATED,
+ IMGTOOLATTR_TIME_LASTMODIFIED
+};
+
+typedef union
+{
+ INT64 i;
+ time_t t;
+} imgtool_attribute;
+
+typedef struct
+{
+ unsigned icon16x16_specified : 1;
+ unsigned icon32x32_specified : 1;
+ UINT32 icon16x16[16][16];
+ UINT32 icon32x32[32][32];
+} imgtool_iconinfo;
+
+enum
+{
+ /* --- the following bits of info are returned as 64-bit signed integers --- */
+ IMGTOOLINFO_INT_FIRST = 0x00000,
+ IMGTOOLINFO_INT_IMAGE_EXTRA_BYTES,
+ IMGTOOLINFO_INT_PARTITION_EXTRA_BYTES,
+ IMGTOOLINFO_INT_DIRECTORY_EXTRA_BYTES,
+ IMGTOOLINFO_INT_PATH_SEPARATOR,
+ IMGTOOLINFO_INT_ALTERNATE_PATH_SEPARATOR,
+ IMGTOOLINFO_INT_PREFER_UCASE,
+ IMGTOOLINFO_INT_INITIAL_PATH_SEPARATOR,
+ IMGTOOLINFO_INT_OPEN_IS_STRICT,
+ IMGTOOLINFO_INT_SUPPORTS_CREATION_TIME,
+ IMGTOOLINFO_INT_SUPPORTS_LASTMODIFIED_TIME,
+ IMGTOOLINFO_INT_TRACKS_ARE_CALLED_CYLINDERS,
+ IMGTOOLINFO_INT_WRITING_UNTESTED,
+ IMGTOOLINFO_INT_CREATION_UNTESTED,
+ IMGTOOLINFO_INT_SUPPORTS_BOOTBLOCK,
+ IMGTOOLINFO_INT_BLOCK_SIZE,
+ IMGTOOLINFO_INT_CHARSET,
+
+ IMGTOOLINFO_INT_CLASS_SPECIFIC = 0x08000,
+
+ /* --- the following bits of info are returned as pointers to data or functions --- */
+ IMGTOOLINFO_PTR_FIRST = 0x10000,
+
+ IMGTOOLINFO_PTR_OPEN,
+ IMGTOOLINFO_PTR_CREATE,
+ IMGTOOLINFO_PTR_CLOSE,
+ IMGTOOLINFO_PTR_OPEN_PARTITION,
+ IMGTOOLINFO_PTR_CREATE_PARTITION,
+ IMGTOOLINFO_PTR_INFO,
+ IMGTOOLINFO_PTR_BEGIN_ENUM,
+ IMGTOOLINFO_PTR_NEXT_ENUM,
+ IMGTOOLINFO_PTR_CLOSE_ENUM,
+ IMGTOOLINFO_PTR_FREE_SPACE,
+ IMGTOOLINFO_PTR_READ_FILE,
+ IMGTOOLINFO_PTR_WRITE_FILE,
+ IMGTOOLINFO_PTR_DELETE_FILE,
+ IMGTOOLINFO_PTR_LIST_FORKS,
+ IMGTOOLINFO_PTR_CREATE_DIR,
+ IMGTOOLINFO_PTR_DELETE_DIR,
+ IMGTOOLINFO_PTR_LIST_ATTRS,
+ IMGTOOLINFO_PTR_GET_ATTRS,
+ IMGTOOLINFO_PTR_SET_ATTRS,
+ IMGTOOLINFO_PTR_ATTR_NAME,
+ IMGTOOLINFO_PTR_GET_ICON_INFO,
+ IMGTOOLINFO_PTR_SUGGEST_TRANSFER,
+ IMGTOOLINFO_PTR_GET_CHAIN,
+ IMGTOOLINFO_PTR_GET_SECTOR_SIZE,
+ IMGTOOLINFO_PTR_GET_GEOMETRY,
+ IMGTOOLINFO_PTR_READ_SECTOR,
+ IMGTOOLINFO_PTR_WRITE_SECTOR,
+ IMGTOOLINFO_PTR_READ_BLOCK,
+ IMGTOOLINFO_PTR_WRITE_BLOCK,
+ IMGTOOLINFO_PTR_APPROVE_FILENAME_CHAR,
+ IMGTOOLINFO_PTR_CREATEIMAGE_OPTGUIDE,
+ IMGTOOLINFO_PTR_WRITEFILE_OPTGUIDE,
+ IMGTOOLINFO_PTR_MAKE_CLASS,
+ IMGTOOLINFO_PTR_LIST_PARTITIONS,
+
+ IMGTOOLINFO_PTR_CLASS_SPECIFIC = 0x18000,
+
+ /* --- the following bits of info are returned as NULL-terminated strings --- */
+ IMGTOOLINFO_STR_FIRST = 0x20000,
+
+ IMGTOOLINFO_STR_NAME,
+ IMGTOOLINFO_STR_DESCRIPTION,
+ IMGTOOLINFO_STR_FILE,
+ IMGTOOLINFO_STR_FILE_EXTENSIONS,
+ IMGTOOLINFO_STR_EOLN,
+ IMGTOOLINFO_STR_CREATEIMAGE_OPTSPEC,
+ IMGTOOLINFO_STR_WRITEFILE_OPTSPEC,
+
+ IMGTOOLINFO_STR_CLASS_SPECIFIC = 0x28000
+};
+
+
+
+union imgtoolinfo;
+typedef struct _imgtool_class imgtool_class;
+
+typedef void (*imgtool_get_info)(const imgtool_class *, UINT32, union imgtoolinfo *);
+
+struct _imgtool_class
+{
+ imgtool_get_info get_info;
+ imgtool_get_info derived_get_info;
+ void *derived_param;
+};
+
+
+
+typedef struct _imgtool_partition_info imgtool_partition_info;
+struct _imgtool_partition_info
+{
+ imgtool_get_info get_info;
+ UINT64 base_block;
+ UINT64 block_count;
+};
+
+
+
+union imgtoolinfo
+{
+ INT64 i; /* generic integers */
+ void * p; /* generic pointers */
+ void * f; /* generic function pointers */
+ char * s; /* generic strings */
+
+ imgtoolerr_t (*open) (imgtool_image *image, imgtool_stream *stream);
+ void (*close) (imgtool_image *image);
+ imgtoolerr_t (*create) (imgtool_image *image, imgtool_stream *stream, option_resolution *opts);
+ imgtoolerr_t (*create_partition) (imgtool_image *image, UINT64 first_block, UINT64 block_count);
+ void (*info) (imgtool_image *image, char *string, size_t len);
+ imgtoolerr_t (*begin_enum) (imgtool_directory *enumeration, const char *path);
+ imgtoolerr_t (*next_enum) (imgtool_directory *enumeration, imgtool_dirent *ent);
+ void (*close_enum) (imgtool_directory *enumeration);
+ imgtoolerr_t (*open_partition) (imgtool_partition *partition, UINT64 first_block, UINT64 block_count);
+ imgtoolerr_t (*free_space) (imgtool_partition *partition, UINT64 *size);
+ imgtoolerr_t (*read_file) (imgtool_partition *partition, const char *filename, const char *fork, imgtool_stream *destf);
+ imgtoolerr_t (*write_file) (imgtool_partition *partition, const char *filename, const char *fork, imgtool_stream *sourcef, option_resolution *opts);
+ imgtoolerr_t (*delete_file) (imgtool_partition *partition, const char *filename);
+ imgtoolerr_t (*list_forks) (imgtool_partition *partition, const char *path, imgtool_forkent *ents, size_t len);
+ imgtoolerr_t (*create_dir) (imgtool_partition *partition, const char *path);
+ imgtoolerr_t (*delete_dir) (imgtool_partition *partition, const char *path);
+ imgtoolerr_t (*list_attrs) (imgtool_partition *partition, const char *path, UINT32 *attrs, size_t len);
+ imgtoolerr_t (*get_attrs) (imgtool_partition *partition, const char *path, const UINT32 *attrs, imgtool_attribute *values);
+ imgtoolerr_t (*set_attrs) (imgtool_partition *partition, const char *path, const UINT32 *attrs, const imgtool_attribute *values);
+ imgtoolerr_t (*attr_name) (UINT32 attribute, const imgtool_attribute *attr, char *buffer, size_t buffer_len);
+ imgtoolerr_t (*get_iconinfo) (imgtool_partition *partition, const char *path, imgtool_iconinfo *iconinfo);
+ imgtoolerr_t (*suggest_transfer) (imgtool_partition *partition, const char *path, imgtool_transfer_suggestion *suggestions, size_t suggestions_length);
+ imgtoolerr_t (*get_chain) (imgtool_partition *partition, const char *path, imgtool_chainent *chain, size_t chain_size);
+ imgtoolerr_t (*get_sector_size) (imgtool_image *image, UINT32 track, UINT32 head, UINT32 sector, UINT32 *sector_size);
+ imgtoolerr_t (*get_geometry) (imgtool_image *image, UINT32 *tracks, UINT32 *heads, UINT32 *sectors);
+ imgtoolerr_t (*read_sector) (imgtool_image *image, UINT32 track, UINT32 head, UINT32 sector, void *buffer, size_t len);
+ imgtoolerr_t (*write_sector) (imgtool_image *image, UINT32 track, UINT32 head, UINT32 sector, const void *buffer, size_t len, int ddam);
+ imgtoolerr_t (*read_block) (imgtool_image *image, void *buffer, UINT64 block);
+ imgtoolerr_t (*write_block) (imgtool_image *image, const void *buffer, UINT64 block);
+ imgtoolerr_t (*list_partitions) (imgtool_image *image, imgtool_partition_info *partitions, size_t len);
+ int (*approve_filename_char)(unicode_char ch);
+ int (*make_class)(int index, imgtool_class *imgclass);
+
+ const option_guide *createimage_optguide;
+ const option_guide *writefile_optguide;
+};
+
+
+
+INLINE INT64 imgtool_get_info_int(const imgtool_class *imgclass, UINT32 state)
+{
+ union imgtoolinfo info;
+ info.i = 0;
+ imgclass->get_info(imgclass, state, &info);
+ return info.i;
+}
+
+INLINE void *imgtool_get_info_ptr(const imgtool_class *imgclass, UINT32 state)
+{
+ union imgtoolinfo info;
+ info.p = NULL;
+ imgclass->get_info(imgclass, state, &info);
+ return info.p;
+}
+
+INLINE void *imgtool_get_info_fct(const imgtool_class *imgclass, UINT32 state)
+{
+ union imgtoolinfo info;
+ info.f = NULL;
+ imgclass->get_info(imgclass, state, &info);
+ return info.f;
+}
+
+INLINE char *imgtool_get_info_string(const imgtool_class *imgclass, UINT32 state)
+{
+ union imgtoolinfo info;
+ info.s = NULL;
+ imgclass->get_info(imgclass, state, &info);
+ return info.s;
+}
+
+/* circular string buffer */
+char *imgtool_temp_str(void);
+
+
+
+typedef struct _imgtool_module imgtool_module;
+struct _imgtool_module
+{
+ imgtool_module *previous;
+ imgtool_module *next;
+
+ imgtool_class imgclass;
+
+ const char *name;
+ const char *description;
+ const char *extensions;
+ const char *eoln;
+
+ size_t image_extra_bytes;
+
+ /* flags */
+ unsigned int initial_path_separator : 1;
+ unsigned int open_is_strict : 1;
+ unsigned int tracks_are_called_cylinders : 1; /* used for hard drivers */
+ unsigned int writing_untested : 1; /* used when we support writing, but not in main build */
+ unsigned int creation_untested : 1; /* used when we support creation, but not in main build */
+
+ imgtoolerr_t (*open) (imgtool_image *image, imgtool_stream *f);
+ void (*close) (imgtool_image *image);
+ void (*info) (imgtool_image *image, char *string, size_t len);
+ imgtoolerr_t (*create) (imgtool_image *image, imgtool_stream *f, option_resolution *opts);
+ imgtoolerr_t (*get_sector_size)(imgtool_image *image, UINT32 track, UINT32 head, UINT32 sector, UINT32 *sector_size);
+ imgtoolerr_t (*get_geometry) (imgtool_image *image, UINT32 *track, UINT32 *heads, UINT32 *sectors);
+ imgtoolerr_t (*read_sector) (imgtool_image *image, UINT32 track, UINT32 head, UINT32 sector, void *buffer, size_t len);
+ imgtoolerr_t (*write_sector) (imgtool_image *image, UINT32 track, UINT32 head, UINT32 sector, const void *buffer, size_t len);
+ imgtoolerr_t (*read_block) (imgtool_image *image, void *buffer, UINT64 block);
+ imgtoolerr_t (*write_block) (imgtool_image *image, const void *buffer, UINT64 block);
+ imgtoolerr_t (*list_partitions)(imgtool_image *image, imgtool_partition_info *partitions, size_t len);
+
+ UINT32 block_size;
+
+ const option_guide *createimage_optguide;
+ const char *createimage_optspec;
+
+ const void *extra;
+};
+
+/* creates an imgtool library */
+imgtool_library *imgtool_library_create(void);
+
+/* closes an imgtool library */
+void imgtool_library_close(imgtool_library *library);
+
+/* adds a module to an imgtool library */
+void imgtool_library_add(imgtool_library *library, imgtool_get_info get_info);
+
+/* seeks out and removes a module from an imgtool library */
+const imgtool_module *imgtool_library_unlink(imgtool_library *library,
+ const char *module);
+
+/* sorts an imgtool library */
+void imgtool_library_sort(imgtool_library *library, imgtool_libsort_t sort);
+
+/* finds a module */
+const imgtool_module *imgtool_library_findmodule(
+ imgtool_library *library, const char *module_name);
+
+/* memory allocators for pooled library memory */
+void *imgtool_library_malloc(imgtool_library *library, size_t mem);
+char *imgtool_library_strdup(imgtool_library *library, const char *s);
+char *imgtool_library_strdup_allow_null(imgtool_library *library, const char *s);
+
+imgtool_module *imgtool_library_iterate(
+ imgtool_library *library, const imgtool_module *module);
+imgtool_module *imgtool_library_index(
+ imgtool_library *library, int i);
+
+#endif /* LIBRARY_H */