Header file:
getopt.h
Synopsis:
int getopt_long_only (int argc, char *const *argv, const char *shortopts,
const struct option *longopts, int indexptr);
Description:
It is similar to getopt_long but it allows user to represent long option with single hypen (-) or double hypen(--). Initially, it tries to parse the option with long option and if none of the long option matches, the option is parsed as short option.
Please know about getopt and getopt_long to get better understanding on getopt_long_only.
getopt_long_only function C example
#include <stdio.h>
#include <getopt.h>
#include <string.h>
#include <stdlib.h>
static int myflag;
struct option longopts[] = {
{"setflag", optional_argument, &myflag, 1},
{"clearflag", no_argument, &myflag, 2},
{"list", optional_argument, 0, 'l'},
{"touch", required_argument, 0, 'm'},
{"rm", required_argument, 0, 'r'},
{"date", no_argument, 0, 'd'}
};
int main (int argc, char **argv) {
int i, ch, indexptr = 0, status = 0;
char str[100];
opterr = 0;
while ((ch = getopt_long_only(argc, argv, "l::m:r:d",
longopts, &indexptr)) != -1) {
switch (ch) {
case 0:
if (*(longopts[indexptr].flag) == 1) {
status = 1;
printf("long opt: %s\n",
longopts[indexptr].name);
printf("U've set status flag\n");
} else if (*(longopts[indexptr].flag) == 2) {
status = 0;
printf("long opt: %s\n",
longopts[indexptr].name);
printf("U've unset status flag\n");
}
break;
case 'd':
printf("short option - %c long option - %s\n",
ch, longopts[indexptr].name);
system("date");
break;
case 'l':
printf("short option - %c long option - %s\n",
ch, longopts[indexptr].name);
strcpy(str, "ls -l ");
if (optarg)
strcat(str, optarg);
system(str);
break;
case 'm':
printf("short option - %c long option - %s\n",
ch, longopts[indexptr].name);
strcpy(str, "touch ");
strcat(str, optarg);
system(str);
break;
case 'r':
printf("short option - %c long option - %s\n",
ch, longopts[indexptr].name);
strcpy(str, "rm ");
strcat(str, optarg);
system(str);
break;
case '?':
if (optopt == 'r' || optopt == 'm')
printf("Argument is mandatory for --%s\n",
longopts[indexptr].name);
else if (isprint (optopt))
printf("U have given an unknown option - %c\n",
optopt);
optopt);
else
printf("Unknown Error-0x%08x\n", optopt);
break;
default:
exit(0);
}
}
for (i = optind; i < argc; i++)
printf("Redundant argument - %s\n", argv[i]);
return 0;
}
Output:
jp@jp-VirtualBox:$ ./a.out -setflag --touch file1 --list=file1
long opt: setflag
U've set status flag
short option - m long option - touch
short option - l long option - list
-rw-r--r-- 1 jp jp 0 2013-02-03 13:16 file1
jp@jp-VirtualBox:$ ./a.out -clearflag -date
long opt: clearflag
U've unset status flag
short option - d long option - date
Sun Feb 3 13:16:35 IST 2013
Note:
If flag is not NULL, getopt_long or getopt_long_only returns 0 on parsing its corresponding long option and the flag will point to the value val in the structure option
static int myflag;
struct option longopt[] {
{"setflag", no_argument, &myflag, 9},
{"clearflag", no_argument, &myflag, 10}
};
./a.out -setflag
In this case, getopt_long_only returns 0 on parsing the long option setflag and the flag "*(longopt[indexptr].flag)" will point to the value of val field (val is '9' here)in the structure option.
Do you need Finance? Are you looking for Finance? Are you looking for finance to enlarge your business? We help individuals and companies to obtain finance for business expanding and to setup a new business ranging any amount. Get finance at affordable interest rate of 3%, Do you need this finance for business and to clear your bills? Then send us an email now for more information contact us now via (financialserviceoffer876@gmail.com) whats-App +918929509036 Dr James Eric Finance Pvt Ltd Thanks
ReplyDelete