Mex files / modifications for mex
parent
601c087baa
commit
358640ba4f
|
@ -0,0 +1,73 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <dynmex.h>
|
||||||
|
|
||||||
|
#include "modify_for_mex.h"
|
||||||
|
|
||||||
|
int main(int nargs, char **args);
|
||||||
|
|
||||||
|
/* MATLAB interface */
|
||||||
|
void
|
||||||
|
mexFunction(int nlhs, mxArray *plhs[],
|
||||||
|
int nrhs, const mxArray *prhs[])
|
||||||
|
{
|
||||||
|
int nargs = 0;
|
||||||
|
int n = 0;
|
||||||
|
int maxnargs = 0;
|
||||||
|
|
||||||
|
char *mainarg = "./a.out";
|
||||||
|
char *argument = NULL;
|
||||||
|
char *beginarg = NULL;
|
||||||
|
char **args = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check args
|
||||||
|
*/
|
||||||
|
if (nrhs != 1 || !mxIsChar(prhs[0]))
|
||||||
|
mexErrMsgTxt("This function takes only one string argument.");
|
||||||
|
|
||||||
|
if (nlhs != 0)
|
||||||
|
mexWarnMsgTxt("This function has no return arguments.\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate memory
|
||||||
|
*/
|
||||||
|
maxnargs = (int)(mxGetN(prhs[0])/2+1);
|
||||||
|
argument = (char *)calloc(mxGetN(prhs[0])+1, sizeof(char));
|
||||||
|
args = (char **)calloc(maxnargs, sizeof(char *));
|
||||||
|
if (argument==NULL || args==NULL)
|
||||||
|
mexErrMsgTxt("In swz_mex: could not allocate memory. (1)");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create argument string from prhs and parse to create args / nargs
|
||||||
|
*/
|
||||||
|
if (!(args[nargs] = (char *)calloc(strlen(mainarg)+1, sizeof(char))))
|
||||||
|
mexErrMsgTxt("In swz_mex: could not allocate memory. (2)");
|
||||||
|
strncpy(args[nargs++], mainarg, strlen(mainarg));
|
||||||
|
|
||||||
|
if (mxGetString(prhs[0], argument, mxGetN(prhs[0])+1))
|
||||||
|
mexErrMsgTxt("In swz_mex: error using mxGetString.\n");
|
||||||
|
|
||||||
|
beginarg = &argument[0];
|
||||||
|
while(n=strcspn(beginarg, " "))
|
||||||
|
{
|
||||||
|
if (!(args[nargs] = (char *)calloc(n+1, sizeof(char))))
|
||||||
|
mexErrMsgTxt("In swz_mex: could not allocate memory. (3)");
|
||||||
|
strncpy(args[nargs++], beginarg, n);
|
||||||
|
beginarg += (isspace(beginarg[n]) || isblank(beginarg[n]) ? ++n : n);
|
||||||
|
}
|
||||||
|
free(argument);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Call top_level function (formerly main)
|
||||||
|
*/
|
||||||
|
main(nargs, args);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* free memory
|
||||||
|
*/
|
||||||
|
for (n=0; n<nargs; n++)
|
||||||
|
free(args[n]);
|
||||||
|
free(args);
|
||||||
|
}
|
|
@ -1,12 +1,36 @@
|
||||||
#include "mex.h"
|
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#if defined(MATLAB_MEX_FILE) || defined(OCTAVE_MEX_FILE)
|
||||||
|
#include <dynmex.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int
|
||||||
|
swz_fprintf_stdout(char *msg, ...)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, msg);
|
||||||
|
|
||||||
|
#if defined(MATLAB_MEX_FILE)
|
||||||
|
ret = mexPrintf(msg, ap);
|
||||||
|
#elif defined(OCTAVE_MEX_FILE)
|
||||||
|
mexPrintf(msg, ap);
|
||||||
|
ret = 1;
|
||||||
|
#else
|
||||||
|
ret = vprintf(msg, ap);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
va_end(ap);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
swz_fprintf_err(FILE *cad, const char * str, ...)
|
swz_fprintf_err(char *str, ...)
|
||||||
{
|
{
|
||||||
char *whole_str=(char*)NULL;
|
char *whole_str=(char*)NULL;
|
||||||
char *msg_truncated = ".....MSG TRUNCATED\n";
|
char *msg_truncated = ".....MSG TRUNCATED\n";
|
||||||
|
@ -16,30 +40,7 @@ swz_fprintf_err(FILE *cad, const char * str, ...)
|
||||||
va_start(ap, str);
|
va_start(ap, str);
|
||||||
|
|
||||||
#if defined(MATLAB_MEX_FILE) || defined(OCTAVE_MEX_FILE)
|
#if defined(MATLAB_MEX_FILE) || defined(OCTAVE_MEX_FILE)
|
||||||
if (!(whole_str = (char *)malloc(sizeof(str)*sizeof(char))))
|
mexPrintf(str, ap);
|
||||||
{
|
|
||||||
printf("Could not allocate memory\n");
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(whole_str, str);
|
|
||||||
while (strtok_r(whole_str, "%", &whole_str) != NULL)
|
|
||||||
num_args++;
|
|
||||||
|
|
||||||
num_args = sizeof(str)*sizeof(char) + num_args*sizeof(long double);
|
|
||||||
if (!(whole_str = (char *)realloc(whole_str, num_args + strlen(msg_truncated) + 1)))
|
|
||||||
{
|
|
||||||
printf("Could not allocate memory\n");
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
vsnprintf(whole_str, num_args, str, ap);
|
|
||||||
if(strlen(whole_str) + 1 == num_args)
|
|
||||||
strcat(whole_str, msg_truncated);
|
|
||||||
|
|
||||||
printf("%s", whole_str);
|
|
||||||
|
|
||||||
free(whole_str);
|
|
||||||
#else
|
#else
|
||||||
vfprintf(stderr, str, ap);
|
vfprintf(stderr, str, ap);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2,9 +2,31 @@
|
||||||
#define _MEXMOD
|
#define _MEXMOD
|
||||||
void swz_exit(int status);
|
void swz_exit(int status);
|
||||||
void swz_fprintf_err(const char * str, ...);
|
void swz_fprintf_err(const char * str, ...);
|
||||||
|
int swz_fprintf_stdout(char *msg, ...);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined(MATLAB_MEX_FILE) || defined(OCTAVE_MEX_FILE)
|
#if defined(MATLAB_MEX_FILE) || defined(OCTAVE_MEX_FILE)
|
||||||
|
#include "matrix.h"
|
||||||
|
#include <dynmex.h>
|
||||||
|
|
||||||
|
/* //#undef printf ansi-c*/
|
||||||
|
/* //#define printf swz_printf ansi-c*/
|
||||||
|
/*#define fflush(stdout) mexEvalString("drawnow;");*/
|
||||||
|
|
||||||
|
#undef printf
|
||||||
|
#undef exit
|
||||||
|
|
||||||
#define printf mexPrintf
|
#define printf mexPrintf
|
||||||
#define exit swz_exit
|
#define exit swz_exit
|
||||||
|
|
||||||
|
#undef malloc
|
||||||
|
#undef calloc
|
||||||
|
#undef realloc
|
||||||
|
#undef free
|
||||||
|
|
||||||
|
#define malloc mxMalloc
|
||||||
|
#define calloc mxCalloc
|
||||||
|
#define realloc mxRealloc
|
||||||
|
#define free mxFree
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue