/*
* Simple commandline argument processing function
* Programmed and designed by Matti 'ccr' Hamalainen
* (C) Copyright 2002-2004 Tecnic Software productions (TNSP)
*
* Please read file 'COPYING' for information on license and distribution.
*/
#include "th_args.h"
#include "th_util.h"
#include <stdio.h>
#include <string.h>
/* Process arguments, handling short and long options by
* calling the given callback functions.
*/
void th_processArgs(int argc, char *argv[],
t_opt optList[], int optListN,
void (*handleOpt)(int, char *, char *),
void (*handleFile)(char *))
{
BOOL endOptions;
int argIndex, newArgIndex, optLen, optN, i;
char *currArg, *optArg;
/* Parse arguments */
argIndex = 1;
endOptions = FALSE;
while (argIndex < argc)
{
currArg = argv[argIndex];
if ((currArg[0] == '-') && !endOptions)
{
newArgIndex = argIndex;
if (currArg[1] == '-')
{
/* Check for "--", which ends the options-list */
if (currArg[2] == 0)
{
endOptions = TRUE;
continue;
}
/* Long option */
optN = -1;
optLen = 0;
for (i = 0; (i < optListN) && (optN < 0); i++)
{
optLen = strlen(optList[i].longOpt);
if (strncmp(&currArg[2], optList[i].longOpt, optLen) == 0)
optN = i;
}
if ((optN >= 0) && (optList[optN].hasArg))
{
if (currArg[optLen + 2] == '=')
optArg = &currArg[optLen + 3];
else
optArg = NULL;
} else
optArg = NULL;
/* Call handler function */
handleOpt((optN >= 0) ? optList[optN].optID : -1, optArg, currArg);
} else
{
/* Short options */
currArg++;
while (*currArg)
{
for (optN = 0; (optN < optListN); optN++)
if (*currArg == optList[optN].shortOpt)
{
if (optList[optN].hasArg)
optArg = argv[++newArgIndex];
else
optArg = NULL;
handleOpt(optList[optN].optID, optArg, currArg);
}
currArg++;
}
}
argIndex = newArgIndex;
} else
{
/* Was not option argument */
handleFile(currArg);
}
argIndex++;
}
}
void th_showHelp(FILE *outFile, t_opt optList[], int optListN, char *progName, char *progUsage)
{
int i;
char tmpStr[64];
fprintf(outFile,
"\n%s v%s (%s)\n"
"%s\n"
"%s\n"
"Usage: %s %s\n",
th_prog_name, th_prog_version, th_prog_fullname,
th_prog_author,
th_prog_license,
progName, progUsage);
for (i = 0; i < optListN; i++)
{
if (optList[i].shortOpt)
fprintf(outFile, " -%c, ", optList[i].shortOpt);
else
fprintf(outFile, " ");
if (optList[i].longOpt)
{
if (optList[i].hasArg)
{
snprintf(tmpStr, sizeof(tmpStr),
"%s=ARG", optList[i].longOpt);
fprintf(outFile, "--%-15s", tmpStr);
} else
fprintf(outFile, "--%-15s", optList[i].longOpt);
} else
fprintf(outFile, " ");
fprintf(outFile, " %s.\n", optList[i].optDesc);
}
}
syntax highlighted by Code2HTML, v. 0.9.1