summaryrefslogtreecommitdiffstats
path: root/usr.bin/make/var.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/make/var.c')
-rw-r--r--usr.bin/make/var.c86
1 files changed, 49 insertions, 37 deletions
diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c
index c0a5898..fb43bf0 100644
--- a/usr.bin/make/var.c
+++ b/usr.bin/make/var.c
@@ -1085,9 +1085,6 @@ VarParseLong(char foo[], GNode *ctxt, Boolean err, size_t *lengthPtr,
Buf_Destroy(buf, TRUE);
- rw_str = VarExpand(v, ctxt, err);
- *freePtr = TRUE;
-
/*
* Now we need to apply any modifiers the user wants applied.
* These are:
@@ -1114,6 +1111,9 @@ VarParseLong(char foo[], GNode *ctxt, Boolean err, size_t *lengthPtr,
if (haveModifier) {
char *cp;
+ rw_str = VarExpand(v, ctxt, err);
+ *freePtr = TRUE;
+
tstr++;
while (*tstr != endc) {
char *newStr; /* New value to return */
@@ -1633,49 +1633,61 @@ VarParseLong(char foo[], GNode *ctxt, Boolean err, size_t *lengthPtr,
}
tstr = cp;
}
- }
- if (v->flags & VAR_FROM_ENV) {
- if (rw_str == (char *)Buf_GetAll(v->val, (size_t *)NULL)) {
+ if (v->flags & VAR_FROM_ENV) {
+ if (rw_str == (char *)Buf_GetAll(v->val, (size_t *)NULL)) {
+ /*
+ * Returning the value unmodified, so tell the caller to free
+ * the thing.
+ */
+ *freePtr = TRUE;
+ *lengthPtr = tstr - input + 1;
+ VarDestroy(v, FALSE);
+ return (rw_str);
+ } else {
+ *lengthPtr = tstr - input + 1;
+ VarDestroy(v, TRUE);
+ return (rw_str);
+ }
+ } else if (v->flags & VAR_JUNK) {
/*
- * Returning the value unmodified, so tell the caller to free
- * the thing.
+ * Perform any free'ing needed and set *freePtr to FALSE so the caller
+ * doesn't try to free a static pointer.
*/
- *freePtr = TRUE;
- *lengthPtr = tstr - input + 1;
- VarDestroy(v, FALSE);
- return (rw_str);
+ if (*freePtr) {
+ free(rw_str);
+ }
+ if (dynamic) {
+ *freePtr = FALSE;
+ *lengthPtr = tstr - input + 1;
+ VarDestroy(v, TRUE);
+ rw_str = emalloc(*lengthPtr + 1);
+ strncpy(rw_str, input, *lengthPtr);
+ rw_str[*lengthPtr] = '\0';
+ *freePtr = TRUE;
+ return (rw_str);
+ } else {
+ *freePtr = FALSE;
+ *lengthPtr = tstr - input + 1;
+ VarDestroy(v, TRUE);
+ return (err ? var_Error : varNoError);
+ }
} else {
*lengthPtr = tstr - input + 1;
- VarDestroy(v, TRUE);
return (rw_str);
}
- } else if (v->flags & VAR_JUNK) {
- /*
- * Perform any free'ing needed and set *freePtr to FALSE so the caller
- * doesn't try to free a static pointer.
- */
- if (*freePtr) {
- free(rw_str);
- }
- if (dynamic) {
- *freePtr = FALSE;
- *lengthPtr = tstr - input + 1;
- VarDestroy(v, TRUE);
- rw_str = emalloc(*lengthPtr + 1);
- strncpy(rw_str, input, *lengthPtr);
- rw_str[*lengthPtr] = '\0';
+ } else {
+ char *result;
+
+ result = VarExpand(v, ctxt, err);
+
+ if (v->flags & VAR_FROM_ENV) {
+ VarDestroy(v, TRUE);
+ }
+
*freePtr = TRUE;
- return (rw_str);
- } else {
- *freePtr = FALSE;
*lengthPtr = tstr - input + 1;
- VarDestroy(v, TRUE);
- return (err ? var_Error : varNoError);
- }
- } else {
- *lengthPtr = tstr - input + 1;
- return (rw_str);
+ return (result);
}
}
OpenPOWER on IntegriCloud