version 1.663, 2020/11/05 20:50:13 |
version 1.664, 2020/11/05 21:16:20 |
|
|
* Return whether to continue parsing. */ |
* Return whether to continue parsing. */ |
static Boolean |
static Boolean |
ParseVarnameLong( |
ParseVarnameLong( |
const char **pp, |
const char *p, |
char startc, |
char startc, |
GNode *ctxt, |
GNode *ctxt, |
VarEvalFlags eflags, |
VarEvalFlags eflags, |
|
|
|
const char **out_FALSE_pp, |
VarParseResult *out_FALSE_res, |
VarParseResult *out_FALSE_res, |
const char **out_FALSE_val, |
const char **out_FALSE_val, |
void **out_FALSE_freeIt, |
void **out_FALSE_freeIt, |
Line 3715 ParseVarnameLong( |
|
Line 3716 ParseVarnameLong( |
|
Boolean haveModifier; |
Boolean haveModifier; |
Boolean dynamic = FALSE; |
Boolean dynamic = FALSE; |
|
|
const char *const start = *pp; |
const char *const start = p; |
char endc = startc == '(' ? ')' : '}'; |
char endc = startc == '(' ? ')' : '}'; |
|
|
const char *p = start + 2; |
p += 2; /* skip "${" or "$(" or "y(" */ |
varname = ParseVarname(&p, startc, endc, ctxt, eflags, &namelen); |
varname = ParseVarname(&p, startc, endc, ctxt, eflags, &namelen); |
|
|
if (*p == ':') { |
if (*p == ':') { |
Line 3727 ParseVarnameLong( |
|
Line 3728 ParseVarnameLong( |
|
haveModifier = FALSE; |
haveModifier = FALSE; |
} else { |
} else { |
Parse_Error(PARSE_FATAL, "Unclosed variable \"%s\"", varname); |
Parse_Error(PARSE_FATAL, "Unclosed variable \"%s\"", varname); |
*pp = p; |
|
free(varname); |
free(varname); |
|
*out_FALSE_pp = p; |
*out_FALSE_val = var_Error; |
*out_FALSE_val = var_Error; |
*out_FALSE_res = VPR_PARSE_MSG; |
*out_FALSE_res = VPR_PARSE_MSG; |
return FALSE; |
return FALSE; |
Line 3750 ParseVarnameLong( |
|
Line 3751 ParseVarnameLong( |
|
|
|
if (!haveModifier) { |
if (!haveModifier) { |
p++; /* skip endc */ |
p++; /* skip endc */ |
*pp = p; |
*out_FALSE_pp = p; |
*out_FALSE_res = EvalUndefined(dynamic, start, p, varname, eflags, |
*out_FALSE_res = EvalUndefined(dynamic, start, p, varname, eflags, |
out_FALSE_freeIt, out_FALSE_val); |
out_FALSE_freeIt, out_FALSE_val); |
return FALSE; |
return FALSE; |
|
|
Var_Parse(const char **pp, GNode *ctxt, VarEvalFlags eflags, |
Var_Parse(const char **pp, GNode *ctxt, VarEvalFlags eflags, |
const char **out_val, void **out_val_freeIt) |
const char **out_val, void **out_val_freeIt) |
{ |
{ |
const char *const start = *pp; |
const char *p = *pp; |
const char *p; |
const char *const start = p; |
Boolean haveModifier; /* TRUE if have modifiers for the variable */ |
Boolean haveModifier; /* TRUE if have modifiers for the variable */ |
char startc; /* Starting character if variable in parens |
char startc; /* Starting character if variable in parens |
* or braces */ |
* or braces */ |
Line 3857 Var_Parse(const char **pp, GNode *ctxt, |
|
Line 3858 Var_Parse(const char **pp, GNode *ctxt, |
|
* initialized. */ |
* initialized. */ |
endc = '\0'; |
endc = '\0'; |
|
|
startc = start[1]; |
startc = p[1]; |
if (startc != '(' && startc != '{') { |
if (startc != '(' && startc != '{') { |
VarParseResult res; |
VarParseResult res; |
if (!ParseVarnameShort(startc, pp, ctxt, eflags, &res, out_val, &v)) |
if (!ParseVarnameShort(startc, pp, ctxt, eflags, &res, out_val, &v)) |
return res; |
return res; |
haveModifier = FALSE; |
haveModifier = FALSE; |
p = start + 1; |
p++; |
} else { |
} else { |
VarParseResult res; |
VarParseResult res; |
if (!ParseVarnameLong(pp, startc, ctxt, eflags, |
if (!ParseVarnameLong(p, startc, ctxt, eflags, |
&res, out_val, out_val_freeIt, |
pp, &res, out_val, out_val_freeIt, |
&endc, &p, &v, &haveModifier, &extramodifiers, |
&endc, &p, &v, &haveModifier, &extramodifiers, |
&dynamic, &exprFlags)) |
&dynamic, &exprFlags)) |
return res; |
return res; |