summaryrefslogtreecommitdiffhomepage
path: root/src/internal/argv/argv.h
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2016-03-04 12:13:22 -0500
committermidipix <writeonce@midipix.org>2016-11-10 23:35:39 -0500
commit0caedfea7f4a990e20b1667b12e461005958dcef (patch)
treea0b581f1b39e22c9f110ea4a02a0d7c0042c7a1a /src/internal/argv/argv.h
parent94c08451d33b43ae40201370dc4d18c99b012baa (diff)
downloadperk-0caedfea7f4a990e20b1667b12e461005958dcef.tar.bz2
perk-0caedfea7f4a990e20b1667b12e461005958dcef.tar.xz
argv.h: argv_scan(): report argv index of first unit and first error (if any).
Diffstat (limited to 'src/internal/argv/argv.h')
-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 9e3ccbe..da5d115 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);