⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getlopt.c

📁 mpg123 是 MPEG 1.0/2.0/2.5 的实时播放软件
💻 C
字号:
/*	getlopt: command line option/parameter parsing	copyright ?-2006 by the mpg123 project - free software under the terms of the LGPL 2.1	see COPYING and AUTHORS files in distribution or http://mpg123.de	initially written Oliver Fromme	old timestamp: Tue Apr  8 07:15:13 MET DST 1997*/#include <stdio.h>#include "config.h"#include "debug.h"#include "getlopt.h"int loptind = 1;	/* index in argv[] */int loptchr = 0;	/* index in argv[loptind] */char *loptarg;		/* points to argument if present, else to option */#if defined(ultrix) || defined(ULTRIX)char *strdup (char *src){	char *dest;	if (!(dest = (char *) malloc(strlen(src)+1)))		return (NULL);	return (strcpy(dest, src));}#endiftopt *findopt (int islong, char *opt, topt *opts){	if (!opts)		return (0);	while (opts->lname) {		if (islong) {			if (!strcmp(opts->lname, opt))				return (opts);		}		else			if (opts->sname == *opt)				return (opts);		opts++;	}	return (0);}int performoption (int argc, char *argv[], topt *opt){	int result = GLO_CONTINUE;	/* this really is not supposed to happen, so the exit may be justified to create asap ficing pressure */	#define prog_error() \	{ \		fprintf(stderr, __FILE__ ":%i Option without type flag! This is a programming error! Developer: fix this ASAP to regain your honor.\n", __LINE__); \		exit(1); \	}	if (!(opt->flags & GLO_ARG)) { /* doesn't take argument */		if (opt->var) {			if (opt->flags & GLO_CHAR) /* var is *char */			{				debug1("char at %p", opt->var);				*((char *) opt->var) = (char) opt->value;\			}			else if(opt->flags & GLO_LONG)			{				debug1("long at %p", opt->var);				*( (long *) opt->var ) = opt->value;			}			else if(opt->flags & GLO_INT)			{				debug1("int at %p", opt->var);				*( (int *) opt->var ) = (int) opt->value;			}			else prog_error();											debug("casting assignment done");		}		else			result = opt->value ? opt->value : opt->sname;	}	else { /* requires argument */		if (loptind >= argc)			return (GLO_NOARG);		loptarg = argv[loptind++]+loptchr;		loptchr = 0;		if (opt->var) {			if (opt->flags & GLO_CHAR) /* var is *char */				*((char **) opt->var) = strdup(loptarg); /* valgrind claims lost memory here */			else if(opt->flags & GLO_LONG)				*((long *) opt->var) = atol(loptarg);			else if(opt->flags & GLO_INT)				*((int *) opt->var) = atoi(loptarg);			else prog_error();		}		else			result = opt->value ? opt->value : opt->sname;	}	if (opt->func)		opt->func(loptarg);	return (result);}int getsingleopt (int argc, char *argv[], topt *opts){	char *thisopt;	topt *opt;	static char shortopt[2] = {0, 0};	if (loptind >= argc)		return (GLO_END);	thisopt = argv[loptind];	debug1("getsingleopt: %s", thisopt);	if (!loptchr) { /* start new option string */		if (thisopt[0] != '-' || !thisopt[1]) /* no more options */			return (GLO_END);		if (thisopt[1] == '-') { /* "--" */			if (thisopt[2]) { /* long option */				loptarg = thisopt+2;				loptind++;				if (!(opt = findopt(1, thisopt+2, opts)))					return (GLO_UNKNOWN);				else					return (performoption(argc, argv, opt));			}			else { /* "--" == end of options */				loptind++;				return (GLO_END);			}		}		else /* start short option(s) */			loptchr = 1;	}	shortopt[0] = thisopt[loptchr];	loptarg = shortopt;	opt = findopt(0, thisopt+(loptchr++), opts);	if (!thisopt[loptchr]) {		loptind++;		loptchr = 0;	}	if (!opt)		return (GLO_UNKNOWN);	else		return (performoption(argc, argv, opt));}int getlopt (int argc, char *argv[], topt *opts){		int result;		while ((result = getsingleopt(argc, argv, opts)) == GLO_CONTINUE);	return (result);}/* EOF */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -