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