Skip to content

Commit 29c0703

Browse files
committed
multi dimensional arrays WIP
1 parent 339007c commit 29c0703

6 files changed

Lines changed: 11 additions & 9 deletions

File tree

src/ps_array.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ ps_array_data *ps_array_alloc(const ps_symbol *array_type)
2121
ps_array_data *array_data = ps_memory_malloc(PS_MEMORY_VALUE, sizeof(ps_array_data));
2222
if (array_data == NULL)
2323
return NULL;
24-
array_data->count = ps_type_definition_get_subrange_count(type_def->def.a.subrange->value->data.t);
24+
array_data->count = ps_type_definition_get_subrange_count(type_def->def.a.subranges[0]->value->data.t);
2525
if (ps_array_debug)
2626
fprintf(stderr, " DEBUG\tps_array_alloc, size: %u * %zu = %zu\n", array_data->count, sizeof(ps_value_data),
2727
array_data->count * sizeof(ps_value_data));
@@ -87,7 +87,7 @@ ps_symbol *ps_array_get_subrange(const ps_symbol *array_type)
8787
ps_type_definition_debug(stderr, "GET_SUBRANGE\tTYPE_DEF\t", type_def);
8888
if (type_def == NULL)
8989
return NULL;
90-
ps_symbol *subrange = type_def->def.a.subrange;
90+
ps_symbol *subrange = type_def->def.a.subranges[0];
9191
if (ps_array_debug)
9292
ps_symbol_debug(stderr, "GET_SUBRANGE\tSUBRANGE\t", subrange);
9393
return subrange;
@@ -113,7 +113,7 @@ ps_error ps_array_get_value(const ps_symbol *array_var, const ps_value *index, p
113113
const ps_type_definition *type_def = array_var->value->type->value->data.t;
114114
if (ps_array_debug)
115115
ps_type_definition_debug(stderr, "*** ps_array_get_value, type_def: ", type_def);
116-
ps_unsigned offset = ps_type_definition_get_subrange_offset(type_def->def.a.subrange->value->data.t, index);
116+
ps_unsigned offset = ps_type_definition_get_subrange_offset(type_def->def.a.subranges[0]->value->data.t, index);
117117
if (offset >= array_var->value->data.a->count)
118118
return PS_ERROR_OUT_OF_RANGE;
119119
ps_value array_value = {.allocated = false,

src/ps_functions.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ ps_error ps_function_low_or_high_type(ps_interpreter *interpreter, ps_symbol *ty
294294
low ? ps_system_constant_boolean_true.value->data.b : ps_system_constant_boolean_false.value->data.b;
295295
break;
296296
case PS_TYPE_ARRAY:
297-
ps_symbol *subrange = type_def->def.a.subrange;
297+
ps_symbol *subrange = type_def->def.a.subranges[0];
298298
if (debug)
299299
ps_symbol_debug(stderr, "ps_function_low/high, array subrange: ", subrange);
300300
return ps_function_low_or_high_type(interpreter, subrange, result, low);

src/ps_type_definition.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ ps_type_definition *ps_type_definition_create_array(ps_symbol *dimension)
121121
ps_type_definition *type_def = ps_type_definition_alloc(PS_TYPE_ARRAY, PS_TYPE_ARRAY);
122122
if (type_def == NULL)
123123
return NULL;
124-
type_def->def.a.subrange = dimension;
124+
type_def->def.a.subranges[0] = dimension;
125125
return type_def;
126126
}
127127

@@ -297,7 +297,7 @@ char *ps_type_definition_get_name(const ps_type_definition *type_def)
297297
break;
298298
case PS_TYPE_ARRAY:
299299
// ARRAY[1..10] OF INTEGER => "ARRAY(SUBRANGE, INTEGER)"
300-
snprintf(buffer, sizeof(buffer) - 1, "ARRAY(%s, %s)", type_def->def.a.subrange->name,
300+
snprintf(buffer, sizeof(buffer) - 1, "ARRAY(%s, %s)", type_def->def.a.subranges[0]->name,
301301
type_def->def.a.item_type->name);
302302
break;
303303
default:

src/ps_value.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ char *ps_value_to_string(const ps_value *value, bool debug, int16_t width, int16
448448
EXECUTABLE_VALUE
449449
break;
450450
case PS_TYPE_ARRAY:
451-
snprintf(buffer, sizeof(buffer) - 1, "ARRAY[%s] OF %s", value->type->value->data.t->def.a.subrange->name,
451+
snprintf(buffer, sizeof(buffer) - 1, "ARRAY[%s] OF %s", value->type->value->data.t->def.a.subranges[0]->name,
452452
value->type->value->data.t->def.a.item_type->name);
453453
break;
454454
case PS_TYPE_POINTER:

src/ps_visit_statement.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ bool ps_visit_assignment_array(ps_interpreter *interpreter, ps_interpreter_mode
9595

9696
EXPECT_TOKEN(PS_TOKEN_LEFT_BRACKET)
9797
READ_NEXT_TOKEN
98-
index.type = variable->value->type->value->data.t->def.a.subrange;
98+
index.type = variable->value->type->value->data.t->def.a.subranges[0];
9999
if (!ps_visit_expression(interpreter, mode, &index))
100100
TRACE_ERROR("INDEX")
101101
EXPECT_TOKEN(PS_TOKEN_RIGHT_BRACKET)

src/ps_visit_type.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,9 @@ bool ps_visit_type_reference_array(ps_interpreter *interpreter, ps_interpreter_m
661661
ps_type_definition_free(type_def);
662662
RETURN_ERROR(PS_ERROR_OUT_OF_MEMORY);
663663
}
664-
memccpy(type_def->def.a.subranges, subranges, dimensions * sizeof(ps_symbol *));
664+
for (int i = 0; i <= dimensions; i++) {
665+
type_def->def.a.subranges[i] = subranges[i];
666+
}
665667
type_def->def.a.item_type = item_type;
666668
type_def->def.a.dimensions = dimensions;
667669
// Register new type definition in symbol table

0 commit comments

Comments
 (0)