Annotation of coherent/g/usr/lib/uucp/tay104/uuconf/cmdarg.c, revision 1.1

1.1     ! root        1: /* cmdarg.c
        !             2:    Look up a command with arguments in a command table.
        !             3: 
        !             4:    Copyright (C) 1992 Ian Lance Taylor
        !             5: 
        !             6:    This file is part of the Taylor UUCP uuconf library.
        !             7: 
        !             8:    This library is free software; you can redistribute it and/or
        !             9:    modify it under the terms of the GNU Library General Public License
        !            10:    as published by the Free Software Foundation; either version 2 of
        !            11:    the License, or (at your option) any later version.
        !            12: 
        !            13:    This library is distributed in the hope that it will be useful, but
        !            14:    WITHOUT ANY WARRANTY; without even the implied warranty of
        !            15:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            16:    Library General Public License for more details.
        !            17: 
        !            18:    You should have received a copy of the GNU Library General Public
        !            19:    License along with this library; if not, write to the Free Software
        !            20:    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
        !            21: 
        !            22:    The author of the program may be contacted at [email protected] or
        !            23:    c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
        !            24:    */
        !            25: 
        !            26: #include "uucnfi.h"
        !            27: 
        !            28: #if USE_RCS_ID
        !            29: const char _uuconf_cmdarg_rcsid[] = "$Id: cmdarg.c,v 1.1 93/07/30 08:07:04 bin Exp Locker: bin $";
        !            30: #endif
        !            31: 
        !            32: #include <ctype.h>
        !            33: 
        !            34: #undef strcmp
        !            35: #if HAVE_STRCASECMP
        !            36: #undef strcasecmp
        !            37: #endif
        !            38: extern int strcmp (), strcasecmp ();
        !            39: 
        !            40: /* Look up a command with arguments in a table and execute it.  */
        !            41: 
        !            42: int
        !            43: uuconf_cmd_args (pglobal, cargs, pzargs, qtab, pinfo, pfiunknown, iflags,
        !            44:                 pblock)
        !            45:      pointer pglobal;
        !            46:      int cargs;
        !            47:      char **pzargs;
        !            48:      const struct uuconf_cmdtab *qtab;
        !            49:      pointer pinfo;
        !            50:      int (*pfiunknown) P((pointer, int, char **, pointer, pointer));
        !            51:      int iflags;
        !            52:      pointer pblock;
        !            53: {
        !            54:   struct sglobal *qglobal = (struct sglobal *) pglobal;
        !            55:   int bfirstu, bfirstl;
        !            56:   int (*pficmp) P((const char *, const char *));
        !            57:   register const struct uuconf_cmdtab *q;
        !            58:   int itype;
        !            59:   int callowed;
        !            60: 
        !            61:   bfirstu = bfirstl = pzargs[0][0];
        !            62:   if ((iflags & UUCONF_CMDTABFLAG_CASE) != 0)
        !            63:     pficmp = strcmp;
        !            64:   else
        !            65:     {
        !            66:       if (islower (bfirstu))
        !            67:        bfirstu = toupper (bfirstu);
        !            68:       if (isupper (bfirstl))
        !            69:        bfirstl = tolower (bfirstl);
        !            70:       pficmp = strcasecmp;
        !            71:     }
        !            72: 
        !            73:   itype = 0;
        !            74: 
        !            75:   for (q = qtab; q->uuconf_zcmd != NULL; q++)
        !            76:     {
        !            77:       int bfirst;
        !            78: 
        !            79:       bfirst = q->uuconf_zcmd[0];
        !            80:       if (bfirst != bfirstu && bfirst != bfirstl)
        !            81:        continue;
        !            82: 
        !            83:       itype = UUCONF_TTYPE_CMDTABTYPE (q->uuconf_itype);
        !            84:       if (itype != UUCONF_CMDTABTYPE_PREFIX)
        !            85:        {
        !            86:          if ((*pficmp) (q->uuconf_zcmd, pzargs[0]) == 0)
        !            87:            break;
        !            88:        }
        !            89:       else
        !            90:        {
        !            91:          size_t clen;
        !            92: 
        !            93:          clen = strlen (q->uuconf_zcmd);
        !            94:          if ((iflags & UUCONF_CMDTABFLAG_CASE) != 0)
        !            95:            {
        !            96:              if (strncmp (q->uuconf_zcmd, pzargs[0], clen) == 0)
        !            97:                break;
        !            98:            }
        !            99:          else
        !           100:            {
        !           101:              if (strncasecmp (q->uuconf_zcmd, pzargs[0], clen) == 0)
        !           102:                break;
        !           103:            }
        !           104:        }
        !           105:     }
        !           106: 
        !           107:   if (q->uuconf_zcmd == NULL)
        !           108:     {
        !           109:       if (pfiunknown == NULL)
        !           110:        return UUCONF_CMDTABRET_CONTINUE;
        !           111:       return (*pfiunknown) (pglobal, cargs, pzargs, (pointer) NULL, pinfo);
        !           112:     }
        !           113: 
        !           114:   callowed = UUCONF_CARGS_CMDTABTYPE (q->uuconf_itype);
        !           115:   if (callowed != 0 && callowed != cargs)
        !           116:     return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
        !           117: 
        !           118:   switch (itype)
        !           119:     {
        !           120:     case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_STRING):
        !           121:       if (cargs == 1)
        !           122:        *(char **) q->uuconf_pvar = (char *) "";
        !           123:       else if (cargs == 2)
        !           124:        *(char **) q->uuconf_pvar = pzargs[1];
        !           125:       else
        !           126:        return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
        !           127: 
        !           128:       return UUCONF_CMDTABRET_KEEP;
        !           129: 
        !           130:     case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_INT):
        !           131:       return _uuconf_iint (qglobal, pzargs[1], q->uuconf_pvar, TRUE);
        !           132: 
        !           133:     case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_LONG):
        !           134:       return _uuconf_iint (qglobal, pzargs[1], q->uuconf_pvar, FALSE);
        !           135: 
        !           136:     case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_BOOLEAN):
        !           137:       return _uuconf_iboolean (qglobal, pzargs[1], (int *) q->uuconf_pvar);
        !           138: 
        !           139:     case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_FULLSTRING):
        !           140:       if (cargs == 1)
        !           141:        {
        !           142:          char ***ppz = (char ***) q->uuconf_pvar;
        !           143:          int iret;
        !           144:          
        !           145:          *ppz = NULL;
        !           146:          iret = _uuconf_iadd_string (qglobal, (char *) NULL, FALSE, FALSE,
        !           147:                                      ppz, pblock);
        !           148:          if (iret != UUCONF_SUCCESS)
        !           149:            return iret | UUCONF_CMDTABRET_EXIT;
        !           150: 
        !           151:          return UUCONF_CMDTABRET_CONTINUE;
        !           152:        }
        !           153:       else
        !           154:        {
        !           155:          char ***ppz = (char ***) q->uuconf_pvar;
        !           156:          int i;
        !           157: 
        !           158:          *ppz = NULL;
        !           159:          for (i = 1; i < cargs; i++)
        !           160:            {
        !           161:              int iret;
        !           162: 
        !           163:              iret = _uuconf_iadd_string (qglobal, pzargs[i], FALSE, FALSE,
        !           164:                                          ppz, pblock);
        !           165:              if (iret != UUCONF_SUCCESS)
        !           166:                {
        !           167:                  *ppz = NULL;
        !           168:                  return iret | UUCONF_CMDTABRET_EXIT;
        !           169:                }
        !           170:            }
        !           171: 
        !           172:          return UUCONF_CMDTABRET_KEEP;
        !           173:        }
        !           174: 
        !           175:     case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_FN):
        !           176:     case UUCONF_TTYPE_CMDTABTYPE (UUCONF_CMDTABTYPE_PREFIX):
        !           177:       return (*q->uuconf_pifn) (pglobal, cargs, pzargs, q->uuconf_pvar,
        !           178:                                pinfo);
        !           179: 
        !           180:     default:
        !           181:       return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
        !           182:     }
        !           183: 
        !           184:   /*NOTREACHED*/
        !           185: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.