Author: marvin
Date: Fri May 11 20:44:53 2012
New Revision: 1337371

URL: http://svn.apache.org/viewvc?rev=1337371&view=rev
Log:
Automatically parse .cfp files.

Added:
    lucy/trunk/clownfish/perl/t/cfsource/Animal.cfp
Modified:
    lucy/trunk/clownfish/src/CFCHierarchy.c

Added: lucy/trunk/clownfish/perl/t/cfsource/Animal.cfp
URL: 
http://svn.apache.org/viewvc/lucy/trunk/clownfish/perl/t/cfsource/Animal.cfp?rev=1337371&view=auto
==============================================================================
--- lucy/trunk/clownfish/perl/t/cfsource/Animal.cfp (added)
+++ lucy/trunk/clownfish/perl/t/cfsource/Animal.cfp Fri May 11 20:44:53 2012
@@ -0,0 +1,3 @@
+{
+    "name": "Animal"
+}

Modified: lucy/trunk/clownfish/src/CFCHierarchy.c
URL: 
http://svn.apache.org/viewvc/lucy/trunk/clownfish/src/CFCHierarchy.c?rev=1337371&r1=1337370&r2=1337371&view=diff
==============================================================================
--- lucy/trunk/clownfish/src/CFCHierarchy.c (original)
+++ lucy/trunk/clownfish/src/CFCHierarchy.c Fri May 11 20:44:53 2012
@@ -32,6 +32,7 @@
 #include "CFCClass.h"
 #include "CFCFile.h"
 #include "CFCFileSpec.h"
+#include "CFCParcel.h"
 #include "CFCSymbol.h"
 #include "CFCUtil.h"
 #include "CFCParser.h"
@@ -55,6 +56,10 @@ struct CFCHierarchy {
     size_t num_classes;
 };
 
+// CFCUtil_walk() callback which parses .cfp files.
+static void
+S_parse_parcel_files(const char *path, void *context);
+
 static void
 S_do_make_path(const char *path);
 
@@ -181,6 +186,12 @@ CFCHierarchy_add_include_dir(CFCHierarch
 void
 CFCHierarchy_build(CFCHierarchy *self) {
     for (size_t i = 0; self->sources[i] != NULL; i++) {
+        CFCUtil_walk(self->sources[i], S_parse_parcel_files, NULL);
+    }
+    for (size_t i = 0; self->includes[i] != NULL; i++) {
+        CFCUtil_walk(self->includes[i], S_parse_parcel_files, NULL);
+    }
+    for (size_t i = 0; self->sources[i] != NULL; i++) {
         S_parse_cf_files(self, self->sources[i], 0);
     }
     for (size_t i = 0; self->includes[i] != NULL; i++) {
@@ -192,6 +203,33 @@ CFCHierarchy_build(CFCHierarchy *self) {
     }
 }
 
+static void
+S_parse_parcel_files(const char *path, void *context) {
+    (void)context; // unused
+
+    // Ignore hidden files.
+    if (strstr(path, CFCUTIL_PATH_SEP ".") != NULL) {
+        return;
+    }
+
+    // Parse .cfp files and register the parcels they define.
+    size_t path_len = strlen(path);
+    if (path_len > 4 && (strcmp((path + path_len - 4), ".cfp") == 0)) {
+        CFCParcel *parcel = CFCParcel_new_from_file(path);
+        CFCParcel *existing = CFCParcel_fetch(CFCParcel_get_name(parcel));
+        if (existing) {
+            if (!CFCParcel_equals(parcel, existing)) {
+                CFCUtil_die("Incompatible parcel '%s' already registered",
+                            CFCParcel_get_name(parcel));
+            }
+        }
+        else {
+            CFCParcel_register(parcel);
+        }
+        CFCBase_decref((CFCBase*)parcel);
+    }
+}
+
 static char**
 S_find_cfh(const char *dir, char **cfh_list, size_t num_cfh) {
     void *dirhandle = CFCUtil_opendir(dir);


Reply via email to