Replace erroneous Clownfish URLs with error message
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/520a87ef Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/520a87ef Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/520a87ef Branch: refs/heads/master Commit: 520a87ef45be57d271b34f1d966664c8fb551db7 Parents: 37504e4 Author: Nick Wellnhofer <[email protected]> Authored: Sun Jul 26 19:39:10 2015 +0200 Committer: Nick Wellnhofer <[email protected]> Committed: Thu Aug 6 18:19:19 2015 +0200 ---------------------------------------------------------------------- compiler/src/CFCC.c | 12 +++- compiler/src/CFCCHtml.c | 16 ++++- compiler/src/CFCPerlPod.c | 14 +++-- compiler/src/CFCUri.c | 137 +++++++++++++++++++++++------------------ compiler/src/CFCUri.h | 18 ++++-- 5 files changed, 125 insertions(+), 72 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/520a87ef/compiler/src/CFCC.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCC.c b/compiler/src/CFCC.c index 6fba122..6d5adc6 100644 --- a/compiler/src/CFCC.c +++ b/compiler/src/CFCC.c @@ -174,9 +174,15 @@ CFCC_write_hostdefs(CFCC *self) { char* CFCC_link_text(CFCUri *uri_obj) { char *link_text = NULL; - int type = CFCUri_get_type(uri_obj); + CFCUriType type = CFCUri_get_type(uri_obj); switch (type) { + case CFC_URI_ERROR: { + const char *error = CFCUri_get_error(uri_obj); + link_text = CFCUtil_sprintf("[%s]", error); + break; + } + case CFC_URI_NULL: link_text = CFCUtil_strdup("NULL"); break; @@ -203,6 +209,10 @@ CFCC_link_text(CFCUri *uri_obj) { link_text = CFCUtil_strdup(name); break; } + + default: + CFCUtil_die("Unsupported node type: %d", type); + break; } return link_text; http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/520a87ef/compiler/src/CFCCHtml.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCCHtml.c b/compiler/src/CFCCHtml.c index 52740f5..c51da80 100644 --- a/compiler/src/CFCCHtml.c +++ b/compiler/src/CFCCHtml.c @@ -1018,7 +1018,16 @@ S_transform_link(cmark_node *link, CFCClass *doc_class, int dir_level) { CFCUri *uri_obj = CFCUri_new(uri_string, doc_class); char *url = S_cfc_uri_to_url(uri_obj, doc_class, dir_level); - if (url) { + if (CFCUri_get_type(uri_obj) == CFC_URI_ERROR) { + // Replace link with error. + char *link_text = CFCC_link_text(uri_obj); + cmark_node *text_node = cmark_node_new(CMARK_NODE_TEXT); + cmark_node_set_literal(text_node, link_text); + cmark_node_insert_after(link, text_node); + cmark_node_free(link); + FREEMEM(link_text); + } + else if (url) { cmark_node_set_url(link, url); if (!cmark_node_first_child(link)) { @@ -1089,7 +1098,7 @@ S_type_to_html(CFCClass *klass, CFCType *type) { static char* S_cfc_uri_to_url(CFCUri *uri_obj, CFCClass *doc_class, int dir_level) { char *url = NULL; - int type = CFCUri_get_type(uri_obj); + CFCUriType type = CFCUri_get_type(uri_obj); switch (type) { case CFC_URI_CLASS: { @@ -1113,6 +1122,9 @@ S_cfc_uri_to_url(CFCUri *uri_obj, CFCClass *doc_class, int dir_level) { url = S_document_to_url(doc, doc_class, dir_level); break; } + + default: + break; } return url; http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/520a87ef/compiler/src/CFCPerlPod.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCPerlPod.c b/compiler/src/CFCPerlPod.c index ffa0f04..8b728e0 100644 --- a/compiler/src/CFCPerlPod.c +++ b/compiler/src/CFCPerlPod.c @@ -570,12 +570,18 @@ S_convert_link(cmark_node *link, CFCClass *doc_class, int header_level) { return retval; } - char *new_uri = NULL; - char *new_text = NULL; - CFCUri *uri_obj = CFCUri_new(uri, doc_class); - int type = CFCUri_get_type(uri_obj); + char *new_uri = NULL; + char *new_text = NULL; + CFCUri *uri_obj = CFCUri_new(uri, doc_class); + CFCUriType type = CFCUri_get_type(uri_obj); switch (type) { + case CFC_URI_ERROR: { + const char *error = CFCUri_get_error(uri_obj); + new_text = CFCUtil_sprintf("[%s]", error); + break; + } + case CFC_URI_NULL: // Change all instances of NULL to 'undef' new_text = CFCUtil_strdup("undef"); http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/520a87ef/compiler/src/CFCUri.c ---------------------------------------------------------------------- diff --git a/compiler/src/CFCUri.c b/compiler/src/CFCUri.c index fc6e8e8..8c7c555 100644 --- a/compiler/src/CFCUri.c +++ b/compiler/src/CFCUri.c @@ -29,10 +29,11 @@ struct CFCUri { CFCBase base; char *string; CFCClass *doc_class; - int type; + CFCUriType type; CFCClass *klass; CFCDocument *document; char *callable; + char *error; }; static const CFCMeta CFCURI_META = { @@ -48,6 +49,9 @@ static void S_resolve(CFCUri *self, const char *prefix, const char *struct_sym, const char *callable); +static void +S_set_error(CFCUri *self, const char *error); + static char* S_next_component(char **iter); @@ -80,6 +84,7 @@ void CFCUri_destroy(CFCUri *self) { FREEMEM(self->string); FREEMEM(self->callable); + FREEMEM(self->error); CFCBase_decref((CFCBase*)self->doc_class); CFCBase_decref((CFCBase*)self->klass); CFCBase_decref((CFCBase*)self->document); @@ -107,36 +112,34 @@ S_parse(CFCUri *self) { // Parcel parcel = component; component = S_next_component(&iter); - } - if (component) { - if (isupper(component[0])) { - // Class - struct_sym = component; - } - else if (component == buf && component[0] == '\0' && iter) { - // "cfish:.Method" style URL. - ; - } - else { - CFCUtil_die("Invalid component in Clownfish URI: %s", - self->string); + if (!component) { + S_set_error(self, "Missing component in Clownfish URI"); + goto done; } + } - component = S_next_component(&iter); + // struct_sym == NULL for "cfish:.Method" style URL. + // parcel implies struct_sym. + if (parcel || component[0] != '\0') { + struct_sym = component; } + component = S_next_component(&iter); + if (component) { callable = component; component = S_next_component(&iter); } if (component) { - CFCUtil_die("Trailing components in Clownfish URI: %s", self->string); + S_set_error(self, "Trailing component in Clownfish URI"); + goto done; } S_resolve(self, parcel, struct_sym, callable); +done: FREEMEM(buf); } @@ -145,67 +148,74 @@ S_resolve(CFCUri *self, const char *parcel, const char *struct_sym, const char *callable) { // Try to find a CFCClass. - if (struct_sym || callable) { - CFCClass *doc_class = self->doc_class; - CFCClass *klass = NULL; - - if (parcel) { - char *full_struct_sym = CFCUtil_sprintf("%s_%s", parcel, struct_sym); - klass = CFCClass_fetch_by_struct_sym(full_struct_sym); - FREEMEM(full_struct_sym); - } - else if (struct_sym && doc_class) { - const char *prefix = CFCClass_get_prefix(doc_class); - char *full_struct_sym = CFCUtil_sprintf("%s%s", prefix, struct_sym); - klass = CFCClass_fetch_by_struct_sym(full_struct_sym); - FREEMEM(full_struct_sym); - } - else { - klass = doc_class; - } + CFCClass *doc_class = self->doc_class; + CFCClass *klass = NULL; - if (klass) { - self->type = CFC_URI_CLASS; - self->klass = klass; - CFCBase_incref((CFCBase*)klass); + if (parcel) { + char *full_struct_sym = CFCUtil_sprintf("%s_%s", parcel, struct_sym); + klass = CFCClass_fetch_by_struct_sym(full_struct_sym); + FREEMEM(full_struct_sym); + } + else if (struct_sym && doc_class) { + const char *prefix = CFCClass_get_prefix(doc_class); + char *full_struct_sym = CFCUtil_sprintf("%s%s", prefix, struct_sym); + klass = CFCClass_fetch_by_struct_sym(full_struct_sym); + FREEMEM(full_struct_sym); + } + else if (callable) { + klass = doc_class; + } - if (callable) { - if (islower(callable[0])) { - if (!CFCClass_function(klass, callable)) { - CFCUtil_warn("Unknown function '%s' in Clownfish URI: %s", - callable, self->string); - } + if (klass) { + self->type = CFC_URI_CLASS; + self->klass = klass; + CFCBase_incref((CFCBase*)klass); - self->type = CFC_URI_FUNCTION; - self->callable = CFCUtil_strdup(callable); + if (callable) { + if (islower(callable[0])) { + if (!CFCClass_function(klass, callable)) { + CFCUtil_warn("Unknown function '%s' in Clownfish URI: %s", + callable, self->string); } - else { - if (!CFCClass_method(klass, callable)) { - CFCUtil_warn("Unknown method '%s' in Clownfish URI: %s", - callable, self->string); - } - - self->type = CFC_URI_METHOD; - self->callable = CFCUtil_strdup(callable); + + self->type = CFC_URI_FUNCTION; + self->callable = CFCUtil_strdup(callable); + } + else { + if (!CFCClass_method(klass, callable)) { + CFCUtil_warn("Unknown method '%s' in Clownfish URI: %s", + callable, self->string); } + + self->type = CFC_URI_METHOD; + self->callable = CFCUtil_strdup(callable); } } + + return; } // Try to find a CFCDocument. - if (self->type == 0 && !parcel && struct_sym && !callable) { + if (!parcel && struct_sym && !callable) { CFCDocument *doc = CFCDocument_fetch(struct_sym); if (doc) { self->type = CFC_URI_DOCUMENT; self->document = doc; CFCBase_incref((CFCBase*)doc); + return; } } - if (self->type == 0) { - CFCUtil_die("Couldn't resolve Clownfish URI: %s", self->string); - } + S_set_error(self, "Couldn't resolve Clownfish URI"); +} + +static void +S_set_error(CFCUri *self, const char *error) { + self->type = CFC_URI_ERROR; + self->error = CFCUtil_sprintf("%s: %s", error, self->string); + + CFCUtil_warn(self->error); } static char* @@ -231,7 +241,7 @@ CFCUri_get_string(CFCUri *self) { return self->string; } -int +CFCUriType CFCUri_get_type(CFCUri *self) { if (self->type == 0) { S_parse(self); } return self->type; @@ -264,3 +274,12 @@ CFCUri_get_callable_name(CFCUri *self) { return self->callable; } +const char* +CFCUri_get_error(CFCUri *self) { + if (self->type == 0) { S_parse(self); } + if (self->error == NULL) { + CFCUtil_die("Not an error URI"); + } + return self->error; +} + http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/520a87ef/compiler/src/CFCUri.h ---------------------------------------------------------------------- diff --git a/compiler/src/CFCUri.h b/compiler/src/CFCUri.h index 9e22d4e..6c05653 100644 --- a/compiler/src/CFCUri.h +++ b/compiler/src/CFCUri.h @@ -21,11 +21,14 @@ extern "C" { #endif -#define CFC_URI_NULL 1 -#define CFC_URI_CLASS 2 -#define CFC_URI_FUNCTION 3 -#define CFC_URI_METHOD 4 -#define CFC_URI_DOCUMENT 5 +typedef enum { + CFC_URI_NULL = 1, + CFC_URI_CLASS = 2, + CFC_URI_FUNCTION = 3, + CFC_URI_METHOD = 4, + CFC_URI_DOCUMENT = 5, + CFC_URI_ERROR = 6 +} CFCUriType; typedef struct CFCUri CFCUri; struct CFCClass; @@ -46,7 +49,7 @@ CFCUri_destroy(CFCUri *self); const char* CFCUri_get_string(CFCUri *self); -int +CFCUriType CFCUri_get_type(CFCUri *self); struct CFCClass* @@ -58,6 +61,9 @@ CFCUri_get_document(CFCUri *self); const char* CFCUri_get_callable_name(CFCUri *self); +const char* +CFCUri_get_error(CFCUri *self); + #ifdef __cplusplus } #endif
