getopt的实现

/* Newsgroups: mod.std.unix Subject: public domain AT&T getopt source Date: 3 Nov 85 19:34:15 GMT Here's something you've all been waiting for: the AT&T public domain source for getopt(3). It is the code which was given out at the 1985 UNIFORUM conference in Dallas. I obtained it by electronic mail directly from AT&T. The people there assure me that it is indeed in the public domain. */

/*LINTLIBRARY*/

extern int strlen();

extern int strcmp();

extern char *strchr();

extern int write();

#define NULL 0

#define EOF (-1)

#define ERR(s, c)

if(opterr){/

char errbuf[2];/

errbuf[0] = c; errbuf[1] = '/n';/

(void) write(2, argv[0], (unsigned)strlen(argv[0]));/

(void) write(2, s, (unsigned)strlen(s));/

(void) write(2, errbuf, 2);}

int opterr = 1;

int optind = 1;

int optopt;

char *optarg;

int getopt(argc, argv, opts)

int argc; char **argv, *opts;

{

static int sp = 1;

register int c;

register char *cp;

if(sp == 1)

 if(optind >= argc ||

   argv[optind][0] != '-' || argv[optind][1] == '/0')

return(EOF);

 else if(strcmp(argv[optind], "--") == NULL) {

  optind++;

 return(EOF);

}

optopt = c = argv[optind][sp];

if(c == ':' || (cp=strchr(opts, c)) == NULL) {

 ERR(": illegal option -- ", c);

if(argv[optind][++sp] == '/0') {

 optind++;

sp = 1;

}

return('?'); }

if(*++cp == ':') {

 if(argv[optind][sp+1] != '/0')

  optarg = &argv[optind++][sp+1];

else if(++optind >= argc) {

 ERR(": option requires an argument -- ", c);

sp = 1;

 return('?');

 } else

 optarg = argv[optind++];

sp = 1; } else {

 if(argv[optind][++sp] == '/0') {

  sp = 1;

 optind++;

}

optarg = NULL;

}

return(c);

}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值