Skip to content

Commit

Permalink
#341 support cortoscript notation in string ser and deser
Browse files Browse the repository at this point in the history
  • Loading branch information
SanderMertens committed Jul 11, 2018
1 parent 4468af6 commit 76edd87
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 72 deletions.
33 changes: 20 additions & 13 deletions src/store/object.c
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ corto_equalityKind corto_compareLookupIntern(
char ch1, ch2;

ch2 = *ptr2;
while((ch1 = *ptr1) && ch2 && (ch2 != '/') && (ch2 != '{') && (ch2 != '.')) {
while((ch1 = *ptr1) && ch2 && (ch2 != '/') && (ch2 != '{') && (ch2 != '[') && (ch2 != '.')) {
if (ch1 == ch2) {
ptr1++; ptr2++;
ch2 = *ptr2;
Expand Down Expand Up @@ -271,7 +271,7 @@ corto_equalityKind corto_compareLookupIntern(
}
}

if (ch2 == '{') {
if (ch2 == '{' || ch2 == '[') {
if (!ch1) {
goto match;
} else {
Expand Down Expand Up @@ -3378,13 +3378,13 @@ corto_object corto_lookup_intern(
ptr ++;
}

if (!ptr[0] || ptr[0] == '{') {
if (!ptr[0] || ptr[0] == '{' || ptr[0] == '[') {
break;
}

bool containsArgs = false;
dot_separator = false; /* reset dot_operator */
for (next = ptr; (ch = *next) && ch != '/' && ch != '{'; next ++) {
for (next = ptr; (ch = *next) && ch != '/' && ch != '{' && ch != '['; next ++) {
if (ch == '(') {
containsArgs = true;
for (next ++; (ch = *next) && (ch != ')'); next ++);
Expand Down Expand Up @@ -3512,13 +3512,18 @@ corto_object corto_lookup_intern(
}

if (!o && resume && parent != corto_lang_o) {
/* Make sure that id passed to resume doesn't contain {} */
/* Make sure that id passed to resume doesn't contain {} or [] */
corto_id buffer;
const char *id = ptr, *value_start;
if ((value_start = strchr(id, '{'))) {
strcpy(buffer, id);
buffer[value_start - id] = '\0';
id = buffer;
} else
if ((value_start = strchr(id, '['))) {
strcpy(buffer, id);
buffer[value_start - id] = '\0';
id = buffer;
}

if (corto_resume(prev, id, &o)) {
Expand All @@ -3529,7 +3534,7 @@ corto_object corto_lookup_intern(

/* If object was found and search string ends in '{', create an
* anonymous object */
if (o && ptr[0] == '{') {
if (o && (ptr[0] == '{' || ptr[0] == '[')) {
corto_object out = NULL;
do {
ptr = corto_create_anonymous(orig_parent, o, ptr, &out);
Expand Down Expand Up @@ -3908,10 +3913,6 @@ int16_t corto_update_begin_intern(
corto_throw(NULL);
goto error;
}
} else {
corto_warning(
"updateBegin: calling updateBegin for non-writable '%s' is useless",
corto_fullpath(NULL, o));
}
}
corto_log_pop_dbg();
Expand Down Expand Up @@ -4145,14 +4146,16 @@ int32_t corto_sig_paramCount(
}
ptr++;

if (ch == '{') {
if (ch == '{' || ch == '[') {
uint32_t nesting = 1;
while((ch = *ptr) && nesting) {
ptr++;
switch(ch) {
case '[':
case '{':
nesting++;
break;
case ']':
case '}':
nesting--;
break;
Expand Down Expand Up @@ -4238,7 +4241,7 @@ int32_t corto_sig_param_type(
}

srcptr++;
if (ch == '{') {
if (ch == '{' || ch == '[') {
uint32_t count=1;
while((ch = *srcptr) && count) {
if (i == id) {
Expand All @@ -4247,9 +4250,11 @@ int32_t corto_sig_param_type(
}
srcptr++;
switch(ch) {
case '[':
case '{':
count++;
break;
case ']':
case '}':
count--;
break;
Expand Down Expand Up @@ -4335,14 +4340,16 @@ int32_t corto_sig_param_name(
}

srcptr++;
if (ch == '{') {
if (ch == '{' || ch == '[') {
uint32_t count=1;
while((ch = *srcptr) && count) {
srcptr++;
switch(ch) {
case '[':
case '{':
count++;
break;
case ']':
case '}':
count--;
break;
Expand Down
7 changes: 5 additions & 2 deletions src/store/string_deser.c
Original file line number Diff line number Diff line change
Expand Up @@ -791,6 +791,7 @@ const char* corto_string_deserParse(
* has finished processing the current value. */
while(ptr && (ch = *ptr) && proceed) {
switch(ch) {
case ':':
case '=': /* Explicit member assignment */
excess = FALSE;
if (buffer == bptr) {
Expand All @@ -808,6 +809,7 @@ const char* corto_string_deserParse(
break;
}

case '[':
case '{': /* Scope open */
if (bptr == buffer) {
if (!(ptr = corto_string_deserParseScope(
Expand All @@ -829,6 +831,7 @@ const char* corto_string_deserParse(
}
break;

case ']':
case '}': /* Scope close and end of value */
if (buffer != bptr) {
*nonWs = '\0';
Expand Down Expand Up @@ -964,7 +967,7 @@ const char* corto_string_deser(
/* Parse typename that potentially precedes string */
bptr = buffer;
ptr = str;
while((ch = *ptr) && (ch != '{')) {
while((ch = *ptr) && (ch != '{') && (ch != '[')) {
if (!((ch == ' ') || (ch == '\n') || (ch == '\t'))) {
*bptr = ch;
bptr++;
Expand All @@ -974,7 +977,7 @@ const char* corto_string_deser(
*bptr = '\0';

/* If no type is found, reset ptr */
if ((ch != '{') || (ptr == str)) {
if (((ch != '{') && (ch != '[')) || (ptr == str)) {
ptr = str;
} else {
corto_object type;
Expand Down
33 changes: 18 additions & 15 deletions src/store/string_ser.c
Original file line number Diff line number Diff line change
Expand Up @@ -230,13 +230,11 @@ static corto_int16 corto_ser_reference(corto_walk_opt* s, corto_value* v, void*

/* For composite and collection objects */
static corto_int16 corto_ser_scope(corto_walk_opt* s, corto_value* v, void* userData) {
corto_int16 result;
corto_string_ser_t *data, privateData;
corto_type t;

data = userData;
t = corto_value_typeof(v);
result = 0;
corto_int16 result = 0;
corto_string_ser_t *data = userData, privateData;
corto_type t = corto_value_typeof(v);
bool is_composite = t->kind == CORTO_COMPOSITE;
bool is_collection = t->kind == CORTO_COLLECTION;

/* Nested data has private itemCount, which prevents superfluous ',' to be added to the result. */
privateData.ptr = data->ptr;
Expand All @@ -248,11 +246,11 @@ static corto_int16 corto_ser_scope(corto_walk_opt* s, corto_value* v, void* user

/* Serialize composite members */
if (!corto_ser_appendColor(&privateData, CORTO_BOLD)) goto finished;
if (!corto_buffer_append(&privateData.buffer, "{")) {
if (!corto_buffer_append(&privateData.buffer, is_composite ? "{" : "[")) {
goto finished;
}
if (!corto_ser_appendColor(&privateData, CORTO_NORMAL)) goto finished;
if (t->kind == CORTO_COMPOSITE) {
if (is_composite) {
if (corto_interface(t)->kind == CORTO_UNION) {
void *ptr = corto_value_ptrof(v);
char *d;
Expand All @@ -269,14 +267,14 @@ static corto_int16 corto_ser_scope(corto_walk_opt* s, corto_value* v, void* user
privateData.itemCount = 1;
}
result = corto_walk_members(s, v, &privateData);
} else if (t->kind == CORTO_COLLECTION){
} else if (is_collection){
result = corto_walk_elements(s, v, &privateData);
} else {
corto_assert(0, "corto_ser_scope: invalid typekind for function.");
}
if (!result) {
if (!corto_ser_appendColor(&privateData, CORTO_BOLD)) goto finished;
if (!corto_buffer_append(&privateData.buffer, "}")) {
if (!corto_buffer_append(&privateData.buffer, is_composite ? "}" : "]")) {
goto finished;
}
if (!corto_ser_appendColor(&privateData, CORTO_NORMAL)) goto finished;
Expand Down Expand Up @@ -307,7 +305,7 @@ static corto_int16 corto_ser_item(corto_walk_opt* s, corto_value* v, void* userD
/* Append ',' if this is not the first item */
if (data->itemCount) {
if (!data->compactNotation) {
if (!corto_buffer_append(&data->buffer, " ")) {
if (!corto_buffer_append(&data->buffer, ", ")) {
goto finished;
}
} else {
Expand All @@ -322,7 +320,7 @@ static corto_int16 corto_ser_item(corto_walk_opt* s, corto_value* v, void* userD
if (!corto_ser_appendColor(data, MEMBER)) goto finished;
if (!corto_buffer_append(&data->buffer, "%s", corto_idof(v->is.member.member))) goto finished;
if (!corto_ser_appendColor(data, CORTO_BOLD)) goto finished;
if (!corto_buffer_append(&data->buffer, "=")) goto finished;
if (!corto_buffer_append(&data->buffer, ":")) goto finished;
if (!corto_ser_appendColor(data, CORTO_NORMAL)) goto finished;
}
}
Expand Down Expand Up @@ -380,15 +378,20 @@ static corto_int16 corto_ser_object(corto_walk_opt* s, corto_value* v, void* use

if (corto_typeof(o)->kind != CORTO_PRIMITIVE) {
if (str) {
result = corto_alloc(strlen(str) + strlen(typeId) + 1);
uint32_t len = strlen(str);
result = corto_alloc(len + strlen(typeId) + 1);
if (str[0] == '{') {
str[0] = '[';
str[len - 1] = ']';
}
sprintf(result, "%s%s", typeId, str);
} else {
result = corto_strdup(typeId);
}
} else {
if (str) {
result = corto_alloc(strlen(str) + strlen(typeId) + 2 + 1);
sprintf(result, "%s{%s}", typeId, str);
sprintf(result, "%s[%s]", typeId, str);
} else {
corto_critical("failed to serialize value to string");
}
Expand Down
16 changes: 8 additions & 8 deletions test/store/src/Fullname.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
void test_Fullname_tc_anonymousAnonymous(
test_Fullname this)
{
corto_object o = corto_resolve(NULL, "list{int32}{10, 20, 30}");
corto_object o = corto_resolve(NULL, "list[int32][10, 20, 30]");
test_assert(o != NULL);
test_assert(corto_typeof(o)->kind == CORTO_COLLECTION);
corto_ll *l = o;
test_assertint(corto_ll_count(*l), 3);

test_assertstr(corto_fullpath(NULL, o), "list{int32,0}{10,20,30}");
test_assertstr(corto_fullpath(NULL, o), "list[int32,0][10,20,30]");
corto_int16 ret = corto_delete(o);
test_assert(ret == 0);

Expand All @@ -20,13 +20,13 @@ void test_Fullname_tc_anonymousAnonymous(
void test_Fullname_tc_anonymousCollection(
test_Fullname this)
{
corto_object o = corto_resolve(NULL, "test/IntList{10, 20, 30}");
corto_object o = corto_resolve(NULL, "test/IntList[10, 20, 30]");
test_assert(o != NULL);
test_assert(corto_typeof(o) == corto_type(test_IntList_o));
test_IntList *l = test_IntList(o);
test_assertint(corto_ll_count(*l), 3);

test_assertstr(corto_fullpath(NULL, o), "/test/IntList{10,20,30}");
test_assertstr(corto_fullpath(NULL, o), "/test/IntList[10,20,30]");
corto_int16 ret = corto_delete(o);
test_assert(ret == 0);

Expand All @@ -35,14 +35,14 @@ void test_Fullname_tc_anonymousCollection(
void test_Fullname_tc_anonymousComposite(
test_Fullname this)
{
corto_object o = corto_resolve(NULL, "test/Point{10, 20}");
corto_object o = corto_resolve(NULL, "test/Point[10, 20]");
test_assert(o != NULL);
test_assert(corto_typeof(o) == corto_type(test_Point_o));
test_Point *p = test_Point(o);
test_assertint(p->x, 10);
test_assertint(p->y, 20);

test_assertstr(corto_fullpath(NULL, o), "/test/Point{10,20}");
test_assertstr(corto_fullpath(NULL, o), "/test/Point[10,20]");
corto_int16 ret = corto_delete(o);
test_assert(ret == 0);

Expand All @@ -51,13 +51,13 @@ void test_Fullname_tc_anonymousComposite(
void test_Fullname_tc_anonymousPrimitive(
test_Fullname this)
{
corto_object o = corto_resolve(NULL, "int32{10}");
corto_object o = corto_resolve(NULL, "int32[10]");
test_assert(o != NULL);
test_assert(corto_typeof(o) == corto_type(corto_int32_o));
corto_int32 *p = o;
test_assertint(*p, 10);

test_assertstr(corto_fullpath(NULL, o), "int32{10}");
test_assertstr(corto_fullpath(NULL, o), "int32[10]");
corto_int16 ret = corto_delete(o);
test_assert(ret == 0);

Expand Down
Loading

0 comments on commit 76edd87

Please sign in to comment.