Changeset 54211


Ignore:
Timestamp:
Jul 23, 2009, 3:33:44 AM (10 years ago)
Author:
toby@…
Message:

Merge the MPParser object into MPPort, there's no need for the distinction.

Location:
users/toby/objcports
Files:
2 deleted
3 edited

Legend:

Unmodified
Added
Removed
  • users/toby/objcports/MPPort.h

    r49547 r54211  
    44{
    55        NSURL *_url;
    6         MPParser *_parser;
    76
    87        NSMutableDictionary *_variableInfo;
     
    1110        NSMutableArray *_platforms;
    1211        NSMutableDictionary *_variants;
     12
     13        Tcl_Interp *_interp;
    1314}
    1415
    15 - (id)initWithURL:(NSURL *)url options:(NSDictionary *)options;
    1616- (id)initWithPath:(NSString *)url options:(NSDictionary *)options;
    17 
    18 - (NSString *)portfile;
    19 
    20 - (NSArray *)targets;
    21 - (BOOL)isTarget:(NSString *)target;
    22 
    23 - (NSArray *)variables;
    2417- (NSString *)variable:(NSString *)name;
    25 
    26 - (NSArray *)settableVariables;
    27 - (void)variable:(NSString *)var set:(NSArray *)value;
    28 
    29 - (NSArray *)settableArrayVariables;
    30 - (void)variable:(NSString *)var append:(NSArray *)value;
    31 - (void)variable:(NSString *)var delete:(NSArray *)value;
    32 
     18- (NSArray *)definedVariants;
    3319- (NSArray *)definedPlatforms;
    34 - (BOOL)testAndRecordPlatform:(NSArray *)platform;
    35 
    36 - (NSArray *)definedVariants;
    37 - (BOOL)testAndRecordVariant:(NSString *)variant withProperties:(NSDictionary *)props;
    3820
    3921@end
  • users/toby/objcports/MPPort.m

    r51252 r54211  
    44
    55#include "MPPort.h"
    6 #include "MPParser.h"
     6#include "MPArrayAdditions.h"
    77
    88static NSString *kPortVariableType = @"Type";
    99static NSString *kPortVariableConstant = @"Constant";
     10
     11static void command_create(Tcl_Interp *interp, const char *cmdName, ClientData clientData);
     12static char *variable_read(ClientData clientData, Tcl_Interp *interp, const char *name1, const char *name2, int flags);
     13static int _nslog(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);
     14static int _fake_boolean(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);
     15
     16@interface MPPort (private)
     17- (NSString *)portfile;
     18- (NSArray *)targets;
     19- (NSArray *)variables;
     20- (NSArray *)settableVariables;
     21- (NSArray *)settableArrayVariables;
     22@end
    1023
    1124@implementation MPPort
     
    5467        }
    5568
    56         _parser = [[MPParser alloc] initWithPort:self];
    57 
     69        _interp = Tcl_CreateInterp();
     70        Tcl_MakeSafe(_interp);
     71        Tcl_UnsetVar(_interp, "tcl_version", 0);
     72        Tcl_UnsetVar(_interp, "tcl_patchLevel", 0);
     73        Tcl_UnsetVar(_interp, "tcl_platform", 0);
     74        Tcl_DeleteCommand(_interp, "tell");
     75        Tcl_DeleteCommand(_interp, "eof");
     76        // XXX: etc?
     77       
     78        @try {
     79                Tcl_Preserve(_interp);
     80               
     81                Tcl_CreateObjCommand(_interp, "nslog", _nslog, NULL, NULL); // XXX: debugging
     82                //Tcl_Eval(_interp, "nslog [info commands]");
     83               
     84                command_create(_interp, "PortSystem", self);
     85                command_create(_interp, "PortGroup", self);
     86                command_create(_interp, "platform", self);
     87                command_create(_interp, "variant", self);
     88               
     89                for (NSString *target in [self targets]) {
     90                        command_create(_interp, [target UTF8String], self);
     91                        command_create(_interp, [[@"pre-" stringByAppendingString:target] UTF8String], self);
     92                        command_create(_interp, [[@"post-" stringByAppendingString:target] UTF8String], self);
     93                }
     94               
     95                for (NSString *opt in [self settableVariables]) {
     96                        command_create(_interp, [opt UTF8String], self);
     97                }
     98                for (NSString *opt in [self settableArrayVariables]) {
     99                        command_create(_interp, [[opt stringByAppendingString:@"-append"] UTF8String], self);
     100                        command_create(_interp, [[opt stringByAppendingString:@"-delete"] UTF8String], self);
     101                }
     102               
     103                for (NSString *var in [self variables]) {
     104                        Tcl_TraceVar(_interp, [var UTF8String], TCL_TRACE_READS, variable_read, self);
     105                }
     106               
     107                // bogus targets
     108                Tcl_CreateObjCommand(_interp, "pre-activate", _nslog, NULL, NULL); // XXX: debugging
     109                Tcl_CreateObjCommand(_interp, "post-activate", _nslog, NULL, NULL); // XXX: debugging
     110                Tcl_CreateObjCommand(_interp, "pre-install", _nslog, NULL, NULL); // XXX: debugging
     111                Tcl_CreateObjCommand(_interp, "post-install", _nslog, NULL, NULL); // XXX: debugging
     112                Tcl_CreateObjCommand(_interp, "post-pkg", _nslog, NULL, NULL); // XXX: debugging
     113                Tcl_CreateObjCommand(_interp, "post-mpkg", _nslog, NULL, NULL); // XXX: debugging
     114                Tcl_CreateObjCommand(_interp, "archive", _nslog, NULL, NULL); // XXX: debugging
     115                Tcl_CreateObjCommand(_interp, "install", _nslog, NULL, NULL); // XXX: debugging
     116                Tcl_CreateObjCommand(_interp, "activate", _nslog, NULL, NULL); // XXX: debugging
     117                Tcl_CreateObjCommand(_interp, "unarchive", _nslog, NULL, NULL); // XXX: debugging
     118                Tcl_CreateObjCommand(_interp, "post-clean", _nslog, NULL, NULL); // XXX: debugging
     119               
     120                // functions we need to provide (?)
     121                Tcl_CreateObjCommand(_interp, "variant_isset", _fake_boolean, NULL, NULL); // XXX: debugging
     122                Tcl_CreateObjCommand(_interp, "variant_set", _fake_boolean, NULL, NULL); // XXX: debugging
     123                Tcl_CreateObjCommand(_interp, "tbool", _fake_boolean, NULL, NULL); // XXX: debugging
     124                Tcl_CreateObjCommand(_interp, "strsed", _nslog, NULL, NULL); // XXX: debugging
     125                Tcl_CreateObjCommand(_interp, "suffix", _nslog, NULL, NULL); // XXX: debugging
     126                Tcl_CreateObjCommand(_interp, "include", _nslog, NULL, NULL); // XXX: debugging
     127               
     128                // variables that should be constant
     129                Tcl_CreateObjCommand(_interp, "prefix", _nslog, NULL, NULL);
     130               
     131                if (Tcl_EvalFile(_interp, [[self portfile] UTF8String]) != TCL_OK) {
     132                        NSLog(@"Tcl_EvalFile(): %s", Tcl_GetStringResult(_interp));
     133                        exit(1);
     134                }
     135               
     136                Tcl_Release(_interp);
     137        }
     138        @catch (NSException *exception) {
     139                NSLog(@"%@: %@", [exception name], [exception reason]);
     140                [self release];
     141                self = nil;
     142        }
     143       
    58144        return self;
    59145}
     
    71157- (void)dealloc
    72158{
    73         [_parser release];
    74159        [_url release];
    75160
     
    79164        [_platforms release];
    80165        [_variants release];
     166
     167        Tcl_DeleteInterp(_interp);
    81168
    82169        [super dealloc];
     
    264351}
    265352
     353- (void)performCommand:(NSString *)command arguments:(NSArray *)args
     354{
     355        if ([command isEqualToString:@"PortSystem"]) {
     356                assert([args count] == 1);
     357                assert([[args objectAtIndex:0] isEqualToString:@"1.0"]);
     358        } else if ([command isEqualToString:@"PortGroup"]) {
     359                NSLog(@"ignoring %@, grps r hard m'kay", command);
     360                // XXX: this should probably set some state in parent port instance
     361                // (ugh, more tcl parsing)
     362        } else if ([command isEqualToString:@"platform"]) {
     363                NSUInteger count = [args count];
     364                NSString *os = nil;
     365                id release = [NSNull null];
     366                id arch = [NSNull null];
     367               
     368                if (count < 2 || count > 4) {
     369                        NSLog(@"bogus platform declaration");
     370                        return;
     371                }
     372               
     373                os = [args objectAtIndex:0];
     374               
     375                if (count == 3) {
     376                        NSInteger rel = [[args objectAtIndex:1] integerValue];
     377                        if (rel != 0) {
     378                                release = [NSNumber numberWithInteger:rel];
     379                        } else {
     380                                arch = [args objectAtIndex:1];
     381                        }
     382                } else if (count == 4) {
     383                        release = [NSNumber numberWithInteger:[[args objectAtIndex:1] integerValue]];
     384                        arch = [args objectAtIndex:2];
     385                }
     386               
     387                if ([self testAndRecordPlatform:[NSArray arrayWithObjects:os, release, arch, nil]]) {
     388                        Tcl_Eval(_interp, [[args lastObject] UTF8String]);
     389                }
     390        } else if ([command isEqualToString:@"variant"]) {
     391                NSUInteger count = [args count];
     392                NSString *name;
     393                NSMutableDictionary *props;
     394                int i;
     395               
     396                // variant name [a b c d] {}
     397                if (count < 2 || count % 2) {
     398                        NSLog(@"bogus variant declaration");
     399                        return;
     400                }
     401               
     402                name = [args objectAtIndex:0];
     403               
     404                // this isn't quite right, conflicts can take multiple "arguments"
     405                props = [NSMutableDictionary dictionaryWithCapacity:count-2];
     406                for (i = 1; i < count - 1; i += 2) {
     407                        [props setObject:[args objectAtIndex:i+1] forKey:[args objectAtIndex:i]];
     408                }
     409               
     410                if ([self testAndRecordVariant:name withProperties:props]) {
     411                        Tcl_Eval(_interp, [[args lastObject] UTF8String]);
     412                }
     413        } else if ([self isTarget:command]) {
     414                // XXX: store for later use...
     415        } else {
     416                if ([command hasSuffix:@"-append"]) {
     417                        [self variable:[command substringWithRange:NSMakeRange(0, [command length] - 7)] append:args];
     418                } else if ([command hasSuffix:@"-delete"]) {
     419                        [self variable:[command substringWithRange:NSMakeRange(0, [command length] - 7)] delete:args];
     420                } else {
     421                        [self variable:command set:args];
     422                }
     423        }
     424}
     425
    266426@end
     427
     428static int
     429command_trampoline(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
     430{
     431        NSArray *args = [[NSArray alloc] initWithTclObjects:objv count:objc];
     432        [(MPPort *)clientData performCommand:[args objectAtIndex:0] arguments:[args subarrayWithRange:NSMakeRange(1, [args count] - 1)]];
     433        [args release];
     434       
     435        return TCL_OK;
     436}
     437
     438static void
     439command_create(Tcl_Interp *interp, const char *cmdName, ClientData clientData)
     440{
     441        Tcl_CmdInfo info;
     442        if (Tcl_GetCommandInfo(interp, cmdName, &info) != 0) {
     443                NSLog(@"Command '%s' already exists, bailing.", cmdName);
     444                abort();
     445        }
     446        Tcl_CreateObjCommand(interp, cmdName, command_trampoline, clientData, NULL);
     447}
     448
     449static char *
     450variable_read(ClientData clientData, Tcl_Interp *interp, const char *name1, const char *name2, int flags)
     451{
     452        NSString *var = [(MPPort *)clientData variable:[NSString stringWithUTF8String:name1]];
     453        assert(var != nil);
     454        Tcl_SetVar2Ex(interp, name1, name2, Tcl_SubstObj(interp, Tcl_NewStringObj([var UTF8String], -1), TCL_SUBST_VARIABLES), 0);
     455        return NULL;
     456}
     457
     458// debugging
     459static int
     460_nslog(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
     461{
     462        NSArray *args = [[NSArray alloc] initWithTclObjects:++objv count:--objc];
     463        NSLog(@"%@", [args componentsJoinedByString:@" "]);
     464        [args release];
     465       
     466        return TCL_OK;
     467}
     468
     469static int
     470_fake_boolean(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
     471{
     472        Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0));
     473        return TCL_OK;
     474}
  • users/toby/objcports/objcports.xcodeproj/project.pbxproj

    r51253 r54211  
    1313                DAD371710F0280EF0064AFF4 /* port.m in Sources */ = {isa = PBXBuildFile; fileRef = DAD371680F0280EF0064AFF4 /* port.m */; };
    1414                DAD371720F0280EF0064AFF4 /* MPArrayAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = DAD3716A0F0280EF0064AFF4 /* MPArrayAdditions.m */; };
    15                 DAD371730F0280EF0064AFF4 /* MPParser.m in Sources */ = {isa = PBXBuildFile; fileRef = DAD3716C0F0280EF0064AFF4 /* MPParser.m */; };
    1615                DAD371740F0280EF0064AFF4 /* MPPort.m in Sources */ = {isa = PBXBuildFile; fileRef = DAD3716E0F0280EF0064AFF4 /* MPPort.m */; };
    1716                DAD371750F0280EF0064AFF4 /* MPStringAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = DAD371700F0280EF0064AFF4 /* MPStringAdditions.m */; };
     
    4140                DAD371690F0280EF0064AFF4 /* MPArrayAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPArrayAdditions.h; sourceTree = "<group>"; };
    4241                DAD3716A0F0280EF0064AFF4 /* MPArrayAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPArrayAdditions.m; sourceTree = "<group>"; };
    43                 DAD3716B0F0280EF0064AFF4 /* MPParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPParser.h; sourceTree = "<group>"; };
    44                 DAD3716C0F0280EF0064AFF4 /* MPParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPParser.m; sourceTree = "<group>"; };
    4542                DAD3716D0F0280EF0064AFF4 /* MPPort.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPort.h; sourceTree = "<group>"; };
    4643                DAD3716E0F0280EF0064AFF4 /* MPPort.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPort.m; sourceTree = "<group>"; };
     
    8481                                DA96BECE0F7C9C2500362779 /* MPIndex.h */,
    8582                                DA96BECF0F7C9C2500362779 /* MPIndex.m */,
    86                                 DAD3716B0F0280EF0064AFF4 /* MPParser.h */,
    87                                 DAD3716C0F0280EF0064AFF4 /* MPParser.m */,
    8883                                DAD3716D0F0280EF0064AFF4 /* MPPort.h */,
    8984                                DAD3716E0F0280EF0064AFF4 /* MPPort.m */,
     
    165160                                DAD371750F0280EF0064AFF4 /* MPStringAdditions.m in Sources */,
    166161                                DA96BED00F7C9C2500362779 /* MPIndex.m in Sources */,
    167                                 DAD371730F0280EF0064AFF4 /* MPParser.m in Sources */,
    168162                                DAD371740F0280EF0064AFF4 /* MPPort.m in Sources */,
    169163                                DA96BF4C0F7CA1A700362779 /* MPDictionaryAdditions.m in Sources */,
Note: See TracChangeset for help on using the changeset viewer.