Skip to content

Commit 3b2dcf7

Browse files
committed
Update: Faster parseStringWithEnv, prepare it for reparse and reduced algorithm complexity
1 parent cbb94a6 commit 3b2dcf7

2 files changed

Lines changed: 23 additions & 34 deletions

File tree

source/redub/buildapi.d

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import redub.package_searching.api;
77

88

99
///vX.X.X
10-
enum RedubVersionOnly = "v1.31.2";
10+
enum RedubVersionOnly = "v1.31.3";
1111
///Redub vX.X.X
1212
enum RedubVersionShort = "Redub "~RedubVersionOnly;
1313
///Redub vX.X.X - Description

source/redub/parsers/environment.d

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)