Skip to content

Commit a83b51b

Browse files
committed
fix for ticket:5696
- allow both -override and -override file - warn if the same variable is overrided twice - add test
1 parent f1e7129 commit a83b51b

File tree

3 files changed

+118
-27
lines changed

3 files changed

+118
-27
lines changed

OMCompiler/SimulationRuntime/c/simulation/simulation_input_xml.c

Lines changed: 63 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -932,13 +932,13 @@ void doOverride(omc_ModelInput *mi, MODEL_DATA *modelData, const char *override,
932932
omc_CommandLineOverrides *mOverrides = NULL;
933933
omc_CommandLineOverridesUses *mOverridesUses = NULL, *it = NULL, *ittmp = NULL;
934934
mmc_sint_t i;
935-
char* overrideStr = NULL;
935+
char* overrideStr1 = NULL, *overrideStr2 = NULL, *overrideStr = NULL;
936936
if((override != NULL) && (overrideFile != NULL)) {
937-
throwStreamPrint(NULL, "simulation_input_xml.c: usage error you cannot have both -override and -overrideFile active at the same time. see Model -? for more info!");
937+
infoStreamPrint(LOG_SOLVER, 0, "using -override=%s and -overrideFile=%s", override, overrideFile);
938938
}
939939

940940
if(override != NULL) {
941-
overrideStr = strdup(override);
941+
overrideStr1 = strdup(override);
942942
}
943943

944944
if(overrideFile != NULL) {
@@ -955,7 +955,6 @@ void doOverride(omc_ModelInput *mi, MODEL_DATA *modelData, const char *override,
955955
throwStreamPrint(NULL, "simulation_input_xml.c: could not open the file given to -overrideFile=%s", overrideFile);
956956
}
957957

958-
free(overrideStr);
959958
fseek(infile, 0L, SEEK_END);
960959
n = ftell(infile);
961960
line = (char*) malloc(n+1);
@@ -969,7 +968,7 @@ void doOverride(omc_ModelInput *mi, MODEL_DATA *modelData, const char *override,
969968
line[n] = '\0';
970969
overrideLine = (char*) malloc(n+1);
971970
overrideLine[0] = '\0';
972-
overrideStr = overrideLine;
971+
overrideStr2 = overrideLine;
973972
tline = line;
974973

975974
/* get the lines */
@@ -979,7 +978,7 @@ void doOverride(omc_ModelInput *mi, MODEL_DATA *modelData, const char *override,
979978
tline = trim(tline);
980979
// if is comment //, ignore line
981980
if (tline[0] && tline[0] != '/' && tline[1] != '/') {
982-
if (overrideLine != overrideStr) {
981+
if (overrideLine != overrideStr2) {
983982
overrideLine[0] = ',';
984983
++overrideLine;
985984
}
@@ -991,33 +990,71 @@ void doOverride(omc_ModelInput *mi, MODEL_DATA *modelData, const char *override,
991990
free(line);
992991
}
993992

994-
if (overrideStr != NULL) {
995-
char *value, *p;
993+
if (overrideStr1 != NULL || overrideStr2 != NULL) {
994+
char *value, *p, *ov;
996995
const char *strs[] = {"solver","startTime","stopTime","stepSize","tolerance","outputFormat","variableFilter"};
997996
/* read override values */
998-
infoStreamPrint(LOG_SOLVER, 0, "read override values: %s", overrideStr);
997+
infoStreamPrint(LOG_SOLVER, 0, "-override=%s", overrideStr1 ? overrideStr1 : "[not given]");
998+
infoStreamPrint(LOG_SOLVER, 0, "-overrideFile=%s", overrideStr2 ? overrideStr2 : "[not given]");
999999
/* fix overrideStr to contain | instead of , for splitting */
1000-
parseVariableStr(overrideStr);
1001-
p = strtok(overrideStr, "!");
1002-
1003-
while (p) {
1004-
// split it key = value => map[key]=value
1005-
value = strchr(p, '=');
1006-
if (*value == '\0') {
1007-
warningStreamPrint(LOG_SOLVER, 0, "failed to parse override string %s", p);
1000+
if (overrideStr1)
1001+
{
1002+
parseVariableStr(overrideStr1);
1003+
p = strtok(overrideStr1, "!");
1004+
1005+
while (p) {
1006+
// split it key = value => map[key]=value
1007+
value = strchr(p, '=');
1008+
if (*value == '\0') {
1009+
warningStreamPrint(LOG_SOLVER, 0, "failed to parse override string %s", p);
1010+
p = strtok(NULL, "!");
1011+
}
1012+
*value = '\0';
1013+
value++;
1014+
// map[key]=value
1015+
// check if we already overrided this variable
1016+
ov = (char*)findHashStringStringNull(mOverrides, p);
1017+
if (ov)
1018+
{
1019+
warningStreamPrint(LOG_STDOUT, 0, "You are overriding variable: %s=%s again with %s=%s.", p, ov, p, value);
1020+
}
1021+
addHashStringString(&mOverrides, p, value);
1022+
addHashStringLong(&mOverridesUses, p, OMC_OVERRIDE_UNUSED);
1023+
1024+
// move to next
10081025
p = strtok(NULL, "!");
10091026
}
1010-
*value = '\0';
1011-
value++;
1012-
// map[key]=value
1013-
addHashStringString(&mOverrides, p, value);
1014-
addHashStringLong(&mOverridesUses, p, OMC_OVERRIDE_UNUSED);
1015-
1016-
// move to next
1017-
p = strtok(NULL, "!");
1027+
free(overrideStr1);
10181028
}
10191029

1020-
free(overrideStr);
1030+
if (overrideStr2)
1031+
{
1032+
parseVariableStr(overrideStr2);
1033+
p = strtok(overrideStr2, "!");
1034+
1035+
while (p) {
1036+
// split it key = value => map[key]=value
1037+
value = strchr(p, '=');
1038+
if (*value == '\0') {
1039+
warningStreamPrint(LOG_SOLVER, 0, "failed to parse override string %s", p);
1040+
p = strtok(NULL, "!");
1041+
}
1042+
*value = '\0';
1043+
value++;
1044+
// map[key]=value
1045+
ov = (char*)findHashStringStringNull(mOverrides, p);
1046+
if (ov)
1047+
{
1048+
warningStreamPrint(LOG_STDOUT, 0, "You are overriding variable: %s=%s again with %s=%s.", p, ov, p, value);
1049+
}
1050+
addHashStringString(&mOverrides, p, value);
1051+
addHashStringLong(&mOverridesUses, p, OMC_OVERRIDE_UNUSED);
1052+
1053+
// move to next
1054+
p = strtok(NULL, "!");
1055+
}
1056+
free(overrideStr2);
1057+
}
10211058

10221059
// now we have all overrides in mOverrides, override mi now
10231060
for (i=0; i<sizeof(strs)/sizeof(char*); i++) {

testsuite/openmodelica/interactive-API/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ Ticket5506.mos \
8080
Ticket5548.mos \
8181
Ticket5571.mos \
8282
Ticket5565.mos \
83-
Ticket5680.mos
83+
Ticket5680.mos \
84+
Ticket5696.mos
8485

8586

8687
# test that currently fail. Move up when fixed.
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// name: Ticket5696.mos
2+
// keywords:
3+
// status: correct
4+
//
5+
// Tests if you can use both -override and -overrideFile at the same time
6+
// teardown_command: rm -rf TestOverride* logOverride.txt override.txt
7+
//
8+
9+
loadString("
10+
model TestOverride
11+
parameter Real a = 1;
12+
parameter Real b = 2;
13+
parameter Real c = 3;
14+
parameter Real d = 3;
15+
Real x(start=a, fixed=true);
16+
equation
17+
der(x) = b*c*d*x;
18+
end TestOverride;
19+
"); getErrorString();
20+
21+
buildModel(TestOverride); getErrorString();
22+
23+
writeFile("override.txt",
24+
"
25+
b=5
26+
c=6
27+
"); getErrorString();
28+
writeFile("logOverride.txt", ""); getErrorString();
29+
system("./TestOverride -override=stopTime=0,b=1 -overrideFile=override.txt -lv=LOG_ALL | grep overrid", "logOverride.txt"); getErrorString();
30+
readFile("logOverride.txt"); getErrorString();
31+
32+
// Result:
33+
// true
34+
// ""
35+
// {"TestOverride","TestOverride_init.xml"}
36+
// ""
37+
// true
38+
// ""
39+
// true
40+
// ""
41+
// 0
42+
// ""
43+
// "LOG_SOLVER | info | using -override=stopTime=0,b=1 and -overrideFile=override.txt
44+
// LOG_SOLVER | info | read override values from file: override.txt
45+
// LOG_SOLVER | info | -override=stopTime=0,b=1
46+
// LOG_SOLVER | info | -overrideFile=b=5,c=6
47+
// stdout | warning | You are overriding variable: b=1 again with b=5.
48+
// LOG_SOLVER | info | override b = 5
49+
// LOG_SOLVER | info | override c = 6
50+
// LOG_SOLVER | info | override done!
51+
// "
52+
// ""
53+
// endResult

0 commit comments

Comments
 (0)