Changeset 54354


Ignore:
Timestamp:
Jul 25, 2009, 9:35:34 AM (10 years ago)
Author:
toby@…
Message:

more config fun

File:
1 edited

Legend:

Unmodified
Added
Removed
  • users/toby/objcports/MPConfig.m

    r54343 r54354  
    11#include <Foundation/Foundation.h>
    22#include <tcl.h>
     3#include <regex.h>
    34
    45#include "MPConfig.h"
     
    78
    89@interface MPConfig (priv)
    9 - (NSString *)macportsConfPath;
     10- (void)loadAutoconf;
    1011@end
    1112
     
    3738{
    3839        NSMutableArray *configFiles;
     40        char *s;
     41        int rc;
    3942
    4043        self = [super init];
    4144
    42         configFiles = [NSMutableArray arrayWithObject:[[self macportsConfPath] stringByAppendingPathComponent:@"macports.conf"]];
     45        _config = [[NSMutableDictionary alloc] initWithCapacity:0];
     46       
     47        [self loadAutoconf];
     48
     49        configFiles = [NSMutableArray arrayWithCapacity:0];
     50        [configFiles addObject:[[_config objectForKey:@"macports_conf_path"] stringByAppendingPathComponent:@"macports.conf"]];
     51        [configFiles addObject:[[_config objectForKey:@"macports_user_dir"] stringByAppendingPathComponent:@"macports.conf"]];
     52        if ((s = getenv("PORTSRC"))) {
     53                [configFiles addObject:[NSString stringWithUTF8String:s]];
     54        }
     55
     56        regex_t re;
     57        rc = regcomp(&re, "^([A-Za-z_]+)([\\\t ]+(.*))?$", REG_EXTENDED);
     58        assert(rc == 0);
     59        assert(re.re_nsub == 3);
    4360        for (NSString *f in configFiles) {
    44                 NSLog(@"%@", f);
     61                size_t len;
     62                char *line;
     63                FILE *fp = fopen([f UTF8String], "r");
     64                if (fp == NULL) continue;
     65                while ((line = fgetln(fp, &len))) {
     66                        regmatch_t match[4];
     67                        line[len - 1] = '\0';
     68                        rc = regexec(&re, line, 4, match, 0);
     69                        if (rc == 0) {
     70                                NSString *k, *v;
     71                                k = [[NSString alloc] initWithBytes:&line[match[1].rm_so] length:(match[1].rm_eo - match[1].rm_so) encoding:NSUTF8StringEncoding];
     72                                if (match[3].rm_so >= 0) {
     73                                        v = [[NSString alloc] initWithBytes:&line[match[3].rm_so] length:(match[3].rm_eo - match[3].rm_so) encoding:NSUTF8StringEncoding];
     74                                } else {
     75                                        v = @"";
     76                                }
     77                                [_config setObject:v forKey:k];
     78                        }
     79                }
     80                fclose(fp);
    4581        }
     82        regfree(&re);
     83
     84        NSLog(@"%@", _config);
    4685
    4786        return self;
    4887}
    4988
    50 - (NSString *)macportsConfPath
     89- (void)dealloc
     90{
     91        [_config release];
     92        [super dealloc];
     93}
     94
     95- (void)loadAutoconf
    5196{
    5297        Tcl_Interp *interp;
    5398        int rc;
    54         const char *path;
    55         NSString *result = nil;
     99        NSString *tmp;
    56100
    57101        interp = Tcl_CreateInterp();
    58102        rc = Tcl_EvalFile(interp, "/Library/Tcl/macports1.0/macports_autoconf.tcl");
    59103        if (rc == 0) {
    60                 path = Tcl_GetVar(interp, "macports::autoconf::macports_conf_path", 0);
    61                 if (path) {
    62                         result = [NSString stringWithUTF8String:path];
     104                [_config setObject:[NSString stringWithUTF8String:Tcl_GetVar(interp, "macports::autoconf::macports_conf_path", 0)] forKey:@"macports_conf_path"];
     105                tmp = [NSString stringWithUTF8String:Tcl_GetVar(interp, "macports::autoconf::macports_user_dir", 0)];
     106                tmp = [tmp stringByExpandingTildeInPath];
     107                if (tmp) {
     108                        [_config setObject:tmp forKey:@"macports_user_dir"];
    63109                }
    64110        }
    65111        Tcl_DeleteInterp(interp);
    66 
    67         return result;
    68112}
    69113
Note: See TracChangeset for help on using the changeset viewer.