From: <sar...@us...> - 2014-07-28 08:46:04
|
Revision: 20928 http://sourceforge.net/p/sbml/code/20928 Author: sarahkeating Date: 2014-07-28 08:45:51 +0000 (Mon, 28 Jul 2014) Log Message: ----------- Merged revision(s) 20884-20927 from trunk/libsbml: Modified Paths: -------------- branches/libsbml-dev-l2v5-l3v2/src/bindings/matlab/OutputSBML.c branches/libsbml-dev-l2v5-l3v2/src/bindings/matlab/TranslateSBML.c branches/libsbml-dev-l2v5-l3v2/src/bindings/swig/swigdoc.py branches/libsbml-dev-l2v5-l3v2/src/sbml/SBase.cpp branches/libsbml-dev-l2v5-l3v2/src/sbml/math-legacy/ASTNode.cpp branches/libsbml-dev-l2v5-l3v2/src/sbml/math-legacy/MathML.cpp branches/libsbml-dev-l2v5-l3v2/src/sbml/test/TestRunner.c Property Changed: ---------------- branches/libsbml-dev-l2v5-l3v2/ Index: branches/libsbml-dev-l2v5-l3v2 =================================================================== --- branches/libsbml-dev-l2v5-l3v2 2014-07-28 08:43:57 UTC (rev 20927) +++ branches/libsbml-dev-l2v5-l3v2 2014-07-28 08:45:51 UTC (rev 20928) Property changes on: branches/libsbml-dev-l2v5-l3v2 ___________________________________________________________________ Modified: svn:mergeinfo ## -2,4 +2,4 ## /branches/libsbml-4:9056-10118 /branches/libsbml-5-conversion:14155-14227 /branches/libsbml-ast-plugin:16251-19654 -/trunk/libsbml:20289-20883 +/trunk/libsbml:20289-20927 \ No newline at end of property Modified: branches/libsbml-dev-l2v5-l3v2/src/bindings/matlab/OutputSBML.c =================================================================== --- branches/libsbml-dev-l2v5-l3v2/src/bindings/matlab/OutputSBML.c 2014-07-28 08:43:57 UTC (rev 20927) +++ branches/libsbml-dev-l2v5-l3v2/src/bindings/matlab/OutputSBML.c 2014-07-28 08:45:51 UTC (rev 20928) @@ -55,6 +55,108 @@ #endif + +#if defined(WIN32) && !defined(CYGWIN) && !defined(USE_OCTAVE) +#define FILE_CHAR wchar_t* +#define FILE_FOPEN(file) _wfopen(file, L"r") +#define USE_FILE_WCHAR 1 +#else +#define FILE_CHAR char* +#define FILE_FOPEN(file) fopen(file, "r") +#endif + +#ifndef uint16_t +#define uint16_t unsigned short +#endif + +FILE_CHAR readUnicodeString(const mxArray *prhs, mwSize length) +{ +#ifdef USE_OCTAVE + char* ansii = (char *) mxCalloc(length, sizeof(char)); + mxGetString(prhs, ansii, length); + return ansii; +#else + wchar_t* utf16 = (wchar_t *) mxCalloc(length, sizeof(wchar_t)); + char* utf8 = NULL; + uint16_T *ch = (uint16_T *) mxGetData(prhs); + wchar_t* p = utf16; + mwSize i; + for ( i = 0; i < length-1; ++i) + *p++ = *ch++; + *p = 0; + +#if USE_FILE_WCHAR + return utf16; +#else + + utf8 = (char*)mxCalloc(length*2, sizeof(char)); + + wcstombs(utf8, utf16, length*2); + + /*mxFree(utf16);*/ + + if (utf8 != NULL && strlen(utf8) == 0 && length > 0) + { + mexErrMsgTxt("This string uses characters that cannot be expressed in UTF8, please rename the file."); + } + + return utf8; +#endif /* USE_FILE_WCHAR */ + +#endif /* USE_OCTAVE*/ + +} + + +FILE_CHAR readUnicodeStringFromArrays(mxArray *mxFilename[2]) + +{ + mwSize nBuflen = (mxGetM(mxFilename[0])*mxGetN(mxFilename[0])+1); + FILE_CHAR pacTempString1 = readUnicodeString(mxFilename[0],nBuflen); + + mwSize nBufferLen = (mxGetM(mxFilename[1])*mxGetN(mxFilename[1])+1); + FILE_CHAR pacTempString2 = readUnicodeString(mxFilename[1],nBufferLen); + +#if USE_FILE_WCHAR + FILE_CHAR pacFilename = (wchar_t *) mxCalloc(nBufferLen+nBuflen, sizeof(wchar_t)); + wcscpy(pacFilename, pacTempString2); + wcscpy(pacFilename, pacTempString1); +#else + FILE_CHAR pacFilename = (char *) mxCalloc(nBufferLen+nBuflen, sizeof(char)); + strcpy(pacFilename, pacTempString2); + strcat(pacFilename, pacTempString1); +#endif + + /*mxFree(pacTempString1);*/ + /*mxFree(pacTempString2);*/ + return pacFilename; +} + +#if USE_FILE_WCHAR + +int endsWith(const wchar_t* fileName, const char* ext) +{ + size_t len = wcslen(fileName), i; + size_t targetLen = strlen(ext); + wchar_t* temp1 = (wchar_t*)mxCalloc(targetLen, sizeof(wchar_t)); + char* temp2 = (char*)mxCalloc(targetLen, sizeof(char)); + int result = 0; + + for (i = 0; i < targetLen; ++i) + { + temp1[i] = fileName[len - targetLen + i]; + } + + wcstombs(temp2,temp1, targetLen); + result = strcmp_insensitive(temp2, ext); + + /*mxFree(temp1);*/ + /*mxFree(temp2);*/ + return result; +} + +#endif + static char * timeSymbol = NULL; static char * delaySymbol = NULL; static char * avoSymbol = NULL; @@ -136,36 +238,37 @@ mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { - mxArray * mxCheckStructure[2]; - mxArray * mxFilename[2], * mxExt[1]; - int nStatus; - char *pacFilename = NULL, *pacTempString1 = NULL, *pacTempString2 = NULL; + mxArray * mxCheckStructure[2]; + mxArray * mxFilename[2], * mxExt[1]; + int nStatus; + FILE_CHAR pacFilename = NULL; + char *pacTempString1 = NULL, *pacTempString2 = NULL; size_t nBuflen, nBufferLen; - - SBMLDocument_t *sbmlDocument; + + SBMLDocument_t *sbmlDocument; SBMLNamespaces_t *ns; XMLNamespaces_t *xmlns; - Model_t *sbmlModel; + Model_t *sbmlModel; - mxArray * mxLevel, * mxVersion, * mxNotes, * mxAnnotations, * mxFBCVersion; + mxArray * mxLevel, * mxVersion, * mxNotes, * mxAnnotations, * mxFBCVersion; mxArray * mxName, * mxId, *mxNamespaces, *mxMetaid, *mxTimeSymbol; mxArray * mxSubstanceUnits, * mxTimeUnits, *mxLengthUnits, *mxAreaUnits; mxArray * mxVolumeUnits, * mxExtentUnits, *mxConversionFactor; mxArray * mxDelaySymbol, *mxAvoSymbol, *mxActiveObjective; - unsigned int nLevel, nVersion, nFBCVersion; - char * pacNotes, * pacAnnotations; + unsigned int nLevel, nVersion, nFBCVersion; + char * pacNotes, * pacAnnotations; char * pacName, * pacId, *pacMetaid; char * pacSubstanceUnits, * pacTimeUnits, *pacLengthUnits, *pacAreaUnits; char * pacVolumeUnits, * pacExtentUnits, *pacConversionFactor, *pacActiveObjective; int nSBOTerm; - + SBasePlugin_t * plugin; - mxArray * mxParameters, * mxCompartments, * mxFunctionDefinitions; + mxArray * mxParameters, * mxCompartments, * mxFunctionDefinitions; mxArray * mxUnitDefinitions, *mxSBOTerm; - mxArray * mxSpecies, * mxRules, * mxReactions, * mxEvents, * mxConstraints; - mxArray * mxSpeciesTypes, * mxCompartmentTypes, * mxInitialAssignments; + mxArray * mxSpecies, * mxRules, * mxReactions, * mxEvents, * mxConstraints; + mxArray * mxSpeciesTypes, * mxCompartmentTypes, * mxInitialAssignments; mxArray * mxFluxBounds, *mxObjectives, *mxFluxObjectives; unsigned int usingOctave = 0; mxArray * mxOctave[1]; @@ -176,136 +279,130 @@ /* determine whether we are in octave or matlab */ mexCallMATLAB(1, mxOctave, 0, NULL, "isoctave"); - + nBuflen = (mxGetM(mxOctave[0])*mxGetN(mxOctave[0])+1); pacTempString1 = (char *) mxCalloc(nBuflen, sizeof(char)); nStatus = mxGetString(mxOctave[0], pacTempString1, (mwSize)(nBuflen)); if (nStatus != 0) { - mexErrMsgTxt("Could not determine platform"); + mexErrMsgTxt("Could not determine platform"); } if (!(strcmp_insensitive(pacTempString1, "0") == 0)) usingOctave = 1; -/************************************************************************************* - * validate inputs and outputs - **********************************************************************************/ + /************************************************************************************* + * validate inputs and outputs + **********************************************************************************/ if (nrhs < 1) { - mexErrMsgTxt("Must supply at least the model as an output argument\n" - "USAGE: OutputSBML(SBMLModel, (filename))"); + mexErrMsgTxt("Must supply at least the model as an output argument\n" + "USAGE: OutputSBML(SBMLModel, (filename))"); } if (usingOctave == 1 && nrhs < 2) { - mexErrMsgTxt("Octave requires the filename to be specified\n" - "USAGE: OutputSBML(SBMLModel, filename)"); + mexErrMsgTxt("Octave requires the filename to be specified\n" + "USAGE: OutputSBML(SBMLModel, filename)"); } if (nrhs > 3) { inInstaller = 1; } -/** - * create a copy of the input - */ - mxModel[0] = mxDuplicateArray(prhs[0]); - mexMakeArrayPersistent(mxModel[0]); - mexAtExit(FreeMem); + /** + * create a copy of the input + */ + mxModel[0] = mxDuplicateArray(prhs[0]); + mexMakeArrayPersistent(mxModel[0]); + mexAtExit(FreeMem); -/** - * we know have the option of a third argument that indicates that we - * want the structure to ONLY contain expected fields or not - */ -if (nrhs > 2) -{ - mxModel[1] = (mxArray *)prhs[2]; -} -else -{ - mxModel[1] = mxCreateDoubleScalar(1); -} - -/** - * check number and type of output arguments - * SHOULDNT BE ANY - */ - if (nlhs > 0) - { - mexErrMsgTxt("Too many output arguments\n" - "USAGE: OutputSBML(SBMLModel, (filename))"); - } + /** + * we know have the option of a third argument that indicates that we + * want the structure to ONLY contain expected fields or not + */ + if (nrhs > 2) + { + mxModel[1] = (mxArray *)prhs[2]; + } + else + { + mxModel[1] = mxCreateDoubleScalar(1); + } -/** - * check number and type of input arguments - * must be a valid MATLAB_SBML structure - * and optionally the filename - */ - - if (nrhs > 4) - { - mexErrMsgTxt("Too many input arguments\n" - "USAGE: OutputSBML(SBMLModel, (filename), (exclusive))"); - } - - nStatus = mexCallMATLAB(2, mxCheckStructure, 2, mxModel, "isSBML_Model"); - - if ((nStatus != 0) || (mxIsLogicalScalarTrue(mxCheckStructure[0]) != 1)) - { - /* there are errors - use the pacFilename char * to list these to the user */ + /** + * check number and type of output arguments + * SHOULDNT BE ANY + */ + if (nlhs > 0) + { + mexErrMsgTxt("Too many output arguments\n" + "USAGE: OutputSBML(SBMLModel, (filename))"); + } + + /** + * check number and type of input arguments + * must be a valid MATLAB_SBML structure + * and optionally the filename + */ + + if (nrhs > 4) + { + mexErrMsgTxt("Too many input arguments\n" + "USAGE: OutputSBML(SBMLModel, (filename), (exclusive))"); + } + + nStatus = mexCallMATLAB(2, mxCheckStructure, 2, mxModel, "isSBML_Model"); + + if ((nStatus != 0) || (mxIsLogicalScalarTrue(mxCheckStructure[0]) != 1)) + { + /* there are errors - use the pacTempString1 char * to list these to the user */ nBuflen = (mxGetM(mxCheckStructure[1])*mxGetN(mxCheckStructure[1])+1); - pacFilename = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxCheckStructure[1], pacFilename, (mwSize)(nBuflen)); + pacTempString1 = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxCheckStructure[1], pacTempString1, (mwSize)(nBuflen)); if (nStatus == 0) { msgTxt = (char *) mxCalloc(200+nBuflen, sizeof(char)); sprintf(msgTxt, "\n%s\n\nErrors reported: %s%s\n", "First input must be a valid MATLAB_SBML Structure", - pacFilename, "USAGE: OutputSBML(SBMLModel, (filename))"); + pacTempString1, "USAGE: OutputSBML(SBMLModel, (filename))"); mexErrMsgTxt(msgTxt); } else { msgTxt = (char *) mxCalloc(200, sizeof(char)); sprintf(msgTxt, "%s\n%s", "First input must be a valid MATLAB_SBML Structure", - "USAGE: OutputSBML(SBMLModel, (filename))"); + "USAGE: OutputSBML(SBMLModel, (filename))"); mexErrMsgTxt(msgTxt); } - } + } if (nrhs >= 2) { - - if (mxIsChar(prhs[1]) != 1) - { - mexErrMsgTxt("Second input must be a filename\n" - "USAGE: OutputSBML(SBMLModel, (filename))"); - } - nBuflen = (mxGetM(prhs[1])*mxGetN(prhs[1])+1); - pacFilename = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(prhs[1], pacFilename, (mwSize)(nBuflen)); - - if (nStatus != 0) + if (mxIsChar(prhs[1]) != 1) { - mexErrMsgTxt("Cannot copy filename"); + mexErrMsgTxt("Second input must be a filename\n" + "USAGE: OutputSBML(SBMLModel, (filename))"); } + nBuflen = (mxGetM(prhs[1])*mxGetN(prhs[1])+1); + pacFilename = readUnicodeString(prhs[1], (mwSize)nBuflen); + } -/********************************************************************************************************* - * get the details of the model - ***********************************************************************************************************/ + /********************************************************************************************************* + * get the details of the model + ***********************************************************************************************************/ -/** - * get the SBML level and version from the structure - * and create the document with these - */ + /** + * get the SBML level and version from the structure + * and create the document with these + */ - mxLevel = mxGetField(mxModel[0], 0, "SBML_level"); - nLevel = (unsigned int) mxGetScalar(mxLevel); + mxLevel = mxGetField(mxModel[0], 0, "SBML_level"); + nLevel = (unsigned int) mxGetScalar(mxLevel); - mxVersion = mxGetField(mxModel[0], 0, "SBML_version"); - nVersion = (unsigned int) mxGetScalar(mxVersion); + mxVersion = mxGetField(mxModel[0], 0, "SBML_version"); + nVersion = (unsigned int) mxGetScalar(mxVersion); if (nLevel > 1) { @@ -313,7 +410,7 @@ nBuflen = (mxGetM(mxTimeSymbol)*mxGetN(mxTimeSymbol)+1); timeSymbol = (char *)mxCalloc(nBuflen, sizeof(char)); nStatus = mxGetString(mxTimeSymbol, timeSymbol, (mwSize)(nBuflen)); - + mxDelaySymbol = mxGetField(mxModel[0], 0, "delay_symbol"); nBuflen = (mxGetM(mxDelaySymbol)*mxGetN(mxDelaySymbol)+1); delaySymbol = (char *)mxCalloc(nBuflen, sizeof(char)); @@ -340,7 +437,7 @@ /* add any saved namespaces */ ns = SBMLNamespaces_create(nLevel, nVersion); - mxNamespaces = mxGetField(mxModel[0], 0, "namespaces"); + mxNamespaces = mxGetField(mxModel[0], 0, "namespaces"); GetNamespaces(mxNamespaces, ns); /* look for fbc */ @@ -349,10 +446,10 @@ { fbcPresent = 1; } - + /* the fbc namespace may not be set - * but thet fbc package may still be used - */ + * but thet fbc package may still be used + */ if (fbcPresent == 0) { nStatus = mxGetFieldNumber(mxModel[0], "fbc_version"); @@ -370,104 +467,104 @@ if (fbcPresent == 1) { SBMLDocument_setPkgRequired(sbmlDocument, "fbc", 0); - mxFBCVersion = mxGetField(mxModel[0], 0, "fbc_version"); - nFBCVersion = (unsigned int) mxGetScalar(mxFBCVersion); + mxFBCVersion = mxGetField(mxModel[0], 0, "fbc_version"); + nFBCVersion = (unsigned int) mxGetScalar(mxFBCVersion); } - /* create a model within the document */ + /* create a model within the document */ sbmlModel = SBMLDocument_createModel(sbmlDocument); - /* get notes */ - mxNotes = mxGetField(mxModel[0], 0, "notes"); + /* get notes */ + mxNotes = mxGetField(mxModel[0], 0, "notes"); nBuflen = (mxGetM(mxNotes)*mxGetN(mxNotes)+1); pacNotes = (char *)mxCalloc(nBuflen, sizeof(char)); nStatus = mxGetString(mxNotes, pacNotes, (mwSize)(nBuflen)); - + if (nStatus != 0) { - mexErrMsgTxt("Cannot copy notes"); + mexErrMsgTxt("Cannot copy notes"); } - SBase_setNotesString((SBase_t *)(sbmlModel), pacNotes); - - /* get name */ - mxName = mxGetField(mxModel[0], 0, "name"); + SBase_setNotesString((SBase_t *)(sbmlModel), pacNotes); + + /* get name */ + mxName = mxGetField(mxModel[0], 0, "name"); nBuflen = (mxGetM(mxName)*mxGetN(mxName)+1); pacName = (char *)mxCalloc(nBuflen, sizeof(char)); nStatus = mxGetString(mxName, pacName, (mwSize)(nBuflen)); - + if (nStatus != 0) { - mexErrMsgTxt("Cannot copy name"); + mexErrMsgTxt("Cannot copy name"); } - Model_setName(sbmlModel, pacName); + Model_setName(sbmlModel, pacName); - mxUnitDefinitions = mxGetField(mxModel[0], 0, "unitDefinition"); - GetUnitDefinition(mxUnitDefinitions, nLevel, nVersion, sbmlModel); + mxUnitDefinitions = mxGetField(mxModel[0], 0, "unitDefinition"); + GetUnitDefinition(mxUnitDefinitions, nLevel, nVersion, sbmlModel); - mxCompartments = mxGetField(mxModel[0], 0, "compartment"); - GetCompartment(mxCompartments, nLevel, nVersion, sbmlModel); + mxCompartments = mxGetField(mxModel[0], 0, "compartment"); + GetCompartment(mxCompartments, nLevel, nVersion, sbmlModel); mxSpecies = mxGetField(mxModel[0], 0, "species"); - GetSpecies(mxSpecies, nLevel, nVersion, sbmlModel); - - mxParameters = mxGetField(mxModel[0], 0, "parameter"); - GetParameter(mxParameters, nLevel, nVersion, sbmlModel); - + GetSpecies(mxSpecies, nLevel, nVersion, sbmlModel); + + mxParameters = mxGetField(mxModel[0], 0, "parameter"); + GetParameter(mxParameters, nLevel, nVersion, sbmlModel); + mxRules = mxGetField(mxModel[0], 0, "rule"); - GetRule(mxRules, nLevel, nVersion, sbmlModel); + GetRule(mxRules, nLevel, nVersion, sbmlModel); mxReactions = mxGetField(mxModel[0], 0, "reaction"); - GetReaction(mxReactions, nLevel, nVersion, sbmlModel); + GetReaction(mxReactions, nLevel, nVersion, sbmlModel); - /* level 2 and 3 only */ - if (nLevel > 1) - { - /* get id */ - mxId = mxGetField(mxModel[0], 0, "id"); - nBuflen = (mxGetM(mxId)*mxGetN(mxId)+1); - pacId = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxId, pacId, (mwSize)(nBuflen)); - - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy id"); - } + /* level 2 and 3 only */ + if (nLevel > 1) + { + /* get id */ + mxId = mxGetField(mxModel[0], 0, "id"); + nBuflen = (mxGetM(mxId)*mxGetN(mxId)+1); + pacId = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxId, pacId, (mwSize)(nBuflen)); - Model_setId(sbmlModel, pacId); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy id"); + } - /* get metaid */ - mxMetaid = mxGetField(mxModel[0], 0, "metaid"); - nBuflen = (mxGetM(mxMetaid)*mxGetN(mxMetaid)+1); - pacMetaid = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxMetaid, pacMetaid, (mwSize)(nBuflen)); - - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy metaid"); - } + Model_setId(sbmlModel, pacId); - SBase_setMetaId((SBase_t *) (sbmlModel), pacMetaid); + /* get metaid */ + mxMetaid = mxGetField(mxModel[0], 0, "metaid"); + nBuflen = (mxGetM(mxMetaid)*mxGetN(mxMetaid)+1); + pacMetaid = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxMetaid, pacMetaid, (mwSize)(nBuflen)); - mxFunctionDefinitions = mxGetField(mxModel[0], 0, "functionDefinition"); - GetFunctionDefinition(mxFunctionDefinitions, nLevel, nVersion, sbmlModel); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy metaid"); + } + SBase_setMetaId((SBase_t *) (sbmlModel), pacMetaid); + + mxFunctionDefinitions = mxGetField(mxModel[0], 0, "functionDefinition"); + GetFunctionDefinition(mxFunctionDefinitions, nLevel, nVersion, sbmlModel); + mxEvents = mxGetField(mxModel[0], 0, "event"); - GetEvent(mxEvents, nLevel, nVersion, sbmlModel); + GetEvent(mxEvents, nLevel, nVersion, sbmlModel); - } + } - /* level 2 version 2-4 */ - if (nLevel == 2) - { + /* level 2 version 2-4 */ + if (nLevel == 2) + { if (nVersion > 1) { - /* get sboTerm */ - mxSBOTerm = mxGetField(mxModel[0], 0, "sboTerm"); - nSBOTerm = (int)mxGetScalar(mxSBOTerm); + /* get sboTerm */ + mxSBOTerm = mxGetField(mxModel[0], 0, "sboTerm"); + nSBOTerm = (int)mxGetScalar(mxSBOTerm); - SBase_setSBOTerm((SBase_t *) (sbmlModel), nSBOTerm); + SBase_setSBOTerm((SBase_t *) (sbmlModel), nSBOTerm); mxCompartmentTypes = mxGetField(mxModel[0], 0, "compartmentType"); GetCompartmentType(mxCompartmentTypes, nLevel, nVersion, sbmlModel); @@ -481,241 +578,243 @@ mxConstraints = mxGetField(mxModel[0], 0, "constraint"); GetConstraint(mxConstraints, nLevel, nVersion, sbmlModel); } - } + } - /* level 3 */ - if (nLevel == 3) - { + /* level 3 */ + if (nLevel == 3) + { /* get sboTerm */ mxSBOTerm = mxGetField(mxModel[0], 0, "sboTerm"); - nSBOTerm = (int)mxGetScalar(mxSBOTerm); + nSBOTerm = (int)mxGetScalar(mxSBOTerm); - SBase_setSBOTerm((SBase_t *) (sbmlModel), nSBOTerm); + SBase_setSBOTerm((SBase_t *) (sbmlModel), nSBOTerm); mxInitialAssignments = mxGetField(mxModel[0], 0, "initialAssignment"); GetInitialAssignment(mxInitialAssignments, nLevel, nVersion, sbmlModel); - + mxConstraints = mxGetField(mxModel[0], 0, "constraint"); GetConstraint(mxConstraints, nLevel, nVersion, sbmlModel); /* get substanceUnits */ - mxSubstanceUnits = mxGetField(mxModel[0], 0, "substanceUnits"); - nBuflen = (mxGetM(mxSubstanceUnits)*mxGetN(mxSubstanceUnits)+1); - pacSubstanceUnits = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxSubstanceUnits, pacSubstanceUnits, (mwSize)(nBuflen)); - - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy substanceUnits"); - } + mxSubstanceUnits = mxGetField(mxModel[0], 0, "substanceUnits"); + nBuflen = (mxGetM(mxSubstanceUnits)*mxGetN(mxSubstanceUnits)+1); + pacSubstanceUnits = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxSubstanceUnits, pacSubstanceUnits, (mwSize)(nBuflen)); - Model_setSubstanceUnits(sbmlModel, pacSubstanceUnits); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy substanceUnits"); + } + Model_setSubstanceUnits(sbmlModel, pacSubstanceUnits); + /* get timeUnits */ - mxTimeUnits = mxGetField(mxModel[0], 0, "timeUnits"); - nBuflen = (mxGetM(mxTimeUnits)*mxGetN(mxTimeUnits)+1); - pacTimeUnits = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxTimeUnits, pacTimeUnits, (mwSize)(nBuflen)); - - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy timeUnits"); - } + mxTimeUnits = mxGetField(mxModel[0], 0, "timeUnits"); + nBuflen = (mxGetM(mxTimeUnits)*mxGetN(mxTimeUnits)+1); + pacTimeUnits = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxTimeUnits, pacTimeUnits, (mwSize)(nBuflen)); - Model_setTimeUnits(sbmlModel, pacTimeUnits); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy timeUnits"); + } + Model_setTimeUnits(sbmlModel, pacTimeUnits); + /* get lengthUnits */ - mxLengthUnits = mxGetField(mxModel[0], 0, "lengthUnits"); - nBuflen = (mxGetM(mxLengthUnits)*mxGetN(mxLengthUnits)+1); - pacLengthUnits = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxLengthUnits, pacLengthUnits, (mwSize)(nBuflen)); - - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy lengthUnits"); - } + mxLengthUnits = mxGetField(mxModel[0], 0, "lengthUnits"); + nBuflen = (mxGetM(mxLengthUnits)*mxGetN(mxLengthUnits)+1); + pacLengthUnits = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxLengthUnits, pacLengthUnits, (mwSize)(nBuflen)); - Model_setLengthUnits(sbmlModel, pacLengthUnits); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy lengthUnits"); + } + Model_setLengthUnits(sbmlModel, pacLengthUnits); + /* get areaUnits */ - mxAreaUnits = mxGetField(mxModel[0], 0, "areaUnits"); - nBuflen = (mxGetM(mxAreaUnits)*mxGetN(mxAreaUnits)+1); - pacAreaUnits = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxAreaUnits, pacAreaUnits, (mwSize)(nBuflen)); - - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy areaUnits"); - } + mxAreaUnits = mxGetField(mxModel[0], 0, "areaUnits"); + nBuflen = (mxGetM(mxAreaUnits)*mxGetN(mxAreaUnits)+1); + pacAreaUnits = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxAreaUnits, pacAreaUnits, (mwSize)(nBuflen)); - Model_setAreaUnits(sbmlModel, pacAreaUnits); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy areaUnits"); + } + Model_setAreaUnits(sbmlModel, pacAreaUnits); + /* get volumeUnits */ - mxVolumeUnits = mxGetField(mxModel[0], 0, "volumeUnits"); - nBuflen = (mxGetM(mxVolumeUnits)*mxGetN(mxVolumeUnits)+1); - pacVolumeUnits = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxVolumeUnits, pacVolumeUnits, (mwSize)(nBuflen)); - - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy volumeUnits"); - } + mxVolumeUnits = mxGetField(mxModel[0], 0, "volumeUnits"); + nBuflen = (mxGetM(mxVolumeUnits)*mxGetN(mxVolumeUnits)+1); + pacVolumeUnits = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxVolumeUnits, pacVolumeUnits, (mwSize)(nBuflen)); - Model_setVolumeUnits(sbmlModel, pacVolumeUnits); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy volumeUnits"); + } + Model_setVolumeUnits(sbmlModel, pacVolumeUnits); + /* get extentUnits */ - mxExtentUnits = mxGetField(mxModel[0], 0, "extentUnits"); - nBuflen = (mxGetM(mxExtentUnits)*mxGetN(mxExtentUnits)+1); - pacExtentUnits = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxExtentUnits, pacExtentUnits, (mwSize)(nBuflen)); - - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy extentUnits"); - } + mxExtentUnits = mxGetField(mxModel[0], 0, "extentUnits"); + nBuflen = (mxGetM(mxExtentUnits)*mxGetN(mxExtentUnits)+1); + pacExtentUnits = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxExtentUnits, pacExtentUnits, (mwSize)(nBuflen)); - Model_setExtentUnits(sbmlModel, pacExtentUnits); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy extentUnits"); + } + Model_setExtentUnits(sbmlModel, pacExtentUnits); + /* get conversionFactor */ - mxConversionFactor = mxGetField(mxModel[0], 0, "conversionFactor"); - nBuflen = (mxGetM(mxConversionFactor)*mxGetN(mxConversionFactor)+1); - pacConversionFactor = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxConversionFactor, pacConversionFactor, (mwSize)(nBuflen)); - - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy conversionFactor"); - } + mxConversionFactor = mxGetField(mxModel[0], 0, "conversionFactor"); + nBuflen = (mxGetM(mxConversionFactor)*mxGetN(mxConversionFactor)+1); + pacConversionFactor = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxConversionFactor, pacConversionFactor, (mwSize)(nBuflen)); - Model_setConversionFactor(sbmlModel, pacConversionFactor); - } + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy conversionFactor"); + } + Model_setConversionFactor(sbmlModel, pacConversionFactor); + } - /* get annotations */ + + /* get annotations */ mxAnnotations = mxGetField(mxModel[0], 0, "annotation"); nBuflen = (mxGetM(mxAnnotations)*mxGetN(mxAnnotations)+1); pacAnnotations = (char *)mxCalloc(nBuflen, sizeof(char)); - + nStatus = mxGetString(mxAnnotations, pacAnnotations, (mwSize)(nBuflen)); - + if (nStatus != 0) { - mexErrMsgTxt("Cannot copy annotations"); + mexErrMsgTxt("Cannot copy annotations"); } SBase_setAnnotationString((SBase_t *) (sbmlModel), pacAnnotations); - if (fbcPresent == 1) + if (fbcPresent == 1) + { +#ifdef USE_FBC + mxFluxBounds = mxGetField(mxModel[0], 0, "fbc_fluxBound"); + GetFluxBound(mxFluxBounds, nLevel, nVersion, nFBCVersion, sbmlModel); + + mxObjectives = mxGetField(mxModel[0], 0, "fbc_objective"); + GetObjective(mxObjectives, nLevel, nVersion, nFBCVersion, sbmlModel); + + /* get conversionFactor */ + mxActiveObjective = mxGetField(mxModel[0], 0, "fbc_activeObjective"); + nBuflen = (mxGetM(mxActiveObjective)*mxGetN(mxActiveObjective)+1); + pacActiveObjective = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxActiveObjective, pacActiveObjective, (mwSize)(nBuflen)); + + if (nStatus != 0) { -#ifdef USE_FBC - mxFluxBounds = mxGetField(mxModel[0], 0, "fbc_fluxBound"); - GetFluxBound(mxFluxBounds, nLevel, nVersion, nFBCVersion, sbmlModel); - - mxObjectives = mxGetField(mxModel[0], 0, "fbc_objective"); - GetObjective(mxObjectives, nLevel, nVersion, nFBCVersion, sbmlModel); - - /* get conversionFactor */ - mxActiveObjective = mxGetField(mxModel[0], 0, "fbc_activeObjective"); - nBuflen = (mxGetM(mxActiveObjective)*mxGetN(mxActiveObjective)+1); - pacActiveObjective = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxActiveObjective, pacActiveObjective, (mwSize)(nBuflen)); - - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy ActiveObjective"); - } - - FbcModelPlugin_setActiveObjectiveId(SBase_getPlugin((SBase_t *)(sbmlModel), "fbc"), - pacActiveObjective); -#endif + mexErrMsgTxt("Cannot copy ActiveObjective"); } - -/************************************************************************************************************ - * output the resulting model to specified file - *********************************************************************************************************/ + FbcModelPlugin_setActiveObjectiveId(SBase_getPlugin((SBase_t *)(sbmlModel), "fbc"), + pacActiveObjective); +#endif + } - if (nrhs == 1) - { - /** - * prompt user for a filename - * and write the document to this - */ - /* extension to look for */ + /************************************************************************************************************ + * output the resulting model to specified file + *********************************************************************************************************/ + + if (nrhs == 1) + { + /** + * prompt user for a filename + * and write the document to this + */ + + /* extension to look for */ mxExt[0] = mxCreateString(".xml"); nStatus = mexCallMATLAB(2, mxFilename, 1, mxExt, "uiputfile"); - + if (nStatus != 0) { mexErrMsgTxt("Failed to read filename"); } - /* get the filename returned */ - nBuflen = (mxGetM(mxFilename[0])*mxGetN(mxFilename[0])+1); - pacTempString1 = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxFilename[0], pacTempString1, (mwSize)(nBuflen)); - - if (nStatus != 0) + pacFilename = readUnicodeStringFromArrays(mxFilename); + +#if USE_FILE_WCHAR + if (wcsstr(pacFilename, L".xml") == NULL) { - mexErrMsgTxt("Cannot copy filename"); + wcscat(pacFilename, L".xml"); } - - /* get the full path */ - nBufferLen = (mxGetM(mxFilename[1])*mxGetN(mxFilename[1])+1); - pacTempString2 = (char *)mxCalloc(nBufferLen, sizeof(char)); - nStatus = mxGetString(mxFilename[1], pacTempString2, (mwSize)(nBufferLen)); - - if (nStatus != 0) +#else + /* check that the extension has been used */ + if (strstr(pacFilename, ".xml") == NULL) { - mexErrMsgTxt("Cannot copy path"); + strcat(pacFilename, ".xml"); } +#endif + } + else + { + /* + * user has specified a filename + * check that the extension has been used + */ +#if USE_FILE_WCHAR + if (wcsstr(pacFilename, L".xml") == NULL) + { + wcscat(pacFilename, L".xml"); + } +#else + /* check that the extension has been used */ + if (strstr(pacFilename, ".xml") == NULL) + { + strcat(pacFilename, ".xml"); + } +#endif + } - /* write full path and filename */ - pacFilename = (char *) mxCalloc(nBufferLen+nBuflen+4, sizeof(char)); - strcpy(pacFilename, pacTempString2); - strcat(pacFilename, pacTempString1); - /* check that the extension has been used */ - if (strstr(pacFilename, ".xml") == NULL) - { - strcat(pacFilename, ".xml"); - } - } - else - { - /* - * user has specified a filename - * check that the extension has been used - */ - if (strstr(pacFilename, ".xml") == NULL) - { - strcat(pacFilename, ".xml"); - } - } - - /* write the SBML document to the filename specified */ - nStatus = writeSBML(sbmlDocument, pacFilename); - +#if USE_FILE_WCHAR + { + char* sbml = writeSBMLToString(sbmlDocument); + size_t len = strlen(sbml); + FILE* fp = _wfopen(pacFilename, L"w"); + fwrite(sbml, sizeof(char), len, fp); + fclose(fp); + nStatus = 1; + } +#else + nStatus = writeSBML(sbmlDocument, pacFilename); +#endif /* don't output messages from installer tests */ if (inInstaller == 0) { - if (nStatus != 1) - { - mexErrMsgTxt("Failed to write file"); - } + if (nStatus != 1) + { + mexErrMsgTxt("Failed to write file"); + } else { mexPrintf("Document written\n"); } } - - /* free any memory allocated */ - mxFree(pacNotes); - mxFree(pacAnnotations); - mxFree(pacName); + + /* free any memory allocated */ + mxFree(pacNotes); + mxFree(pacAnnotations); + mxFree(pacName); if (nLevel > 1) { mxFree(pacMetaid); @@ -736,14 +835,14 @@ { mxFree(pacTempString1); mxFree(pacTempString2); - mxFree(pacFilename); + mxFree(pacFilename); mxDestroyArray(mxFilename[0]); mxDestroyArray(mxFilename[1]); mxDestroyArray(mxExt[0]); } - mxDestroyArray(mxCheckStructure[0]); + mxDestroyArray(mxCheckStructure[0]); - SBMLDocument_free(sbmlDocument); + SBMLDocument_free(sbmlDocument); } /** @@ -992,92 +1091,92 @@ * */ void -GetCompartment (mxArray * mxCompartments, - unsigned int unSBMLLevel, - unsigned int unSBMLVersion, - Model_t * sbmlModel) +GetCompartment ( mxArray * mxCompartments, + unsigned int unSBMLLevel, + unsigned int unSBMLVersion, + Model_t * sbmlModel) { - size_t nNoCompartments = mxGetNumberOfElements(mxCompartments); + size_t nNoCompartments = mxGetNumberOfElements(mxCompartments); - int nStatus; - size_t nBuflen; + int nStatus; + size_t nBuflen; - /* field values */ - char * pacNotes; - char * pacAnnotations; - char * pacName; - char * pacId; + /* field values */ + char * pacNotes; + char * pacAnnotations; + char * pacName; + char * pacId; char * pacCompartmentType; - double dVolume; - unsigned int unSpatialDimensions; + double dVolume; + unsigned int unSpatialDimensions; double dSpatialDimensions; - double dSize; - char * pacUnits; - char * pacOutside; - int nConstant; - unsigned int unIsSetVolume; - unsigned int unIsSetSize; - unsigned int unIsSetSpatialDimensions; + double dSize; + char * pacUnits; + char * pacOutside; + int nConstant; + unsigned int unIsSetVolume; + unsigned int unIsSetSize; + unsigned int unIsSetSpatialDimensions; int nSBOTerm; - char * pacMetaid; + char * pacMetaid; mxArray *mxMetaid, *mxIsSetSpatialDimensions; - mxArray * mxNotes, * mxAnnotations, * mxName, * mxId, * mxUnits; - mxArray * mxOutside, * mxVolume, * mxIsSetVolume, * mxSpatialDimensions; + mxArray * mxNotes, * mxAnnotations, * mxName, * mxId, * mxUnits; + mxArray * mxOutside, * mxVolume, * mxIsSetVolume, * mxSpatialDimensions; mxArray * mxSize, * mxConstant, * mxIsSetSize, * mxCompartmentType, * mxSBOTerm; - - Compartment_t *pCompartment; - int i; - for (i = 0; i < nNoCompartments; i++) { + Compartment_t *pCompartment; + int i; - pCompartment = Model_createCompartment(sbmlModel); + for (i = 0; i < nNoCompartments; i++) { + pCompartment = Model_createCompartment(sbmlModel); - /* get notes */ - mxNotes = mxGetField(mxCompartments, i, "notes"); - nBuflen = (mxGetM(mxNotes)*mxGetN(mxNotes)+1); - pacNotes = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxNotes, pacNotes, (mwSize)(nBuflen)); - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy notes"); - } + /* get notes */ + mxNotes = mxGetField(mxCompartments, i, "notes"); + nBuflen = (mxGetM(mxNotes)*mxGetN(mxNotes)+1); + pacNotes = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxNotes, pacNotes, (mwSize)(nBuflen)); - SBase_setNotesString((SBase_t *) (pCompartment), pacNotes); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy notes"); + } + SBase_setNotesString((SBase_t *) (pCompartment), pacNotes); - /* get name */ - mxName = mxGetField(mxCompartments, i, "name"); - nBuflen = (mxGetM(mxName)*mxGetN(mxName)+1); - pacName = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxName, pacName, (mwSize)(nBuflen)); - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy name"); - } + /* get name */ + mxName = mxGetField(mxCompartments, i, "name"); + nBuflen = (mxGetM(mxName)*mxGetN(mxName)+1); + pacName = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxName, pacName, (mwSize)(nBuflen)); - Compartment_setName(pCompartment, pacName); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy name"); + } + Compartment_setName(pCompartment, pacName); - /* get units */ - mxUnits = mxGetField(mxCompartments, i, "units"); - nBuflen = (mxGetM(mxUnits)*mxGetN(mxUnits)+1); - pacUnits = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxUnits, pacUnits, (mwSize)(nBuflen)); - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy units"); - } + /* get units */ + mxUnits = mxGetField(mxCompartments, i, "units"); + nBuflen = (mxGetM(mxUnits)*mxGetN(mxUnits)+1); + pacUnits = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxUnits, pacUnits, (mwSize)(nBuflen)); - Compartment_setUnits(pCompartment, pacUnits); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy units"); + } + Compartment_setUnits(pCompartment, pacUnits); + /* out of L3 */ - + if (unSBMLLevel < 3) { /* get outside */ @@ -1092,218 +1191,218 @@ } Compartment_setOutside(pCompartment, pacOutside); - + /* get isSetVolume */ mxIsSetVolume = mxGetField(mxCompartments, i, "isSetVolume"); unIsSetVolume = (unsigned int)mxGetScalar(mxIsSetVolume); } - /* level 1 only */ - if (unSBMLLevel == 1) - { - /* get volume */ - mxVolume = mxGetField(mxCompartments, i, "volume"); - dVolume = mxGetScalar(mxVolume); + /* level 1 only */ + if (unSBMLLevel == 1) + { + /* get volume */ + mxVolume = mxGetField(mxCompartments, i, "volume"); + dVolume = mxGetScalar(mxVolume); - if (unIsSetVolume == 1) { - Compartment_setVolume(pCompartment, dVolume); - } - - } + if (unIsSetVolume == 1) { + Compartment_setVolume(pCompartment, dVolume); + } - /* level 2 only */ - if (unSBMLLevel == 2) - { - /* get metaid */ - mxMetaid = mxGetField(mxCompartments, i, "metaid"); - nBuflen = (mxGetM(mxMetaid)*mxGetN(mxMetaid)+1); - pacMetaid = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxMetaid, pacMetaid, (mwSize)(nBuflen)); - - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy metaid"); - } + } - SBase_setMetaId((SBase_t *) (pCompartment), pacMetaid); + /* level 2 only */ + if (unSBMLLevel == 2) + { + /* get metaid */ + mxMetaid = mxGetField(mxCompartments, i, "metaid"); + nBuflen = (mxGetM(mxMetaid)*mxGetN(mxMetaid)+1); + pacMetaid = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxMetaid, pacMetaid, (mwSize)(nBuflen)); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy metaid"); + } + + SBase_setMetaId((SBase_t *) (pCompartment), pacMetaid); + /* get id */ - mxId = mxGetField(mxCompartments, i, "id"); - nBuflen = (mxGetM(mxId)*mxGetN(mxId)+1); - pacId = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxId, pacId, (mwSize)(nBuflen)); + mxId = mxGetField(mxCompartments, i, "id"); + nBuflen = (mxGetM(mxId)*mxGetN(mxId)+1); + pacId = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxId, pacId, (mwSize)(nBuflen)); - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy id"); - } + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy id"); + } - Compartment_setId(pCompartment, pacId); - - - /* get constant */ - mxConstant = mxGetField(mxCompartments, i, "constant"); - nConstant = (int)mxGetScalar(mxConstant); + Compartment_setId(pCompartment, pacId); - Compartment_setConstant(pCompartment, nConstant); - /* get spatialdimensions */ - mxSpatialDimensions = mxGetField(mxCompartments, i, "spatialDimensions"); - unSpatialDimensions = (unsigned int)mxGetScalar(mxSpatialDimensions); + /* get constant */ + mxConstant = mxGetField(mxCompartments, i, "constant"); + nConstant = (int)mxGetScalar(mxConstant); - Compartment_setSpatialDimensions(pCompartment, unSpatialDimensions); + Compartment_setConstant(pCompartment, nConstant); - /* get isSetSize */ - mxIsSetSize = mxGetField(mxCompartments, i, "isSetSize"); - unIsSetSize = (unsigned int)mxGetScalar(mxIsSetSize); + /* get spatialdimensions */ + mxSpatialDimensions = mxGetField(mxCompartments, i, "spatialDimensions"); + unSpatialDimensions = (unsigned int)mxGetScalar(mxSpatialDimensions); - - /* get size */ - mxSize = mxGetField(mxCompartments, i, "size"); - dSize = mxGetScalar(mxSize); + Compartment_setSpatialDimensions(pCompartment, unSpatialDimensions); - if (unIsSetSize == 1) { - Compartment_setSize(pCompartment, dSize); - } + /* get isSetSize */ + mxIsSetSize = mxGetField(mxCompartments, i, "isSetSize"); + unIsSetSize = (unsigned int)mxGetScalar(mxIsSetSize); + + /* get size */ + mxSize = mxGetField(mxCompartments, i, "size"); + dSize = mxGetScalar(mxSize); + + if (unIsSetSize == 1) { + Compartment_setSize(pCompartment, dSize); + } + /* level 2 version 2 onwards */ if (unSBMLVersion > 1) { - /* get compartmentType */ - mxCompartmentType = mxGetField(mxCompartments, i, "compartmentType"); - nBuflen = (mxGetM(mxCompartmentType)*mxGetN(mxCompartmentType)+1); - pacCompartmentType = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxCompartmentType, pacCompartmentType, (mwSize)(nBuflen)); + /* get compartmentType */ + mxCompartmentType = mxGetField(mxCompartments, i, "compartmentType"); + nBuflen = (mxGetM(mxCompartmentType)*mxGetN(mxCompartmentType)+1); + pacCompartmentType = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxCompartmentType, pacCompartmentType, (mwSize)(nBuflen)); - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy compartmentType"); - } + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy compartmentType"); + } - Compartment_setCompartmentType(pCompartment, pacCompartmentType); - + Compartment_setCompartmentType(pCompartment, pacCompartmentType); + } /* level 2 version 3 + */ if (unSBMLVersion > 2) { - /* get sboTerm */ - mxSBOTerm = mxGetField(mxCompartments, i, "sboTerm"); - nSBOTerm = (int)mxGetScalar(mxSBOTerm); + /* get sboTerm */ + mxSBOTerm = mxGetField(mxCompartments, i, "sboTerm"); + nSBOTerm = (int)mxGetScalar(mxSBOTerm); - SBase_setSBOTerm((SBase_t *) (pCompartment), nSBOTerm); + SBase_setSBOTerm((SBase_t *) (pCompartment), nSBOTerm); } - } - /* level 3 only */ - else if (unSBMLLevel == 3) - { - /* get metaid */ - mxMetaid = mxGetField(mxCompartments, i, "metaid"); - nBuflen = (mxGetM(mxMetaid)*mxGetN(mxMetaid)+1); - pacMetaid = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxMetaid, pacMetaid, (mwSize)(nBuflen)); - - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy metaid"); - } + } + /* level 3 only */ + else if (unSBMLLevel == 3) + { + /* get metaid */ + mxMetaid = mxGetField(mxCompartments, i, "metaid"); + nBuflen = (mxGetM(mxMetaid)*mxGetN(mxMetaid)+1); + pacMetaid = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxMetaid, pacMetaid, (mwSize)(nBuflen)); - SBase_setMetaId((SBase_t *) (pCompartment), pacMetaid); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy metaid"); + } + SBase_setMetaId((SBase_t *) (pCompartment), pacMetaid); + /* get id */ - mxId = mxGetField(mxCompartments, i, "id"); - nBuflen = (mxGetM(mxId)*mxGetN(mxId)+1); - pacId = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxId, pacId, (mwSize)(nBuflen)); + mxId = mxGetField(mxCompartments, i, "id"); + nBuflen = (mxGetM(mxId)*mxGetN(mxId)+1); + pacId = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxId, pacId, (mwSize)(nBuflen)); - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy id"); - } + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy id"); + } - Compartment_setId(pCompartment, pacId); - - - /* get constant */ - mxConstant = mxGetField(mxCompartments, i, "constant"); - nConstant = (int)mxGetScalar(mxConstant); + Compartment_setId(pCompartment, pacId); - Compartment_setConstant(pCompartment, nConstant); - /* get isSetSpatialDimensions */ - mxIsSetSpatialDimensions = mxGetField(mxCompartments, i, "isSetSpatialDimensions"); - unIsSetSpatialDimensions = (unsigned int)mxGetScalar(mxIsSetSpatialDimensions); + /* get constant */ + mxConstant = mxGetField(mxCompartments, i, "constant"); + nConstant = (int)mxGetScalar(mxConstant); + Compartment_setConstant(pCompartment, nConstant); + + /* get isSetSpatialDimensions */ + mxIsSetSpatialDimensions = mxGetField(mxCompartments, i, "isSetSpatialDimensions"); + unIsSetSpatialDimensions = (unsigned int)mxGetScalar(mxIsSetSpatialDimensions); + /* get spatialdimensions */ - mxSpatialDimensions = mxGetField(mxCompartments, i, "spatialDimensions"); - dSpatialDimensions = mxGetScalar(mxSpatialDimensions); + mxSpatialDimensions = mxGetField(mxCompartments, i, "spatialDimensions"); + dSpatialDimensions = mxGetScalar(mxSpatialDimensions); if (unIsSetSpatialDimensions == 1) { Compartment_setSpatialDimensionsAsDouble(pCompartment, dSpatialDimensions); } - /* get isSetSize */ - mxIsSetSize = mxGetField(mxCompartments, i, "isSetSize"); - unIsSetSize = (unsigned int)mxGetScalar(mxIsSetSize); + /* get isSetSize */ + mxIsSetSize = mxGetField(mxCompartments, i, "isSetSize"); + unIsSetSize = (unsigned int)mxGetScalar(mxIsSetSize); - - /* get size */ - mxSize = mxGetField(mxCompartments, i, "size"); - dSize = mxGetScalar(mxSize); - if (unIsSetSize == 1) { - Compartment_setSize(pCompartment, dSize); - } + /* get size */ + mxSize = mxGetField(mxCompartments, i, "size"); + dSize = mxGetScalar(mxSize); - /* get sboTerm */ - mxSBOTerm = mxGetField(mxCompartments, i, "sboTerm"); - nSBOTerm = (int)mxGetScalar(mxSBOTerm); + if (unIsSetSize == 1) { + Compartment_setSize(pCompartment, dSize); + } - SBase_setSBOTerm((SBase_t *) (pCompartment), nSBOTerm); - } + /* get sboTerm */ + mxSBOTerm = mxGetField(mxCompartments, i, "sboTerm"); + nSBOTerm = (int)mxGetScalar(mxSBOTerm); - /* get annotations */ - mxAnnotations = mxGetField(mxCompartments, i, "annotation"); - nBuflen = (mxGetM(mxAnnotations)*mxGetN(mxAnnotations)+1); - pacAnnotations = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxAnnotations, pacAnnotations, (mwSize)(nBuflen)); + SBase_setSBOTerm((SBase_t *) (pCompartment), nSBOTerm); + } - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy annotations"); - } + /* get annotations */ + mxAnnotations = mxGetField(mxCompartments, i, "annotation"); + nBuflen = (mxGetM(mxAnnotations)*mxGetN(mxAnnotations)+1); + pacAnnotations = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxAnnotations, pacAnnotations, (mwSize)(nBuflen)); - SBase_setAnnotationString((SBase_t *) (pCompartment), pacAnnotations); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy annotations"); + } + SBase_setAnnotationString((SBase_t *) (pCompartment), pacAnnotations); + /* free any memory allocated */ - mxFree(pacNotes); - mxFree(pacAnnotations); - mxFree(pacName); - mxFree(pacUnits); + mxFree(pacNotes); + mxFree(pacAnnotations); + mxFree(pacName); + mxFree(pacUnits); if (unSBMLLevel == 1) { - mxFree(pacOutside); + mxFree(pacOutside); } - /* level 2 only */ - else if (unSBMLLevel == 2) - { - mxFree(pacOutside); - mxFree(pacId); - mxFree(pacMetaid); + /* level 2 only */ + else if (unSBMLLevel == 2) + { + mxFree(pacOutside); + mxFree(pacId); + mxFree(pacMetaid); if (unSBMLVersion > 1) { mxFree(pacCompartmentType); } } - else if (unSBMLLevel == 3) - { - mxFree(pacId); - mxFree(pacMetaid); + else if (unSBMLLevel == 3) + { + mxFree(pacId); + mxFree(pacMetaid); } - } + } } /** @@ -1321,133 +1420,133 @@ */ void GetUnitDefinition ( mxArray * mxUnitDefinitions, - unsigned int unSBMLLevel, - unsigned int unSBMLVersion, - Model_t * sbmlModel ) + unsigned int unSBMLLevel, + unsigned int unSBMLVersion, + Model_t * sbmlModel ) { - size_t nNoUnitDefinitions = mxGetNumberOfElements(mxUnitDefinitions); - - int nStatus; - size_t nBuflen; + size_t nNoUnitDefinitions = mxGetNumberOfElements(mxUnitDefinitions); - /* values */ - char * pacNotes; - char * pacAnnotations; - char * pacName; - char * pacId = NULL; + int nStatus; + size_t nBuflen; + + /* values */ + char * pacNotes; + char * pacAnnotations; + char * pacName; + char * pacId = NULL; int nSBOTerm; - char * pacMetaid; + char * pacMetaid; mxArray *mxMetaid; - mxArray * mxNotes, * mxAnnotations, * mxName, * mxId, * mxUnits, * mxSBOTerm; + mxArray * mxNotes, * mxAnnotations, * mxName, * mxId, * mxUnits, * mxSBOTerm; - UnitDefinition_t *pUnitDefinition; - int i; + UnitDefinition_t *pUnitDefinition; + int i; - for (i = 0; i < nNoUnitDefinitions; i++) - { - pUnitDefinition = Model_createUnitDefinition(sbmlModel); + for (i = 0; i < nNoUnitDefinitions; i++) + { + pUnitDefinition = Model_createUnitDefinition(sbmlModel); - /* get notes */ - mxNotes = mxGetField(mxUnitDefinitions, i, "notes"); - nBuflen = (mxGetM(mxNotes)*mxGetN(mxNotes)+1); - pacNotes = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxNotes, pacNotes, (mwSize)(nBuflen)); + /* get notes */ + mxNotes = mxGetField(mxUnitDefinitions, i, "notes"); + nBuflen = (mxGetM(mxNotes)*mxGetN(mxNotes)+1); + pacNotes = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxNotes, pacNotes, (mwSize)(nBuflen)); - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy notes"); - } + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy notes"); + } - SBase_setNotesString((SBase_t *) (pUnitDefinition), pacNotes); + SBase_setNotesString((SBase_t *) (pUnitDefinition), pacNotes); - /* get name */ - mxName = mxGetField(mxUnitDefinitions, i, "name"); - nBuflen = (mxGetM(mxName)*mxGetN(mxName)+1); - pacName = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxName, pacName, (mwSize)(nBuflen)); + /* get name */ + mxName = mxGetField(mxUnitDefinitions, i, "name"); + nBuflen = (mxGetM(mxName)*mxGetN(mxName)+1); + pacName = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxName, pacName, (mwSize)(nBuflen)); - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy name"); - } + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy name"); + } - UnitDefinition_setName(pUnitDefinition, pacName); + UnitDefinition_setName(pUnitDefinition, pacName); - - /* get list of units */ - mxUnits = mxGetField(mxUnitDefinitions, i, "unit"); - GetUnit(mxUnits, unSBMLLevel, unSBMLVersion, pUnitDefinition); + /* get list of units */ + mxUnits = mxGetField(mxUnitDefinitions, i, "unit"); + GetUnit(mxUnits, unSBMLLevel, unSBMLVersion, pUnitDefinition); - /* level 2 only */ - if (unSBMLLevel > 1) - { - /* get metaid */ - mxMetaid = mxGetField(mxUnitDefinitions, i, "metaid"); - nBuflen = (mxGetM(mxMetaid)*mxGetN(mxMetaid)+1); - pacMetaid = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxMetaid, pacMetaid, (mwSize)(nBuflen)); - - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy metaid"); - } - SBase_setMetaId((SBase_t *) (pUnitDefinition), pacMetaid); + /* level 2 only */ + if (unSBMLLevel > 1) + { + /* get metaid */ + mxMetaid = mxGetField(mxUnitDefinitions, i, "metaid"); + nBuflen = (mxGetM(mxMetaid)*mxGetN(mxMetaid)+1); + pacMetaid = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxMetaid, pacMetaid, (mwSize)(nBuflen)); - /* get id */ - mxId = mxGetField(mxUnitDefinitions, i, "id"); - nBuflen = (mxGetM(mxId)*mxGetN(mxId)+1); - pacId = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxId, pacId, (mwSize)(nBuflen)); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy metaid"); + } - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy id"); - } + SBase_setMetaId((SBase_t *) (pUnitDefinition), pacMetaid); - UnitDefinition_setId(pUnitDefinition, pacId); + /* get id */ + mxId = mxGetField(mxUnitDefinitions, i, "id"); + nBuflen = (mxGetM(mxId)*mxGetN(mxId)+1); + pacId = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxId, pacId, (mwSize)(nBuflen)); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy id"); + } + + UnitDefinition_setId(pUnitDefinition, pacId); + /* level 2 version 3 only */ if ((unSBMLLevel == 2 && unSBMLVersion > 2) || unSBMLLevel > 2) { - /* get sboTerm */ - mxSBOTerm = mxGetField(mxUnitDefinitions, i, "sboTerm"); - nSBOTerm = (int)mxGetScalar(mxSBOTerm); + /* get sboTerm */ + mxSBOTerm = mxGetField(mxUnitDefinitions, i, "sboTerm"); + nSBOTerm = (int)mxGetScalar(mxSBOTerm); - SBase_setSBOTerm((SBase_t *) (pUnitDefinition), nSBOTerm); + SBase_setSBOTerm((SBase_t *) (pUnitDefinition), nSBOTerm); } - } + } - /* get annotations */ - mxAnnotations = mxGetField(mxUnitDefinitions, i, "annotation"); - nBuflen = (mxGetM(mxAnnotations)*mxGetN(mxAnnotations)+1); - pacAnnotations = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxAnnotations, pacAnnotations, (mwSize)(nBuflen)); + /* get annotations */ + mxAnnotations = mxGetField(mxUnitDefinitions, i, "annotation"); + nBuflen = (mxGetM(mxAnnotations)*mxGetN(mxAnnotations)+1); + pacAnnotations = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxAnnotations, pacAnnotations, (mwSize)(nBuflen)); - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy annotations"); - } + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy annotations"); + } - SBase_setAnnotationString((SBase_t *) (pUnitDefinition), pacAnnotations); + SBase_setAnnotationString((SBase_t *) (pUnitDefinition), pacAnnotations); /* free any memory allocated */ - mxFree(pacNotes); - mxFree(pacAnnotations); - mxFree(pacName); - /* level 2 only */ - if (unSBMLLevel > 1) - { - mxFree(pacId); - mxFree(pacMetaid); + mxFree(pacNotes); + mxFree(pacAnnotations); + mxFree(pacName); + /* level 2 only */ + if (unSBMLLevel > 1) + { + mxFree(pacId); + mxFree(pacMetaid); } - } + } } /** @@ -1467,142 +1566,142 @@ GetUnit ( mxArray * mxUnits, unsigned int unSBMLLevel, unsigned int unSBMLVersion, - UnitDefinition_t * sbmlUnitDefinition ) + UnitDefinition_t * sbmlUnitDefinition ) { - size_t nNoUnits = mxGetNumberOfElements(mxUnits); - - int nStatus; - size_t nBuflen; + size_t nNoUnits = mxGetNumberOfElements(mxUnits); - /* values */ - char * pacNotes; - char * pacAnnotations; - char * pacKind; - int nExponent; - int nScale; - double dMultiplier; - double dOffset; + int nStatus; + size_t nBuflen; + + /* values */ + char * pacNotes; + char * pacAnnotations; + char * pacKind; + int nExponent; + int nScale; + double dMultiplier; + double dOffset; double dExponent; int nSBOTerm; - char * pacMetaid; + char * pacMetaid; mxArray *mxMetaid; - mxArray * mxNotes, * mxAnnotations, * mxKind, *mxExponent; - mxArray * mxScale, * mxMultiplier, * mxOffset, * mxSBOTerm; + mxArray * mxNotes, * mxAnnotations, * mxKind, *mxExponent; + mxArray * mxScale, * mxMultiplier, * mxOffset, * mxSBOTerm; - Unit_t *pUnit; - int i; + Unit_t *pUnit; + int i; - for (i = 0; i < nNoUnits; i++) - { - pUnit = UnitDefinition_createUnit(sbmlUnitDefinition); + for (i = 0; i < nNoUnits; i++) + { + pUnit = UnitDefinition_createUnit(sbmlUnitDefinition); - /* get notes */ - mxNotes = mxGetField(mxUnits, i, "notes"); - nBuflen = (mxGetM(mxNotes)*mxGetN(mxNotes)+1); - pacNotes = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxNotes, pacNotes, (mwSize)(nBuflen)); + /* get notes */ + mxNotes = mxGetField(mxUnits, i, "notes"); + nBuflen = (mxGetM(mxNotes)*mxGetN(mxNotes)+1); + pacNotes = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxNotes, pacNotes, (mwSize)(nBuflen)); - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy notes"); - } + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy notes"); + } - SBase_setNotesString((SBase_t *) (pUnit), pacNotes); + SBase_setNotesString((SBase_t *) (pUnit), pacNotes); - /* get kind */ - mxKind = mxGetField(mxUnits, i, "kind"); - nBuflen = (mxGetM(mxKind)*mxGetN(mxKind)+1); - pacKind = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxKind, pacKind, (mwSize)(nBuflen)); + /* get kind */ + mxKind = mxGetField(mxUnits, i, "kind"); + nBuflen = (mxGetM(mxKind)*mxGetN(mxKind)+1); + pacKind = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxKind, pacKind, (mwSize)(nBuflen)); - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy kind"); - } + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy kind"); + } - Unit_setKind(pUnit, UnitKind_forName(pacKind)); + Unit_setKind(pUnit, UnitKind_forName(pacKind)); - /* get scale */ - mxScale = mxGetField(mxUnits, i, "scale"); - nScale = (int)mxGetScalar(mxScale); + /* get scale */ + mxScale = mxGetField(mxUnits, i, "scale"); + nScale = (int)mxGetScalar(mxScale); - Unit_setScale(pUnit, nScale); + Unit_setScale(pUnit, nScale); - /* level 2 only */ - if (unSBMLLevel == 2) - { - /* get metaid */ - mxMetaid = mxGetField(mxUnits, i, "metaid"); - nBuflen = (mxGetM(mxMetaid)*mxGetN(mxMetaid)+1); - pacMetaid = (char *)mxCalloc(nBuflen, sizeof(char)); - nStatus = mxGetString(mxMetaid, pacMetaid, (mwSize)(nBuflen)); - - if (nStatus != 0) - { - mexErrMsgTxt("Cannot copy metaid"); - } + /* level 2 only */ + if (unSBMLLevel == 2) + { + /* get metaid */ + mxMetaid = mxGetField(mxUnits, i, "metaid"); + nBuflen = (mxGetM(mxMetaid)*mxGetN(mxMetaid)+1); + pacMetaid = (char *)mxCalloc(nBuflen, sizeof(char)); + nStatus = mxGetString(mxMetaid, pacMetaid, (mwSize)(nBuflen)); - SBase_setMetaId((SBase_t *) (pUnit), pacMetaid); + if (nStatus != 0) + { + mexErrMsgTxt("Cannot copy metaid"); + } - /* get multiplier */ - mxMultiplier = mxGetField(mxUnits, i, "multiplier"); - dMultiplier = mxGetScalar(mxMultiplier); + SBase_setMetaId((SBase_t *) (pUnit), pacMetaid); - Unit_setMultiplier(pUnit, dMultiplier); - + /* get multiplier */ + mxMultiplier = mxGetField(mxUnits, i, "multiplier"); + dMultiplier = mxGetScalar(mxMultiplier); + + Unit_setMultiplier(pUnit, dMultiplier); + /* level 2 version 1 only */ if (unSBMLVersion == 1) { - /* get offset */ - mxOffset = mxGetField(mxUnits, i, "offset"); - dOffset = mxGetScalar(mxOffset); + /* get offset */ + mxOffset = mxGetField(mxUnits, i, "offset"); + dOffset = mxGetSca... [truncated message content] |