Updated C code with new array handling

This commit is contained in:
Alexandre Paillier
2022-03-14 17:29:48 +01:00
parent 1bc8675473
commit 3b6c32d707

View File

@@ -19,16 +19,23 @@ typedef enum
// contract defined struct
TYPE_CUSTOM = 0,
// native types
TYPE_SOLIDITY_INT,
TYPE_SOLIDITY_UINT,
TYPE_SOLIDITY_ADDRESS,
TYPE_SOLIDITY_BOOL,
TYPE_SOLIDITY_STRING,
TYPE_SOLIDITY_BYTE,
TYPE_SOLIDITY_BYTES_FIX,
TYPE_SOLIDITY_BYTES_DYN
TYPE_SOL_INT,
TYPE_SOL_UINT,
TYPE_SOL_ADDRESS,
TYPE_SOL_BOOL,
TYPE_SOL_STRING,
TYPE_SOL_BYTE,
TYPE_SOL_BYTES_FIX,
TYPE_SOL_BYTES_DYN,
TYPES_COUNT
} e_type;
typedef enum
{
ARRAY_DYNAMIC = 0,
ARRAY_FIXED_SIZE
} e_array_type;
// APDUs INS
#define INS_STRUCT_DEF 0x18
@@ -85,7 +92,7 @@ bool set_struct_field(uint8_t *data)
// copy TypeSize
mem_buffer[mem_idx++] = data[data_idx++];
}
if ((type_desc & TYPE_MASK) == TYPE_CUSTOM)
else if ((type_desc & TYPE_MASK) == TYPE_CUSTOM)
{
len = data[data_idx++];
// copy custom struct name length
@@ -95,6 +102,26 @@ bool set_struct_field(uint8_t *data)
mem_idx += len;
data_idx += len;
}
if (type_desc & ARRAY_MASK)
{
len = data[data_idx++];
mem_buffer[mem_idx++] = len;
while (len-- > 0)
{
mem_buffer[mem_idx++] = data[data_idx];
switch (data[data_idx++])
{
case ARRAY_DYNAMIC: // nothing to do
break;
case ARRAY_FIXED_SIZE:
mem_buffer[mem_idx++] = data[data_idx++];
break;
default:
// should not be in here :^)
break;
}
}
}
// copy length
len = data[data_idx++];
@@ -111,6 +138,7 @@ void dump_mem(void)
uint8_t *mem = structs_array + 1;
uint8_t type_desc;
uint8_t fields_count;
uint8_t array_depth;
for (int i = 0; i < *structs_array; ++i)
{
@@ -131,9 +159,9 @@ void dump_mem(void)
mem += (1 + *mem);
if (type_desc & TYPESIZE_MASK) mem += 1;
break;
case TYPE_SOLIDITY_UINT:
case TYPE_SOL_UINT:
printf("u");
case TYPE_SOLIDITY_INT:
case TYPE_SOL_INT:
printf("int");
if (type_desc & TYPESIZE_MASK)
{
@@ -141,23 +169,23 @@ void dump_mem(void)
mem += 1;
}
break;
case TYPE_SOLIDITY_ADDRESS:
case TYPE_SOL_ADDRESS:
printf("address");
if (type_desc & TYPESIZE_MASK) mem += 1;
break;
case TYPE_SOLIDITY_BOOL:
case TYPE_SOL_BOOL:
printf("bool");
if (type_desc & TYPESIZE_MASK) mem += 1;
break;
case TYPE_SOLIDITY_STRING:
case TYPE_SOL_STRING:
printf("string");
if (type_desc & TYPESIZE_MASK) mem += 1;
break;
case TYPE_SOLIDITY_BYTE:
case TYPE_SOL_BYTE:
printf("byte");
if (type_desc & TYPESIZE_MASK) mem += 1;
break;
case TYPE_SOLIDITY_BYTES_FIX:
case TYPE_SOL_BYTES_FIX:
printf("bytes");
if (type_desc & TYPESIZE_MASK)
{
@@ -165,7 +193,7 @@ void dump_mem(void)
mem += 1;
}
break;
case TYPE_SOLIDITY_BYTES_DYN:
case TYPE_SOL_BYTES_DYN:
printf("bytes");
if (type_desc & TYPESIZE_MASK) mem += 1;
break;
@@ -173,7 +201,25 @@ void dump_mem(void)
// should not be in here :^)
break;
}
if (type_desc & ARRAY_MASK) printf("[]");
if (type_desc & ARRAY_MASK)
{
array_depth = *mem++;
while (array_depth-- > 0)
{
switch (*mem++)
{
case ARRAY_DYNAMIC:
printf("[]");
break;
case ARRAY_FIXED_SIZE:
printf("[%u]", *mem++);
break;
default:
// should not be in here :^)
break;
}
}
}
printf(" ");
fwrite(mem + 1, *mem, sizeof(*mem), stdout);
mem += (1 + *mem);