Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
- Add support for functions returning arrays of strings


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@11265 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
sjoelund committed Mar 2, 2012
1 parent 8fe5164 commit f0cdf47
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 0 deletions.
28 changes: 28 additions & 0 deletions Compiler/susan_codegen/SimCode/CodegenC.tpl
Expand Up @@ -3468,6 +3468,34 @@ match var
case var as VARIABLE(ty = T_STRING(__)) then
if not acceptMetaModelicaGrammar() then
// We need to strdup() all strings, then allocate them on the memory pool again, then free the temporary string
if instDims then
let instDimsInit = (instDims |> exp =>
daeExp(exp, contextFunction, &varInits /*BUFC*/, &varDecls /*BUFD*/)
;separator=", ")
let loopVar = tempDecl("long", &varDecls)
let sz = tempDecl("long", &varDecls)
let strVar = tempDecl("modelica_string_t *", &varDecls)
let &varCopy += '<%sz%> = base_array_nr_of_elements(&<%contextCref(var.name,contextFunction)%>);<%\n%>'
let &varCopy +=
<<
<%strVar%> = (modelica_string_t*) malloc(<%sz%>*sizeof(modelica_string_t));
for (<%loopVar%>=0;<%loopVar%><<%sz%>;<%loopVar%>++) {
<%strVar%>[<%loopVar%>] = strdup(string_get(&<%contextCref(var.name,contextFunction)%>,<%loopVar%>));<%\n%>
}
<%\n%>>>
let destTarget = '(&<%dest%>.targ<%ix%>)'
let &varInits += 'alloc_<%expTypeShort(var.ty)%>_array(<%destTarget%>, <%listLength(instDims)%>, <%instDimsInit%>);<%\n%>'
// let &varAssign += 'copy_<%expTypeShort(var.ty)%>_array_data(&<%contextCref(var.name,contextFunction)%>, &<%dest%>.targ<%ix%>);<%\n%>'
let &varAssign +=
<<
for (<%loopVar%>=0;<%loopVar%><<%sz%>;<%loopVar%>++) {
((modelica_string_t*) <%destTarget%>->data)[<%loopVar%>] = init_modelica_string(<%strVar%>[<%loopVar%>]);
free(<%strVar%>[<%loopVar%>]);<%\n%>
}
free(<%strVar%>);<%\n%>
>>
""
else
let strVar = tempDecl("modelica_string_t", &varDecls)
let &varCopy += '<%strVar%> = strdup(<%contextCref(var.name,contextFunction)%>);<%\n%>'
let &varAssign +=
Expand Down
15 changes: 15 additions & 0 deletions SimulationRuntime/c/util/string_array.c
Expand Up @@ -937,3 +937,18 @@ void convert_alloc_string_array_from_f77(const string_array_t * a,
}
transpose_string_array(a, dest);
}

void fill_alloc_string_array(string_array_t* dest, modelica_string value, int ndims, ...)
{
size_t i;
size_t elements = 0;
va_list ap;
va_start(ap, ndims);
elements = alloc_base_array(dest, ndims, ap);
va_end(ap);
dest->data = string_alloc(0,elements);

for(i = 0; i < elements; ++i) {
string_set(dest, i, value);
}
}
2 changes: 2 additions & 0 deletions SimulationRuntime/c/util/string_array.h
Expand Up @@ -176,4 +176,6 @@ extern void convert_alloc_string_array_to_f77(const string_array_t * a,
extern void convert_alloc_string_array_from_f77(const string_array_t * a,
string_array_t* dest);

extern void fill_alloc_real_array(real_array_t* dest, modelica_real value, int ndims, ...);

#endif

0 comments on commit f0cdf47

Please sign in to comment.