From ab137f2edb1b76dd0963dc9bd2df884ecbaa4567 Mon Sep 17 00:00:00 2001 From: Raphael Assenat Date: Sun, 25 Oct 2015 16:29:11 -0400 Subject: [PATCH] Add mempak_rm and mempak_convert --- tool/n64savetool/Makefile | 8 ++- tool/n64savetool/mempak_convert.c | 84 +++++++++++++++++++++++++++++ tool/n64savetool/mempak_rm.c | 90 +++++++++++++++++++++++++++++++ 3 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 tool/n64savetool/mempak_convert.c create mode 100644 tool/n64savetool/mempak_rm.c diff --git a/tool/n64savetool/Makefile b/tool/n64savetool/Makefile index 7cf9782..1c08e28 100644 --- a/tool/n64savetool/Makefile +++ b/tool/n64savetool/Makefile @@ -6,13 +6,19 @@ LDFLAGS=-g PREFIX=/usr/local -PROGRAMS=mempak_ls mempak_format mempak_extract_note mempak_insert_note +PROGRAMS=mempak_ls mempak_format mempak_extract_note mempak_insert_note mempak_rm mempak_convert MEMPAKLIB_OBJS=mempak.o mempak_fs.o .PHONY : clean install all: $(PROGRAMS) +mempak_convert: mempak_convert.o $(MEMPAKLIB_OBJS) + $(LD) $^ $(LDFLAGS) -o $@ + +mempak_rm: mempak_rm.o $(MEMPAKLIB_OBJS) + $(LD) $^ $(LDFLAGS) -o $@ + mempak_insert_note: mempak_insert_note.o $(MEMPAKLIB_OBJS) $(LD) $^ $(LDFLAGS) -o $@ diff --git a/tool/n64savetool/mempak_convert.c b/tool/n64savetool/mempak_convert.c new file mode 100644 index 0000000..bb38560 --- /dev/null +++ b/tool/n64savetool/mempak_convert.c @@ -0,0 +1,84 @@ +#include +#include +#include "mempak.h" + +#define DEFAULT_FORMAT_STR "n64" + +static void print_usage(void) +{ + printf("Usage: ./mempak_convert in_file out_file \n"); + printf("\n"); + printf("Options:\n"); + printf(" -h Display help\n"); + printf(" -f format Write file in specified format (default: %s)\n", DEFAULT_FORMAT_STR); + printf("\n"); + printf("Formats:\n"); + printf(" mpk Standard 32kB .mpk file format\n"); + printf(" mpk4 128kB .mpk file (4 copies or the 32kB block)\n"); + printf(" n64 .N64 file format\n"); +} + +int main(int argc, char **argv) +{ + mempak_structure_t *mpk; + const char *infile; + const char *outfile; + unsigned char type; + struct option long_options[] = { + { "format", required_argument, 0, 'f' }, + { "help", no_argument, 0, 'h' }, + { }, // terminator + }; + const char *format = DEFAULT_FORMAT_STR; + + if (argc < 2) { + print_usage(); + return 1; + } + + while(1) { + int c; + + c = getopt_long(argc, argv, "f:h", long_options, NULL); + if (c==-1) + break; + + switch(c) + { + case 'h': + print_usage(); + return 0; + + case 'f': + format = optarg; + break; + + case '?': + fprintf(stderr, "Unknown argument. Try -h\n"); + return -1; + } + } + + type = mempak_string2format(format); + if (type == MPK_FORMAT_INVALID) { + fprintf(stderr, "Unknown format specified\n"); + return -1; + } + + infile = argv[optind]; + outfile = argv[optind+1]; + + mpk = mempak_loadFromFile(infile); + if (!mpk) { + fprintf(stderr, "Could not load mempak file '%s'\n", infile); + return 1; + } + printf("Loaded file '%s' (%s format)\n", infile, mempak_format2string(mpk->file_format)); + + mempak_saveToFile(mpk, outfile, type); + mempak_free(mpk); + + printf("Wrote file '%s' in %s format\n", outfile, mempak_format2string(type)); + + return 0; +} diff --git a/tool/n64savetool/mempak_rm.c b/tool/n64savetool/mempak_rm.c new file mode 100644 index 0000000..793a925 --- /dev/null +++ b/tool/n64savetool/mempak_rm.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include "mempak.h" + +static void print_usage(void) +{ + printf("Usage: ./mempak_rm pakfile note_id\n"); + printf("\n"); + printf("Options:\n"); + printf(" -h, --help Display help\n"); +} + + +int main(int argc, char **argv) +{ + const char *pakfile; + mempak_structure_t *mpk; + struct option long_options[] = { + { "help", no_argument, 0, 'h' }, + { }, // terminator + }; + int noteid; + entry_structure_t entry; + + if (argc < 3) { + print_usage(); + return 1; + } + + while(1) { + int c; + + c = getopt_long(argc, argv, "h", long_options, NULL); + if (c==-1) + break; + + switch(c) + { + case 'h': + print_usage(); + return 0; + case '?': + fprintf(stderr, "Unknown argument. Try -h\n"); + return -1; + } + } + + pakfile = argv[optind]; + noteid = atoi(argv[optind+1]); + + if (noteid < 0 || noteid > 15) { + fprintf(stderr, "Note id out of range (0-15)\n"); + return -1; + } + + mpk = mempak_loadFromFile(pakfile); + if (!mpk) { + return -1; + } + printf("Loaded pakfile in %s format.\n", mempak_format2string(mpk->file_format)); + + if (0 != get_mempak_entry(mpk, noteid, &entry)) { + fprintf(stderr, "Could not get note id %d\n", noteid); + mempak_free(mpk); + return -1; + } + + if (!entry.valid) { + fprintf(stderr, "Note %d is already free\n", noteid); + mempak_free(mpk); + return -1; + } + + printf("Deleting note %d (%d blocks)\n", noteid, entry.blocks); + + if (0 != delete_mempak_entry(mpk, &entry)) { + fprintf(stderr, "Error deleting entry\n"); + mempak_free(mpk); + return -1; + } + + if (0 != mempak_saveToFile(mpk, pakfile, mpk->file_format)) { + fprintf(stderr, "could not write to memory pak file\n"); + } + + mempak_free(mpk); + + return 0; +}