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

📄 popthelp.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- *//*@-type@*//** \ingroup popt * \file popt/popthelp.c *//* (C) 1998-2002 Red Hat, Inc. -- Licensing details are in the COPYING   file accompanying popt source distributions, available from    ftp://ftp.rpm.org/pub/rpm/dist. */#include "system.h"#include "poptint.h"/** * Display arguments. * @param con		context * @param foo		(unused) * @param key		option(s) * @param arg		(unused) * @param data		(unused) */static void displayArgs(poptContext con,		/*@unused@*/ enum poptCallbackReason foo,		struct poptOption * key, 		/*@unused@*/ const char * arg, /*@unused@*/ void * data)	/*@globals fileSystem@*/	/*@modifies fileSystem@*/{    if (key->shortName == '?')	poptPrintHelp(con, stdout, 0);    else	poptPrintUsage(con, stdout, 0);    exit(0);}#ifdef	NOTYET/*@unchecked@*/static int show_option_defaults = 0;#endif/** * Empty table marker to enable displaying popt alias/exec options. *//*@observer@*/ /*@unchecked@*/struct poptOption poptAliasOptions[] = {    POPT_TABLEEND};/** * Auto help table options. *//*@-castfcnptr@*//*@observer@*/ /*@unchecked@*/struct poptOption poptHelpOptions[] = {  { NULL, '\0', POPT_ARG_CALLBACK, (void *)&displayArgs, '\0', NULL, NULL },  { "help", '?', 0, NULL, '?', N_("Show this help message"), NULL },  { "usage", '\0', 0, NULL, 'u', N_("Display brief usage message"), NULL },#ifdef	NOTYET  { "defaults", '\0', POPT_ARG_NONE, &show_option_defaults, 0,	N_("Display option defaults in message"), NULL },#endif    POPT_TABLEEND} ;/*@=castfcnptr@*//** * @param table		option(s) *//*@observer@*/ /*@null@*/ static const char *constgetTableTranslationDomain(/*@null@*/ const struct poptOption *table)	/*@*/{    const struct poptOption *opt;    if (table != NULL)    for (opt = table; opt->longName || opt->shortName || opt->arg; opt++) {	if (opt->argInfo == POPT_ARG_INTL_DOMAIN)	    return opt->arg;    }    return NULL;}/** * @param opt		option(s) * @param translation_domain	translation domain *//*@observer@*/ /*@null@*/ static const char *constgetArgDescrip(const struct poptOption * opt,		/*@-paramuse@*/ /* FIX: i18n macros disabled with lclint */		/*@null@*/ const char * translation_domain)		/*@=paramuse@*/	/*@*/{    if (!(opt->argInfo & POPT_ARG_MASK)) return NULL;    if (opt == (poptHelpOptions + 1) || opt == (poptHelpOptions + 2))	if (opt->argDescrip) return POPT_(opt->argDescrip);    if (opt->argDescrip) return D_(translation_domain, opt->argDescrip);    switch (opt->argInfo & POPT_ARG_MASK) {    case POPT_ARG_NONE:		return POPT_("NONE");#ifdef	DYING    case POPT_ARG_VAL:		return POPT_("VAL");#else    case POPT_ARG_VAL:		return NULL;#endif    case POPT_ARG_INT:		return POPT_("INT");    case POPT_ARG_LONG:		return POPT_("LONG");    case POPT_ARG_STRING:	return POPT_("STRING");    case POPT_ARG_FLOAT:	return POPT_("FLOAT");    case POPT_ARG_DOUBLE:	return POPT_("DOUBLE");    default:			return POPT_("ARG");    }}/** * Display default value for an option. * @param lineLength * @param opt		option(s) * @param translation_domain	translation domain * @return */static /*@only@*/ /*@null@*/ char *singleOptionDefaultValue(int lineLength,		const struct poptOption * opt,		/*@-paramuse@*/ /* FIX: i18n macros disabled with lclint */		/*@null@*/ const char * translation_domain)		/*@=paramuse@*/	/*@*/{    const char * defstr = D_(translation_domain, "default");    char * le = malloc(4*lineLength + 1);    char * l = le;    if (le == NULL) return NULL;	/* XXX can't happen *//*@-boundswrite@*/    *le = '\0';    *le++ = '(';    strcpy(le, defstr);	le += strlen(le);    *le++ = ':';    *le++ = ' ';    if (opt->arg)	/* XXX programmer error */    switch (opt->argInfo & POPT_ARG_MASK) {    case POPT_ARG_VAL:    case POPT_ARG_INT:    {	long aLong = *((int *)opt->arg);	le += sprintf(le, "%ld", aLong);    }	break;    case POPT_ARG_LONG:    {	long aLong = *((long *)opt->arg);	le += sprintf(le, "%ld", aLong);    }	break;    case POPT_ARG_FLOAT:    {	double aDouble = *((float *)opt->arg);	le += sprintf(le, "%g", aDouble);    }	break;    case POPT_ARG_DOUBLE:    {	double aDouble = *((double *)opt->arg);	le += sprintf(le, "%g", aDouble);    }	break;    case POPT_ARG_STRING:    {	const char * s = *(const char **)opt->arg;	if (s == NULL) {	    strcpy(le, "null");	le += strlen(le);	} else {	    size_t slen = 4*lineLength - (le - l) - sizeof("\"...\")");	    *le++ = '"';	    strncpy(le, s, slen); le[slen] = '\0'; le += strlen(le);		    if (slen < strlen(s)) {		strcpy(le, "...");	le += strlen(le);	    }	    *le++ = '"';	}    }	break;    case POPT_ARG_NONE:    default:	l = _free(l);	return NULL;	/*@notreached@*/ break;    }    *le++ = ')';    *le = '\0';/*@=boundswrite@*/    return l;}/** * Display help text for an option. * @param fp		output file handle * @param maxLeftCol * @param opt		option(s) * @param translation_domain	translation domain */static void singleOptionHelp(FILE * fp, int maxLeftCol, 		const struct poptOption * opt,		/*@null@*/ const char * translation_domain)	/*@globals fileSystem @*/	/*@modifies *fp, fileSystem @*/{    int indentLength = maxLeftCol + 5;    int lineLength = 79 - indentLength;    const char * help = D_(translation_domain, opt->descrip);    const char * argDescrip = getArgDescrip(opt, translation_domain);    int helpLength;    char * defs = NULL;    char * left;    int nb = maxLeftCol + 1;    /* Make sure there's more than enough room in target buffer. */    if (opt->longName)	nb += strlen(opt->longName);    if (argDescrip)	nb += strlen(argDescrip);/*@-boundswrite@*/    left = malloc(nb);    if (left == NULL) return;	/* XXX can't happen */    left[0] = '\0';    left[maxLeftCol] = '\0';    if (opt->longName && opt->shortName)	sprintf(left, "-%c, %s%s", opt->shortName,		((opt->argInfo & POPT_ARGFLAG_ONEDASH) ? "-" : "--"),		opt->longName);    else if (opt->shortName != '\0') 	sprintf(left, "-%c", opt->shortName);    else if (opt->longName)	sprintf(left, "%s%s",		((opt->argInfo & POPT_ARGFLAG_ONEDASH) ? "-" : "--"),		opt->longName);    if (!*left) goto out;    if (argDescrip) {	char * le = left + strlen(left);	if (opt->argInfo & POPT_ARGFLAG_OPTIONAL)	    *le++ = '[';	/* Choose type of output */	/*@-branchstate@*/	if (opt->argInfo & POPT_ARGFLAG_SHOW_DEFAULT) {	    defs = singleOptionDefaultValue(lineLength, opt, translation_domain);	    if (defs) {		char * t = malloc((help ? strlen(help) : 0) +				strlen(defs) + sizeof(" "));		if (t) {		    char * te = t;		    *te = '\0';		    if (help) {			strcpy(te, help);	te += strlen(te);		    }		    *te++ = ' ';		    strcpy(te, defs);		    defs = _free(defs);		}		defs = t;	    }	}	/*@=branchstate@*/	if (opt->argDescrip == NULL) {	    switch (opt->argInfo & POPT_ARG_MASK) {	    case POPT_ARG_NONE:		break;	    case POPT_ARG_VAL:#ifdef	NOTNOW	/* XXX pug ugly nerdy output */	    {	long aLong = opt->val;		int ops = (opt->argInfo & POPT_ARGFLAG_LOGICALOPS);		int negate = (opt->argInfo & POPT_ARGFLAG_NOT);		/* Don't bother displaying typical values */		if (!ops && (aLong == 0L || aLong == 1L || aLong == -1L))		    break;		*le++ = '[';		switch (ops) {		case POPT_ARGFLAG_OR:		    *le++ = '|';		    /*@innerbreak@*/ break;		case POPT_ARGFLAG_AND:		    *le++ = '&';		    /*@innerbreak@*/ break;		case POPT_ARGFLAG_XOR:		    *le++ = '^';		    /*@innerbreak@*/ break;		default:		    /*@innerbreak@*/ break;		}		*le++ = '=';		if (negate) *le++ = '~';		/*@-formatconst@*/		le += sprintf(le, (ops ? "0x%lx" : "%ld"), aLong);		/*@=formatconst@*/		*le++ = ']';	    }#endif		break;	    case POPT_ARG_INT:	    case POPT_ARG_LONG:	    case POPT_ARG_FLOAT:	    case POPT_ARG_DOUBLE:	    case POPT_ARG_STRING:		*le++ = '=';		strcpy(le, argDescrip);		le += strlen(le);		break;	    default:		break;	    }	} else {	    *le++ = '=';	    strcpy(le, argDescrip);		le += strlen(le);	}	if (opt->argInfo & POPT_ARGFLAG_OPTIONAL)	    *le++ = ']';	*le = '\0';    }/*@=boundswrite@*/    if (help)	fprintf(fp,"  %-*s   ", maxLeftCol, left);    else {	fprintf(fp,"  %s\n", left); 	goto out;    }    left = _free(left);    if (defs) {	help = defs; defs = NULL;    }    helpLength = strlen(help);/*@-boundsread@*/    while (helpLength > lineLength) {	const char * ch;	char format[16];	ch = help + lineLength - 1;	while (ch > help && !isspace(*ch)) ch--;	if (ch == help) break;		/* give up */	while (ch > (help + 1) && isspace(*ch)) ch--;	ch++;	sprintf(format, "%%.%ds\n%%%ds", (int) (ch - help), indentLength);	/*@-formatconst@*/	fprintf(fp, format, help, " ");	/*@=formatconst@*/	help = ch;	while (isspace(*help) && *help) help++;	helpLength = strlen(help);    }/*@=boundsread@*/    if (helpLength) fprintf(fp, "%s\n", help);out:    /*@-dependenttrans@*/    defs = _free(defs);    /*@=dependenttrans@*/    left = _free(left);}/** * @param opt		option(s) * @param translation_domain	translation domain */static int maxArgWidth(const struct poptOption * opt,		       /*@null@*/ const char * translation_domain)	/*@*/{    int max = 0;    int len = 0;    const char * s;

⌨️ 快捷键说明

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