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

📄 popt.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
}/* returns 'val' element, -1 on last item, POPT_ERROR_* on error */int poptGetNextOpt(poptContext con){    const struct poptOption * opt = NULL;    int done = 0;    /* looks a bit tricky to get rid of alloca properly in this fn */#if HAVE_ALLOCA_H#define ALLOCA(x) alloca(x)#else#define ALLOCA(x) malloc(x)#endif    while (!done) {	const char * origOptString = NULL;	poptCallbackType cb = NULL;	const void * cbData = NULL;	const char * longArg = NULL;	int canstrip = 0;	while (!con->os->nextCharArg && con->os->next == con->os->argc		&& con->os > con->optionStack) {	    cleanOSE(con->os--);	}	if (!con->os->nextCharArg && con->os->next == con->os->argc) {	    invokeCallbacks(con, con->options, 1);	    if (con->doExec) execCommand(con);	    return -1;	}	/* Process next long option */	if (!con->os->nextCharArg) {	    char * localOptString, * optString;	    int thisopt;	    if (con->os->argb && PBM_ISSET(con->os->next, con->os->argb)) {		con->os->next++;		continue;	    }	    thisopt=con->os->next;	    origOptString = con->os->argv[con->os->next++];	    if (con->restLeftover || *origOptString != '-') {		con->leftovers[con->numLeftovers++] = origOptString;		if (con->flags & POPT_CONTEXT_POSIXMEHARDER)		    con->restLeftover = 1;		continue;	    }	    /* Make a copy we can hack at */	    localOptString = optString =			strcpy(ALLOCA(strlen(origOptString) + 1),			origOptString);	    if (!optString[0])		return POPT_ERROR_BADOPT;	    if (optString[1] == '-' && !optString[2]) {		con->restLeftover = 1;		continue;	    } else {		char *oe;		int singleDash;		optString++;		if (*optString == '-')		    singleDash = 0, optString++;		else		    singleDash = 1;		/* XXX aliases with arg substitution need "--alias=arg" */		if (handleAlias(con, optString, '\0', NULL))		    continue;		if (handleExec(con, optString, '\0'))		    continue;		/* Check for "--long=arg" option. */		for (oe = optString; *oe && *oe != '='; oe++)		    ;		if (*oe == '=') {		    *oe++ = '\0';		    /* XXX longArg is mapped back to persistent storage. */		    longArg = origOptString + (oe - localOptString);		}		opt = findOption(con->options, optString, '\0', &cb, &cbData,				 singleDash);		if (!opt && !singleDash)		    return POPT_ERROR_BADOPT;	    }	    if (!opt) {		con->os->nextCharArg = origOptString + 1;	    } else {		if(con->os == con->optionStack &&		   opt->argInfo & POPT_ARGFLAG_STRIP) {		    canstrip = 1;		    poptStripArg(con, thisopt);		}	    }	}	/* Process next short option */	if (con->os->nextCharArg) {	    origOptString = con->os->nextCharArg;	    con->os->nextCharArg = NULL;	    if (handleAlias(con, NULL, *origOptString,			    origOptString + 1)) {		origOptString++;		continue;	    }	    if (handleExec(con, NULL, *origOptString))		continue;	    opt = findOption(con->options, NULL, *origOptString, &cb,			     &cbData, 0);	    if (!opt)		return POPT_ERROR_BADOPT;	    origOptString++;	    if (*origOptString)		con->os->nextCharArg = origOptString;	}	if (opt->arg && (opt->argInfo & POPT_ARG_MASK) == POPT_ARG_NONE) {	    *((int *)opt->arg) = 1;	} else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_VAL) {	    if (opt->arg)		*((int *) opt->arg) = opt->val;	} else if ((opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE) {	    if (con->os->nextArg) {		xfree(con->os->nextArg);		con->os->nextArg = NULL;	    }	    if (longArg) {		con->os->nextArg = expandNextArg(con, longArg);	    } else if (con->os->nextCharArg) {		con->os->nextArg = expandNextArg(con, con->os->nextCharArg);		con->os->nextCharArg = NULL;	    } else {		while (con->os->next == con->os->argc &&		       con->os > con->optionStack) {		    cleanOSE(con->os--);		}		if (con->os->next == con->os->argc)		    return POPT_ERROR_NOARG;		/* make sure this isn't part of a short arg or the                   result of an alias expansion */		if(con->os == con->optionStack &&		   opt->argInfo & POPT_ARGFLAG_STRIP &&		   canstrip) {		    poptStripArg(con, con->os->next);		}				con->os->nextArg = expandNextArg(con, con->os->argv[con->os->next++]);	    }	    if (opt->arg) {		long aLong;		char *end;		switch (opt->argInfo & POPT_ARG_MASK) {		  case POPT_ARG_STRING:		    /* XXX memory leak, hard to plug */		    *((const char **) opt->arg) = xstrdup(con->os->nextArg);		    break;		  case POPT_ARG_INT:		  case POPT_ARG_LONG:		    aLong = strtol(con->os->nextArg, &end, 0);		    if (!(end && *end == '\0'))			return POPT_ERROR_BADNUMBER;		    if (aLong == LONG_MIN || aLong == LONG_MAX)			return POPT_ERROR_OVERFLOW;		    if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_LONG) {			*((long *) opt->arg) = aLong;		    } else {			if (aLong > INT_MAX || aLong < INT_MIN)			    return POPT_ERROR_OVERFLOW;			*((int *) opt->arg) = aLong;		    }		    break;		  default:		    fprintf(stdout, POPT_("option type (%d) not implemented in popt\n"),		      opt->argInfo & POPT_ARG_MASK);		    exit(EXIT_FAILURE);		}	    }	}	if (cb)	    cb(con, POPT_CALLBACK_REASON_OPTION, opt, con->os->nextArg, cbData);	else if (opt->val && ((opt->argInfo & POPT_ARG_MASK) != POPT_ARG_VAL))	    done = 1;	if ((con->finalArgvCount + 2) >= (con->finalArgvAlloced)) {	    con->finalArgvAlloced += 10;	    con->finalArgv = realloc(con->finalArgv,			    sizeof(*con->finalArgv) * con->finalArgvAlloced);	}	{    char *s = malloc((opt->longName ? strlen(opt->longName) : 0) + 3);	    if (opt->longName)		sprintf(s, "--%s", opt->longName);	    else		sprintf(s, "-%c", opt->shortName);	    con->finalArgv[con->finalArgvCount++] = s;	}	if (opt->arg && (opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE		     && (opt->argInfo & POPT_ARG_MASK) != POPT_ARG_VAL) {	    con->finalArgv[con->finalArgvCount++] = xstrdup(con->os->nextArg);	}    }    return opt->val;}const char * poptGetOptArg(poptContext con) {    const char * ret = con->os->nextArg;    con->os->nextArg = NULL;    return ret;}const char * poptGetArg(poptContext con) {    if (con->numLeftovers == con->nextLeftover) return NULL;    return con->leftovers[con->nextLeftover++];}const char * poptPeekArg(poptContext con) {    if (con->numLeftovers == con->nextLeftover) return NULL;    return con->leftovers[con->nextLeftover];}const char ** poptGetArgs(poptContext con) {    if (con->numLeftovers == con->nextLeftover) return NULL;    /* some apps like [like RPM ;-) ] need this NULL terminated */    con->leftovers[con->numLeftovers] = NULL;    return (con->leftovers + con->nextLeftover);}void poptFreeContext(poptContext con) {    int i;    poptResetContext(con);    if (con->os->argb) free(con->os->argb);    for (i = 0; i < con->numAliases; i++) {	if (con->aliases[i].longName) xfree(con->aliases[i].longName);	free(con->aliases[i].argv);    }    for (i = 0; i < con->numExecs; i++) {	if (con->execs[i].longName) xfree(con->execs[i].longName);	xfree(con->execs[i].script);    }    if (con->execs) xfree(con->execs);    free(con->leftovers);    free(con->finalArgv);    if (con->appName) xfree(con->appName);    if (con->aliases) free(con->aliases);    if (con->otherHelp) xfree(con->otherHelp);    if (con->execPath) xfree(con->execPath);    if (con->arg_strip) PBM_FREE(con->arg_strip);        free(con);}int poptAddAlias(poptContext con, struct poptAlias newAlias,		/*@unused@*/ int flags){    int aliasNum = con->numAliases++;    struct poptAlias * alias;    /* SunOS won't realloc(NULL, ...) */    if (!con->aliases)	con->aliases = malloc(sizeof(newAlias) * con->numAliases);    else	con->aliases = realloc(con->aliases,			       sizeof(newAlias) * con->numAliases);    alias = con->aliases + aliasNum;    alias->longName = (newAlias.longName)	? strcpy(malloc(strlen(newAlias.longName) + 1), newAlias.longName)	: NULL;    alias->shortName = newAlias.shortName;    alias->argc = newAlias.argc;    alias->argv = newAlias.argv;    return 0;}const char * poptBadOption(poptContext con, int flags) {    struct optionStackEntry * os;    if (flags & POPT_BADOPTION_NOALIAS)	os = con->optionStack;    else	os = con->os;    return os->argv[os->next - 1];}#define POPT_ERROR_NOARG	-10#define POPT_ERROR_BADOPT	-11#define POPT_ERROR_OPTSTOODEEP	-13#define POPT_ERROR_BADQUOTE	-15	/* only from poptParseArgString() */#define POPT_ERROR_ERRNO	-16	/* only from poptParseArgString() */const char *poptStrerror(const int error) {    switch (error) {      case POPT_ERROR_NOARG:	return POPT_("missing argument");      case POPT_ERROR_BADOPT:	return POPT_("unknown option");      case POPT_ERROR_OPTSTOODEEP:	return POPT_("aliases nested too deeply");      case POPT_ERROR_BADQUOTE:	return POPT_("error in paramter quoting");      case POPT_ERROR_BADNUMBER:	return POPT_("invalid numeric value");      case POPT_ERROR_OVERFLOW:	return POPT_("number too large or too small");      case POPT_ERROR_ERRNO:	return strerror(errno);      default:	return POPT_("unknown error");    }}int poptStuffArgs(poptContext con, const char ** argv) {    int argc;    if ((con->os - con->optionStack) == POPT_OPTION_DEPTH)	return POPT_ERROR_OPTSTOODEEP;    for (argc = 0; argv[argc]; argc++)	;    con->os++;    con->os->next = 0;    con->os->nextArg = NULL;    con->os->nextCharArg = NULL;    con->os->currAlias = NULL;    poptDupArgv(argc, argv, &con->os->argc, &con->os->argv);    con->os->argb = NULL;    con->os->stuffed = 1;    return 0;}const char * poptGetInvocationName(poptContext con) {    return con->os->argv[0];}int poptStrippedArgv(poptContext con, int argc, char **argv){    int i,j=1, numargs=argc;        for(i=1; i<argc; i++) {	if(PBM_ISSET(i, con->arg_strip)) {	    numargs--;	}    }        for(i=1; i<argc; i++) {	if(PBM_ISSET(i, con->arg_strip)) {	    continue;	} else {	    if(j<numargs) {		argv[j++]=argv[i];	    } else {		argv[j++]='\0';	    }	}    }        return(numargs);}

⌨️ 快捷键说明

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