186 lines
4.7 KiB
C
186 lines
4.7 KiB
C
/* cmdarg.c
|
||
Look up a command with arguments in a command table.
|
||
|
||
Copyright (C) 1992 Ian Lance Taylor
|
||
|
||
This file is part of the Taylor UUCP uuconf library.
|
||
|
||
This library is free software; you can redistribute it and/or
|
||
modify it under the terms of the GNU Library General Public License
|
||
as published by the Free Software Foundation; either version 2 of
|
||
the License, or (at your option) any later version.
|
||
|
||
This library is distributed in the hope that it will be useful, but
|
||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
Library General Public License for more details.
|
||
|
||
You should have received a copy of the GNU Library General Public
|
||
License along with this library; if not, write to the Free Software
|
||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||
|
||
The author of the program may be contacted at ian@airs.com or
|
||
c/o Cygnus Support, 48 Grove Street, Somerville, MA 02144.
|
||
*/
|
||
|
||
#include "uucnfi.h"
|
||
|
||
#if USE_RCS_ID
|
||
const char _uuconf_cmdarg_rcsid[] = "$FreeBSD$";
|
||
#endif
|
||
|
||
#include <ctype.h>
|
||
|
||
#undef strcmp
|
||
#if HAVE_STRCASECMP
|
||
#undef strcasecmp
|
||
#endif
|
||
extern int strcmp (), strcasecmp ();
|
||
|
||
/* Look up a command with arguments in a table and execute it. */
|
||
|
||
int
|
||
uuconf_cmd_args (pglobal, cargs, pzargs, qtab, pinfo, pfiunknown, iflags,
|
||
pblock)
|
||
pointer pglobal;
|
||
int cargs;
|
||
char **pzargs;
|
||
const struct uuconf_cmdtab *qtab;
|
||
pointer pinfo;
|
||
int (*pfiunknown) P((pointer, int, char **, pointer, pointer));
|
||
int iflags;
|
||
pointer pblock;
|
||
{
|
||
struct sglobal *qglobal = (struct sglobal *) pglobal;
|
||
int bfirstu, bfirstl;
|
||
int (*pficmp) P((const char *, const char *));
|
||
register const struct uuconf_cmdtab *q;
|
||
int itype;
|
||
int callowed;
|
||
|
||
bfirstu = bfirstl = pzargs[0][0];
|
||
if ((iflags & UUCONF_CMDTABFLAG_CASE) != 0)
|
||
pficmp = strcmp;
|
||
else
|
||
{
|
||
if (islower (bfirstu))
|
||
bfirstu = toupper (bfirstu);
|
||
if (isupper (bfirstl))
|
||
bfirstl = tolower (bfirstl);
|
||
pficmp = strcasecmp;
|
||
}
|
||
|
||
itype = 0;
|
||
|
||
for (q = qtab; q->uuconf_zcmd != NULL; q++)
|
||
{
|
||
int bfirst;
|
||
|
||
bfirst = q->uuconf_zcmd[0];
|
||
if (bfirst != bfirstu && bfirst != bfirstl)
|
||
continue;
|
||
|
||
itype = UUCONF_TTYPE_CMDTABTYPE (q->uuconf_itype);
|
||
if (itype != UUCONF_CMDTABTYPE_PREFIX)
|
||
{
|
||
if ((*pficmp) (q->uuconf_zcmd, pzargs[0]) == 0)
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
size_t clen;
|
||
|
||
clen = strlen (q->uuconf_zcmd);
|
||
if ((iflags & UUCONF_CMDTABFLAG_CASE) != 0)
|
||
{
|
||
if (strncmp (q->uuconf_zcmd, pzargs[0], clen) == 0)
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
if (strncasecmp (q->uuconf_zcmd, pzargs[0], clen) == 0)
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (q->uuconf_zcmd == NULL)
|
||
{
|
||
if (pfiunknown == NULL)
|
||
return UUCONF_CMDTABRET_CONTINUE;
|
||
return (*pfiunknown) (pglobal, cargs, pzargs, (pointer) NULL, pinfo);
|
||
}
|
||
|
||
callowed = UUCONF_CARGS_CMDTABTYPE (q->uuconf_itype);
|
||
if (callowed != 0 && callowed != cargs)
|
||
return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
|
||
|
||
switch (itype)
|
||
{
|
||
case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_STRING):
|
||
if (cargs == 1)
|
||
*(char **) q->uuconf_pvar = (char *) "";
|
||
else if (cargs == 2)
|
||
*(char **) q->uuconf_pvar = pzargs[1];
|
||
else
|
||
return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
|
||
|
||
return UUCONF_CMDTABRET_KEEP;
|
||
|
||
case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_INT):
|
||
return _uuconf_iint (qglobal, pzargs[1], q->uuconf_pvar, TRUE);
|
||
|
||
case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_LONG):
|
||
return _uuconf_iint (qglobal, pzargs[1], q->uuconf_pvar, FALSE);
|
||
|
||
case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_BOOLEAN):
|
||
return _uuconf_iboolean (qglobal, pzargs[1], (int *) q->uuconf_pvar);
|
||
|
||
case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_FULLSTRING):
|
||
if (cargs == 1)
|
||
{
|
||
char ***ppz = (char ***) q->uuconf_pvar;
|
||
int iret;
|
||
|
||
*ppz = NULL;
|
||
iret = _uuconf_iadd_string (qglobal, (char *) NULL, FALSE, FALSE,
|
||
ppz, pblock);
|
||
if (iret != UUCONF_SUCCESS)
|
||
return iret | UUCONF_CMDTABRET_EXIT;
|
||
|
||
return UUCONF_CMDTABRET_CONTINUE;
|
||
}
|
||
else
|
||
{
|
||
char ***ppz = (char ***) q->uuconf_pvar;
|
||
int i;
|
||
|
||
*ppz = NULL;
|
||
for (i = 1; i < cargs; i++)
|
||
{
|
||
int iret;
|
||
|
||
iret = _uuconf_iadd_string (qglobal, pzargs[i], FALSE, FALSE,
|
||
ppz, pblock);
|
||
if (iret != UUCONF_SUCCESS)
|
||
{
|
||
*ppz = NULL;
|
||
return iret | UUCONF_CMDTABRET_EXIT;
|
||
}
|
||
}
|
||
|
||
return UUCONF_CMDTABRET_KEEP;
|
||
}
|
||
|
||
case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_FN):
|
||
case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_PREFIX):
|
||
return (*q->uuconf_pifn) (pglobal, cargs, pzargs, q->uuconf_pvar,
|
||
pinfo);
|
||
|
||
default:
|
||
return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
|
||
}
|
||
|
||
/*NOTREACHED*/
|
||
}
|