BBN-Vax-TCP/src/telnet/args.c

#define NULL 0
#define MINUS_1 ((char *)-1)

/* -------------------------- A R G S T R --------------------------- */
/*
 * Given keyword or NULL, return pointer to next arg. Expunge from arg list.
 */
char *
ArgStr(kw, deflt, argv)
    char * kw;
    char * deflt;
    char * argv[];
{
    register char ** ap;
    char * arg;

    for (ap = &argv[1]; *ap != 0 && *ap != MINUS_1; ap++)
	if (kw == NULL)
	{
	    arg = *ap;
	    ArgExpunge(ap);
	    return(arg);
	}
	else if ( strcmp(kw, *ap) == 0 )
	{
	    ap++;
	    if (*ap == 0 || *ap == MINUS_1)
		rcmderr(0, "%s requires an argument.\n", kw);
	    arg = *ap;
	    ArgExpunge(ap);
	    ArgExpunge(--ap);
	    return(arg);
	}
    return(deflt);
}

/* -------------------------- A R G I N T --------------------------- */
/*
 * Given keyword or NULL, return following int. Expunge from arg list.
 */
ArgInt(kw, deflt, argv)
    char * kw;
    int deflt;
    char * argv[];
{
    register char ** ap;
    int out;
    extern char * atoiv();

    for (ap = &argv[1]; *ap != 0 && *ap != MINUS_1; ap++)
	if (kw == NULL)
	{
	    if (*atoiv(*ap, &out) != '\0')
		rcmderr(0, "\"%s\" is not a number.\n", *ap);
	    ArgExpunge(ap);
	    return(out);
	}
	else if (strcmp(kw, *ap) == 0)
	{
	    ap++;
	    if (*ap == 0 || *ap == MINUS_1)
		rcmderr(0, "%s requires a numeric argument.\n", kw);
	    if (*atoiv(*ap, &out) != '\0')
		rcmderr(0, "\"%s\" is not a number.\n", *ap);
	    ArgExpunge(ap);
	    ArgExpunge(--ap);
	    return(out);
	}
    return(deflt);
}

/* -------------------------- A R G L O N G ------------------------- */
/*
 * Given keyword or NULL, return following long. Expunge from arg list.
 */
long
ArgLong(kw, deflt, argv)
    char * kw;
    long deflt;
    char * argv[];
{
    register char ** ap;
    long out;
    extern char * atolv();

    for (ap = &argv[1]; *ap != 0 && *ap != MINUS_1; ap++)
	if (kw == NULL)
	{
	    if (*atolv(*ap, &out) != '\0')
		rcmderr(0, "\"%s\" is not a number.\n", *ap);
	    ArgExpunge(ap);
	    return(out);
	}
	else if (strcmp(kw, *ap) == 0)
	{
	    ap++;
	    if (*ap == 0 || *ap == MINUS_1)
		rcmderr(0, "%s requires a numeric argument.\n", kw);
	    if (*atolv(*ap, &out) != '\0')
		rcmderr(0, "\"%s\" is not a number.\n", *ap);
	    ArgExpunge(ap);
	    ArgExpunge(--ap);
	    return(out);
	}
    return(deflt);
}

/* -------------------------- A R G F L A G ------------------------- */
/*
 * Given keyword, return its index in the argument array, or 0 if not found.
 */
ArgFlag(kw, argv)
    char * kw;
    char * argv[];
{
    register char ** ap;

    for (ap = &argv[1]; *ap != 0 && *ap != MINUS_1; ap++)
	if (strcmp(kw, *ap) == 0)
	{
	    ArgExpunge(ap);
	    return(ap - &argv[0]);
	}
    return(0);
}

/* -------------------------- A R G C O U N T ----------------------- */
/*
 * Return new value for argc following a series of calls on the routines above.
 * This routine returns the total number of arguments in the array,
 * including argv[0]. In other words, given an argv straight from
 * main(argc, argv), its return value will be equal to argc.
 */
ArgCount(argv)
    char * argv[];
{
    register char ** ap;
    register int i = 0;

    for (ap = &argv[0]; *ap != 0 && *ap != MINUS_1; ap++)
	i++;
    return(i);
}

/* -------------------------- A R G E X P U N G E ------------------- */
/*
 * Expunge the argument pointed to.
 */
ArgExpunge(ap)
    register char ** ap;
{
    while (*ap != 0 && *ap != (char *)-1)
    {
	*ap = *(ap + 1);
	ap++;
    }
}

/* ------------------------------------------------------------------ */