Skip to content

Commit

Permalink
- Added scanReal ceval
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@11662 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
sjoelund committed Apr 4, 2012
1 parent 754b7f9 commit 9ee95e0
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 1 deletion.
14 changes: 13 additions & 1 deletion Compiler/FrontEnd/Ceval.mo
Expand Up @@ -1559,6 +1559,8 @@ algorithm
case ("ModelicaInternal_print") then ();
case ("ModelicaInternal_countLines") then ();
case ("ModelicaInternal_readLine") then ();
case ("ModelicaStrings_scanReal") then ();
case ("ModelicaStrings_skipWhiteSpace") then ();
case ("ModelicaError") then ();
end match;
end isKnownExternalFunc;
Expand Down Expand Up @@ -1641,7 +1643,7 @@ protected function cevalKnownExternalFuncs2 "Helper function to cevalKnownExtern
algorithm
outValue := match (id,inValuesValueLst,inMsg)
local
Real rv_1,rv,rv1,rv2,sv,cv;
Real rv_1,rv,rv1,rv2,sv,cv,r;
String str,fileName;
Integer start, stop, i, lineNumber;
Boolean b;
Expand Down Expand Up @@ -1746,6 +1748,16 @@ algorithm
(str,b) = ModelicaExternalC.Streams_readLine(fileName,lineNumber);
then Values.TUPLE({Values.STRING(str),Values.BOOL(b)});

case ("ModelicaStrings_scanReal",{Values.STRING(str),Values.INTEGER(i),Values.BOOL(b)},_)
equation
(i,r) = ModelicaExternalC.Strings_advanced_scanReal(str,i,b);
then Values.TUPLE({Values.INTEGER(i),Values.REAL(r)});

case ("ModelicaInternal_skipWhiteSpace",{Values.STRING(str),Values.INTEGER(i)},_)
equation
i = ModelicaExternalC.Strings_advanced_skipWhiteSpace(str,i);
then Values.INTEGER(i);

end match;
end cevalKnownExternalFuncs2;

Expand Down
20 changes: 20 additions & 0 deletions Compiler/Util/ModelicaExternalC.mo
Expand Up @@ -65,4 +65,24 @@ function Streams_close
external "C" ModelicaStreams_closeFile(fileName) annotation(Library="ModelicaExternalC");
end Streams_close;

function Strings_advanced_scanReal
input String string;
input Integer startIndex;
input Boolean unsigned;
output Integer nextIndex;
output Real number;

external "C" ModelicaStrings_scanReal(string,startIndex,unsigned,nextIndex,number) annotation(Library = "ModelicaExternalC");
end Strings_advanced_scanReal;


function Strings_advanced_skipWhiteSpace
input String string;
input Integer startIndex(min = 1) = 1;
output Integer nextIndex;

external "C" nextIndex = ModelicaStrings_skipWhiteSpace(string,startIndex) annotation(Library = "ModelicaExternalC");
end Strings_advanced_skipWhiteSpace;


end ModelicaExternalC;
24 changes: 24 additions & 0 deletions Compiler/runtime/ModelicaExternalC_rml.c
Expand Up @@ -35,6 +35,8 @@ void ModelicaInternal_print(const char*,const char*);
const char* ModelicaInternal_readLine(const char*,int,int*);
int ModelicaInternal_countLines(const char*);
void ModelicaStreams_closeFile(const char*);
void ModelicaStrings_scanReal(const char*,int,int,int*,double*);
int ModelicaStrings_skipWhiteSpace(const char*,int);

void ModelicaExternalC_5finit(void)
{
Expand Down Expand Up @@ -81,3 +83,25 @@ RML_BEGIN_LABEL(ModelicaExternalC__Streams_5fclose)
}
RML_END_LABEL

RML_BEGIN_LABEL(ModelicaExternalC__Strings_5fadvanced_5fscanReal)
{
char* str = RML_STRINGDATA(rmlA0);
int i = RML_UNTAGFIXNUM(rmlA1);
int unsign = RML_UNTAGFIXNUM(rmlA2);
int next_ix=0;
double val=0;
ModelicaStrings_scanReal(str,i,unsign,&next_ix,&val);
rmlA0 = mk_icon(next_ix);
rmlA1 = mk_rcon(val);
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

RML_BEGIN_LABEL(ModelicaExternalC__Strings_5fadvanced_5fskipWhiteSpace)
{
char* str = RML_STRINGDATA(rmlA0);
int i = RML_UNTAGFIXNUM(rmlA1);
rmlA0 = mk_icon(ModelicaStrings_skipWhiteSpace(str,i));
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

0 comments on commit 9ee95e0

Please sign in to comment.