aboutsummaryrefslogtreecommitdiff
path: root/gnu/libexec/uucp/libuuconf/cmdarg.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/libexec/uucp/libuuconf/cmdarg.c')
-rw-r--r--gnu/libexec/uucp/libuuconf/cmdarg.c185
1 files changed, 185 insertions, 0 deletions
diff --git a/gnu/libexec/uucp/libuuconf/cmdarg.c b/gnu/libexec/uucp/libuuconf/cmdarg.c
new file mode 100644
index 000000000000..39c8d30b4dd3
--- /dev/null
+++ b/gnu/libexec/uucp/libuuconf/cmdarg.c
@@ -0,0 +1,185 @@
+/* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ The author of the program may be contacted at ian@airs.com or
+ c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
+ */
+
+#include "uucnfi.h"
+
+#if USE_RCS_ID
+const char _uuconf_cmdarg_rcsid[] = "$Id: cmdarg.c,v 1.1 1993/08/05 18:25:07 conklin Exp $";
+#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*/
+}