@@ -238,56 +238,50 @@ string parseStringWithEnvironment(string str)
238238 struct VarPos
239239 {
240240 size_t start, end;
241+ string envValue;
241242 }
242243 VarPos[] variables;
243244 ptrdiff_t diffLength;
244245 for (int i = 0 ; i < str.length; i++ )
245246 {
246247 if (str[i] == ' $' )
247248 {
248- if (i + 1 < str.length && str[i+ 1 ] == ' {' )
249+ ptrdiff_t end = i;
250+ string envValue;
251+ if (i + 1 < str.length && str[i+ 1 ] == ' $' )
249252 {
250- int end = cast (int )indexOf(str, ' }' , i);
251- enforce(++ end != 0 , " Could not find matching brackets at " ~ str);
252- variables~= VarPos (i, end);
253- i = end;
253+ end = i+ 2 ;
254+ envValue = " $" ;
255+ }
256+ else if (i + 1 < str.length && str[i+ 1 ] == ' {' )
257+ {
258+ end = cast (int )indexOf(str, ' }' , i);
259+ enforce(++ end != 0 , " Could not find matching brackets at " ~ str); // Advance the }
260+ envValue = getEnvVariable(str[i+ 2 .. end- 1 ]);
254261 }
255262 else
256263 {
257- size_t start = i+ 1 ;
258- size_t end = start;
264+ end = i+ 1 ;
259265 while (end < str.length && (str[end].isAlphaNum || str[end] == ' _' )) end++ ;
260- variables~= VarPos (i, end);
261- i = cast (int )end;
266+ if (end == i+ 1 )
267+ continue ;
268+ envValue = getEnvVariable(str[i+ 1 .. end]);
262269 }
270+ if (envValue.length)
271+ variables ~= VarPos(i, end, envValue);
272+ i = cast (int )end - 1 ;
263273 }
264274 }
265275 if (variables.length == 0 )
266276 return str;
267277
268278 char [] ret;
269- // /Count the difference length between input string and output string and remove inexisntet variables.
279+ // /Count the difference length between input string and output string
270280 for (int i = 0 ; i < variables.length; i++ )
271281 {
272282 VarPos v = variables[i];
273- bool useBrackets = v.end > 0 && str[v.end - 1 ] == ' }' ;
274- int bracketOffset = useBrackets ? 1 : 0 ;
275- string strVar = str[v.start+ 1 + bracketOffset.. v.end - bracketOffset];
276- diffLength-= 1 + strVar.length + bracketOffset* 2 ; // $.length + (abcd).length {}.length (optionally)
277-
278-
279- if (strVar.length == 0 ) // $
280- continue ;
281- string envValue = getEnvVariable(strVar);
282- if (! envValue.length)
283- {
284- variables = variables[0 .. i] ~ variables[i+ 1 .. $];
285- i-- ;
286- continue ;
287- }
288- diffLength+= envValue.length;
283+ diffLength = diffLength - (v.end - v.start) + v.envValue.length;
289284 }
290- if (variables.length == 0 ) return str;
291285
292286 ret = new char [](str.length+ diffLength);
293287 size_t outStart;
@@ -302,17 +296,12 @@ string parseStringWithEnvironment(string str)
302296 // /Starts appending text or variable depending on the variable positions
303297 foreach (v; variables)
304298 {
305- // Remove the $ {} optionally
306- int bracketOffset = v.end > 0 && str[v.end - 1 ] == ' }' ;
307- string envVar = str[v.start+ 1 + bracketOffset.. v.end - bracketOffset];
308-
309299 // /Copy text up to the variable
310300 string leftText = str[srcStart.. v.start];
311301 appendToRet(leftText);
312302
313303 // /Insert the variable value
314- if (envVar.length)
315- appendToRet(getEnvVariable(envVar));
304+ appendToRet(v.envValue);
316305
317306 // /Move the start pointer past the variable
318307 srcStart = v.end;
0 commit comments