From 90e67cba628af4cc442db8c2adae70389e43f6c0 Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Thu, 10 May 2012 12:05:33 +0200 Subject: [PATCH] fexc: prepare for multitool support and validate input and output format options --- Makefile | 3 ++- fexc.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 79 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index ef60cf9..120fad9 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ CC = gcc -CFLAGS = -g -O2 -Wall -Wextra -std=c99 +CFLAGS = -g -O2 -Wall -Wextra +CFLAGS += -std=c99 -D_POSIX_C_SOURCE=200112L TOOLS = fexc bin2fex fex2bin diff --git a/fexc.c b/fexc.c index f26b326..52179b8 100644 --- a/fexc.c +++ b/fexc.c @@ -17,7 +17,83 @@ #include "fexc.h" -int main(int UNUSED(argc), char *UNUSED(argv[])) +#include +#include +#include +#include +#include + +/* + */ +static inline void app_usage(const char *arg0, int mode) { + errf("Usage: %s [-vq]%s[ []]\n", arg0, + mode ? " " : " [-I ] [-O ] "); + + if (mode == 0) + fputs("\ninfmt: fex, bin (default:fex)" + "\noutfmt: fex, bin (default:bin)\n", + stderr); +} + +static inline int app_choose_mode(char *arg0) +{ + const char *name = basename(arg0); + if (strcmp(name, "fex2bin") == 0) + return 1; + else if (strcmp(name, "bin2fex") == 0) + return 2; + else + return 0; +} + +/* + */ +int main(int argc, char *argv[]) +{ + static const char *formats[] = { "fex", "bin", NULL }; + int infmt=0, outfmt=1; + + int app_mode = app_choose_mode(argv[0]); + + const char *opt_string = "I:O:vq?"+ ((app_mode == 0)? 0: 4); + int opt; + int verbose = 0; + + while ((opt = getopt(argc, argv, opt_string)) != -1) { + switch (opt) { + case 'I': + infmt=0; + for (const char **f = formats; *f; f++, infmt++) { + if (strcmp(*f, optarg) == 0) + break; + } + if (!formats[infmt]) { + errf("%s: invalid format -- \"%s\"\n", + argv[0], optarg); + goto show_usage; + } + break; + case 'O': + outfmt=0; + for (const char **f = formats; *f; f++, outfmt++) { + if (strcmp(*f, optarg) == 0) + break; + } + if (!formats[outfmt]) { + errf("%s: invalid format -- \"%s\"\n", + argv[0], optarg); + goto show_usage; + } + break; + case 'v': + verbose++; + break; + default: +show_usage: + app_usage(argv[0], app_mode); + exit(1); + } + } return 1; }