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);