Ejemplo n.º 1
0
static void
varvalue(const_cstring_t name, int32_t quoted, int32_t subtype, int32_t flag)
{
    int32_t num;
    cstring_t p;
    int32_t i;
    char sep;
    cstring_t* ap;
    switch (*name)
    {
    case '$':
        num = rootpid;
        goto numvar;
    case '?':
        num = oexitstatus;
        goto numvar;
    case '#':
        num = shellparam.nparam;
        goto numvar;
    case '!':
        num = backgndpidval();
numvar:
        expdest = cvtnum(num, expdest);
        break;
    case '-':
        for (i = 0 ; i < NOPTS ; i++)
        {
            if (optlist[i].val)
                STPUTC(optlist[i].letter, expdest);
        }
        break;
    case '@':
        if (flag & EXP_FULL && quoted)
        {
            for (ap = shellparam.p ; (p = *ap++) != NULL ;)
            {
                strtodest(p, flag, subtype, quoted);
                if (*ap)
                    STPUTC('\0', expdest);
            }
            break;
        }
    /* FALLTHROUGH */
    case '*':
        if (ifsset())
            sep = ifsval()[0];
        else
            sep = ' ';
        for (ap = shellparam.p ; (p = *ap++) != NULL ;)
        {
            strtodest(p, flag, subtype, quoted);
            if (!*ap)
                break;
            if (sep || (flag & EXP_FULL && !quoted &&** ap != '\0'))
                STPUTC(sep, expdest);
        }
        break;
    default:
        if (is_digit(*name))
        {
            num = atoi(name);
            if (num == 0)
                p = arg0;
            else if (num > 0 && num <= shellparam.nparam)
                p = shellparam.p[num - 1];
            else
                break;
            strtodest(p, flag, subtype, quoted);
        }
        break;
    }
}
Ejemplo n.º 2
0
static void
varvalue(const char *name, int quoted, int subtype, int flag)
{
	int num;
	char *p;
	int i;
	char sep[2];
	char **ap;

	switch (*name) {
	case '$':
		num = rootpid;
		break;
	case '?':
		num = oexitstatus;
		break;
	case '#':
		num = shellparam.nparam;
		break;
	case '!':
		num = backgndpidval();
		break;
	case '-':
		for (i = 0 ; i < NOPTS ; i++) {
			if (optlist[i].val)
				STPUTC(optlist[i].letter, expdest);
		}
		return;
	case '@':
		if (flag & EXP_FULL && quoted) {
			for (ap = shellparam.p ; (p = *ap++) != NULL ; ) {
				strtodest(p, flag, subtype, quoted);
				if (*ap)
					STPUTC('\0', expdest);
			}
			return;
		}
		/* FALLTHROUGH */
	case '*':
		if (ifsset())
			sep[0] = ifsval()[0];
		else
			sep[0] = ' ';
		sep[1] = '\0';
		for (ap = shellparam.p ; (p = *ap++) != NULL ; ) {
			strtodest(p, flag, subtype, quoted);
			if (!*ap)
				break;
			if (sep[0])
				strtodest(sep, flag, subtype, quoted);
			else if (flag & EXP_FULL && !quoted && **ap != '\0')
				STPUTC('\0', expdest);
		}
		return;
	default:
		if (is_digit(*name)) {
			num = atoi(name);
			if (num == 0)
				p = arg0;
			else if (num > 0 && num <= shellparam.nparam)
				p = shellparam.p[num - 1];
			else
				return;
			strtodest(p, flag, subtype, quoted);
			}
		return;
		}
	expdest = cvtnum(num, expdest);
}
Ejemplo n.º 3
0
static void
varvalue(const char *name, int quoted, int subtype, int flag,
    struct worddest *dst)
{
	int num;
	char *p;
	int i;
	int splitlater;
	char sep[2];
	char **ap;
	char buf[(NSHORTOPTS > 10 ? NSHORTOPTS : 10) + 1];

	if (subtype == VSLENGTH)
		flag &= ~EXP_FULL;
	splitlater = subtype == VSTRIMLEFT || subtype == VSTRIMLEFTMAX ||
		subtype == VSTRIMRIGHT || subtype == VSTRIMRIGHTMAX;

	switch (*name) {
	case '$':
		num = rootpid;
		break;
	case '?':
		num = oexitstatus;
		break;
	case '#':
		num = shellparam.nparam;
		break;
	case '!':
		num = backgndpidval();
		break;
	case '-':
		p = buf;
		for (i = 0 ; i < NSHORTOPTS ; i++) {
			if (optlist[i].val)
				*p++ = optlist[i].letter;
		}
		*p = '\0';
		strtodest(buf, flag, subtype, quoted, dst);
		return;
	case '@':
		if (flag & EXP_SPLIT && quoted) {
			for (ap = shellparam.p ; (p = *ap++) != NULL ; ) {
				strtodest(p, flag, subtype, quoted, dst);
				if (*ap) {
					if (splitlater)
						STPUTC('\0', expdest);
					else
						NEXTWORD('\0', flag, expdest,
						    dst);
				}
			}
			if (shellparam.nparam > 0)
				dst->state = WORD_QUOTEMARK;
			return;
		}
		/* FALLTHROUGH */
	case '*':
		if (ifsset())
			sep[0] = ifsval()[0];
		else
			sep[0] = ' ';
		sep[1] = '\0';
		for (ap = shellparam.p ; (p = *ap++) != NULL ; ) {
			strtodest(p, flag, subtype, quoted, dst);
			if (!*ap)
				break;
			if (sep[0])
				strtodest(sep, flag, subtype, quoted, dst);
			else if (flag & EXP_SPLIT && !quoted && **ap != '\0') {
				if (splitlater)
					STPUTC('\0', expdest);
				else
					NEXTWORD('\0', flag, expdest, dst);
			}
		}
		return;
	default:
		if (is_digit(*name)) {
			num = atoi(name);
			if (num == 0)
				p = arg0;
			else if (num > 0 && num <= shellparam.nparam)
				p = shellparam.p[num - 1];
			else
				return;
			strtodest(p, flag, subtype, quoted, dst);
		}
		return;
	}
	cvtnum(num, buf);
	strtodest(buf, flag, subtype, quoted, dst);
}