cantera/src/matlab/xmlmethods.cpp
2012-03-15 19:55:18 +00:00

163 lines
3.7 KiB
C++

/**
* @file xmlmethods.cpp
*/
#include "clib/ctxml.h"
#include "clib/ct.h"
#include "ctmatutils.h"
void reportError();
static bool nargs_ok(int job, int n)
{
switch (n) {
case 1:
case 2:
case 10:
case 21:
case 22:
return (n == 2);
case 3:
case 4:
case 6:
case 7:
case 8:
case 9:
case 13:
case 14:
case 20:
return (n == 3);
case 5:
case 11:
case 12:
return (n == 4);
default:
return true;
}
}
void xmlmethods(int nlhs, mxArray* plhs[],
int nrhs, const mxArray* prhs[])
{
int j, m, iok = 0;
char* file, *key, *val, *nm;
int job = getInt(prhs[1]);
int i = getInt(prhs[2]);
// Check for proper number of arguments
if (!nargs_ok(job,nrhs-1)) {
mexErrMsgTxt("Wrong number of inputs.");
return;
} else if (nlhs > 1) {
mexErrMsgTxt("Too many output arguments");
}
// options that do not return a value
if (job < 20) {
switch (job) {
case 0:
nm = getString(prhs[3]);
iok = xml_new(nm);
break;
case 1:
iok = xml_del(i);
break;
case 2:
iok = xml_copy(i);
break;
case 3:
j = getInt(prhs[3]);
iok = xml_assign(i,j);
break;
case 4:
file = getString(prhs[3]);
iok = xml_build(i, file);
break;
case 5:
key = getString(prhs[3]);
val = getString(prhs[4]);
iok = xml_addAttrib(i, key, val);
break;
case 6:
key = getString(prhs[3]);
iok = xml_child(i, key);
break;
case 7:
m = getInt(prhs[3]);
iok = xml_child_bynumber(i, m);
break;
case 8:
key = getString(prhs[3]);
iok = xml_findID(i, key);
break;
case 9:
key = getString(prhs[3]);
iok = xml_findByName(i, key);
break;
case 10:
iok = xml_nChildren(i);
break;
case 11:
key = getString(prhs[3]);
val = getString(prhs[4]);
iok = xml_addChild(i, key, val);
break;
case 12:
key = getString(prhs[3]);
j = getInt(prhs[4]);
iok = xml_addChildNode(i, j);
break;
case 13:
file = getString(prhs[3]);
iok = xml_write(i, file);
break;
case 14:
j = getInt(prhs[3]);
iok = xml_removeChild(i, j);
break;
case 15:
file = getString(prhs[3]);
iok = xml_get_XML_File(file);
break;
default:
mexErrMsgTxt("unknown job parameter");
}
plhs[0] = mxCreateNumericMatrix(1,1,mxDOUBLE_CLASS,mxREAL);
double* h = mxGetPr(plhs[0]);
*h = double(iok);
if (iok < 0) {
reportError();
}
return;
}
// options that return strings
char* v = (char*)mxCalloc(80, sizeof(char));
switch (job) {
case 20:
// return an attribute
key = getString(prhs[3]);
iok = xml_attrib(i, key, v);
break;
case 21:
// return the value of the node
iok = xml_value(i, v);
break;
case 22:
iok = xml_tag(i, v);
break;
default:
mexErrMsgTxt("unknown job parameter");
}
if (iok < 0) {
plhs[0] = mxCreateNumericMatrix(1,1,mxDOUBLE_CLASS,mxREAL);
double* h = mxGetPr(plhs[0]);
*h = double(iok);
if (iok < 0) {
reportError();
}
} else {
plhs[0] = mxCreateString(v);
}
}