Skip to content

Commit

Permalink
Scarab opaques with embedded NULs are now converted into MATLAB uint8…
Browse files Browse the repository at this point in the history
… arrays. Fixed a memory leak when converting a codec event into a MATLAB struct. Ensure that MEX files are always linked against the latest libMWorksMATLABTools.
  • Loading branch information
cstawarz committed Aug 15, 2012
1 parent 4979a79 commit 543249a
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 24 deletions.
64 changes: 47 additions & 17 deletions tools/data/MATLABTools/MWorksMATLABTools.cpp
Expand Up @@ -44,12 +44,8 @@ mxArray *recursiveGetScarabList(ScarabDatum *datum){
mx_datum = mxCreateDoubleScalar(scarab_extract_float(values[i]));
break;
case SCARAB_OPAQUE:
{
char *buffer = scarab_extract_string(values[i]);
mx_datum = mxCreateString(buffer);
free(buffer);
mx_datum = getScarabOpaque(values[i]);
break;
}
case SCARAB_DICT:
mx_datum = recursiveGetScarabDict(values[i]);
break;
Expand Down Expand Up @@ -196,12 +192,8 @@ mxArray *recursiveGetScarabDict(ScarabDatum *datum){
mx_datum = mxCreateDoubleScalar(scarab_extract_float(values[i]));
break;
case SCARAB_OPAQUE:
{
char *buffer = scarab_extract_string(values[i]);
mx_datum = mxCreateString(buffer);
free(buffer);
mx_datum = getScarabOpaque(values[i]);
break;
}
case SCARAB_DICT:
mx_datum = recursiveGetScarabDict(values[i]);
break;
Expand Down Expand Up @@ -268,12 +260,8 @@ mxArray *getScarabEventData(ScarabDatum *datum){
retVal = mxCreateDoubleScalar(scarab_extract_float(payload)); // HACK
break;
case SCARAB_OPAQUE:
{
char *buffer = scarab_extract_string(payload);
retVal = mxCreateString(buffer);
free(buffer);
retVal = getScarabOpaque(payload);
break;
}
case SCARAB_DICT:
retVal = recursiveGetScarabDict(payload);
break;
Expand Down Expand Up @@ -337,8 +325,8 @@ mxArray *getCodec(ScarabDatum *codec){
mxCreateDoubleScalar(varValue->data.integer));
} else if(varValue->type == SCARAB_OPAQUE){
char *val = scarab_extract_string(varValue);
mxSetField(codec_struct, c, buffer,
mxCreateString(val));
mxSetField(codec_struct, c, buffer, mxCreateString(val));
free(val);
}

free(buffer);
Expand Down Expand Up @@ -444,4 +432,46 @@ std::string getString(const mxArray *string_array_ptr) {

return new_string;
}

mxArray *getScarabOpaque(ScarabDatum *datum) {
unsigned char *data = datum->data.opaque.data;
mxArray *opaque;

if (scarab_opaque_is_string(datum)) {
opaque = mxCreateString((char *)data);
} else {
int size = datum->data.opaque.size;
mwSize dims[] = { 1, size };
opaque = mxCreateNumericArray(2, dims, mxUINT8_CLASS, mxREAL);
if (opaque != NULL) {
memcpy(mxGetData(opaque), data, size);
}
}

return opaque;
}

























1 change: 1 addition & 0 deletions tools/data/MATLABTools/MWorksMATLABTools.h
Expand Up @@ -21,6 +21,7 @@ using namespace DataFileUtilities;
int insertDatumIntoCodecList(mxArray *codeclist, const int index, ScarabDatum *datum);
MWTime getMWorksTime(const mxArray *time);
std::string getString(const mxArray *string_array_ptr);
mxArray *getScarabOpaque(ScarabDatum *datum);
mxArray *getScarabEventData(ScarabDatum *datum);
mxArray *getCodec(ScarabDatum *system_payload);
mxArray *recursiveGetScarabList(ScarabDatum *datum);
Expand Down
21 changes: 14 additions & 7 deletions tools/data/MATLABTools/Makefile
Expand Up @@ -18,11 +18,7 @@ EXES_32 = $(OBJS:.o=.mexmaci)
EXES_64 = $(OBJS:.o=.mexmaci64)
EXES = $(EXES_32) $(EXES_64)

install: all
/bin/mkdir -p $(INSTALL_DIR)
/bin/cp $(EXES) $(INSTALL_DIR)

all: $(EXES)
all: clean_exes install

$(EXES_32): %.mexmaci: %.o
MACI64=0 $(MEX) -maci $(MEXFLAGS) $(LIBS) -output $@ $<
Expand All @@ -33,5 +29,16 @@ $(EXES_64): %.mexmaci64: %.o
$(OBJS): %.o: %.cpp
$(CXX) $(CFLAGS) $(INCLUDE) -c $<

clean:
/bin/rm -f $(EXES) $(OBJS)
build: $(EXES)

install: build
/bin/mkdir -p $(INSTALL_DIR)
/bin/cp $(EXES) $(INSTALL_DIR)

clean_objs:
/bin/rm -f $(OBJS)

clean_exes:
/bin/rm -f $(EXES)

clean: clean_objs clean_exes

0 comments on commit 543249a

Please sign in to comment.