Skip to content

Commit

Permalink
Fix code generation for String(enum)
Browse files Browse the repository at this point in the history
Previously, the integer_to_string routines were called instead of
the enumeration case.
  • Loading branch information
sjoelund committed Dec 11, 2015
1 parent 9b84eda commit f5aa013
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 5 deletions.
16 changes: 14 additions & 2 deletions Compiler/Template/CodegenCFunctions.tpl
Expand Up @@ -4108,6 +4108,14 @@ template tempDecl(String ty, Text &varDecls)
newVar
end tempDecl;

template tempDeclArray(String ty, Text len, Text elts, Text &varDecls)
"Declares a temporary variable in varDecls and returns the name."
::=
let newVarIx = 'tmp<%System.tmpTick()%>'
let &varDecls += '<%ty%> <%newVarIx%>[<%len%>] = {<%elts%>};<%\n%>'
newVarIx
end tempDeclArray;

template tempDeclZero(String ty, Text &varDecls)
"Declares a temporary variable initialized to zero in varDecls and returns the name."
::=
Expand Down Expand Up @@ -5616,13 +5624,17 @@ template daeExpCall(Exp call, Context context, Text &preExp, Text &varDecls, Tex
let sExp = daeExp(s, context, &preExp, &varDecls, &auxFunction)
let minlenExp = daeExp(minlen, context, &preExp, &varDecls, &auxFunction)
let leftjustExp = daeExp(leftjust, context, &preExp, &varDecls, &auxFunction)
let typeStr = expTypeFromExpModelica(s)
let enumStr = (match typeof(s)
case T_ENUMERATION(__) then
let strs = names |> s => '"<%Util.escapeModelicaStringToCString(s)%>"' ; separator = ", "
', <%tempDeclArray("const char*", listLength(names), strs, &varDecls)%>')
let typeStr = (if enumStr then "enum" else expTypeFromExpModelica(s))
match typeStr
case "modelica_real" then
let &preExp += '<%tvar%> = <%typeStr%>_to_modelica_string(<%sExp%>, <%minlenExp%>, <%leftjustExp%>, 6);<%\n%>'
'<%tvar%>'
else
let &preExp += '<%tvar%> = <%typeStr%>_to_modelica_string(<%sExp%>, <%minlenExp%>, <%leftjustExp%>);<%\n%>'
let &preExp += '<%tvar%> = <%typeStr%>_to_modelica_string(<%sExp%><%enumStr%>, <%minlenExp%>, <%leftjustExp%>);<%\n%>'
'<%tvar%>'
end match

Expand Down
7 changes: 5 additions & 2 deletions SimulationRuntime/c/util/modelica_string.c
Expand Up @@ -231,9 +231,12 @@ modelica_string modelica_boolean_to_modelica_string(modelica_boolean b, modelica

/* Convert a modelica_enumeration to a modelica_string, used in String(b) */

modelica_string modelica_enumeration_to_modelica_string(modelica_integer nr,const modelica_string e[],modelica_integer minLen, modelica_boolean leftJustified)
modelica_string enum_to_modelica_string(modelica_integer nr, const char *e[],modelica_integer minLen, modelica_boolean leftJustified)
{
return mmc_mk_scon(e[nr-1]);
size_t sz = snprintf(NULL, 0, leftJustified ? "%-*s" : "%*s", (int) minLen, e[nr-1]);
void *res = alloc_modelica_string(sz);
sprintf(MMC_STRINGDATA(res), leftJustified ? "%-*s" : "%*s", (int) minLen, e[nr-1]);
return res;
}

modelica_string alloc_modelica_string(int length)
Expand Down
2 changes: 1 addition & 1 deletion SimulationRuntime/c/util/modelica_string.h
Expand Up @@ -59,7 +59,7 @@ extern modelica_string modelica_integer_to_modelica_string(modelica_integer i,
extern modelica_string modelica_boolean_to_modelica_string(modelica_boolean b,
modelica_integer minLen, modelica_boolean leftJustified);

extern modelica_string modelica_enumeration_to_modelica_string(modelica_integer nr, const modelica_string e[],
extern modelica_string enum_to_modelica_string(modelica_integer nr, const char *e[],
modelica_integer minLen, modelica_boolean leftJustified);

/* Escape string */
Expand Down

0 comments on commit f5aa013

Please sign in to comment.