您的位置:首页 > 运维架构 > Linux

Linux 平台上getopt函数在Windos平台上的的实现算法

2009-09-09 12:44 459 查看
getopt.h文件代码:

#ifndef _GETOPT_
#define _GETOPT_

int getopt(int argc, char **argv, char *optstring);

extern char *optarg; // returned arg to go with this option
extern int optind; // index to next argv element to process
extern int opterr; // should error messages be printed?
extern int optopt; //

#define BADCH ('?')

#endif // _GETOPT

getopt.c文件代码:

/* got this off net.sources */
#include <stdio.h>
#include <string.h>
#include "getopt.h"

/*
* get option letter from argument vector
*/
int
opterr = 1, // should error messages be printed?
optind = 1, // index into parent argv vector
optopt; // character checked for validity
char
*optarg; // argument associated with option

#define EMSG ""

char *progname; // may also be defined elsewhere

static void
error(char *pch)
{
if (!opterr) {
return; // without printing
}
fprintf(stderr, "%s: %s: %c/n",
(NULL != progname) ? progname : "getopt", pch, optopt);
}

int
getopt(int argc, char **argv, char *ostr)
{
static char *place = EMSG; /* option letter processing */
register char *oli; /* option letter list index */

if (!*place) {
// update scanning pointer
if (optind >= argc || *(place = argv[optind]) != '-' || !*++place) {
return EOF;
}
if (*place == '-') {
// found "--"
++optind;
return EOF;
}
}

/* option letter okay? */
if ((optopt = (int)*place++) == (int)':'
|| !(oli = strchr(ostr, optopt))) {
if (!*place) {
++optind;
}
error("illegal option");
return BADCH;
}
if (*++oli != ':') {
/* don't need argument */
optarg = NULL;
if (!*place)
++optind;
} else {
/* need an argument */
if (*place) {
optarg = place; /* no white space */
} else if (argc <= ++optind) {
/* no arg */
place = EMSG;
error("option requires an argument");
return BADCH;
} else {
optarg = argv[optind]; /* white space */
}
place = EMSG;
++optind;
}
return optopt; // return option letter
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: