#include
#include
#include
#include "engine.h"
#include "matrix.h"
Engine *ep;
int runFile (char *fname, int argc, char **argv);
char *stripRChars (char *str, const char *chars);
char *stripLChars (char *str, const char *chars);
inline char *chomp (char* str) { return stripRChars (str, "\n\r"); }
inline char *stripChars (char *str, const char *chars)
{
return (stripLChars (stripRChars (str, chars), chars));
}
inline char *stripWhitespace (char *str) { return stripChars (str, " \t\r\n"); }
int main (int argc, char *argv[])
{
fclose (stderr);
ep = engOpen ("matlab -nosplash");
if (!ep)
{
fprintf (stderr, "engOpen failed.\n");
exit (1);
}
runFile (argv[1], argc - 1, argv + 1);
engClose (ep);
return 0;
}
int runFile (char *fname, int argc, char **argv)
{
FILE* fp = NULL;
char lineBuf[4096];
char evalBuf[4096];
fp = fopen (fname, "r");
if (!fp)
{
return 1;
}
mxArray *mxArgc = mxCreateNumericMatrix (1, 1, mxINT32_CLASS, mxREAL);
(static_cast (mxGetData (mxArgc)))[0] = argc;
engPutVariable (ep, "argc", mxArgc);
mxArray *mxArgv = mxCreateCellMatrix (1, argc);
for (int idx = 0; idx < argc; idx++)
{
mxSetCell (mxArgv, idx, mxCreateString (argv[idx]));
}
engPutVariable (ep, "argv", mxArgv);
evalBuf[0] = 0;
char engBuf[65536];
engOutputBuffer (ep, engBuf, 65536);
for (int lineNo = 1; fgets (lineBuf, 4096, fp); lineNo++)
{
stripWhitespace (lineBuf);
if ((lineNo == 1)
&& (lineBuf[0] == '#')
&& (lineBuf[1] == '!'))
{
continue;
}
if (!lineBuf[0] || (lineBuf[0] == '%'))
{
continue;
}
int lineLen = strlen (lineBuf);
if ((lineLen > 3)
&& (lineBuf[lineLen - 1] == '.')
&& (lineBuf[lineLen - 2] == '.')
&& (lineBuf[lineLen - 3] == '.'))
{
lineBuf[lineLen - 3] = 0;
strncat (evalBuf, lineBuf, 4096);
}
else
{
strncat (evalBuf, lineBuf, 4096);
if (engEvalString (ep, evalBuf))
{
return 3;
}
evalBuf[0] = 0;
if (engBuf[0])
{
printf ("%s", engBuf);
}
}
}
mxDestroyArray (mxArgc);
mxDestroyArray (mxArgv);
if (fclose (fp))
{
return 2;
}
return 0;
}
// Remove all characters from the RHS.
char *stripRChars (char *str, const char *chars)
{
int pos = strlen (str);
int nChars = strlen (chars);
while (pos--)
{
int idx = nChars;
while (idx && (chars[--idx] != str[pos]));
if (chars[idx] == str[pos])
{
str[pos] = 0;
}
else
{
pos = 0;
}
}
return str;
}
// Remove all characters from the LHS.
char *stripLChars (char *str, const char *chars)
{
int sLen = strlen (str);
int nChars = strlen (chars);
int pos;
for (pos = 0; (pos < sLen); pos++)
{
int idx = nChars;
while (idx && (chars[--idx] != str[pos]));
if (chars[idx] == str[pos])
{
continue;
}
else
{
break;
}
}
// pos is the first non-matching character
int ssLen = strlen (str + pos);
if (ssLen && (ssLen != sLen))
{
memmove (str, str + pos, (ssLen + 1));
}
return str;
}