mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	This changeset fixes a number of compiler warnings in the Python Launcher binary for OSX. It also cleans up whitespace usage in those sources.
		
			
				
	
	
		
			307 lines
		
	
	
	
		
			9.4 KiB
		
	
	
	
		
			Objective-C
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			307 lines
		
	
	
	
		
			9.4 KiB
		
	
	
	
		
			Objective-C
		
	
	
		
			Executable file
		
	
	
	
	
//
 | 
						|
//  FileSettings.m
 | 
						|
//  PythonLauncher
 | 
						|
//
 | 
						|
//  Created by Jack Jansen on Sun Jul 21 2002.
 | 
						|
//  Copyright (c) 2002 __MyCompanyName__. All rights reserved.
 | 
						|
//
 | 
						|
 | 
						|
#import "FileSettings.h"
 | 
						|
 | 
						|
@implementation FileSettings
 | 
						|
 | 
						|
+ (id)getFactorySettingsForFileType: (NSString *)filetype
 | 
						|
{
 | 
						|
    static FileSettings *fsdefault_py, *fsdefault_pyw, *fsdefault_pyc;
 | 
						|
    FileSettings **curdefault;
 | 
						|
 | 
						|
    if ([filetype isEqualToString: @"Python Script"]) {
 | 
						|
        curdefault = &fsdefault_py;
 | 
						|
    } else if ([filetype isEqualToString: @"Python GUI Script"]) {
 | 
						|
        curdefault = &fsdefault_pyw;
 | 
						|
    } else if ([filetype isEqualToString: @"Python Bytecode Document"]) {
 | 
						|
        curdefault = &fsdefault_pyc;
 | 
						|
    } else {
 | 
						|
        NSLog(@"Funny File Type: %@\n", filetype);
 | 
						|
        curdefault = &fsdefault_py;
 | 
						|
        filetype = @"Python Script";
 | 
						|
    }
 | 
						|
    if (!*curdefault) {
 | 
						|
        *curdefault = [[FileSettings new] initForFSDefaultFileType: filetype];
 | 
						|
    }
 | 
						|
    return *curdefault;
 | 
						|
}
 | 
						|
 | 
						|
+ (id)getDefaultsForFileType: (NSString *)filetype
 | 
						|
{
 | 
						|
    static FileSettings *default_py, *default_pyw, *default_pyc;
 | 
						|
    FileSettings **curdefault;
 | 
						|
 | 
						|
    if ([filetype isEqualToString: @"Python Script"]) {
 | 
						|
        curdefault = &default_py;
 | 
						|
    } else if ([filetype isEqualToString: @"Python GUI Script"]) {
 | 
						|
        curdefault = &default_pyw;
 | 
						|
    } else if ([filetype isEqualToString: @"Python Bytecode Document"]) {
 | 
						|
        curdefault = &default_pyc;
 | 
						|
    } else {
 | 
						|
        NSLog(@"Funny File Type: %@\n", filetype);
 | 
						|
        curdefault = &default_py;
 | 
						|
        filetype = @"Python Script";
 | 
						|
    }
 | 
						|
    if (!*curdefault) {
 | 
						|
        *curdefault = [[FileSettings new] initForDefaultFileType: filetype];
 | 
						|
    }
 | 
						|
    return *curdefault;
 | 
						|
}
 | 
						|
 | 
						|
+ (id)newSettingsForFileType: (NSString *)filetype
 | 
						|
{
 | 
						|
    FileSettings *cur;
 | 
						|
 | 
						|
    cur = [FileSettings new];
 | 
						|
    [cur initForFileType: filetype];
 | 
						|
    return [cur retain];
 | 
						|
}
 | 
						|
 | 
						|
- (id)initWithFileSettings: (FileSettings *)source
 | 
						|
{
 | 
						|
    self = [super init];
 | 
						|
    if (!self) return self;
 | 
						|
 | 
						|
    interpreter = [source->interpreter retain];
 | 
						|
    honourhashbang = source->honourhashbang;
 | 
						|
    debug = source->debug;
 | 
						|
    verbose = source->verbose;
 | 
						|
    inspect = source->inspect;
 | 
						|
    optimize = source->optimize;
 | 
						|
    nosite = source->nosite;
 | 
						|
    tabs = source->tabs;
 | 
						|
    others = [source->others retain];
 | 
						|
    scriptargs = [source->scriptargs retain];
 | 
						|
    with_terminal = source->with_terminal;
 | 
						|
    prefskey = source->prefskey;
 | 
						|
    if (prefskey) [prefskey retain];
 | 
						|
 | 
						|
    return self;
 | 
						|
}
 | 
						|
 | 
						|
- (id)initForFileType: (NSString *)filetype
 | 
						|
{
 | 
						|
    FileSettings *defaults;
 | 
						|
 | 
						|
    defaults = [FileSettings getDefaultsForFileType: filetype];
 | 
						|
    self = [self initWithFileSettings: defaults];
 | 
						|
    origsource = [defaults retain];
 | 
						|
    return self;
 | 
						|
}
 | 
						|
 | 
						|
- (id)initForFSDefaultFileType: (NSString *)filetype
 | 
						|
{
 | 
						|
    int i;
 | 
						|
    NSString *filename;
 | 
						|
    NSDictionary *dict;
 | 
						|
    static NSDictionary *factorySettings;
 | 
						|
 | 
						|
    self = [super init];
 | 
						|
    if (!self) return self;
 | 
						|
 | 
						|
    if (factorySettings == NULL) {
 | 
						|
        NSBundle *bdl = [NSBundle mainBundle];
 | 
						|
        NSString *path = [ bdl pathForResource: @"factorySettings"
 | 
						|
                ofType: @"plist"];
 | 
						|
        factorySettings = [[NSDictionary dictionaryWithContentsOfFile:
 | 
						|
            path] retain];
 | 
						|
        if (factorySettings == NULL) {
 | 
						|
            NSLog(@"Missing %@", path);
 | 
						|
            return NULL;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    dict = [factorySettings objectForKey: filetype];
 | 
						|
    if (dict == NULL) {
 | 
						|
        NSLog(@"factorySettings.plist misses file type \"%@\"", filetype);
 | 
						|
        interpreter = [@"no default found" retain];
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
    [self applyValuesFromDict: dict];
 | 
						|
    interpreters = [dict objectForKey: @"interpreter_list"];
 | 
						|
    interpreter = NULL;
 | 
						|
    for (i=0; i < [interpreters count]; i++) {
 | 
						|
        filename = [interpreters objectAtIndex: i];
 | 
						|
        filename = [filename stringByExpandingTildeInPath];
 | 
						|
        if ([[NSFileManager defaultManager] fileExistsAtPath: filename]) {
 | 
						|
            interpreter = [filename retain];
 | 
						|
            break;
 | 
						|
        }
 | 
						|
    }
 | 
						|
    if (interpreter == NULL)
 | 
						|
        interpreter = [@"no default found" retain];
 | 
						|
    origsource = NULL;
 | 
						|
    return self;
 | 
						|
}
 | 
						|
 | 
						|
- (void)applyUserDefaults: (NSString *)filetype
 | 
						|
{
 | 
						|
    NSUserDefaults *defaults;
 | 
						|
    NSDictionary *dict;
 | 
						|
 | 
						|
    defaults = [NSUserDefaults standardUserDefaults];
 | 
						|
    dict = [defaults dictionaryForKey: filetype];
 | 
						|
    if (!dict)
 | 
						|
        return;
 | 
						|
    [self applyValuesFromDict: dict];
 | 
						|
}
 | 
						|
 | 
						|
- (id)initForDefaultFileType: (NSString *)filetype
 | 
						|
{
 | 
						|
    FileSettings *fsdefaults;
 | 
						|
 | 
						|
    fsdefaults = [FileSettings getFactorySettingsForFileType: filetype];
 | 
						|
    self = [self initWithFileSettings: fsdefaults];
 | 
						|
    if (!self) return self;
 | 
						|
    interpreters = [fsdefaults->interpreters retain];
 | 
						|
    scriptargs = [@"" retain];
 | 
						|
    [self applyUserDefaults: filetype];
 | 
						|
    prefskey = [filetype retain];
 | 
						|
    return self;
 | 
						|
}
 | 
						|
 | 
						|
- (void)reset
 | 
						|
{
 | 
						|
    if (origsource) {
 | 
						|
        [self updateFromSource: origsource];
 | 
						|
    } else {
 | 
						|
        FileSettings *fsdefaults;
 | 
						|
        fsdefaults = [FileSettings getFactorySettingsForFileType: prefskey];
 | 
						|
        [self updateFromSource: fsdefaults];
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
- (void)updateFromSource: (id <FileSettingsSource>)source
 | 
						|
{
 | 
						|
    interpreter = [[source interpreter] retain];
 | 
						|
    honourhashbang = [source honourhashbang];
 | 
						|
    debug = [source debug];
 | 
						|
    verbose = [source verbose];
 | 
						|
    inspect = [source inspect];
 | 
						|
    optimize = [source optimize];
 | 
						|
    nosite = [source nosite];
 | 
						|
    tabs = [source tabs];
 | 
						|
    others = [[source others] retain];
 | 
						|
    scriptargs = [[source scriptargs] retain];
 | 
						|
    with_terminal = [source with_terminal];
 | 
						|
    // And if this is a user defaults object we also save the
 | 
						|
    // values
 | 
						|
    if (!origsource) {
 | 
						|
        NSUserDefaults *defaults;
 | 
						|
        NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
 | 
						|
            interpreter, @"interpreter",
 | 
						|
            [NSNumber numberWithBool: honourhashbang], @"honourhashbang",
 | 
						|
            [NSNumber numberWithBool: debug], @"debug",
 | 
						|
            [NSNumber numberWithBool: verbose], @"verbose",
 | 
						|
            [NSNumber numberWithBool: inspect], @"inspect",
 | 
						|
            [NSNumber numberWithBool: optimize], @"optimize",
 | 
						|
            [NSNumber numberWithBool: nosite], @"nosite",
 | 
						|
            [NSNumber numberWithBool: tabs], @"tabs",
 | 
						|
            others, @"others",
 | 
						|
            scriptargs, @"scriptargs",
 | 
						|
            [NSNumber numberWithBool: with_terminal], @"with_terminal",
 | 
						|
            nil];
 | 
						|
        defaults = [NSUserDefaults standardUserDefaults];
 | 
						|
        [defaults setObject: dict forKey: prefskey];
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
- (void)applyValuesFromDict: (NSDictionary *)dict
 | 
						|
{
 | 
						|
    id value;
 | 
						|
 | 
						|
    value = [dict objectForKey: @"interpreter"];
 | 
						|
    if (value) interpreter = [value retain];
 | 
						|
    value = [dict objectForKey: @"honourhashbang"];
 | 
						|
    if (value) honourhashbang = [value boolValue];
 | 
						|
    value = [dict objectForKey: @"debug"];
 | 
						|
    if (value) debug = [value boolValue];
 | 
						|
    value = [dict objectForKey: @"verbose"];
 | 
						|
    if (value) verbose = [value boolValue];
 | 
						|
    value = [dict objectForKey: @"inspect"];
 | 
						|
    if (value) inspect = [value boolValue];
 | 
						|
    value = [dict objectForKey: @"optimize"];
 | 
						|
    if (value) optimize = [value boolValue];
 | 
						|
    value = [dict objectForKey: @"nosite"];
 | 
						|
    if (value) nosite = [value boolValue];
 | 
						|
    value = [dict objectForKey: @"tabs"];
 | 
						|
    if (value) tabs = [value boolValue];
 | 
						|
    value = [dict objectForKey: @"others"];
 | 
						|
    if (value) others = [value retain];
 | 
						|
    value = [dict objectForKey: @"scriptargs"];
 | 
						|
    if (value) scriptargs = [value retain];
 | 
						|
    value = [dict objectForKey: @"with_terminal"];
 | 
						|
    if (value) with_terminal = [value boolValue];
 | 
						|
}
 | 
						|
 | 
						|
- (NSString*)_replaceSingleQuotes: (NSString*)string
 | 
						|
{
 | 
						|
    /* Replace all single-quotes by '"'"', that way shellquoting will
 | 
						|
     * be correct when the result value is delimited  using single quotes.
 | 
						|
     */
 | 
						|
    NSArray* components = [string componentsSeparatedByString:@"'"];
 | 
						|
 | 
						|
    return [components componentsJoinedByString:@"'\"'\"'"];
 | 
						|
}
 | 
						|
 | 
						|
- (NSString *)commandLineForScript: (NSString *)script
 | 
						|
{
 | 
						|
    NSString *cur_interp = NULL;
 | 
						|
    NSString* script_dir = NULL;
 | 
						|
    char hashbangbuf[1024];
 | 
						|
    FILE *fp;
 | 
						|
    char *p;
 | 
						|
 | 
						|
    script_dir = [script substringToIndex:
 | 
						|
	    [script length]-[[script lastPathComponent] length]];
 | 
						|
 | 
						|
    if (honourhashbang &&
 | 
						|
       (fp=fopen([script fileSystemRepresentation], "r")) &&
 | 
						|
       fgets(hashbangbuf, sizeof(hashbangbuf), fp) &&
 | 
						|
       strncmp(hashbangbuf, "#!", 2) == 0 &&
 | 
						|
       (p=strchr(hashbangbuf, '\n'))) {
 | 
						|
            *p = '\0';
 | 
						|
            p = hashbangbuf + 2;
 | 
						|
            while (*p == ' ') p++;
 | 
						|
            cur_interp = [NSString stringWithUTF8String: p];
 | 
						|
    }
 | 
						|
    if (!cur_interp)
 | 
						|
        cur_interp = interpreter;
 | 
						|
 | 
						|
    return [NSString stringWithFormat:
 | 
						|
        @"cd '%@' && '%@'%s%s%s%s%s%s %@ '%@' %@ %s",
 | 
						|
    	[self _replaceSingleQuotes:script_dir],
 | 
						|
        [self _replaceSingleQuotes:cur_interp],
 | 
						|
        debug?" -d":"",
 | 
						|
        verbose?" -v":"",
 | 
						|
        inspect?" -i":"",
 | 
						|
        optimize?" -O":"",
 | 
						|
        nosite?" -S":"",
 | 
						|
        tabs?" -t":"",
 | 
						|
        others,
 | 
						|
        [self _replaceSingleQuotes:script],
 | 
						|
        scriptargs ? scriptargs : @"",
 | 
						|
        with_terminal? "&& echo Exit status: $? && exit 1" : " &"];
 | 
						|
}
 | 
						|
 | 
						|
- (NSArray *) interpreters { return interpreters;};
 | 
						|
 | 
						|
// FileSettingsSource protocol
 | 
						|
- (NSString *) interpreter { return interpreter;};
 | 
						|
- (BOOL) honourhashbang { return honourhashbang; };
 | 
						|
- (BOOL) debug { return debug;};
 | 
						|
- (BOOL) verbose { return verbose;};
 | 
						|
- (BOOL) inspect { return inspect;};
 | 
						|
- (BOOL) optimize { return optimize;};
 | 
						|
- (BOOL) nosite { return nosite;};
 | 
						|
- (BOOL) tabs { return tabs;};
 | 
						|
- (NSString *) others { return others;};
 | 
						|
- (NSString *) scriptargs { return scriptargs;};
 | 
						|
- (BOOL) with_terminal { return with_terminal;};
 | 
						|
 | 
						|
@end
 |