From: <sar...@us...> - 2014-07-29 07:47:41
|
Revision: 20938 http://sourceforge.net/p/sbml/code/20938 Author: sarahkeating Date: 2014-07-29 07:47:34 +0000 (Tue, 29 Jul 2014) Log Message: ----------- Merged revision(s) 20839-20937 from trunk/libsbml: Modified Paths: -------------- branches/libsbml-experimental/CMakeLists.txt branches/libsbml-experimental/NEWS.txt branches/libsbml-experimental/docs/src/Makefile.in branches/libsbml-experimental/docs/src/SBMLDoclet.java branches/libsbml-experimental/docs/src/common-text/xmlid-syntax.html branches/libsbml-experimental/docs/src/css/libsbml-base-stylesheet.css branches/libsbml-experimental/docs/src/css/libsbml-doxygen-stylesheet.css branches/libsbml-experimental/docs/src/css/libsbml-javadoc-stylesheet.css branches/libsbml-experimental/docs/src/doxygen-config-common.txt branches/libsbml-experimental/docs/src/filters/doc-filter-python.py branches/libsbml-experimental/docs/src/libsbml-accessing.html.in branches/libsbml-experimental/docs/src/libsbml-java-reading.html branches/libsbml-experimental/docs/src/libsbml-programming.txt branches/libsbml-experimental/docs/src/libsbml-python-creating-model.txt branches/libsbml-experimental/docs/src/python-substitutions/CompPkgNamespaces.py branches/libsbml-experimental/docs/src/python-substitutions/FbcPkgNamespaces.py branches/libsbml-experimental/docs/src/python-substitutions/LayoutPkgNamespaces.py branches/libsbml-experimental/docs/src/python-substitutions/QualPkgNamespaces.py branches/libsbml-experimental/examples/python/createSimpleModel.py branches/libsbml-experimental/src/bindings/csharp/Makefile.in branches/libsbml-experimental/src/bindings/matlab/OutputSBML.c branches/libsbml-experimental/src/bindings/matlab/TranslateSBML.c branches/libsbml-experimental/src/bindings/python/local-contrib.i branches/libsbml-experimental/src/bindings/python/local-doc-extras.i branches/libsbml-experimental/src/bindings/python/local.i branches/libsbml-experimental/src/bindings/r/CMakeLists.txt branches/libsbml-experimental/src/bindings/swig/libsbml.i branches/libsbml-experimental/src/bindings/swig/swigdoc.py branches/libsbml-experimental/src/sbml/Rule.h branches/libsbml-experimental/src/sbml/SBase.cpp branches/libsbml-experimental/src/sbml/SBase.h branches/libsbml-experimental/src/sbml/annotation/RDFAnnotationParser.h branches/libsbml-experimental/src/sbml/conversion/SBMLFunctionDefinitionConverter.h branches/libsbml-experimental/src/sbml/conversion/SBMLIdConverter.h branches/libsbml-experimental/src/sbml/conversion/SBMLInferUnitsConverter.h branches/libsbml-experimental/src/sbml/conversion/SBMLInitialAssignmentConverter.h branches/libsbml-experimental/src/sbml/conversion/SBMLLevelVersionConverter.h branches/libsbml-experimental/src/sbml/conversion/SBMLLocalParameterConverter.h branches/libsbml-experimental/src/sbml/conversion/SBMLReactionConverter.h branches/libsbml-experimental/src/sbml/conversion/SBMLRuleConverter.h branches/libsbml-experimental/src/sbml/conversion/SBMLStripPackageConverter.h branches/libsbml-experimental/src/sbml/conversion/SBMLUnitsConverter.h branches/libsbml-experimental/src/sbml/math/ASTNode.h branches/libsbml-experimental/src/sbml/math-legacy/ASTNode.cpp branches/libsbml-experimental/src/sbml/math-legacy/MathML.cpp branches/libsbml-experimental/src/sbml/packages/comp/extension/CompExtension.h branches/libsbml-experimental/src/sbml/packages/comp/util/CompFlatteningConverter.h branches/libsbml-experimental/src/sbml/packages/fbc/util/CobraToFbcConverter.h branches/libsbml-experimental/src/sbml/packages/fbc/util/FbcToCobraConverter.h branches/libsbml-experimental/src/sbml/packages/layout/extension/LayoutExtension.h branches/libsbml-experimental/src/sbml/validator/constraints/ConsistencyConstraints.cpp branches/libsbml-experimental/src/sbml/validator/constraints/UnitConsistencyConstraints.cpp branches/libsbml-experimental/src/sbml/validator/test/test-data/libsbml-constraints/99508-fail-01-02.xml branches/libsbml-experimental/src/sbml/xml/XMLNode.h branches/libsbml-experimental/src/sbml/xml/XMLOutputStream.h Added Paths: ----------- branches/libsbml-experimental/src/bindings/r/Makevars.in branches/libsbml-experimental/src/bindings/r/Makevars.win branches/libsbml-experimental/src/bindings/r/configure branches/libsbml-experimental/src/bindings/r/configure.in branches/libsbml-experimental/src/bindings/r/configure.win branches/libsbml-experimental/src/bindings/r/create_package.cmake branches/libsbml-experimental/src/sbml/validator/test/test-data/libsbml-constraints/99508-fail-01-01-20616.xml branches/libsbml-experimental/src/sbml/validator/test/test-data/sbml-general-consistency-constraints/20507-fail-01-11.xml branches/libsbml-experimental/src/sbml/validator/test/test-data/sbml-general-consistency-constraints/20508-fail-01-11.xml branches/libsbml-experimental/src/sbml/validator/test/test-data/sbml-unit-constraints/20509-fail-01-13-99508.xml branches/libsbml-experimental/src/sbml/validator/test/test-data/sbml-unit-constraints/20608-fail-01-18-99508.xml Removed Paths: ------------- branches/libsbml-experimental/src/sbml/validator/test/test-data/libsbml-constraints/99508-fail-01-01.xml Property Changed: ---------------- branches/libsbml-experimental/ Index: branches/libsbml-experimental =================================================================== --- branches/libsbml-experimental 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental 2014-07-29 07:47:34 UTC (rev 20938) Property changes on: branches/libsbml-experimental ___________________________________________________________________ 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:18168-18171,18174-18194,18196-18201,18204,18207-18209,18211-18213,18215-18216,18226,18228-18292,18294-18388,18390-18443,18450-18454,18456-18458,18460-18462,18464,18466,18469-18520,18523-18561,18563,18565-18584,18586-18638,18640-18641,18644-18715,18717-18844,18846-19128,19130-19829,19831-20838 +/trunk/libsbml:18168-18171,18174-18194,18196-18201,18204,18207-18209,18211-18213,18215-18216,18226,18228-18292,18294-18388,18390-18443,18450-18454,18456-18458,18460-18462,18464,18466,18469-18520,18523-18561,18563,18565-18584,18586-18638,18640-18641,18644-18715,18717-18844,18846-19128,19130-19829,19831-20937 \ No newline at end of property Modified: branches/libsbml-experimental/CMakeLists.txt =================================================================== --- branches/libsbml-experimental/CMakeLists.txt 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/CMakeLists.txt 2014-07-29 07:47:34 UTC (rev 20938) @@ -1008,6 +1008,10 @@ message(STATUS " Using Matlab = ${MATLAB_ROOT_PATH}") endif() +if(WITH_R) + message(STATUS " Using R = ${R_INTERPRETER}") +endif() + if(WITH_CHECK) message(STATUS " Using libcheck = ${LIBCHECK_LIBRARY}") Modified: branches/libsbml-experimental/NEWS.txt =================================================================== --- branches/libsbml-experimental/NEWS.txt 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/NEWS.txt 2014-07-29 07:47:34 UTC (rev 20938) @@ -16,6 +16,10 @@ * Bug fixes + - Code checking the values of units attributes was incorrectly + allowing the default Level 2 units, such as substance, to + be used in Level 3. This has been corrected. + - 'comp' package-specific bug fixes: - 'fbc' package-specific bug fixes: - 'layout' package-specific bug fixes: Modified: branches/libsbml-experimental/docs/src/Makefile.in =================================================================== --- branches/libsbml-experimental/docs/src/Makefile.in 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/docs/src/Makefile.in 2014-07-29 07:47:34 UTC (rev 20938) @@ -123,16 +123,10 @@ doxygen-config-octave.txt \ doxygen-config-perl.txt \ doxygen-config-python.txt \ - libsbml-accessing.html \ - libsbml-converters.txt \ - libsbml-group-comp-intro.html \ - libsbml-group-core-intro.html \ - libsbml-group-fbc-intro.html \ - libsbml-group-layout-intro.html \ - libsbml-group-qual-intro.html \ - libsbml-installation.html \ perlmod \ - xml + xml \ + $(other-generated-files) \ + $(expanded-html-files) # The `make dist' rules for this directory are more complicated than usual. # There are additional separate rules below. @@ -677,7 +671,7 @@ # we can't currently do anything about, and that are harmless. cs-ignorable-warnings = \ - "is not found in the argument list of|explicit link request to 'GO' could not be resolved" + "is not found in the argument list of|explicit link request to 'GO' could not be resolved|multiple use of section label" csharp-manual $(csharp-manual): doxygen-config-csharp.txt $(all-sources) \ $(css-files) @@ -760,7 +754,7 @@ endef define adjust_frameset_in_file - perl -i -pe 's/20%,80%/22%,78%/' $(1) + perl -i -pe 's/20%,80%/26%,74%/' $(1) endef define fix_broken_highlighting Modified: branches/libsbml-experimental/docs/src/SBMLDoclet.java =================================================================== --- branches/libsbml-experimental/docs/src/SBMLDoclet.java 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/docs/src/SBMLDoclet.java 2014-07-29 07:47:34 UTC (rev 20938) @@ -388,6 +388,20 @@ return doc.name().startsWith("libsbmlJNI"); } + private static boolean isSWIGOwnershipMethod(Doc doc) + { + if (doc instanceof ProgramElementDoc) + { + ProgramElementDoc pdoc = (ProgramElementDoc) doc; + if (pdoc.qualifiedName().endsWith("swigReleaseOwnership") + || pdoc.qualifiedName().endsWith("swigTakeOwnership")) + return true; + } + return (doc.isMethod() + && (doc.name().equals("swigReleaseOwnership") + || doc.name().equals("swigTakeOwnership"))); + } + private static boolean isDeleteMethod(Doc doc) { if (doc instanceof ProgramElementDoc) @@ -425,7 +439,8 @@ if (markedInternal(item)) continue; - if (isSWIGWrapper(item) || isJNIclass(item)) + if (isSWIGWrapper(item) || isJNIclass(item) || + isSWIGOwnershipMethod(item)) { if (m_list_skipped) { Modified: branches/libsbml-experimental/docs/src/common-text/xmlid-syntax.html =================================================================== --- branches/libsbml-experimental/docs/src/common-text/xmlid-syntax.html 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/docs/src/common-text/xmlid-syntax.html 2014-07-29 07:47:34 UTC (rev 20938) @@ -2,8 +2,8 @@ <a target="_blank" href="http://www.w3.org/TR/REC-xml/#id">ID</a>. We express the syntax using an extended form of BNF notation: <p> -<nobr><code style="margin-left: 2em">NCNameChar ::= letter | digit | '.' | '-' | '_' | ':' | CombiningChar | Extender</code><br></nobr> -<code style="margin-left: 2em">ID ::= ( letter | '_' | ':' ) NCNameChar*</code><br> +<nobr><code style="margin-left: 2em; letter-spacing: -1px">NCNameChar ::= letter | digit | '.' | '-' | '_' | ':' | CombiningChar | Extender</code><br></nobr> +<code style="margin-left: 2em; letter-spacing: -1px">ID ::= ( letter | '_' | ':' ) NCNameChar*</code><br> <p> The characters <code>(</code> and <code>)</code> are used for grouping, the character <code>*</code> means "zero or more times", and the character Modified: branches/libsbml-experimental/docs/src/css/libsbml-base-stylesheet.css =================================================================== --- branches/libsbml-experimental/docs/src/css/libsbml-base-stylesheet.css 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/docs/src/css/libsbml-base-stylesheet.css 2014-07-29 07:47:34 UTC (rev 20938) @@ -66,6 +66,13 @@ padding-bottom: 2px; } +h2 code +{ + font-size: 18px; + padding-left: 3px; + padding-right: 3px; +} + /* This is for the words "Detailed Description" in Doxygen class pages. */ h2.groupheader { font-size: 16pt; @@ -125,18 +132,30 @@ font-weight: 700; } -ul +ul, ol { margin-top: 0.75em; margin-bottom: 0.75em; + padding: 0; } -ul li +ul li, +ol li { margin-top: 0.75em; margin-bottom: 0.75em; + margin-left: 2.5em; } +.tabs ul li, +.tabs2 ul li, +.tabs3 ul li, +.tabs4 ul li +{ + margin-left: 0; +} + +ul li p, ul li p { margin: 0px; @@ -162,8 +181,8 @@ font-family: 'Anonymous Pro', 'Courier New', Courier, monospace, fixed; font-weight: 700; font-size: 13px; - padding-left: 2px; - padding-right: 2px; + padding-left: 1px; + padding-right: 0px; color: black; margin-top: 1em; margin-bottom: 1em; Modified: branches/libsbml-experimental/docs/src/css/libsbml-doxygen-stylesheet.css =================================================================== --- branches/libsbml-experimental/docs/src/css/libsbml-doxygen-stylesheet.css 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/docs/src/css/libsbml-doxygen-stylesheet.css 2014-07-29 07:47:34 UTC (rev 20938) @@ -102,6 +102,8 @@ font-family: 'Anonymous Pro', 'Courier New', Courier, monospace, fixed; font-weight: 700; font-size: 10pt; + padding-left: 1px; + padding-right: 0px; } a.code, a.code:visited { @@ -669,8 +671,10 @@ table.directory td.entry { border-bottom: 1px dotted #ccc; - min-width: 235px; - padding-top: 5px; + min-width: 240px; + padding-top: 3px; + padding-bottom: 3px; + vertical-align: middle; } table.directory td.entry a.el { @@ -1312,7 +1316,7 @@ pre.signature { font-size: 13px; font-weight: 700; - margin-left: 12px; + margin-left: 15px; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word; @@ -1355,11 +1359,6 @@ padding-right: 1em; } -.textblock ul, -.textblock ol { - padding-left: 2.5em; -} - .textblock ul li p.startli, #doc-content ul li p.startli { padding: 0px; Modified: branches/libsbml-experimental/docs/src/css/libsbml-javadoc-stylesheet.css =================================================================== --- branches/libsbml-experimental/docs/src/css/libsbml-javadoc-stylesheet.css 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/docs/src/css/libsbml-javadoc-stylesheet.css 2014-07-29 07:47:34 UTC (rev 20938) @@ -196,6 +196,15 @@ font-weight: bold; } +/* This next one catches the most common use of li for us inside +method documentation, namely for return types. Hacky, this is. */ + +dl dd dl dd ul li +{ + margin-top: 0.25em; + margin-bottom: 0.25em; +} + td, th { padding: 2px; Modified: branches/libsbml-experimental/docs/src/doxygen-config-common.txt =================================================================== --- branches/libsbml-experimental/docs/src/doxygen-config-common.txt 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/docs/src/doxygen-config-common.txt 2014-07-29 07:47:34 UTC (rev 20938) @@ -196,7 +196,7 @@ ALIASES += sbmlfunction{2}="@if clike SBML_\1()@endif @if csharp SBML_\1()@endif @if python @link libsbml.\1() \1()@endlink@endif@~" -ALIASES += sbmlconstant{2}="@if clike @link \2#\1 \1@endlink@endif @if csharp @link libsbmlcs#\1 \1@endlink@endif @if python @link libsbml#\1 \1@endlink@endif @if java @link libsbmlConstants#\1 \1@endlink@endif@~" +ALIASES += sbmlconstant{2}="@if clike @link \2#\1 \1@endlink@endif @if csharp @link libsbml#\1 \1@endlink@endif @if python @link libsbml#\1 \1@endlink@endif @if java @link libsbmlConstants#\1 \1@endlink@endif@~" # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" Modified: branches/libsbml-experimental/docs/src/filters/doc-filter-python.py =================================================================== --- branches/libsbml-experimental/docs/src/filters/doc-filter-python.py 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/docs/src/filters/doc-filter-python.py 2014-07-29 07:47:34 UTC (rev 20938) @@ -46,14 +46,14 @@ def reformatDocString (match): text = match.group(1) - # First, a regexp we use more than once below. - # This regexp matches signatures of the following form: + # First, define some regexps we use more than once below. + # The regexp matches signatures of the following form: # foo() # foo() -> result(arg, arg, ...) # foo(arg, arg, ...) -> result(arg, arg, ...) - sigLHS = '\w+\([\w()=*:"<>?,.\n ]*\)' - sigRHS = '( -> [\w()=*:"<>?|, \t]+)?' + sigLHS = '\w+\([-\w()=&*:"<>?,.\n ]*\)' + sigRHS = '( -> [-\w()=&*:"<>?|, \t]+)?' sigLine = sigLHS + sigRHS # We start by fixing some wonkiness with the output from SWIG: it sometimes @@ -105,13 +105,23 @@ p = re.compile(' -> ') text = p.sub(r' ' + newArrow + ' ', text) - # Now we do a final transformation: bring up the brief description, if there - # is one, to make it the first line of the doc string. + # Now we do some final transformations. - start = '<pre class="signature">' + start = '<pre class=["\']signature["\']>' + middle = '.*?' + end = '</pre>' + + # First, clean up whitespace in the method signature strings (and not the + # rest of the doc body, because that will mess up code example blocks). + + p = re.compile(start + '(' + middle + ')' + end, re.DOTALL) + text = p.sub(clean_up_spaces, text) + + # Next, bring up the brief description, if there is one, to make it the + # first line of the doc string. + brief = '\w[^.]+\.' - - p = re.compile('(' + start + r'.*?)<p>\s*(' + brief + ')\s(.*)', re.DOTALL) + p = re.compile('(' + start + middle + end + '\s*?)<p>\s*(' + brief + ')\s(.*)', re.DOTALL) text = p.sub(r'\2\n\n' + r'\1' + r'\3', text) # Crucial detail: need a '!' character after the opening triple quotes or @@ -120,6 +130,15 @@ return "\"\"\"!" + text + "\"\"\"" +def clean_up_spaces(match): + normalized = re.sub(' +', ' ', match.group(0)) # Multiple spaces. + normalized = re.sub('^ +', '', normalized, flags=re.MULTILINE) # Leading spaces. + normalized = normalized.replace(' , ', ', ') # Space before comma. + normalized = normalized.replace('( ', '(') # Space after paren. + normalized = normalized.replace(' )', ')') # Space before paren. + return normalized + + def filterDocStrings (contents): # Make the docstrings more readable. p = re.compile('\"\"\"(.+?)\"\"\"', re.DOTALL | re.MULTILINE) @@ -171,6 +190,9 @@ # Other simple type replacements. contents = contents.replace('an unsigned int', 'a long integer') contents = contents.replace('unsigned int', 'long') + contents = contents.replace('const int&', 'int') + contents = contents.replace('const long&', 'long') + contents = contents.replace('const bool&', 'bool') contents = contents.replace('const std.string&', 'string') contents = contents.replace('const std.string', 'string') contents = contents.replace('SBMLConstructorException', 'ValueError') @@ -179,6 +201,14 @@ contents = contents.replace('const ', '') contents = contents.replace('char *', 'string') contents = contents.replace('string *', 'string') + contents = contents.replace('string &', 'string') + contents = contents.replace('double *', 'float') + contents = contents.replace('double &', 'float') + contents = contents.replace('float &', 'float') + contents = contents.replace('float&', 'float') + contents = contents.replace('bool &', 'bool') + contents = contents.replace('long &', 'long') + contents = contents.replace('int &', 'int') return contents @@ -266,9 +296,3 @@ if __name__ == '__main__': main(sys.argv) - - -# Misc. code from previous iterations that I don't want to throw -# away just yet: -# -# text = p.sub(r'\1<table class="signatureTable"><tr><td class="signatureIntro"><b>Python method signature(s)</b>:</td><td class="signatureBlock">\2</td></tr></table>\1<p>', text) Modified: branches/libsbml-experimental/docs/src/libsbml-accessing.html.in =================================================================== --- branches/libsbml-experimental/docs/src/libsbml-accessing.html.in 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/docs/src/libsbml-accessing.html.in 2014-07-29 07:47:34 UTC (rev 20938) @@ -206,41 +206,72 @@ to use the Java-libSBML interface in an application. -<h4>Step 1: set LD_LIBRARY_PATH (Linux), DYLD_LIBRARY_PATH -(Mac OS X), or PATH (Windows)</h4> +<h4>Step 1: set the run-time library search path</h4> -First, please follow the instructions for configuring the -<code>LD_LIBRARY_PATH</code> (under Linux, Unix, Cygwin), -<code>DYLD_LIBRARY_PATH</code> (under Mac OS X) or <code>PATH</code> (under -Windows) variables described in the beginning of this section. This is -necessary so that, before the operating system starts a Java application, -the system loaders can find libSBML's native library components. +<p> This is necessary so that, before the operating system starts a Java +application, the system loaders can find libSBML's native library components. +For Java, there are two ways of doing this: +<ol> + +<li style="margin-bottom: 1em"><em>Approach 1</em>: follow the instructions +for configuring the <code>LD_LIBRARY_PATH</code> (under Linux, Unix, Cygwin), +<code>DYLD_LIBRARY_PATH</code> (under Mac OS X) or +<code>PATH</code> (under Windows) variables described in the <a +href="#common">beginning of this section</a>.</li> -<h4>Step 2: adjust the application's class search path</h4> +<li><em>Approach 2</em>: start your Java interpreter with a value for the +flag <code>-Djava.library.path</code> equal to the directory containing the +libSBML library files (i.e., the <code>.jnilib</code>, <code>.dylib</code> +and/or <code>.dll</code> files for libSBML, depending on the operating +system—<em>not</em> the JAR file). For example, suppose that you +configured libSBML to be installed into <code>/usr/local</code> on a Linux +system. Then, you could start your application using a command that begins +as follows: -Java applications separately need to have their class search paths include -the libSBML <code>.jar</code> and binary object files. This is often most -easily done by setting the <code>CLASSPATH</code> environment variable, but -other methods are possible. The exact recipe also depends on the operating -system in use, as follows: +<pre class="fragment"> +java -Djava.library.path=/usr/local/lib -cp .:/usr/local/share/java/libsbmlj.jar <span class="placeholder">APPLICATION</span> +</pre></li> +</ol> + +<p> If the library search path is <em>not</em> set, your application will +encounter a <code>java.lang.UnsatisfiedLinkError</code> at run time when it +attempts to call <code>System.loadLibrary("sbmlj")</code> (discussed in +Step 3 below). Here is an example of such an error message printed by +the Java interpreter: + +<pre class="fragment"> +Exception in thread "main" java.lang.UnsatisfiedLinkError: no libsbmlj in java.library.path + at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1764) + at java.lang.Runtime.loadLibrary0(Runtime.java:823) + at java.lang.System.loadLibrary(System.java:1044) + at test.<clinit>(test.java:31) +</pre> + + +<h4>Step 2: set the application's Java class search path</h4> + +Java applications separately <strong>also</strong> need to have their class +search paths set up such that they include the libSBML <code>.jar</code> +file. This is often most easily done by setting the <code>CLASSPATH</code> +environment variable, but other methods are possible. The exact recipe also +depends on the operating system in use, as follows: + <ul> <li><em>Java on Linux, Mac OS X and similar Unix-like systems:</em> -<p style="margin-top: 0.5em;"> You must either (1) set -your <code>CLASSPATH</code> environment variable to include -the <code>.jar</code> file, or (2) the <code>.jar</code> file must be listed -in the <nobr><code>-classpath</code></nobr> option passed to the Java -interpreter when it is started. As an example of the former approach, -if you had configured libSBML to install itself into -<code>/usr/local</code> (e.g., by using -<nobr><code>--prefix=/usr/local</code></nobr> when configuring libSBML -using the <code>configure</code> system), -the <code>libsbmlj.jar</code> file will end up as -<code>/usr/local/share/java/libsbmlj.jar</code> and your environment -variable would at minimum need to be set as follows: +<p style="margin-top: 0.5em;"> You must either (1) set your +<code>CLASSPATH</code> environment variable to include the <code>.jar</code> +file, or (2) the libSBML <code>.jar</code> file must be listed in the +<nobr><code>-classpath</code></nobr> option passed to the Java interpreter +when it is started. As an example of the former approach, if you had +configured libSBML to be installed into <code>/usr/local</code>, the +<code>libsbmlj.jar</code> file will end up as +<code>/usr/local/share/java/libsbmlj.jar</code> on Linux and +Mac OS X and your environment variable would at minimum need to be +set as follows: <pre class="fragment"> CLASSPATH=.:/usr/local/share/java/libsbmlj.jar @@ -265,15 +296,33 @@ </li> </ul> +<p> If the Java class search path is <em>not</em> set, then your application +will encounter a <code>java.lang.ClassNotFoundException</code> error at run +time when it first attempts to access a libSBML class. Here is an example +of such an error message: +<pre class="fragment"> +Exception in thread "main" java.lang.NoClassDefFoundError: org/sbml/libsbml/XMLOutputStream + at test.main(test.java:15) +Caused by: java.lang.ClassNotFoundException: org.sbml.libsbml.XMLOutputStream + at java.net.URLClassLoader$1.run(URLClassLoader.java:202) + at java.security.AccessController.doPrivileged(Native Method) + at java.net.URLClassLoader.findClass(URLClassLoader.java:190) + at java.lang.ClassLoader.loadClass(ClassLoader.java:306) + at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) + at java.lang.ClassLoader.loadClass(ClassLoader.java:247) + ... 1 more +</pre> + + <h4>Step 3: load the libSBML JNI library in the application</h4> -Finally, because of how JNI works in Java, an explicit call to +<p> Finally, because of how JNI works in Java, an explicit call to <code>System.loadLibrary</code> is needed in an application to load the native language library portion of libSBML. This involves putting a Java <code>static</code> block of code somewhere in your application, usually in -the application's main class. The following example illustrates one way of -doing this. +the application's main class. The following is an example of the minimum +code for doing this: <pre class="fragment"><span style="color: #777">import org.sbml.libsbml.*; @@ -290,6 +339,32 @@ */ static { + System.loadLibrary("sbmlj"); + } +} +</pre> + +<p> For real applications, it is often useful to catch run-time exceptions +and try to interpret the causes on users' behalf. The following is a more +elaborate example of code to load libSBML that tries to catch exceptions at +run-time, interpret their meaning, and provide informative error messages +about their causes. (Note that the following is an entirely optional +replacement for the simpler version above.) + +<pre class="fragment"><span style="color: #777">import org.sbml.libsbml.*; +public class YourMainApplicationClass +{ + public static void main (String[] args) + { + /* Whatever your application does here ... */ + } +</span> + /** + * The following static block is needed in order to load the + * libSBML Java interface library when the application starts. + */ + static + { String varname; String shlibname; @@ -298,9 +373,14 @@ varname = "DYLD_LIBRARY_PATH"; // We're on a Mac. shlibname = "libsbmlj.jnilib and/or libsbml.dylib"; } + else if (System.getProperty("os.name").startsWith("Windows")) + { + varname = "PATH"; // We're on Windows. + shlibname = "sbmlj.dll and/or libsbml.dll"; + } else { - varname = "LD_LIBRARY_PATH"; // We're not on a Mac. + varname = "LD_LIBRARY_PATH"; // Linux or possibly some other Unix. shlibname = "libsbmlj.so and/or libsbml.so"; } Modified: branches/libsbml-experimental/docs/src/libsbml-java-reading.html =================================================================== --- branches/libsbml-experimental/docs/src/libsbml-java-reading.html 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/docs/src/libsbml-java-reading.html 2014-07-29 07:47:34 UTC (rev 20938) @@ -58,17 +58,7 @@ static { - try - { - System.loadLibrary("sbmlj"); - /* Extra check to be sure we have access to libSBML: */ - Class.forName("org.sbml.libsbml.libsbml"); - } - catch (Exception e) - { - System.err.println("Error: could not load the libSBML library"); - System.exit(1); - } + System.loadLibrary("sbmlj"); } } </pre> Modified: branches/libsbml-experimental/docs/src/libsbml-programming.txt =================================================================== --- branches/libsbml-experimental/docs/src/libsbml-programming.txt 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/docs/src/libsbml-programming.txt 2014-07-29 07:47:34 UTC (rev 20938) @@ -14,8 +14,8 @@ @endif @if python - @subpage libsbml-python-reading-files +- @subpage libsbml-python-creating-model - @subpage libsbml-math -- @subpage libsbml-python-creating-model - @subpage libsbml-python-example-files @endif @if conly Modified: branches/libsbml-experimental/docs/src/libsbml-python-creating-model.txt =================================================================== --- branches/libsbml-experimental/docs/src/libsbml-python-creating-model.txt 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/docs/src/libsbml-python-creating-model.txt 2014-07-29 07:47:34 UTC (rev 20938) @@ -19,16 +19,21 @@ @endcode Next, we define a simple function to check the return values of libSBML calls -and report any errors encountered. This function is designed to work with -null values and error code values. +and report any errors encountered. This function uses a generic parameter +for the value (the first argument), and tests the value against nulls as well +as integer codes. This makes it suitable for testing the return values from +any libSBML function, whether the function returns an object or an integer +status codes. The benefit of this will become clear in the code further +below. @code{.py} def check(value, message): - """If the value is None, prints the message and exit with status code 1. - If the value is an integer, checks if it's equal to LIBSBML_OPERATION_SUCCESS. - If if is, returns without further action; if it's a different integer, prints - the message along with text from libSBML explaining the meaning of the code, - and exits with status code 1. + """If 'value' is None, prints an error message constructed using + 'message' and then exits with status code 1. If 'value' is an integer, + it assumes it is a libSBML return status code. If the code value is + LIBSBML_OPERATION_SUCCESS, returns without further action; if it is not, + prints an error message constructed using 'message' along with text from + libSBML explaining the meaning of the code, and exits with status code 1. """ if value == None: print('LibSBML returned a null value trying to ' + message + '.') @@ -47,18 +52,22 @@ return @endcode -Now we get to the real business of building the model. Here we encapsulated -the entire model in one function to make the example simpler, but in a real -application, it would likely be more effective to decompose the function -further. For example, an improvement would be to abstract away the -construction of major pieces such as SBML species into functions that -encapsulate repeated code for setting the component's attributes. +Now we get to the real business of building the model. Here we +encapsulated the entire model in one function to make the example +simpler, but in a real application, it would likely be more effective to +decompose the function further. For example, an improvement would be to +abstract away the construction of major pieces such as SBML species into +functions that encapsulate repeated code for setting the component's +attributes. @code{.py} def create_model(): """Returns a simple but complete SBML Level 3 model for illustration.""" - # Create an empty SBMLDocument object: + # Create an empty SBMLDocument object. It's a good idea to check for + # possible errors. Even when the parameter values are hardwired like + # this, it is still possible for a failure to occur (e.g., if the + # operating system runs out of memory). try: document = SBMLDocument(3, 1) @@ -66,7 +75,12 @@ print('Could not create SBMLDocumention object') sys.exit(1) - # Create the basic Model object inside the SBMLDocument object: + # Create the basic Model object inside the SBMLDocument object. To + # produce a model with complete units for the reaction rates, we need + # to set the 'timeUnits' and 'extentUnits' attributes on Model. We + # set 'substanceUnits' too, for good measure, though it's not strictly + # necessary here because we also set the units for invididual species + # in their definitions. model = document.createModel() check(model, 'create model') @@ -74,7 +88,9 @@ check(model.setExtentUnits("mole"), 'set model units of extent') check(model.setSubstanceUnits('mole'), 'set model substance units') - # Create a unit definition we will need later: + # Create a unit definition we will need later. Note that SBML Unit + # objects must have all four attributes 'kind', 'exponent', 'scale' + # and 'multiplier' defined. per_second = model.createUnitDefinition() check(per_second, 'create unit definition') @@ -86,7 +102,8 @@ check(unit.setScale(0), 'set unit scale') check(unit.setMultiplier(1), 'set unit multiplier') - # Create components inside the model: + # Create a compartment inside this model, and set the required + # attributes for an SBML compartment in SBML Level 3. c1 = model.createCompartment() check(c1, 'create compartment') @@ -96,6 +113,12 @@ check(c1.setSpatialDimensions(3), 'set compartment dimensions') check(c1.setUnits('litre'), 'set compartment size units') + # Create two species inside this model, set the required attributes + # for each species in SBML Level 3 (which are the 'id', 'compartment', + # 'constant', 'hasOnlySubstanceUnits', and 'boundaryCondition' + # attributes), and initialize the amount of the species along with the + # units of the amount. + s1 = model.createSpecies() check(s1, 'create species s1') check(s1.setId('s1'), 'set species s1 id') @@ -116,13 +139,23 @@ check(s2.setBoundaryCondition(False), 'set "boundaryCondition" on s2') check(s2.setHasOnlySubstanceUnits(False), 'set "hasOnlySubstanceUnits" on s2') + # Create a parameter object inside this model, set the required + # attributes 'id' and 'constant' for a parameter in SBML Level 3, and + # initialize the parameter with a value along with its units. + k = model.createParameter() check(k, 'create parameter k') check(k.setId('k'), 'set parameter k id') + check(k.setConstant(True), 'set parameter k "constant"') check(k.setValue(1), 'set parameter k value') check(k.setUnits('per_second'), 'set parameter k units') - check(k.setConstant(True), 'set parameter k "constant"') + # Create a reaction inside this model, set the reactants and products, + # and set the reaction rate expression (the SBML "kinetic law"). We + # set the minimum required attributes for all of these objects. The + # units of the reaction rate are determined from the 'timeUnits' and + # 'extentUnits' attributes on the Model object. + r1 = model.createReaction() check(r1, 'create reaction') check(r1.setId('r1'), 'set reaction id') @@ -146,7 +179,8 @@ check(kinetic_law, 'create kinetic law') check(kinetic_law.setMath(math_ast), 'set math on kinetic law') - # Done. Return a text string containing the model. + # And we're done creating the basic model. + # Now return a text string containing the model in XML format. return writeSBMLToString(document) @endcode Modified: branches/libsbml-experimental/docs/src/python-substitutions/CompPkgNamespaces.py =================================================================== --- branches/libsbml-experimental/docs/src/python-substitutions/CompPkgNamespaces.py 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/docs/src/python-substitutions/CompPkgNamespaces.py 2014-07-29 07:47:34 UTC (rev 20938) @@ -2,9 +2,7 @@ """ @sbmlpackage{comp} - @htmlinclude pkg-marker-comp.html Class to store SBML Level, Version, and XML - namespace for the SBML Hierarchical Model Composition (“comp”) - package. + @htmlinclude pkg-marker-comp.html SBMLNamespaces extension for the package. @htmlinclude not-sbml-warning.html Modified: branches/libsbml-experimental/docs/src/python-substitutions/FbcPkgNamespaces.py =================================================================== --- branches/libsbml-experimental/docs/src/python-substitutions/FbcPkgNamespaces.py 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/docs/src/python-substitutions/FbcPkgNamespaces.py 2014-07-29 07:47:34 UTC (rev 20938) @@ -2,9 +2,7 @@ """ @sbmlpackage{fbc} - @htmlinclude pkg-marker-fbc.html Class to store SBML Level, Version, and XML - namespace for the SBML Flux Balance Constraints (“fbc”) - package. + @htmlinclude pkg-marker-fbc.html SBMLNamespaces extension for the package. @htmlinclude not-sbml-warning.html Modified: branches/libsbml-experimental/docs/src/python-substitutions/LayoutPkgNamespaces.py =================================================================== --- branches/libsbml-experimental/docs/src/python-substitutions/LayoutPkgNamespaces.py 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/docs/src/python-substitutions/LayoutPkgNamespaces.py 2014-07-29 07:47:34 UTC (rev 20938) @@ -2,8 +2,7 @@ """ @sbmlpackage{layout} - @htmlinclude pkg-marker-layout.html Class to store SBML Level, Version, and XML - namespace for the SBML Layout (“layout”) package. + @htmlinclude pkg-marker-layout.html SBMLNamespaces extension for the package. @htmlinclude not-sbml-warning.html Modified: branches/libsbml-experimental/docs/src/python-substitutions/QualPkgNamespaces.py =================================================================== --- branches/libsbml-experimental/docs/src/python-substitutions/QualPkgNamespaces.py 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/docs/src/python-substitutions/QualPkgNamespaces.py 2014-07-29 07:47:34 UTC (rev 20938) @@ -2,8 +2,7 @@ """ @sbmlpackage{qual} - @htmlinclude pkg-marker-qual.html Class to store SBML Level, Version, and XML - namespace for the SBML Qualitative Models (“qual”) package. + @htmlinclude pkg-marker-qual.html SBMLNamespaces extension for the package. @htmlinclude not-sbml-warning.html Modified: branches/libsbml-experimental/examples/python/createSimpleModel.py =================================================================== --- branches/libsbml-experimental/examples/python/createSimpleModel.py 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/examples/python/createSimpleModel.py 2014-07-29 07:47:34 UTC (rev 20938) @@ -44,11 +44,12 @@ def check(value, message): - """If the value is None, prints the message and exit with status code 1. - If the value is an integer, checks if it's equal to LIBSBML_OPERATION_SUCCESS. - If it is, returns without further action; if it's a different integer, prints - the message along with text from libSBML explaining the meaning of the code, - and exits with status code 1. + """If 'value' is None, prints an error message constructed using + 'message' and then exits with status code 1. If 'value' is an integer, + it assumes it is a libSBML return status code. If the code value is + LIBSBML_OPERATION_SUCCESS, returns without further action; if it is not, + prints an error message constructed using 'message' along with text from + libSBML explaining the meaning of the code, and exits with status code 1. """ if value == None: print('LibSBML returned a null value trying to ' + message + '.') @@ -70,15 +71,23 @@ def create_model(): """Returns a simple but complete SBML Level 3 model for illustration.""" - # Create an empty SBMLDocument object: + # Create an empty SBMLDocument object. It's a good idea to check for + # possible errors. Even when the parameter values are hardwired like + # this, it is still possible for a failure to occur (e.g., if the + # operating system runs out of memory). try: document = SBMLDocument(3, 1) except ValueError: - print('Could not create SBMLDocument object') + print('Could not create SBMLDocumention object') sys.exit(1) - # Create the basic Model object inside the SBMLDocument object: + # Create the basic Model object inside the SBMLDocument object. To + # produce a model with complete units for the reaction rates, we need + # to set the 'timeUnits' and 'extentUnits' attributes on Model. We + # set 'substanceUnits' too, for good measure, though it's not strictly + # necessary here because we also set the units for invididual species + # in their definitions. model = document.createModel() check(model, 'create model') @@ -86,7 +95,9 @@ check(model.setExtentUnits("mole"), 'set model units of extent') check(model.setSubstanceUnits('mole'), 'set model substance units') - # Create a unit definition we will need later: + # Create a unit definition we will need later. Note that SBML Unit + # objects must have all four attributes 'kind', 'exponent', 'scale' + # and 'multiplier' defined. per_second = model.createUnitDefinition() check(per_second, 'create unit definition') @@ -98,7 +109,8 @@ check(unit.setScale(0), 'set unit scale') check(unit.setMultiplier(1), 'set unit multiplier') - # Create components inside the model: + # Create a compartment inside this model, and set the required + # attributes for an SBML compartment in SBML Level 3. c1 = model.createCompartment() check(c1, 'create compartment') @@ -108,6 +120,12 @@ check(c1.setSpatialDimensions(3), 'set compartment dimensions') check(c1.setUnits('litre'), 'set compartment size units') + # Create two species inside this model, set the required attributes + # for each species in SBML Level 3 (which are the 'id', 'compartment', + # 'constant', 'hasOnlySubstanceUnits', and 'boundaryCondition' + # attributes), and initialize the amount of the species along with the + # units of the amount. + s1 = model.createSpecies() check(s1, 'create species s1') check(s1.setId('s1'), 'set species s1 id') @@ -128,13 +146,23 @@ check(s2.setBoundaryCondition(False), 'set "boundaryCondition" on s2') check(s2.setHasOnlySubstanceUnits(False), 'set "hasOnlySubstanceUnits" on s2') + # Create a parameter object inside this model, set the required + # attributes 'id' and 'constant' for a parameter in SBML Level 3, and + # initialize the parameter with a value along with its units. + k = model.createParameter() check(k, 'create parameter k') check(k.setId('k'), 'set parameter k id') + check(k.setConstant(True), 'set parameter k "constant"') check(k.setValue(1), 'set parameter k value') check(k.setUnits('per_second'), 'set parameter k units') - check(k.setConstant(True), 'set parameter k "constant"') + # Create a reaction inside this model, set the reactants and products, + # and set the reaction rate expression (the SBML "kinetic law"). We + # set the minimum required attributes for all of these objects. The + # units of the reaction rate are determined from the 'timeUnits' and + # 'extentUnits' attributes on the Model object. + r1 = model.createReaction() check(r1, 'create reaction') check(r1.setId('r1'), 'set reaction id') @@ -158,7 +186,8 @@ check(kinetic_law, 'create kinetic law') check(kinetic_law.setMath(math_ast), 'set math on kinetic law') - # Done. Return a text string containing the model. + # And we're done creating the basic model. + # Now return a text string containing the model in XML format. return writeSBMLToString(document) Modified: branches/libsbml-experimental/src/bindings/csharp/Makefile.in =================================================================== --- branches/libsbml-experimental/src/bindings/csharp/Makefile.in 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/src/bindings/csharp/Makefile.in 2014-07-29 07:47:34 UTC (rev 20938) @@ -360,7 +360,7 @@ all: @echo @echo "Reconfigure libSBML using --with-csharp to enable CSharp support."; - @echo "(--with-cli-interpreter=path" and/or --with-csharp-compiler=path may be required.)"; + @echo "(--with-cli-interpreter=path and/or --with-csharp-compiler=path may be required.)"; @echo @exit 1 endif @@ -368,8 +368,25 @@ # Until we improve swigdoc.py, the following warnings are spurious and annoying # and we don't need to see them. -CSC_NOWARN = -nowarn:108,109,219 +# the compile run disables the following warnings +# - 105: duplicated using statement, due to the patch above +# - 108: 'method name' hides inherited member 'base member name'. Use the +# new keyword if hiding was intended. +# - 114: 'method name' hides inherited member 'base member name'. To make +# the current member override that implementation, add the override +# keyword. Otherwise add the new keyword. +# - 1570: XML comment on 'class name' has badly formed XML. +# - 1572: XML comment on 'method name' has a param tag for 'parameter name' +# but there is no parameter by that name. +# - 1573: Parameter 'parameter name' has no matching param tag in the XML +# comment for 'method name' (but other parameters do). +# - 1574: XML comment on 'method name' has cref attribute 'method name' +# that could not be resolved. +# - 1591: Missing XML comment for publicly visible type or member 'method +# name' +CSC_NOWARN = -nowarn:105,108,109,114,1570,1572,1573,1574,1591 + $(csproxy_lib): $(outpath)/libsbml.cs $(dllimport_lib) -"$(SN)" -k $(sn_keyfile) "$(CSHARP_COMPILER)" $(CSC_OPT_SHARED) $(CSC_NOWARN) \ @@ -464,6 +481,13 @@ # stand-in for the .cs files. Their creation results in the creation of the .cs # files too -- both are made by running swig. +patch-swig-output: + @list='$(wildcard $(outpath)/*.cs)'; for file in $$list; do \ + echo 'using System;\nusing System.Runtime.InteropServices;\n\n' > $(outpath)/.tmpfile; \ + cat $$file >> $(outpath)/.tmpfile; \ + mv -f $(outpath)/.tmpfile $$file; \ + done + # for non-Windows libsbml_wrap.cpp $(outpath) : $(swig_sources) $(main_sources) csdoc.i \ $(shell $(call check_comp)) $(shell $(call check_fbc)) \ @@ -473,6 +497,7 @@ "$(SWIG)" $(SWIGFLAGS) $(sort $(default_includes) $(INCLUDES)) \ -c++ -csharp -namespace libsbmlcs -dllimport $(dllimport_name) \ -outdir $(outpath) -o libsbml_wrap.cpp libsbml.i + make patch-swig-output # for Windows libsbml_wrap-win.cpp $(outpath_win) : $(swig_sources) $(main_sources) csdoc.i \ Modified: branches/libsbml-experimental/src/bindings/matlab/OutputSBML.c =================================================================== --- branches/libsbml-experimental/src/bindings/matlab/OutputSBML.c 2014-07-29 07:22:58 UTC (rev 20937) +++ branches/libsbml-experimental/src/bindings/matlab/OutputSBML.c 2014-07-29 07:47:34 UTC (rev 20938) @@ -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(SBMLMod... [truncated message content] |