summaryrefslogtreecommitdiff
path: root/src/internal/argv
diff options
context:
space:
mode:
Diffstat (limited to 'src/internal/argv')
-rw-r--r--src/internal/argv/argv.h21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/internal/argv/argv.h b/src/internal/argv/argv.h
index 4749769..0cb3c40 100644
--- a/src/internal/argv/argv.h
+++ b/src/internal/argv/argv.h
@@ -82,6 +82,8 @@ struct argv_ctx {
const char * program;
};
+static const char * argv_program_name(const char *);
+
static void argv_usage(
FILE *,
const char * header,
@@ -377,6 +379,21 @@ static void argv_scan(
}
}
+static const char * argv_program_name(const char * program_path)
+{
+ const char * ch;
+
+ if (program_path) {
+ if ((ch = strrchr(program_path,'/')))
+ return *(++ch) ? ch : 0;
+
+ if ((ch = strrchr(program_path,'\\')))
+ return *(++ch) ? ch : 0;
+ }
+
+ return program_path;
+}
+
static void argv_show_error(struct argv_ctx * ctx)
{
fprintf(stderr,"%s: error: ",ctx->program);
@@ -538,8 +555,12 @@ static struct argv_meta * argv_get(
argv_scan(argv,options,&ctx,0);
if (ctx.errcode != ARGV_ERROR_OK) {
+ if (!ctx.program)
+ ctx.program = argv_program_name(argv[0]);
+
if (ctx.flags & ARGV_VERBOSITY_ERRORS)
argv_show_error(&ctx);
+
return 0;
}