@@ -204,6 +204,44 @@ static void extract_first_arg(LPWSTR command_line, LPWSTR exepath, LPWSTR buf)
204
204
LocalFree (wargv );
205
205
}
206
206
207
+ static LPWSTR expand_variables (LPWSTR buf , size_t alloc )
208
+ {
209
+ size_t len = wcslen (buf );
210
+
211
+ for (;;) {
212
+ LPWSTR atat = wcsstr (buf , L"@@" ), atat2 ;
213
+ WCHAR save ;
214
+ int env_len , delta ;
215
+
216
+ if (!atat )
217
+ break ;
218
+
219
+ atat2 = wcsstr (atat + 2 , L"@@" );
220
+ if (!atat2 )
221
+ break ;
222
+
223
+ * atat2 = L'\0' ;
224
+ env_len = GetEnvironmentVariable (atat + 2 , NULL , 0 );
225
+ delta = env_len - 1 - (atat2 + 2 - atat );
226
+ if (len + delta >= alloc ) {
227
+ fwprintf (stderr ,
228
+ L"Substituting '%s' results in too "
229
+ L"large a command-line\n" , atat + 2 );
230
+ exit (1 );
231
+ }
232
+ if (delta )
233
+ memmove (atat2 + 2 + delta , atat2 + 2 ,
234
+ sizeof (WCHAR ) * (len + 1
235
+ - (atat2 + 2 - buf )));
236
+ len += delta ;
237
+ save = atat [env_len - 1 ];
238
+ GetEnvironmentVariable (atat + 2 , atat , env_len );
239
+ atat [env_len - 1 ] = save ;
240
+ }
241
+
242
+ return buf ;
243
+ }
244
+
207
245
static int configure_via_resource (LPWSTR basename , LPWSTR exepath , LPWSTR exep ,
208
246
LPWSTR * prefix_args , int * prefix_args_len ,
209
247
int * is_git_command , LPWSTR * working_directory , int * full_path ,
@@ -214,6 +252,7 @@ static int configure_via_resource(LPWSTR basename, LPWSTR exepath, LPWSTR exep,
214
252
215
253
#define BUFSIZE 65536
216
254
static WCHAR buf [BUFSIZE ];
255
+ LPWSTR buf2 = buf ;
217
256
int len ;
218
257
219
258
for (id = 0 ; ; id ++ ) {
@@ -253,48 +292,19 @@ static int configure_via_resource(LPWSTR basename, LPWSTR exepath, LPWSTR exep,
253
292
if (!id )
254
293
SetEnvironmentVariable (L"EXEPATH" , exepath );
255
294
256
- for (;;) {
257
- LPWSTR atat = wcsstr (buf , L"@@" ), atat2 ;
258
- WCHAR save ;
259
- int env_len , delta ;
260
-
261
- if (!atat )
262
- break ;
263
-
264
- atat2 = wcsstr (atat + 2 , L"@@" );
265
- if (!atat2 )
266
- break ;
267
-
268
- * atat2 = L'\0' ;
269
- env_len = GetEnvironmentVariable (atat + 2 , NULL , 0 );
270
- delta = env_len - 1 - (atat2 + 2 - atat );
271
- if (len + delta >= BUFSIZE ) {
272
- fwprintf (stderr ,
273
- L"Substituting '%s' results in too "
274
- L"large a command-line\n" , atat + 2 );
275
- exit (1 );
276
- }
277
- if (delta )
278
- memmove (atat2 + 2 + delta , atat2 + 2 ,
279
- sizeof (WCHAR ) * (len + 1
280
- - (atat2 + 2 - buf )));
281
- len += delta ;
282
- save = atat [env_len - 1 ];
283
- GetEnvironmentVariable (atat + 2 , atat , env_len );
284
- atat [env_len - 1 ] = save ;
285
- }
295
+ buf2 = expand_variables (buf , BUFSIZE );
286
296
287
- extract_first_arg (buf , exepath , exep );
297
+ extract_first_arg (buf2 , exepath , exep );
288
298
289
299
if (_waccess (exep , 0 ) != -1 )
290
300
break ;
291
301
fwprintf (stderr ,
292
302
L"Skipping command-line '%s'\n('%s' not found)\n" ,
293
- buf , exep );
303
+ buf2 , exep );
294
304
}
295
305
296
- * prefix_args = buf ;
297
- * prefix_args_len = wcslen (buf );
306
+ * prefix_args = buf2 ;
307
+ * prefix_args_len = wcslen (buf2 );
298
308
299
309
* is_git_command = 0 ;
300
310
* working_directory = (LPWSTR ) 1 ;
0 commit comments