You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2012/04/19 01:47:31 UTC

[lucy-commits] svn commit: r1327728 - in /lucy/trunk/clownfish: perl/t/105-object_type.t src/CFCType.c

Author: marvin
Date: Wed Apr 18 23:47:31 2012
New Revision: 1327728

URL: http://svn.apache.org/viewvc?rev=1327728&view=rev
Log:
LUCY-215 Allow type specifiers of external parcels.

Modified:
    lucy/trunk/clownfish/perl/t/105-object_type.t
    lucy/trunk/clownfish/src/CFCType.c

Modified: lucy/trunk/clownfish/perl/t/105-object_type.t
URL: http://svn.apache.org/viewvc/lucy/trunk/clownfish/perl/t/105-object_type.t?rev=1327728&r1=1327727&r2=1327728&view=diff
==============================================================================
--- lucy/trunk/clownfish/perl/t/105-object_type.t (original)
+++ lucy/trunk/clownfish/perl/t/105-object_type.t Wed Apr 18 23:47:31 2012
@@ -16,7 +16,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 55;
+use Test::More tests => 54;
 use Clownfish::CFC::Model::Type;
 use Clownfish::CFC::Parser;
 
@@ -26,7 +26,7 @@ my $parser = Clownfish::CFC::Parser->new
 my $parcel = $parser->parse('parcel Neato;')
     or die "failed to process parcel_definition";
 
-for my $bad_specifier (qw( foo fooBar Foo_Bar FOOBAR 1Foo 1FOO )) {
+for my $bad_specifier (qw( foo Foo_Bar FOOBAR 1Foo 1FOO )) {
     eval {
         my $type = Clownfish::CFC::Model::Type->new_object(
             parcel    => 'Neato',

Modified: lucy/trunk/clownfish/src/CFCType.c
URL: http://svn.apache.org/viewvc/lucy/trunk/clownfish/src/CFCType.c?rev=1327728&r1=1327727&r2=1327728&view=diff
==============================================================================
--- lucy/trunk/clownfish/src/CFCType.c (original)
+++ lucy/trunk/clownfish/src/CFCType.c Wed Apr 18 23:47:31 2012
@@ -223,21 +223,38 @@ CFCType_new_object(int flags, CFCParcel 
         flags |= CFCTYPE_STRING_TYPE;
     }
 
-    const char *prefix = CFCParcel_get_prefix(parcel);
     const size_t MAX_SPECIFIER_LEN = 256;
     char full_specifier[MAX_SPECIFIER_LEN + 1];
     char small_specifier[MAX_SPECIFIER_LEN + 1];
-    if (strlen(prefix) + strlen(specifier) > MAX_SPECIFIER_LEN) {
-        CFCUtil_die("Specifier and/or parcel prefix too long");
-    }
-    if (strstr(specifier, prefix) != specifier) {
+    if (isupper(*specifier)) {
+        const char *prefix = CFCParcel_get_prefix(parcel);
+        if (strlen(prefix) + strlen(specifier) > MAX_SPECIFIER_LEN) {
+            CFCUtil_die("Specifier and/or parcel prefix too long");
+        }
         sprintf(full_specifier, "%s%s", prefix, specifier);
         strcpy(small_specifier, specifier);
     }
+    else if (!isalpha(*specifier)) {
+        CFCUtil_die("Invalid specifier: '%s'", specifier);
+    }
     else {
+        if (strlen(specifier) > MAX_SPECIFIER_LEN) {
+            CFCUtil_die("Specifier too long");
+        }
+        const char *probe = specifier;
+        while (*probe) {
+            if (isupper(*probe)) {
+                break;
+            }
+            else if (!isalnum(*probe) && *probe != '_') {
+                CFCUtil_die("Invalid specifier: '%s'", specifier);
+            }
+            probe++;
+        }
         strcpy(full_specifier, specifier);
-        strcpy(small_specifier, specifier + strlen(prefix));
+        strcpy(small_specifier, probe);
     }
+
     if (!CFCSymbol_validate_class_name_component(small_specifier)) {
         CFCUtil_die("Invalid specifier: '%s'", specifier);
     }