mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			307 lines
		
	
	
	
		
			9.4 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
			
		
		
	
	
			307 lines
		
	
	
	
		
			9.4 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
| //
 | |
| //  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
 | 
