Пример #1
0
newtRef NcFullLookupFrame(newtRefArg start, newtRefArg name)
{
    newtRefVar	current;
    newtRefVar	left = start;

	if (! NewtRefIsFrame(start))
		return kNewtRefUnbind;

    while (NewtRefIsNotNIL(left))
    {
        current = left;

        while (NewtRefIsNotNIL(current))
        {
			current = NcResolveMagicPointer(current);

			if (NewtRefIsMagicPointer(current))
				return kNewtRefUnbind;

            if (NewtHasSlot(current, name))
                return current;
    
            current = NcGetSlot(current, NSSYM0(_proto));
        }

        left = NcGetSlot(left, NSSYM0(_parent));
    }

    return kNewtRefUnbind;
}
Пример #2
0
newtRef NsOr(newtRefArg rcvr, newtRefArg r1, newtRefArg r2)
{
	bool	result;

	result = (NewtRefIsNotNIL(r1) || NewtRefIsNotNIL(r2));

    return NewtMakeBoolean(result);
}
Пример #3
0
newtRef protoREGEX_cleanup(newtRefArg rcvr)
{
	newtRefVar  preg;

	if (NewtRefIsNIL(rcvr))
		return kNewtRefUnbind;

	NcSetSlot(rcvr, NSSYM(_matchs), kNewtRefNIL);
	preg = NcGetSlot(rcvr, NSSYM(_preg));

	if (NewtRefIsNotNIL(preg))
	{
		protoREGEX_regfree(preg);
		NcSetSlot(rcvr, NSSYM(_preg), kNewtRefNIL);
	}

	return kNewtRefNIL;
}
Пример #4
0
newtRef NcLexicalLookup(newtRefArg start, newtRef name)
{
    newtRefVar	current = start;

    while (NewtRefIsNotNIL(current))
    {
		current = NcResolveMagicPointer(current);

		if (NewtRefIsMagicPointer(current))
			return kNewtRefUnbind;

        if (NewtHasSlot(current, name))
            return NcGetSlot(current, name);

        current = NcGetSlot(current, NSSYM0(_nextArgFrame));
    }

    return kNewtRefUnbind;
}
Пример #5
0
newtRef NewtParamStr(char * baseStr, size_t baseStrLen, newtRefArg paramStrArray, bool ifthen)
{
	newtRefVar	dstStr;
	newtRefVar  r;
	size_t	fpos = 0;
	size_t	fst = 0;
	size_t	len;
	size_t	n;
	size_t	truePos;
	size_t	trueLen;
	size_t	falsePos;
	size_t	falseLen;
	char *	found;
	char	c;

	dstStr = NewtMakeString("", false);

	do
	{
		found = memchr(&baseStr[fst], '^', baseStrLen - fst);

		if (found == NULL)
			break;

		c = found[1];

		len = found - (baseStr + fpos);
		NewtStrCat2(dstStr, &baseStr[fpos], len);
		fpos += len;
		fst = fpos + 1;

		if ('0' <= c && c <= '9')
		{
			fpos += 2;
			fst = fpos;

			r = NewtGetArraySlot(paramStrArray, c - '0');

			if (NewtRefIsNotNIL(r))
			{
				NcStrCat(dstStr, r);
			}
		}
		else if (ifthen && c == '?')
		{
			c = found[2];

			if ('0' <= c && c <= '9')
			{
				n = c - '0';

				truePos = fpos + 3;
				found = memchr(&baseStr[truePos], '|', baseStrLen - truePos);

				if (found != NULL)
				{
					falsePos = found + 1 - baseStr;
					trueLen = falsePos - truePos - 1;

					found = memchr(&baseStr[falsePos], '|', baseStrLen - falsePos);

					if (found != NULL)
					{
						fpos = found + 1 - baseStr;
					}
					else
					{
						fpos = baseStrLen;
					}

					falseLen = fpos - falsePos - 1;
				}
				else
				{
					trueLen = baseStrLen - truePos;

					falsePos = baseStrLen;
					falseLen = 0;

					fpos = baseStrLen;
				}

				fst = fpos;

				r = NewtGetArraySlot(paramStrArray, n);

				if (NewtRefIsNotNIL(r))
				{
					r = NewtParamStr(&baseStr[truePos], trueLen, paramStrArray, false);
					NcStrCat(dstStr, r);
				}
				else
				{
					if (falsePos == baseStrLen)
						break;

					r = NewtParamStr(&baseStr[falsePos], falseLen, paramStrArray, false);
					NcStrCat(dstStr, r);
				}
			}
		}
	} while(true);

	len = baseStrLen - fpos;

	if (0 < len)
	{
		NewtStrCat2(dstStr, &baseStr[fpos], len);
	}

	return dstStr;
}