summaryrefslogtreecommitdiffhomepage
path: root/src/internal/argv
diff options
context:
space:
mode:
Diffstat (limited to 'src/internal/argv')
-rw-r--r--src/internal/argv/argv.h15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/internal/argv/argv.h b/src/internal/argv/argv.h
index a40ede5..430f4be 100644
--- a/src/internal/argv/argv.h
+++ b/src/internal/argv/argv.h
@@ -128,6 +128,8 @@ struct argv_ctx {
int flags;
int mode;
int nentries;
+ int unitidx;
+ int erridx;
enum argv_error errcode;
const char * errch;
const struct argv_option * erropt;
@@ -292,8 +294,7 @@ static void argv_scan(
bool fhybrid;
bool fnoscan;
- argv++;
- parg = argv;
+ parg = &argv[1];
ch = *parg;
ferr = ARGV_ERROR_OK;
fshort = false;
@@ -301,6 +302,9 @@ static void argv_scan(
fval = false;
mentry = meta ? meta->entries : 0;
+ ctx->unitidx = 0;
+ ctx->erridx = 0;
+
while (ch && (ferr == ARGV_ERROR_OK)) {
option = 0;
fhybrid = false;
@@ -424,10 +428,15 @@ static void argv_scan(
if (!is_arg_in_paradigm(ch,option->paradigm))
ferr = ARGV_ERROR_OPTARG_PARADIGM;
+ if (ferr == ARGV_ERROR_OK)
+ if (!option && !ctx->unitidx)
+ ctx->unitidx = parg - argv;
+
if (ferr != ARGV_ERROR_OK) {
ctx->errcode = ferr;
ctx->errch = ctx->errch ? ctx->errch : ch;
ctx->erropt = option;
+ ctx->erridx = parg - argv;
return;
} else if (ctx->mode == ARGV_MODE_SCAN) {
if (!fnoscan)
@@ -670,7 +679,7 @@ static struct argv_meta * argv_get(
int flags)
{
struct argv_meta * meta;
- struct argv_ctx ctx = {flags,ARGV_MODE_SCAN,0,0,0,0,0};
+ struct argv_ctx ctx = {flags,ARGV_MODE_SCAN,0,0,0,0,0,0,0};
argv_scan(argv,options,&ctx,0);