You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2015/07/11 15:01:38 UTC
[3/5] lucy-clownfish git commit: Helper function to extract path parts
Helper function to extract path parts
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/692f8ad1
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/692f8ad1
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/692f8ad1
Branch: refs/heads/master
Commit: 692f8ad186ee0dc50cb4b4937845fad8bfc87714
Parents: b055f09
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Wed Jul 8 13:59:25 2015 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sat Jul 11 14:54:59 2015 +0200
----------------------------------------------------------------------
compiler/src/CFCHierarchy.c | 77 +++++++++++++++++++--------------------
compiler/src/CFCTestParcel.c | 6 +--
2 files changed, 40 insertions(+), 43 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/692f8ad1/compiler/src/CFCHierarchy.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCHierarchy.c b/compiler/src/CFCHierarchy.c
index ea4f8d7..a9bda94 100644
--- a/compiler/src/CFCHierarchy.c
+++ b/compiler/src/CFCHierarchy.c
@@ -81,6 +81,9 @@ S_parse_cf_files(CFCHierarchy *self, const char *source_dir, int is_included);
static void
S_find_files(const char *path, void *arg);
+static char*
+S_extract_path_part(const char *path, const char *dir, const char *ext);
+
static void
S_connect_classes(CFCHierarchy *self);
@@ -251,26 +254,10 @@ S_parse_parcel_files(const char *source_dir, int is_included) {
context.num_paths = 0;
CFCUtil_walk(source_dir, S_find_files, &context);
- size_t source_dir_len = strlen(source_dir);
-
// Parse .cfp files and register the parcels they define.
for (int i = 0; context.paths[i] != NULL; i++) {
const char *path = context.paths[i];
-
- if (strncmp(path, source_dir, source_dir_len) != 0) {
- CFCUtil_die("'%s' doesn't start with '%s'", path, source_dir);
- }
- const char *path_part = path + source_dir_len;
- while (*path_part == CHY_DIR_SEP_CHAR) {
- ++path_part;
- }
-
- // Ignore hidden files.
- if (path_part[0] == '.'
- || strstr(path_part, CHY_DIR_SEP ".") != NULL) {
- continue;
- }
-
+ char *path_part = S_extract_path_part(path, source_dir, ".cfp");
CFCFileSpec *file_spec
= CFCFileSpec_new(source_dir, path_part, is_included);
CFCParcel *parcel = CFCParcel_new_from_file(path, file_spec);
@@ -293,6 +280,7 @@ S_parse_parcel_files(const char *source_dir, int is_included) {
}
CFCBase_decref((CFCBase*)parcel);
CFCBase_decref((CFCBase*)file_spec);
+ FREEMEM(path_part);
}
CFCUtil_free_string_array(context.paths);
@@ -328,33 +316,12 @@ S_parse_cf_files(CFCHierarchy *self, const char *source_dir, int is_included) {
context.paths = (char**)CALLOCATE(1, sizeof(char*));
context.num_paths = 0;
CFCUtil_walk(source_dir, S_find_files, &context);
- size_t source_dir_len = strlen(source_dir);
- char *path_part = NULL;
- size_t path_part_max = 0;
// Process any file that has at least one class declaration.
for (int i = 0; context.paths[i] != NULL; i++) {
// Derive the name of the class that owns the module file.
char *source_path = context.paths[i];
- size_t source_path_len = strlen(source_path);
- if (strncmp(source_path, source_dir, source_dir_len) != 0) {
- CFCUtil_die("'%s' doesn't start with '%s'", source_path,
- source_dir);
- }
- size_t path_part_len = source_path_len
- - source_dir_len
- - strlen(".cfh");
- if (path_part_max < path_part_len + 1) {
- path_part_max = path_part_len + 1;
- path_part = (char*)REALLOCATE(path_part, path_part_max);
- }
- const char *src = source_path + source_dir_len;
- while (*src == CHY_DIR_SEP_CHAR) {
- ++src;
- --path_part_len;
- }
- memcpy(path_part, src, path_part_len);
- path_part[path_part_len] = '\0';
+ char *path_part = S_extract_path_part(source_path, source_dir, ".cfh");
// Ignore hidden files.
if (path_part[0] == '.'
@@ -397,11 +364,11 @@ S_parse_cf_files(CFCHierarchy *self, const char *source_dir, int is_included) {
CFCBase_decref((CFCBase*)file);
CFCBase_decref((CFCBase*)file_spec);
+ FREEMEM(path_part);
}
self->classes[self->num_classes] = NULL;
CFCUtil_free_string_array(context.paths);
- FREEMEM(path_part);
}
static void
@@ -424,6 +391,36 @@ S_find_files(const char *path, void *arg) {
}
}
+static char*
+S_extract_path_part(const char *path, const char *dir, const char *ext) {
+ size_t path_len = strlen(path);
+ size_t dir_len = strlen(dir);
+ size_t ext_len = strlen(ext);
+
+ if (path_len <= dir_len + ext_len) {
+ CFCUtil_die("Unexpected path '%s'", path);
+ }
+ if (strncmp(path, dir, dir_len) != 0) {
+ CFCUtil_die("'%s' doesn't start with '%s'", path, dir);
+ }
+ if (strcmp(path + path_len - ext_len, ext) != 0) {
+ CFCUtil_die("'%s' doesn't end with '%s'", path, ext);
+ }
+
+ const char *src = path + dir_len;
+ size_t path_part_len = path_len - (dir_len + ext_len);
+ while (path_part_len && *src == CHY_DIR_SEP_CHAR) {
+ ++src;
+ --path_part_len;
+ }
+
+ char *path_part = (char*)MALLOCATE(path_part_len + 1);
+ memcpy(path_part, src, path_part_len);
+ path_part[path_part_len] = '\0';
+
+ return path_part;
+}
+
static void
S_connect_classes(CFCHierarchy *self) {
// Wrangle the classes into hierarchies and figure out inheritance.
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/692f8ad1/compiler/src/CFCTestParcel.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestParcel.c b/compiler/src/CFCTestParcel.c
index 8d57b0c..eec782a 100644
--- a/compiler/src/CFCTestParcel.c
+++ b/compiler/src/CFCTestParcel.c
@@ -86,7 +86,7 @@ S_run_parcel_tests(CFCTest *test) {
}
{
- CFCFileSpec *file_spec = CFCFileSpec_new(".", "Parcel.cfp", true);
+ CFCFileSpec *file_spec = CFCFileSpec_new(".", "Parcel", true);
CFCParcel *parcel = CFCParcel_new("Foo", NULL, NULL, file_spec);
OK(test, CFCParcel_included(parcel), "included");
CFCBase_decref((CFCBase*)parcel);
@@ -163,13 +163,13 @@ S_run_parcel_tests(CFCTest *test) {
}
{
- CFCFileSpec *foo_file_spec = CFCFileSpec_new(".", "Foo.cfp", true);
+ CFCFileSpec *foo_file_spec = CFCFileSpec_new(".", "Foo", true);
CFCParcel *foo = CFCParcel_new("Foo", NULL, NULL, foo_file_spec);
CFCParcel_register(foo);
CFCVersion *cfish_version = CFCVersion_new("v0.8.7");
CFCFileSpec *cfish_file_spec
- = CFCFileSpec_new(".", "Clownfish.cfp", true);
+ = CFCFileSpec_new(".", "Clownfish", true);
CFCParcel *cfish
= CFCParcel_new("Clownfish", NULL, cfish_version, cfish_file_spec);
CFCParcel_register(cfish);