/*
DiskImageTool - Tool for manipulating disk images
Copyright (C) 2019 Ian Cowburn (ianc@noddybox.co.uk)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
-------------------------------------------------------------------------
Main
*/
#include
#include
#include
#include "util.h"
#include "handler.h"
#include "cpc.h"
/* ---------------------------------------- MACROS
*/
/* ---------------------------------------- VERSION INFO
*/
static const char *ditool_version =
"Disk Image Tool Version 1.0 development\n"
"\n"
"This program is distributed in the hope that it will be useful,\n"
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
"GNU General Public License (Version 3) for more details.\n"
"\n";
/* ---------------------------------------- TYPES
*/
/* ---------------------------------------- GLOBALS
*/
static int g_no_handlers;
static Handler *g_handler;
static Handler *g_current;
static int g_open = 0;
/* ---------------------------------------- DISK HANDLER REGISTER
*/
static void DITOOL_Initialise(void)
{
CPC_Initialise();
}
void DITOOL_Register(const Handler *handler)
{
g_no_handlers++;
g_handler = Realloc(g_handler, sizeof *g_handler * g_no_handlers);
g_handler[g_no_handlers - 1] = *handler;
}
/* ---------------------------------------- COMMAND ROUTINES
*/
static void Help(void)
{
printf(
"handlers - List available disk image handlers.\n"
"current - Set current handler.\n"
"open - Try and open disk image. Changes current handler.\n"
"close [] - Close the current disk image. If the optional name\n"
" name is provided the image is saved to that file.\n"
"create - Create new disk image using current handler.\n"
"ls - List files in disk image.\n"
"info - Get info on the disk image.\n"
"get - Get named file from disk image and store it in file.\n"
"put - Put file into disk image calling it name.\n"
"delete - Delete named file from disk image.\n"
"quit - Quit.\n"
);
}
static void Current(char * const tok[])
{
int f;
int found = 0;
if (tok[1])
{
for(f = 0; f < g_no_handlers; f++)
{
if (strcmp(g_handler[f].id, tok[1]) == 0)
{
if (g_open && g_current)
{
g_current->close_image(NULL);
g_open = 0;
}
g_current = g_handler + f;
found = 1;
printf("Set current handler to %s\n",
g_current->name);
}
}
if (!found)
{
printf("unknown handler %s\n", tok[1]);
}
}
else
{
printf("Missing argument\n");
}
}
static void Handlers(char * const tok[])
{
int f;
for(f = 0; f < g_no_handlers; f++)
{
printf("%s - %s\n", g_handler[f].id, g_handler[f].name);
}
}
static void Open(char * const tok[])
{
if (tok[1])
{
void *mem;
size_t size;
mem = Load(tok[1], &size);
if (mem)
{
int f;
if (g_open && g_current)
{
g_current->close_image(NULL);
g_open = 0;
}
g_current = NULL;
for(f = 0; f < g_no_handlers && !g_current; f++)
{
if (g_handler[f].is_my_file(mem, size))
{
g_current = g_handler + f;
}
}
if (g_current)
{
if (g_current->open_image(mem, size))
{
g_open = 1;
printf("Set current handler to %s\n",
g_current->name);
}
else
{
g_open = 0;
printf("%s\n", g_current->last_error());
}
}
else
{
free(mem);
printf("No handler for file %s\n", tok[1]);
}
}
else
{
printf("Failed to open %s\n", tok[1]);
}
}
else
{
printf("Missing argument\n");
}
}
static void Close(char * const tok[])
{
if (g_open && g_current)
{
g_current->close_image(tok[1]);
g_open = 0;
}
else
{
printf("No open image\n");
}
}
static void Create(char * const tok[])
{
if (tok[1])
{
if (g_current)
{
if (g_open)
{
g_current->close_image(NULL);
g_open = 0;
}
if (!g_current->create(tok[1]))
{
printf("%s\n", g_current->last_error());
}
}
else
{
printf("No current handler\n");
}
}
else
{
printf("Missing argument\n");
}
}
static void Ls(char * const tok[])
{
if (g_current && g_open)
{
g_current->list_files();
}
else
{
printf("No open image\n");
}
}
static void Info(char * const tok[])
{
if (g_current && g_open)
{
g_current->list_info();
}
else
{
printf("No open image\n");
}
}
static void Get(char * const tok[])
{
if (tok[2])
{
if (g_current && g_open)
{
if (!g_current->get_file(tok[1], tok[2]))
{
printf("%s\n", g_current->last_error());
}
}
else
{
printf("No open image\n");
}
}
else
{
printf("Missing arguments\n");
}
}
static void Put(char * const tok[])
{
if (tok[2])
{
if (g_current && g_open)
{
if (!g_current->put_file(tok[1], tok[2]))
{
printf("%s\n", g_current->last_error());
}
}
else
{
printf("No open image\n");
}
}
else
{
printf("Missing arguments\n");
}
}
static void Delete(char * const tok[])
{
if (tok[1])
{
if (g_current && g_open)
{
if (!g_current->delete_file(tok[1]))
{
printf("%s\n", g_current->last_error());
}
}
else
{
printf("No open image\n");
}
}
else
{
printf("Missing argument\n");
}
}
/* ---------------------------------------- MAIN
*/
int main(int argc, char *argv[])
{
char buff[1024];
int quit = 0;
printf("%s", ditool_version);
printf("Type help for help\n");
DITOOL_Initialise();
while(!quit && GetLine(g_current ? g_current->id : "DITOOL",
buff, sizeof buff))
{
char *tok[3] = {0};
tok[0] = strtok(buff, " \t");
if (tok[0])
{
tok[1] = strtok(NULL, " \t");
if (tok[1])
{
tok[2] = strtok(NULL, " \t");
}
if (strcmp(tok[0], "quit") == 0)
{
quit = 1;
}
else if (strcmp(tok[0], "help") == 0 || strcmp(tok[0], "?") == 0)
{
Help();
}
else if (strcmp(tok[0], "current") == 0)
{
Current(tok);
}
else if (strcmp(tok[0], "handlers") == 0)
{
Handlers(tok);
}
else if (strcmp(tok[0], "open") == 0)
{
Open(tok);
}
else if (strcmp(tok[0], "close") == 0)
{
Close(tok);
}
else if (strcmp(tok[0], "create") == 0)
{
Create(tok);
}
else if (strcmp(tok[0], "ls") == 0)
{
Ls(tok);
}
else if (strcmp(tok[0], "info") == 0)
{
Info(tok);
}
else if (strcmp(tok[0], "get") == 0)
{
Get(tok);
}
else if (strcmp(tok[0], "put") == 0)
{
Put(tok);
}
else if (strcmp(tok[0], "delete") == 0)
{
Delete(tok);
}
else
{
printf("unknown command %s - type help for help\n", tok[0]);
}
}
}
return EXIT_SUCCESS;
}
/*
vim: ai sw=4 ts=8 expandtab
*/