PyObject * mlabraw_get(PyObject *, PyObject *args) { char *lName; PyObject *lHandle; mxArray *lArray = NULL; PyObject *lDest = NULL; if (! PyArg_ParseTuple(args, "Os:get", &lHandle, &lName)) return NULL; if (! PyCObject_Check(lHandle)) { PyErr_SetString(PyExc_TypeError, "Invalid object passed as mlabraw session handle"); return NULL; } lArray = _getMatlabVar(lHandle, lName); if (lArray == NULL) { PyErr_SetString(mlabraw_error, "Unable to get matrix from MATLAB(TM) workspace"); return NULL; } if (mxIsChar(lArray)) { lDest = (PyObject *)mx2char(lArray); } else if (mxIsDouble(lArray) && ! mxIsSparse(lArray)) { lDest = (PyObject *)mx2numeric(lArray); } else { // FIXME structs, cells and non-double arrays PyErr_SetString(PyExc_TypeError, "Only strings and non-sparse numeric arrays are supported."); } mxDestroyArray(lArray); return lDest; }
PyObject * mlabraw_eval(PyObject *, PyObject *args) { //XXX how large should this be? const int BUFSIZE=10000; char* fmt = "try, %s; MLABRAW_ERROR_=0; catch, MLABRAW_ERROR_=1; end;"; char buffer[BUFSIZE]; char cmd[BUFSIZE]; char *lStr; char *retStr = buffer; PyObject *ret; PyObject *lHandle; if (! PyArg_ParseTuple(args, "Os:eval", &lHandle, &lStr)) return NULL; if (! PyCObject_Check(lHandle)) { PyErr_SetString(PyExc_TypeError, "Invalid object passed as mlabraw session handle"); return NULL; } sprintf(cmd, fmt, lStr); //FIXME check buffer overflow // std::cout << "DEBUG: CMD " << cmd << std::endl << std::flush; engOutputBuffer((Engine *)PyCObject_AsVoidPtr(lHandle), retStr, BUFSIZE-1); if (engEvalString((Engine *)PyCObject_AsVoidPtr(lHandle), cmd) != 0) { PyErr_SetString(mlabraw_error, "Unable to evaluate string in MATLAB(TM) workspace"); return NULL; } { mxArray *lArray = NULL; char buffer2[BUFSIZE]; char *retStr2 = buffer2; bool __mlabraw_error; if (NULL == (lArray = _getMatlabVar(lHandle, "MLABRAW_ERROR_")) ) { PyErr_SetString(mlabraw_error, "Something VERY BAD happened whilst trying to evaluate string " "in MATLAB(TM) workspace."); return NULL; } __mlabraw_error = (bool)*mxGetPr(lArray); mxDestroyArray(lArray); if (__mlabraw_error) { engOutputBuffer((Engine *)PyCObject_AsVoidPtr(lHandle), retStr2, BUFSIZE-1); if (engEvalString((Engine *)PyCObject_AsVoidPtr(lHandle), "disp(subsref(lasterror(),struct('type','.','subs','message')))") != 0) { PyErr_SetString(mlabraw_error, "THIS SHOULD NOT HAVE HAPPENED!!!"); return NULL; } PyErr_SetString(mlabraw_error, retStr2 + ((strncmp(">> ", retStr2, 3) == 0) ? 3 : 0)); return NULL; } } if (strncmp(">> ", retStr, 3) == 0) { retStr += 3; } //FIXME ret = (PyObject *)PyString_FromString(retStr); return ret; }
PyObject * mlabraw_eval(PyObject *, PyObject *args) { //XXX how large should this be? used to be 10000, but looks like matlab // hangs when it gets bigger than ~9000 I'm not aware of some actual limit // being documented anywhere; I don't want to make it too small since the // high overhead of engine calls means that it can be potentially useful to // eval large chunks. const int BUFSIZE=4096; char* fmt = "try, %s; MLABRAW_ERROR_=0; catch, MLABRAW_ERROR_=1; end;"; char buffer[BUFSIZE]; char cmd[BUFSIZE]; char *lStr; char *retStr = buffer; PyObject *ret; PyObject *lHandle; if (! PyArg_ParseTuple(args, "Os:eval", &lHandle, &lStr)) return NULL; if (! PyCObject_Check(lHandle)) { PyErr_SetString(PyExc_TypeError, "Invalid object passed as mlabraw session handle"); return NULL; } bool ok = my_snprintf(cmd, BUFSIZE, fmt, lStr); if (! ok) { PyErr_SetString(mlabraw_error, "String too long to evaluate."); return NULL; } // std::cout << "DEBUG: CMD " << cmd << std::endl << std::flush; engOutputBuffer((Engine *)PyCObject_AsVoidPtr(lHandle), retStr, BUFSIZE-1); if (engEvalString((Engine *)PyCObject_AsVoidPtr(lHandle), cmd) != 0) { PyErr_SetString(mlabraw_error, "Unable to evaluate string in MATLAB(TM) workspace"); return NULL; } { mxArray *lArray = NULL; char buffer2[BUFSIZE]; char *retStr2 = buffer2; bool __mlabraw_error; if (NULL == (lArray = _getMatlabVar(lHandle, "MLABRAW_ERROR_")) ) { PyErr_SetString(mlabraw_error, "Something VERY BAD happened whilst trying to evaluate string " "in MATLAB(TM) workspace."); return NULL; } __mlabraw_error = (bool)*mxGetPr(lArray); mxDestroyArray(lArray); if (__mlabraw_error) { engOutputBuffer((Engine *)PyCObject_AsVoidPtr(lHandle), retStr2, BUFSIZE-1); if (engEvalString((Engine *)PyCObject_AsVoidPtr(lHandle), "disp(subsref(lasterror(),struct('type','.','subs','message')))") != 0) { PyErr_SetString(mlabraw_error, "THIS SHOULD NOT HAVE HAPPENED!!!"); return NULL; } PyErr_SetString(mlabraw_error, retStr2 + ((strncmp(">> ", retStr2, 3) == 0) ? 3 : 0)); return NULL; } } if (strncmp(">> ", retStr, 3) == 0) { retStr += 3; } //FIXME ret = (PyObject *)PyString_FromString(retStr); return ret; }