From 4d3b95dc243f2a8ef4ffb9c534bccd1abd07d1d6 Mon Sep 17 00:00:00 2001 From: CaS Date: Fri, 18 Feb 2005 08:15:34 +0000 Subject: [PATCH] Fix environment setting on NSTask git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@20743 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 4 ++++ Source/NSTask.m | 40 +++++++++++++++++++++++++++++----------- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index d2db15042..74b6b7b92 100644 --- a/ChangeLog +++ b/ChangeLog @@ -12,6 +12,10 @@ So ... you can now either revert to 8bit charset filesystem support, or download a more recent version of the mingw runtime from the mingw site. + * Source/NSTask.m: Fix setting environment for mingw ... use own + method to get environment rather than examining instance variable, + as the variable may not be set. Sort variables because windows needs + them in alphabetical order. Fix conversion to unicode. 2005-02-16 14:40 Richard Frith-Macdonald diff --git a/Source/NSTask.m b/Source/NSTask.m index 45cf893de..ca46a29d0 100644 --- a/Source/NSTask.m +++ b/Source/NSTask.m @@ -1073,7 +1073,8 @@ quotedFromString(NSString *aString) wchar_t *w_args; int result; const wchar_t *wexecutable; - const LPVOID envp = 0; + LPVOID envp = 0; + NSDictionary *env; if (_hasLaunched) { @@ -1097,25 +1098,42 @@ quotedFromString(NSString *aString) sizeof(wchar_t) * ([args length] + 1)); [args getCharacters: (unichar*)w_args]; - if ([_environment count] > 0) + env = [self environment]; + if ([env count] > 0) { NSMutableData *data = [NSMutableData dataWithCapacity: 10240]; NSEnumerator *enumerator; NSString *key; - unichar terminator= (unichar)'\0'; - unichar separator = (unichar)'='; + unichar terminator = 0; CREATE_AUTORELEASE_POOL(pool); - enumerator = [_environment keyEnumerator]; + // Win32 environment variables must be sorted by name + enumerator = [[[env allKeys] + sortedArrayUsingSelector: @selector(compare:)] objectEnumerator]; while ((key = [enumerator nextObject])) { - NSString *value; + NSString *value = [env objectForKey:key]; + NSString *setting; + unsigned l; + NSRange r = NSMakeRange(0,0); + unichar buffer[1024]; - [data appendData: [key dataUsingEncoding: NSUnicodeStringEncoding]]; - [data appendBytes: &separator length: 2]; - value = [_environment objectForKey: key]; - [data appendData: [value dataUsingEncoding: NSUnicodeStringEncoding]]; - [data appendBytes: &terminator length: 2]; // end key-value pair + setting = [NSString stringWithFormat: @"%@=%@", key, value]; + l = [setting length]; + while (r.location < l) + { + r.length = l - r.location; + if (r.length > 1024) + { + r.length = 1024; + } + + [setting getCharacters: buffer range: r]; + [data appendBytes: buffer length: (r.length)*sizeof(unichar)]; + + r.location += r.length; + } + [data appendBytes: &terminator length: 2]; // end of setting } [data appendBytes: &terminator length: 2]; // end of environment RELEASE(pool);