Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit cbe247e

Browse files
sjoelundOpenModelica-Hudson
authored andcommitted
Handle indexed assignment of string arrays
Synchronize the indexed assignment function for string arrays to match the other types. Also refactored the code shared by indexed assignment and allocation functions. This fixes ticket:4705. Belonging to [master]: - #2102
1 parent fe5c35d commit cbe247e

File tree

7 files changed

+99
-238
lines changed

7 files changed

+99
-238
lines changed

SimulationRuntime/c/util/base_array.c

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,3 +375,67 @@ void clone_reverse_base_array_spec(const base_array_t* source, base_array_t* des
375375
dest->dim_size[i] = source->dim_size[dest->ndims - 1 - i];
376376
}
377377
}
378+
379+
void index_alloc_base_array_size(const real_array_t * source,
380+
const index_spec_t* source_spec,
381+
base_array_t* dest)
382+
{
383+
int i;
384+
int j;
385+
386+
omc_assert_macro(base_array_ok(source));
387+
omc_assert_macro(index_spec_ok(source_spec));
388+
omc_assert_macro(index_spec_fit_base_array(source_spec, source));
389+
390+
for(i = 0, j = 0; i < source_spec->ndims; ++i) {
391+
if(source_spec->dim_size[i] != 0) { /* is 'W' or 'A' */
392+
++j;
393+
}
394+
}
395+
dest->ndims = j;
396+
dest->dim_size = size_alloc(dest->ndims);
397+
398+
for(i = 0, j = 0; i < source_spec->ndims; ++i) {
399+
if(source_spec->dim_size[i] != 0) { /* is 'W' or 'A' */
400+
if(source_spec->index[i] != NULL) { /* is 'A' */
401+
dest->dim_size[j] = source_spec->dim_size[i];
402+
} else { /* is 'W' */
403+
dest->dim_size[j] = source->dim_size[i];
404+
}
405+
406+
++j;
407+
}
408+
}
409+
}
410+
411+
void indexed_assign_base_array_size_alloc(const base_array_t *source, base_array_t *dest, const index_spec_t *dest_spec, _index_t** _idx_vec1, _index_t** _idx_size)
412+
{
413+
_index_t* idx_vec1;
414+
_index_t* idx_size;
415+
int i, j;
416+
omc_assert_macro(base_array_ok(source));
417+
omc_assert_macro(base_array_ok(dest));
418+
omc_assert_macro(index_spec_ok(dest_spec));
419+
omc_assert_macro(index_spec_fit_base_array(dest_spec, dest));
420+
for(i = 0,j = 0; i < dest_spec->ndims; ++i) {
421+
if(dest_spec->dim_size[i] != 0) {
422+
++j;
423+
}
424+
}
425+
omc_assert_macro(j == source->ndims);
426+
427+
idx_vec1 = size_alloc(dest->ndims);
428+
idx_size = size_alloc(dest_spec->ndims);
429+
430+
for(i = 0; i < dest_spec->ndims; ++i) {
431+
idx_vec1[i] = 0;
432+
433+
if(dest_spec->index[i] != NULL) { /* is 'S' or 'A' */
434+
idx_size[i] = imax(dest_spec->dim_size[i],1);
435+
} else { /* is 'W' */
436+
idx_size[i] = dest->dim_size[i];
437+
}
438+
}
439+
*_idx_vec1 = idx_vec1;
440+
*_idx_size = idx_size;
441+
}

SimulationRuntime/c/util/base_array.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,9 @@ size_t calc_base_index_dims_subs(int ndims,...);
104104

105105
int index_spec_fit_base_array(const index_spec_t *s, const base_array_t *a);
106106

107+
/* Helper function for index_alloc_TYPE_array; allocates the ndims and dim_size */
108+
void index_alloc_base_array_size(const base_array_t * source, const index_spec_t* source_spec, base_array_t* dest);
109+
/* Helper function for indexed_assign_TYPE_array; allocates the ndims and dim_size */
110+
void indexed_assign_base_array_size_alloc(const base_array_t *source, base_array_t *dest, const index_spec_t *dest_spec, _index_t** _idx_vec1, _index_t** _idx_size);
111+
107112
#endif /* BASE_ARRAY_H_ */

SimulationRuntime/c/util/boolean_array.c

Lines changed: 8 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
#include "boolean_array.h"
3333
#include "gc/omc_gc.h"
34+
#include "omc_error.h"
3435

3536
#include <stdio.h>
3637
#include <stdlib.h>
@@ -306,44 +307,20 @@ void simple_indexed_assign_boolean_array2(const boolean_array_t* source,
306307
void indexed_assign_boolean_array(const boolean_array_t source, boolean_array_t* dest,
307308
const index_spec_t* dest_spec)
308309
{
309-
_index_t* idx_vec1;
310-
_index_t* idx_size;
311-
int i,j;
312-
313-
assert(base_array_ok(&source));
314-
assert(base_array_ok(dest));
315-
assert(index_spec_ok(dest_spec));
316-
assert(index_spec_fit_base_array(dest_spec, dest));
317-
for(i = 0,j = 0; i < dest_spec->ndims; ++i) {
318-
if(dest_spec->dim_size[i] != 0) {
319-
++j;
320-
}
321-
}
322-
assert(j == source.ndims);
323-
324-
idx_vec1 = size_alloc(dest->ndims);
325-
idx_size = size_alloc(dest_spec->ndims);
326-
327-
for(i = 0; i < dest_spec->ndims; ++i) {
328-
idx_vec1[i] = 0;
329-
330-
if(dest_spec->index[i] != NULL) { /* is 'S' or 'A' */
331-
idx_size[i] = imax(dest_spec->dim_size[i],1);
332-
} else { /* is 'W' */
333-
idx_size[i] = dest->dim_size[i];
334-
}
335-
}
310+
_index_t* idx_vec1, idx_size;
311+
int j;
312+
indexed_assign_base_array_size_alloc(&source, dest, dest_spec, &idx_vec1, &idx_size);
336313

337314
j = 0;
338315
do {
339316
boolean_set(dest,
340-
calc_base_index_spec(dest->ndims, idx_vec1, dest, dest_spec),
341-
boolean_get(source, j));
317+
calc_base_index_spec(dest->ndims, idx_vec1, dest, dest_spec),
318+
boolean_get(source, j));
342319
j++;
343320

344321
} while(0 == next_index(dest_spec->ndims, idx_vec1, idx_size));
345322

346-
assert(j == base_array_nr_of_elements(source));
323+
omc_assert_macro(j == base_array_nr_of_elements(source));
347324
}
348325

349326
/*
@@ -428,33 +405,7 @@ void index_alloc_boolean_array(const boolean_array_t* source,
428405
const index_spec_t* source_spec,
429406
boolean_array_t* dest)
430407
{
431-
int i;
432-
int j;
433-
434-
assert(base_array_ok(source));
435-
assert(index_spec_ok(source_spec));
436-
assert(index_spec_fit_base_array(source_spec, source));
437-
438-
for(i = 0, j = 0; i < source_spec->ndims; ++i) {
439-
if(source_spec->dim_size[i] != 0) { /* is 'W' or 'A' */
440-
++j;
441-
}
442-
}
443-
dest->ndims = j;
444-
dest->dim_size = size_alloc(dest->ndims);
445-
446-
for(i = 0, j = 0; i < source_spec->ndims; ++i) {
447-
if(source_spec->dim_size[i] != 0) { /* is 'W' or 'A' */
448-
if(source_spec->index[i] != NULL) { /* is 'A' */
449-
dest->dim_size[j] = source_spec->dim_size[i];
450-
} else { /* is 'W' */
451-
dest->dim_size[j] = source->dim_size[i];
452-
}
453-
454-
++j;
455-
}
456-
}
457-
408+
index_alloc_base_array_size(source, source_spec, dest);
458409
alloc_boolean_array_data(dest);
459410
index_boolean_array(source, source_spec, dest);
460411
}

SimulationRuntime/c/util/integer_array.c

Lines changed: 4 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -302,33 +302,9 @@ void simple_indexed_assign_integer_array2(const integer_array_t * source,
302302
void indexed_assign_integer_array(const integer_array_t source, integer_array_t* dest,
303303
const index_spec_t* dest_spec)
304304
{
305-
_index_t* idx_vec1;
306-
_index_t* idx_size;
307-
int i,j;
308-
309-
omc_assert_macro(base_array_ok(&source));
310-
omc_assert_macro(base_array_ok(dest));
311-
omc_assert_macro(index_spec_ok(dest_spec));
312-
omc_assert_macro(index_spec_fit_base_array(dest_spec, dest));
313-
for(i = 0,j = 0; i < dest_spec->ndims; ++i) {
314-
if(dest_spec->dim_size[i] != 0) {
315-
++j;
316-
}
317-
}
318-
omc_assert_macro(j == source.ndims);
319-
320-
idx_vec1 = size_alloc(dest->ndims);
321-
idx_size = size_alloc(dest_spec->ndims);
322-
323-
for(i = 0; i < dest_spec->ndims; ++i) {
324-
idx_vec1[i] = 0;
325-
326-
if(dest_spec->index[i] != NULL) { /* is 'S' or 'A' */
327-
idx_size[i] = imax(dest_spec->dim_size[i],1);
328-
} else { /* is 'W' */
329-
idx_size[i] = dest->dim_size[i];
330-
}
331-
}
305+
_index_t* idx_vec1, idx_size;
306+
int j;
307+
indexed_assign_base_array_size_alloc(&source, dest, dest_spec, &idx_vec1, &idx_size);
332308

333309
j = 0;
334310
do {
@@ -424,34 +400,7 @@ void index_alloc_integer_array(const integer_array_t * source,
424400
const index_spec_t* source_spec,
425401
integer_array_t* dest)
426402
{
427-
int i;
428-
int j;
429-
430-
omc_assert_macro(base_array_ok(source));
431-
omc_assert_macro(index_spec_ok(source_spec));
432-
omc_assert_macro(index_spec_fit_base_array(source_spec,source));
433-
434-
435-
for(i = 0, j = 0; i < source_spec->ndims; ++i) {
436-
if(source_spec->dim_size[i] != 0) { /* is 'W' or 'A' */
437-
++j;
438-
}
439-
}
440-
dest->ndims = j;
441-
dest->dim_size = size_alloc(dest->ndims);
442-
443-
for(i = 0, j = 0; i < source_spec->ndims; ++i) {
444-
if(source_spec->dim_size[i] != 0) { /* is 'W' or 'A' */
445-
if(source_spec->index[i] != NULL) { /* is 'A' */
446-
dest->dim_size[j] = source_spec->dim_size[i];
447-
} else { /* is 'W' */
448-
dest->dim_size[j] = source->dim_size[i];
449-
}
450-
451-
++j;
452-
}
453-
}
454-
403+
index_alloc_base_array_size(source, source_spec, dest);
455404
alloc_integer_array_data(dest);
456405
index_integer_array(source, source_spec, dest);
457406
}

SimulationRuntime/c/util/real_array.c

Lines changed: 4 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -279,33 +279,9 @@ void simple_indexed_assign_real_array2(const real_array_t * source,
279279
void indexed_assign_real_array(const real_array_t source, real_array_t* dest,
280280
const index_spec_t* dest_spec)
281281
{
282-
_index_t* idx_vec1;
283-
_index_t* idx_size;
284-
int i,j;
285-
286-
omc_assert_macro(base_array_ok(&source));
287-
omc_assert_macro(base_array_ok(dest));
288-
omc_assert_macro(index_spec_ok(dest_spec));
289-
omc_assert_macro(index_spec_fit_base_array(dest_spec, dest));
290-
for(i = 0,j = 0; i < dest_spec->ndims; ++i) {
291-
if(dest_spec->dim_size[i] != 0) {
292-
++j;
293-
}
294-
}
295-
omc_assert_macro(j == source.ndims);
296-
297-
idx_vec1 = size_alloc(dest->ndims);
298-
idx_size = size_alloc(dest_spec->ndims);
299-
300-
for(i = 0; i < dest_spec->ndims; ++i) {
301-
idx_vec1[i] = 0;
302-
303-
if(dest_spec->index[i] != NULL) { /* is 'S' or 'A' */
304-
idx_size[i] = imax(dest_spec->dim_size[i],1);
305-
} else { /* is 'W' */
306-
idx_size[i] = dest->dim_size[i];
307-
}
308-
}
282+
_index_t* idx_vec1, idx_size;
283+
int j;
284+
indexed_assign_base_array_size_alloc(&source, dest, dest_spec, &idx_vec1, &idx_size);
309285

310286
j = 0;
311287
do {
@@ -413,33 +389,7 @@ void index_alloc_real_array(const real_array_t * source,
413389
const index_spec_t* source_spec,
414390
real_array_t* dest)
415391
{
416-
int i;
417-
int j;
418-
419-
omc_assert_macro(base_array_ok(source));
420-
omc_assert_macro(index_spec_ok(source_spec));
421-
omc_assert_macro(index_spec_fit_base_array(source_spec, source));
422-
423-
for(i = 0, j = 0; i < source_spec->ndims; ++i) {
424-
if(source_spec->dim_size[i] != 0) { /* is 'W' or 'A' */
425-
++j;
426-
}
427-
}
428-
dest->ndims = j;
429-
dest->dim_size = size_alloc(dest->ndims);
430-
431-
for(i = 0, j = 0; i < source_spec->ndims; ++i) {
432-
if(source_spec->dim_size[i] != 0) { /* is 'W' or 'A' */
433-
if(source_spec->index[i] != NULL) { /* is 'A' */
434-
dest->dim_size[j] = source_spec->dim_size[i];
435-
} else { /* is 'W' */
436-
dest->dim_size[j] = source->dim_size[i];
437-
}
438-
439-
++j;
440-
}
441-
}
442-
392+
index_alloc_base_array_size(source, source_spec, dest);
443393
alloc_real_array_data(dest);
444394
index_real_array(source, source_spec, dest);
445395
}

0 commit comments

Comments
 (0)