[54354] users/toby/objcports/MPConfig.m

toby at macports.org toby at macports.org
Sat Jul 25 02:35:34 PDT 2009


Revision: 54354
          http://trac.macports.org/changeset/54354
Author:   toby at macports.org
Date:     2009-07-25 02:35:34 -0700 (Sat, 25 Jul 2009)
Log Message:
-----------
more config fun

Modified Paths:
--------------
    users/toby/objcports/MPConfig.m

Modified: users/toby/objcports/MPConfig.m
===================================================================
--- users/toby/objcports/MPConfig.m	2009-07-25 09:16:01 UTC (rev 54353)
+++ users/toby/objcports/MPConfig.m	2009-07-25 09:35:34 UTC (rev 54354)
@@ -1,12 +1,13 @@
 #include <Foundation/Foundation.h>
 #include <tcl.h>
+#include <regex.h>
 
 #include "MPConfig.h"
 
 static MPConfig *sharedConfigInstance = nil;
 
 @interface MPConfig (priv)
-- (NSString *)macportsConfPath;
+- (void)loadAutoconf;
 @end
 
 @implementation MPConfig
@@ -36,35 +37,78 @@
 - (id)init
 {
 	NSMutableArray *configFiles;
+	char *s;
+	int rc;
 
 	self = [super init];
 
-	configFiles = [NSMutableArray arrayWithObject:[[self macportsConfPath] stringByAppendingPathComponent:@"macports.conf"]];
+	_config = [[NSMutableDictionary alloc] initWithCapacity:0];
+	
+	[self loadAutoconf];
+
+	configFiles = [NSMutableArray arrayWithCapacity:0];
+	[configFiles addObject:[[_config objectForKey:@"macports_conf_path"] stringByAppendingPathComponent:@"macports.conf"]];
+	[configFiles addObject:[[_config objectForKey:@"macports_user_dir"] stringByAppendingPathComponent:@"macports.conf"]];
+	if ((s = getenv("PORTSRC"))) {
+		[configFiles addObject:[NSString stringWithUTF8String:s]];
+	}
+
+	regex_t re;
+	rc = regcomp(&re, "^([A-Za-z_]+)([\\\t ]+(.*))?$", REG_EXTENDED);
+	assert(rc == 0);
+	assert(re.re_nsub == 3);
 	for (NSString *f in configFiles) {
-		NSLog(@"%@", f);
+		size_t len;
+		char *line;
+		FILE *fp = fopen([f UTF8String], "r");
+		if (fp == NULL) continue;
+		while ((line = fgetln(fp, &len))) {
+			regmatch_t match[4];
+			line[len - 1] = '\0';
+			rc = regexec(&re, line, 4, match, 0);
+			if (rc == 0) {
+				NSString *k, *v;
+				k = [[NSString alloc] initWithBytes:&line[match[1].rm_so] length:(match[1].rm_eo - match[1].rm_so) encoding:NSUTF8StringEncoding];
+				if (match[3].rm_so >= 0) {
+					v = [[NSString alloc] initWithBytes:&line[match[3].rm_so] length:(match[3].rm_eo - match[3].rm_so) encoding:NSUTF8StringEncoding];
+				} else {
+					v = @"";
+				}
+				[_config setObject:v forKey:k];
+			}
+		}
+		fclose(fp);
 	}
+	regfree(&re);
 
+	NSLog(@"%@", _config);
+
 	return self;
 }
 
-- (NSString *)macportsConfPath
+- (void)dealloc
 {
+	[_config release];
+	[super dealloc];
+}
+
+- (void)loadAutoconf
+{
 	Tcl_Interp *interp;
 	int rc;
-	const char *path;
-	NSString *result = nil;
+	NSString *tmp;
 
 	interp = Tcl_CreateInterp(); 
 	rc = Tcl_EvalFile(interp, "/Library/Tcl/macports1.0/macports_autoconf.tcl");
 	if (rc == 0) {
-		path = Tcl_GetVar(interp, "macports::autoconf::macports_conf_path", 0);
-		if (path) {
-			result = [NSString stringWithUTF8String:path];
+		[_config setObject:[NSString stringWithUTF8String:Tcl_GetVar(interp, "macports::autoconf::macports_conf_path", 0)] forKey:@"macports_conf_path"];
+		tmp = [NSString stringWithUTF8String:Tcl_GetVar(interp, "macports::autoconf::macports_user_dir", 0)];
+		tmp = [tmp stringByExpandingTildeInPath];
+		if (tmp) {
+			[_config setObject:tmp forKey:@"macports_user_dir"];
 		}
 	}
 	Tcl_DeleteInterp(interp);
-
-	return result;
 }
 
 @end
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20090725/f3c8c963/attachment.html>


More information about the macports-changes mailing list