@@ -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 ++ ) {
0 commit comments