Ejemplo n.º 1
0
static StringParseResult ParseVarRef(const char *expr, int start, int end)
{
    if (start + 1 < end && (expr[start] == '$' || expr[start] == '@'))
    {
        if (expr[start + 1] == '(' || expr[start + 1] == '{')
        {
            char closing_bracket = expr[start + 1] == '(' ? ')' : '}';
            StringParseResult res = ParseQname(expr, start + 2, end);

            if (res.result)
            {
                if (res.position < end && expr[res.position] == closing_bracket)
                {
                    StringExpression *ret = xcalloc(1, sizeof(StringExpression));

                    ret->op = VARREF;
                    ret->val.varref.name = res.result;

                    if (expr[start] == '$')
                    {
                        ret->val.varref.type = VAR_REF_TYPE_SCALAR;
                    }
                    else if (expr[start] == '@')
                    {
                        ret->val.varref.type = VAR_REF_TYPE_LIST;
                    }
                    else
                    {
                        ProgrammingError("Unrecognized var ref type");
                    }

                    return (StringParseResult) {ret, res.position + 1};
                }
                else
                {
                    FreeStringExpression(res.result);
                    return (StringParseResult) {NULL, res.position};
                }
            }
            else
            {
                return res;
            }
        }
        else
        {
            return (StringParseResult) {NULL, start + 1};
        }
    }
    else
    {
        return (StringParseResult) {NULL, start};
    }
}
Ejemplo n.º 2
0
static StringParseResult ParseVarRef(const char *expr, int start, int end)
{
    if (start + 1 < end && expr[start] == '$')
    {
        if (expr[start + 1] == '(' || expr[start + 1] == '{')
        {
            char closing_bracket = expr[start + 1] == '(' ? ')' : '}';
            StringParseResult res = ParseQname(expr, start + 2, end);

            if (res.result)
            {
                if (res.position < end && expr[res.position] == closing_bracket)
                {
                    StringExpression *ret = xcalloc(1, sizeof(StringExpression));

                    ret->op = VARREF;
                    ret->val.varref.name = res.result;

                    return (StringParseResult) {ret, res.position + 1};
                }
                else
                {
                    FreeStringExpression(res.result);
                    return (StringParseResult) {NULL, res.position};
                }
            }
            else
            {
                return res;
            }
        }
        else
        {
            return (StringParseResult) {NULL, start + 1};
        }
    }
    else
    {
        return (StringParseResult) {NULL, start};
    }
}