feat: add -h/--help with full option descriptions to fpack/funpack

This commit is contained in:
2026-09-15 12:44:58 +02:00
parent 01aebb3f31
commit d9997184fd
2 changed files with 51 additions and 4 deletions
+30 -3
View File
@@ -32,6 +32,7 @@ static struct option long_opts[] = {
{"progress", no_argument, NULL, 'p'},
{"quiet", no_argument, NULL, 'q'},
{"verbose", no_argument, NULL, 'v'},
{"help", no_argument, NULL, 'h'},
{NULL, 0, NULL, 0}
};
@@ -57,17 +58,23 @@ static char *join_path(const char *dir, const char *name)
return out;
}
#ifdef _WIN32
#define IS_PATH_SEP(c) ((c) == '/' || (c) == '\\')
#else
#define IS_PATH_SEP(c) ((c) == '/')
#endif
static char *basename_dup(const char *path)
{
size_t end = strlen(path);
size_t start;
char *out;
while (end > 0 && path[end - 1] == '/')
while (end > 0 && IS_PATH_SEP(path[end - 1]))
end--;
start = end;
while (start > 0 && path[start - 1] != '/')
while (start > 0 && !IS_PATH_SEP(path[start - 1]))
start--;
out = malloc(end - start + 1);
@@ -155,9 +162,26 @@ static int extract_entry(const char *out_dir, const fpk_entry_t *entry,
static void usage(void)
{
fprintf(stderr, "usage: %s [-d output_dir] [-l] [-p] [-q] [-v] input.fpk\n", PROGRAM_NAME);
fprintf(stderr, "try '%s --help' for more information\n", PROGRAM_NAME);
exit(1);
}
static void help(void)
{
printf("usage: %s [options] input.fpk\n", PROGRAM_NAME);
printf("\n");
printf("Extract files from an fpk archive.\n");
printf("\n");
printf("options:\n");
printf(" -d, --dir=DIR extract into DIR instead of the archive's derived name\n");
printf(" -l, --list list archive entries and exit, without extracting\n");
printf(" -p, --progress print extraction progress\n");
printf(" -q, --quiet suppress the final summary line\n");
printf(" -v, --verbose print each extracted entry\n");
printf(" -h, --help show this help and exit\n");
exit(0);
}
int main(int argc, char **argv)
{
const char *dir_arg = NULL;
@@ -168,7 +192,7 @@ int main(int argc, char **argv)
uint64_t i;
int c;
while ((c = getopt_long(argc, argv, "d:lpqv", long_opts, NULL)) != -1) {
while ((c = getopt_long(argc, argv, "d:lpqvh", long_opts, NULL)) != -1) {
switch (c) {
case 'd':
dir_arg = optarg;
@@ -185,6 +209,9 @@ int main(int argc, char **argv)
case 'v':
flags |= FUNPACK_VERBOSE;
break;
case 'h':
help();
break;
default:
usage();
}