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}; } }
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}; } }